lora-python 0.12.0__tar.gz → 0.13.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.12.0 → lora_python-0.13.0}/Cargo.lock +30 -18
- {lora_python-0.12.0 → lora_python-0.13.0}/Cargo.toml +14 -13
- {lora_python-0.12.0 → lora_python-0.13.0}/PKG-INFO +1 -1
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/clauses.rs +5 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/state.rs +15 -2
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/tests.rs +36 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/Cargo.toml +1 -0
- lora_python-0.13.0/crates/lora-database/src/io.rs +338 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/lib.rs +11 -0
- lora_python-0.13.0/crates/lora-io/Cargo.toml +23 -0
- lora_python-0.13.0/crates/lora-io/src/csv.rs +1138 -0
- lora_python-0.13.0/crates/lora-io/src/format.rs +259 -0
- lora_python-0.13.0/crates/lora-io/src/json_array.rs +579 -0
- lora_python-0.13.0/crates/lora-io/src/jsonl.rs +379 -0
- lora_python-0.13.0/crates/lora-io/src/lib.rs +33 -0
- lora_python-0.13.0/crates/lora-io/src/mapping.rs +311 -0
- lora_python-0.13.0/crates/lora-io/src/value_json.rs +336 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/pyproject.toml +1 -1
- {lora_python-0.12.0 → lora_python-0.13.0}/LICENSE +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/README.md +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/.gitignore +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/Cargo.toml +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/LICENSE +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/README.md +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/build.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/examples/async_demo.py +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/examples/basic.py +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/src/errors.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/src/from_python.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/src/lib.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/src/to_python.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/tests/test_async.py +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/tests/test_sync.py +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/Cargo.toml +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/errors.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/lib.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/resolved.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/scope.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/symbols.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/tests/error_messages.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-ast/Cargo.toml +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-ast/src/ast.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-ast/src/lib.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-builtins-meta/Cargo.toml +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-builtins-meta/src/lib.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/Cargo.toml +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/lib.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/logical.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/optimizer.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/pattern.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/physical.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/plan_tree.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/planner.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/README.md +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/advanced.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/concurrency_guard.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/concurrent.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/engine.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/fixtures.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/index_acceleration.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/perf_smoke.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/query_implementations.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/realistic.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/scale.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/temporal_spatial.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/wal.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/builder.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/compile.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/execute.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/explain.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/graph_api.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/occ.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/procedures.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/profile.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/pull_mode.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/replay.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/row_projection.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/schema.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/show_pipeline.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/stream.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/write_guard.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/durable_io.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/error.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/explain.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/live_store.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/named.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/plan_cache.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/snapshot/json.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/snapshot/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/snapshot/store.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/stream.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/transaction.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/admin.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/archive/format.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/archive/lock.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/archive/platform.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/archive/worker.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/archive.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/write_scope.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/advanced_queries.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/aggregation.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/backend_stub.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/binary.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/builtin_namespaces.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/constraints.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/create.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/docs_examples.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/error_messages.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/errors.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/explain_profile.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/expressions.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/foreach.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/fulltext_index.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/functions_extended.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/index_acceleration.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/invariants.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/managed_snapshots.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/match.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/merge.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/ordering.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/parameters.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/parser.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/paths.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/projection.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/scale.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/schema.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/seeds.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/snapshot.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/spatial.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/temporal.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/test_helpers.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/transactions.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/types_advanced.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/union.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/update.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/vector_index.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/vectors.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/wal.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/where_clause.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/with.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/Cargo.toml +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/errors.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/binops.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/list.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/number.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/errors.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/expr.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/functions.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/point.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/regex.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/vector.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/aggregation.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/helpers.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/immutable.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/mutable.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/optional.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/sort.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/lib.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/profile.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/aggregate.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/columns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/context.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/expand.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/filter.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/hydration.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/mutable.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/optional.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/path.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/projection.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/scan.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/shape.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/sort.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/source.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/tests.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/traits.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/union.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/value.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/tests/error_messages.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/Cargo.toml +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/cypher.pest +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/errors.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/lib.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/clauses.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/expressions.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/literals.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/patterns.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/query.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/schema.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/tests.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/util.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/tests/error_messages.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/Cargo.toml +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/body.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/codec.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/columnar.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/envelope.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/errors.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/format.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/lib.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/options.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/tests.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/transform.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/view.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/tests/error_messages.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/Cargo.toml +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/codec.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/lib.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/lock_table.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/constraint_enforce.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/entity_index_store.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/fulltext_index.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/graph.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/hnsw.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/impls.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/index_catalog.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/point_index.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/property_index.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/secondary_index_maintenance.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/snapshot.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/sorted_property_index.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/stats.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/tests.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/text_index.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/vector_index.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/mutation.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/snapshot.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/traits.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/binary/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/binary/tests.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/binary/traits.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/binary/types.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/graph.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/property_value.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/spatial/distance.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/spatial/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/spatial/point.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/spatial/srid.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/spatial/tests.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/date.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/duration.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/format.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/time.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/vector/build.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/vector/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/vector/similarity.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/vector/tests.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/vector/types.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/tests/error_messages.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/Cargo.toml +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/codec/decode.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/codec/encode.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/codec/format.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/codec/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/codec/tests.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/config.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/dir.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/errors.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/io.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/lib.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/lock.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/lsn.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/record.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/recorder/errors.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/recorder/mirror.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/recorder/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/recorder/recorder.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/recorder/tests.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/replay.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/segment.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/testing.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/wal/mod.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/wal/tests.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/wal/wal.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/tests/error_messages.rs +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/python/lora_python/__init__.py +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/python/lora_python/_async.py +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/python/lora_python/_native.pyi +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/python/lora_python/py.typed +0 -0
- {lora_python-0.12.0 → lora_python-0.13.0}/python/lora_python/types.py +0 -0
|
@@ -773,7 +773,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
|
|
|
773
773
|
|
|
774
774
|
[[package]]
|
|
775
775
|
name = "lora-analyzer"
|
|
776
|
-
version = "0.
|
|
776
|
+
version = "0.13.0"
|
|
777
777
|
dependencies = [
|
|
778
778
|
"lora-ast",
|
|
779
779
|
"lora-builtins-meta",
|
|
@@ -784,14 +784,14 @@ dependencies = [
|
|
|
784
784
|
|
|
785
785
|
[[package]]
|
|
786
786
|
name = "lora-ast"
|
|
787
|
-
version = "0.
|
|
787
|
+
version = "0.13.0"
|
|
788
788
|
dependencies = [
|
|
789
789
|
"smallvec 2.0.0-alpha.12",
|
|
790
790
|
]
|
|
791
791
|
|
|
792
792
|
[[package]]
|
|
793
793
|
name = "lora-binding-buffer"
|
|
794
|
-
version = "0.
|
|
794
|
+
version = "0.13.0"
|
|
795
795
|
dependencies = [
|
|
796
796
|
"lora-database",
|
|
797
797
|
"lora-store",
|
|
@@ -799,11 +799,11 @@ dependencies = [
|
|
|
799
799
|
|
|
800
800
|
[[package]]
|
|
801
801
|
name = "lora-builtins-meta"
|
|
802
|
-
version = "0.
|
|
802
|
+
version = "0.13.0"
|
|
803
803
|
|
|
804
804
|
[[package]]
|
|
805
805
|
name = "lora-compiler"
|
|
806
|
-
version = "0.
|
|
806
|
+
version = "0.13.0"
|
|
807
807
|
dependencies = [
|
|
808
808
|
"lora-analyzer",
|
|
809
809
|
"lora-ast",
|
|
@@ -812,7 +812,7 @@ dependencies = [
|
|
|
812
812
|
|
|
813
813
|
[[package]]
|
|
814
814
|
name = "lora-database"
|
|
815
|
-
version = "0.
|
|
815
|
+
version = "0.13.0"
|
|
816
816
|
dependencies = [
|
|
817
817
|
"anyhow",
|
|
818
818
|
"chacha20poly1305",
|
|
@@ -824,6 +824,7 @@ dependencies = [
|
|
|
824
824
|
"lora-ast",
|
|
825
825
|
"lora-compiler",
|
|
826
826
|
"lora-executor",
|
|
827
|
+
"lora-io",
|
|
827
828
|
"lora-parser",
|
|
828
829
|
"lora-snapshot",
|
|
829
830
|
"lora-store",
|
|
@@ -836,7 +837,7 @@ dependencies = [
|
|
|
836
837
|
|
|
837
838
|
[[package]]
|
|
838
839
|
name = "lora-executor"
|
|
839
|
-
version = "0.
|
|
840
|
+
version = "0.13.0"
|
|
840
841
|
dependencies = [
|
|
841
842
|
"blake3",
|
|
842
843
|
"crc32fast",
|
|
@@ -859,7 +860,7 @@ dependencies = [
|
|
|
859
860
|
|
|
860
861
|
[[package]]
|
|
861
862
|
name = "lora-ffi"
|
|
862
|
-
version = "0.
|
|
863
|
+
version = "0.13.0"
|
|
863
864
|
dependencies = [
|
|
864
865
|
"anyhow",
|
|
865
866
|
"lora-binding-buffer",
|
|
@@ -869,9 +870,20 @@ dependencies = [
|
|
|
869
870
|
"serde_json",
|
|
870
871
|
]
|
|
871
872
|
|
|
873
|
+
[[package]]
|
|
874
|
+
name = "lora-io"
|
|
875
|
+
version = "0.13.0"
|
|
876
|
+
dependencies = [
|
|
877
|
+
"lora-executor",
|
|
878
|
+
"lora-store",
|
|
879
|
+
"serde",
|
|
880
|
+
"serde_json",
|
|
881
|
+
"thiserror",
|
|
882
|
+
]
|
|
883
|
+
|
|
872
884
|
[[package]]
|
|
873
885
|
name = "lora-node"
|
|
874
|
-
version = "0.
|
|
886
|
+
version = "0.13.0"
|
|
875
887
|
dependencies = [
|
|
876
888
|
"anyhow",
|
|
877
889
|
"lora-binding-buffer",
|
|
@@ -886,7 +898,7 @@ dependencies = [
|
|
|
886
898
|
|
|
887
899
|
[[package]]
|
|
888
900
|
name = "lora-parser"
|
|
889
|
-
version = "0.
|
|
901
|
+
version = "0.13.0"
|
|
890
902
|
dependencies = [
|
|
891
903
|
"lora-ast",
|
|
892
904
|
"pest",
|
|
@@ -897,7 +909,7 @@ dependencies = [
|
|
|
897
909
|
|
|
898
910
|
[[package]]
|
|
899
911
|
name = "lora-python"
|
|
900
|
-
version = "0.
|
|
912
|
+
version = "0.13.0"
|
|
901
913
|
dependencies = [
|
|
902
914
|
"anyhow",
|
|
903
915
|
"lora-database",
|
|
@@ -909,7 +921,7 @@ dependencies = [
|
|
|
909
921
|
|
|
910
922
|
[[package]]
|
|
911
923
|
name = "lora-query-wasm"
|
|
912
|
-
version = "0.
|
|
924
|
+
version = "0.13.0"
|
|
913
925
|
dependencies = [
|
|
914
926
|
"console_error_panic_hook",
|
|
915
927
|
"js-sys",
|
|
@@ -923,7 +935,7 @@ dependencies = [
|
|
|
923
935
|
|
|
924
936
|
[[package]]
|
|
925
937
|
name = "lora-server"
|
|
926
|
-
version = "0.
|
|
938
|
+
version = "0.13.0"
|
|
927
939
|
dependencies = [
|
|
928
940
|
"anyhow",
|
|
929
941
|
"axum",
|
|
@@ -937,7 +949,7 @@ dependencies = [
|
|
|
937
949
|
|
|
938
950
|
[[package]]
|
|
939
951
|
name = "lora-snapshot"
|
|
940
|
-
version = "0.
|
|
952
|
+
version = "0.13.0"
|
|
941
953
|
dependencies = [
|
|
942
954
|
"argon2",
|
|
943
955
|
"blake3",
|
|
@@ -952,7 +964,7 @@ dependencies = [
|
|
|
952
964
|
|
|
953
965
|
[[package]]
|
|
954
966
|
name = "lora-store"
|
|
955
|
-
version = "0.
|
|
967
|
+
version = "0.13.0"
|
|
956
968
|
dependencies = [
|
|
957
969
|
"crc32fast",
|
|
958
970
|
"js-sys",
|
|
@@ -963,7 +975,7 @@ dependencies = [
|
|
|
963
975
|
|
|
964
976
|
[[package]]
|
|
965
977
|
name = "lora-wal"
|
|
966
|
-
version = "0.
|
|
978
|
+
version = "0.13.0"
|
|
967
979
|
dependencies = [
|
|
968
980
|
"crc32fast",
|
|
969
981
|
"lora-store",
|
|
@@ -973,7 +985,7 @@ dependencies = [
|
|
|
973
985
|
|
|
974
986
|
[[package]]
|
|
975
987
|
name = "lora-wasm"
|
|
976
|
-
version = "0.
|
|
988
|
+
version = "0.13.0"
|
|
977
989
|
dependencies = [
|
|
978
990
|
"anyhow",
|
|
979
991
|
"console_error_panic_hook",
|
|
@@ -989,7 +1001,7 @@ dependencies = [
|
|
|
989
1001
|
|
|
990
1002
|
[[package]]
|
|
991
1003
|
name = "lora_ruby"
|
|
992
|
-
version = "0.
|
|
1004
|
+
version = "0.13.0"
|
|
993
1005
|
dependencies = [
|
|
994
1006
|
"anyhow",
|
|
995
1007
|
"lora-database",
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[workspace]
|
|
2
|
-
members = ["crates/lora-ast", "crates/lora-parser", "crates/lora-builtins-meta", "crates/lora-analyzer", "crates/lora-compiler", "crates/lora-store", "crates/lora-snapshot", "crates/lora-wal", "crates/lora-executor", "crates/lora-database", "crates/bindings/lora-python"]
|
|
2
|
+
members = ["crates/lora-ast", "crates/lora-parser", "crates/lora-builtins-meta", "crates/lora-analyzer", "crates/lora-compiler", "crates/lora-store", "crates/lora-snapshot", "crates/lora-io", "crates/lora-wal", "crates/lora-executor", "crates/lora-database", "crates/bindings/lora-python"]
|
|
3
3
|
resolver = "2"
|
|
4
4
|
|
|
5
5
|
[workspace.package]
|
|
6
6
|
edition = "2021"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.13.0"
|
|
8
8
|
license = "BUSL-1.1"
|
|
9
9
|
authors = ["LoraDB, Inc."]
|
|
10
10
|
repository = "https://github.com/lora-db/lora"
|
|
@@ -15,17 +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-
|
|
26
|
-
lora-
|
|
27
|
-
lora-
|
|
28
|
-
lora-
|
|
18
|
+
lora-ast = { path = "crates/lora-ast", version = "=0.13.0" }
|
|
19
|
+
lora-parser = { path = "crates/lora-parser", version = "=0.13.0" }
|
|
20
|
+
lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.13.0" }
|
|
21
|
+
lora-analyzer = { path = "crates/lora-analyzer", version = "=0.13.0" }
|
|
22
|
+
lora-compiler = { path = "crates/lora-compiler", version = "=0.13.0" }
|
|
23
|
+
lora-store = { path = "crates/lora-store", version = "=0.13.0" }
|
|
24
|
+
lora-snapshot = { path = "crates/lora-snapshot", version = "=0.13.0", default-features = false }
|
|
25
|
+
lora-io = { path = "crates/lora-io", version = "=0.13.0" }
|
|
26
|
+
lora-wal = { path = "crates/lora-wal", version = "=0.13.0" }
|
|
27
|
+
lora-executor = { path = "crates/lora-executor", version = "=0.13.0", default-features = false }
|
|
28
|
+
lora-database = { path = "crates/lora-database", version = "=0.13.0" }
|
|
29
|
+
lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.13.0" }
|
|
29
30
|
|
|
30
31
|
# External crates.
|
|
31
32
|
anyhow = "1"
|
|
@@ -54,6 +54,11 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
54
54
|
pub(super) fn analyze_unwind(&mut self, u: &Unwind) -> Result<ResolvedUnwind, SemanticError> {
|
|
55
55
|
let expr = self.analyze_expr(&u.expr)?;
|
|
56
56
|
let alias = self.declare_fresh_variable(&u.alias.name)?;
|
|
57
|
+
// UNWIND iterates a list — typically `$rows` from a batched
|
|
58
|
+
// import, where each element is a map of arbitrary keys. The
|
|
59
|
+
// analyzer can't know the row shape, so let property access on
|
|
60
|
+
// the alias skip the graph-catalog check.
|
|
61
|
+
self.dynamic_property_vars.insert(alias);
|
|
57
62
|
|
|
58
63
|
Ok(ResolvedUnwind { expr, alias })
|
|
59
64
|
}
|
|
@@ -4,12 +4,18 @@ use lora_ast::{
|
|
|
4
4
|
UpdatingClause,
|
|
5
5
|
};
|
|
6
6
|
use lora_store::GraphCatalog;
|
|
7
|
-
use std::collections::BTreeMap;
|
|
7
|
+
use std::collections::{BTreeMap, BTreeSet};
|
|
8
8
|
|
|
9
9
|
pub struct Analyzer<'a, S: GraphCatalog + ?Sized> {
|
|
10
10
|
pub(super) storage: &'a S,
|
|
11
11
|
pub(super) scopes: ScopeStack,
|
|
12
12
|
pub(super) symbols: SymbolTable,
|
|
13
|
+
/// Variables whose runtime value shape isn't tracked by the analyzer
|
|
14
|
+
/// (UNWIND-bound elements, anything that may legitimately hold a map
|
|
15
|
+
/// or list of maps). Property access on these vars must skip the
|
|
16
|
+
/// graph-catalog check — the caller can't know which keys the data
|
|
17
|
+
/// carries until rows are bound at execution time.
|
|
18
|
+
pub(super) dynamic_property_vars: BTreeSet<VarId>,
|
|
13
19
|
}
|
|
14
20
|
|
|
15
21
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
@@ -26,6 +32,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
26
32
|
storage,
|
|
27
33
|
scopes: ScopeStack::new(),
|
|
28
34
|
symbols: SymbolTable::default(),
|
|
35
|
+
dynamic_property_vars: BTreeSet::new(),
|
|
29
36
|
}
|
|
30
37
|
}
|
|
31
38
|
|
|
@@ -324,7 +331,13 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
|
|
|
324
331
|
|
|
325
332
|
pub(super) fn property_access_allowed(&self, base: &ResolvedExpr, key: &str) -> bool {
|
|
326
333
|
match base {
|
|
327
|
-
|
|
334
|
+
// Map literals and query parameters carry their own keys —
|
|
335
|
+
// there's nothing in the graph catalog to check against.
|
|
336
|
+
ResolvedExpr::Map(_) | ResolvedExpr::Parameter(_) => true,
|
|
337
|
+
// Variables whose value shape isn't tracked (UNWIND-bound
|
|
338
|
+
// row elements, etc.) — the catalog can't speak to keys on
|
|
339
|
+
// values that come from `$params` at execution time.
|
|
340
|
+
ResolvedExpr::Variable(id) if self.dynamic_property_vars.contains(id) => true,
|
|
328
341
|
_ => {
|
|
329
342
|
self.storage.has_property_key(key)
|
|
330
343
|
|| (self.storage.node_count() == 0 && self.storage.relationship_count() == 0)
|
|
@@ -31,6 +31,42 @@ fn create_allows_new_relationship_type_when_graph_is_not_empty() {
|
|
|
31
31
|
));
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
#[test]
|
|
35
|
+
fn unwind_alias_allows_property_access_with_unknown_keys() {
|
|
36
|
+
// Regression: when the playground import driver runs
|
|
37
|
+
// UNWIND $rows AS r CREATE (:Label {`User Id`: r.`User Id`})
|
|
38
|
+
// against a non-empty graph that has never seen "User Id" as a
|
|
39
|
+
// property key, the analyzer used to reject `r.\`User Id\`` as an
|
|
40
|
+
// unknown property. UNWIND-bound vars hold whatever the parameter
|
|
41
|
+
// payload carries, so property access on them must skip the
|
|
42
|
+
// catalog check.
|
|
43
|
+
let mut graph = InMemoryGraph::new();
|
|
44
|
+
let _ = graph.create_node(vec!["Other".into()], Properties::new());
|
|
45
|
+
|
|
46
|
+
let doc = parse_query(
|
|
47
|
+
"UNWIND $rows AS r CREATE (:People {`User Id`: r.`User Id`, `First Name`: r.`First Name`})",
|
|
48
|
+
)
|
|
49
|
+
.unwrap();
|
|
50
|
+
let mut analyzer = Analyzer::new(&graph);
|
|
51
|
+
analyzer
|
|
52
|
+
.analyze(&doc)
|
|
53
|
+
.expect("UNWIND-bound row variable should allow any property key");
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
#[test]
|
|
57
|
+
fn parameter_property_access_allowed_with_unknown_keys() {
|
|
58
|
+
// Parameters are runtime maps the analyzer can't introspect — keys
|
|
59
|
+
// on `$ctx.foo` must not be gated by the graph catalog either.
|
|
60
|
+
let mut graph = InMemoryGraph::new();
|
|
61
|
+
let _ = graph.create_node(vec!["Other".into()], Properties::new());
|
|
62
|
+
|
|
63
|
+
let doc = parse_query("RETURN $ctx.user_id AS u").unwrap();
|
|
64
|
+
let mut analyzer = Analyzer::new(&graph);
|
|
65
|
+
analyzer
|
|
66
|
+
.analyze(&doc)
|
|
67
|
+
.expect("property access on a parameter should skip the catalog check");
|
|
68
|
+
}
|
|
69
|
+
|
|
34
70
|
// --- Vector function analyzer tests ----------------------------------
|
|
35
71
|
|
|
36
72
|
#[test]
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
//! Row-level bulk import / export driver.
|
|
2
|
+
//!
|
|
3
|
+
//! Thin orchestration on top of [`lora_io`]. Export drives the existing
|
|
4
|
+
//! [`QueryStream`] through a [`lora_io::RowEncoder`]; import drives a
|
|
5
|
+
//! [`lora_io::RowDecoder`] through batched
|
|
6
|
+
//! `UNWIND $rows AS r CREATE …` statements either generated from a
|
|
7
|
+
//! [`lora_io::RowMapping`] (auto-mapping path) or supplied verbatim by
|
|
8
|
+
//! the caller (Cypher template escape hatch).
|
|
9
|
+
|
|
10
|
+
use std::any::Any;
|
|
11
|
+
use std::collections::BTreeMap;
|
|
12
|
+
use std::io::{BufRead, Write};
|
|
13
|
+
|
|
14
|
+
use lora_executor::{ExecuteOptions, LoraValue, QueryResult, ResultFormat};
|
|
15
|
+
use lora_io::{
|
|
16
|
+
CsvDecoder, CsvEncoder, Format, JsonArrayDecoder, JsonArrayEncoder, JsonlDecoder, JsonlEncoder,
|
|
17
|
+
RowDecoder, RowEncoder, RowMapping,
|
|
18
|
+
};
|
|
19
|
+
use lora_store::{GraphStorage, GraphStorageMut, InMemoryGraph};
|
|
20
|
+
|
|
21
|
+
use crate::error::{LoraError, LoraErrorCode};
|
|
22
|
+
use crate::Database;
|
|
23
|
+
|
|
24
|
+
/// Rows-shipped accounting from an export run.
|
|
25
|
+
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
|
|
26
|
+
pub struct ExportStats {
|
|
27
|
+
pub rows: u64,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// Rows-shipped accounting from an import run.
|
|
31
|
+
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
|
|
32
|
+
pub struct ImportStats {
|
|
33
|
+
pub rows: u64,
|
|
34
|
+
pub batches: u64,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// Default batch size for [`Database::import_rows`] /
|
|
38
|
+
/// [`Database::import_with_template`] when none is supplied. Sized to
|
|
39
|
+
/// keep `$rows` parameter payloads roughly bounded for typical row widths.
|
|
40
|
+
pub const DEFAULT_IMPORT_BATCH_SIZE: usize = 1_000;
|
|
41
|
+
|
|
42
|
+
impl<S> Database<S>
|
|
43
|
+
where
|
|
44
|
+
S: GraphStorage + GraphStorageMut + Any + Clone + Send + Sync + 'static,
|
|
45
|
+
{
|
|
46
|
+
/// Encode a query's results into `writer`. Materialises the full
|
|
47
|
+
/// result set first (`RowArrays` projection) before encoding, so
|
|
48
|
+
/// peak memory is `O(result rows)`. Works on any storage backend.
|
|
49
|
+
///
|
|
50
|
+
/// For the in-memory backend prefer
|
|
51
|
+
/// [`Database::export_query_streaming`], which pulls rows from
|
|
52
|
+
/// the engine's true streaming cursor and keeps peak memory
|
|
53
|
+
/// bounded by the encoder buffer.
|
|
54
|
+
pub fn export_query<W: Write>(
|
|
55
|
+
&self,
|
|
56
|
+
query: &str,
|
|
57
|
+
params: BTreeMap<String, LoraValue>,
|
|
58
|
+
format: Format,
|
|
59
|
+
writer: W,
|
|
60
|
+
) -> Result<ExportStats, LoraError> {
|
|
61
|
+
match format {
|
|
62
|
+
Format::Jsonl => self.drive_export(query, params, JsonlEncoder::new(writer)),
|
|
63
|
+
Format::Json => self.drive_export(query, params, JsonArrayEncoder::new(writer)),
|
|
64
|
+
Format::Csv => self.drive_export(query, params, CsvEncoder::new(writer)),
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
fn drive_export<E: RowEncoder>(
|
|
69
|
+
&self,
|
|
70
|
+
query: &str,
|
|
71
|
+
params: BTreeMap<String, LoraValue>,
|
|
72
|
+
mut encoder: E,
|
|
73
|
+
) -> Result<ExportStats, LoraError> {
|
|
74
|
+
// Use the RowArrays result format so we get plan-derived
|
|
75
|
+
// column ordering even when the result set is empty. The
|
|
76
|
+
// executor materializes rows once; we drive them through
|
|
77
|
+
// the encoder row-at-a-time so memory stays bounded by the
|
|
78
|
+
// result set, not by the on-disk output size.
|
|
79
|
+
let result = self.execute_with_params(
|
|
80
|
+
query,
|
|
81
|
+
Some(ExecuteOptions {
|
|
82
|
+
format: ResultFormat::RowArrays,
|
|
83
|
+
}),
|
|
84
|
+
params,
|
|
85
|
+
)?;
|
|
86
|
+
let QueryResult::RowArrays(arrays) = result else {
|
|
87
|
+
return Err(LoraError::new(
|
|
88
|
+
LoraErrorCode::Internal,
|
|
89
|
+
"expected RowArrays result for export".to_string(),
|
|
90
|
+
));
|
|
91
|
+
};
|
|
92
|
+
encoder.begin(&arrays.columns).map_err(io_err)?;
|
|
93
|
+
let mut rows = 0u64;
|
|
94
|
+
for row_vals in arrays.rows {
|
|
95
|
+
let pairs: Vec<(String, LoraValue)> =
|
|
96
|
+
arrays.columns.iter().cloned().zip(row_vals).collect();
|
|
97
|
+
encoder.write_named_row(&pairs).map_err(io_err)?;
|
|
98
|
+
rows += 1;
|
|
99
|
+
}
|
|
100
|
+
encoder.finish().map_err(io_err)?;
|
|
101
|
+
Ok(ExportStats { rows })
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/// Decode rows from `reader` and apply them to the graph via the
|
|
105
|
+
/// supplied [`RowMapping`]. The mapping renders a parameterised
|
|
106
|
+
/// `UNWIND $rows AS r CREATE …` template; rows are batched and
|
|
107
|
+
/// each batch executes as a single auto-committed statement.
|
|
108
|
+
pub fn import_rows<R: BufRead>(
|
|
109
|
+
&self,
|
|
110
|
+
reader: R,
|
|
111
|
+
format: Format,
|
|
112
|
+
mapping: &RowMapping,
|
|
113
|
+
batch_size: Option<usize>,
|
|
114
|
+
) -> Result<ImportStats, LoraError> {
|
|
115
|
+
let template = mapping.to_cypher().map_err(|e| {
|
|
116
|
+
LoraError::new(
|
|
117
|
+
LoraErrorCode::InvalidParams,
|
|
118
|
+
format!("invalid row mapping: {e}"),
|
|
119
|
+
)
|
|
120
|
+
})?;
|
|
121
|
+
self.import_with_template(reader, format, &template, batch_size)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/// Decode rows from `reader` and execute `template` once per
|
|
125
|
+
/// batch with `$rows` bound to that batch's row objects. The
|
|
126
|
+
/// caller-supplied template is the escape hatch for the
|
|
127
|
+
/// auto-mapping path — anything Cypher can express is fair game.
|
|
128
|
+
pub fn import_with_template<R: BufRead>(
|
|
129
|
+
&self,
|
|
130
|
+
reader: R,
|
|
131
|
+
format: Format,
|
|
132
|
+
template: &str,
|
|
133
|
+
batch_size: Option<usize>,
|
|
134
|
+
) -> Result<ImportStats, LoraError> {
|
|
135
|
+
let batch = batch_size.unwrap_or(DEFAULT_IMPORT_BATCH_SIZE).max(1);
|
|
136
|
+
match format {
|
|
137
|
+
Format::Jsonl => self.drive_import(template, JsonlDecoder::new(reader), batch),
|
|
138
|
+
Format::Json => self.drive_import(template, JsonArrayDecoder::new(reader), batch),
|
|
139
|
+
Format::Csv => self.drive_import(template, CsvDecoder::new(reader), batch),
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
fn drive_import<D: RowDecoder>(
|
|
144
|
+
&self,
|
|
145
|
+
template: &str,
|
|
146
|
+
mut decoder: D,
|
|
147
|
+
batch_size: usize,
|
|
148
|
+
) -> Result<ImportStats, LoraError> {
|
|
149
|
+
// Eagerly read the header so format errors surface before any
|
|
150
|
+
// mutations happen.
|
|
151
|
+
decoder.header().map_err(io_err)?;
|
|
152
|
+
|
|
153
|
+
let mut stats = ImportStats::default();
|
|
154
|
+
let mut buf: Vec<LoraValue> = Vec::with_capacity(batch_size);
|
|
155
|
+
|
|
156
|
+
while let Some(cells) = decoder.next_row().map_err(io_err)? {
|
|
157
|
+
let row_map: BTreeMap<String, LoraValue> = cells.into_iter().collect();
|
|
158
|
+
buf.push(LoraValue::Map(row_map));
|
|
159
|
+
if buf.len() >= batch_size {
|
|
160
|
+
self.flush_batch(template, &mut buf, &mut stats)?;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if !buf.is_empty() {
|
|
164
|
+
self.flush_batch(template, &mut buf, &mut stats)?;
|
|
165
|
+
}
|
|
166
|
+
Ok(stats)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
fn flush_batch(
|
|
170
|
+
&self,
|
|
171
|
+
template: &str,
|
|
172
|
+
buf: &mut Vec<LoraValue>,
|
|
173
|
+
stats: &mut ImportStats,
|
|
174
|
+
) -> Result<(), LoraError> {
|
|
175
|
+
let batch = std::mem::take(buf);
|
|
176
|
+
let batch_len = batch.len() as u64;
|
|
177
|
+
let mut params = BTreeMap::new();
|
|
178
|
+
params.insert("rows".to_string(), LoraValue::List(batch));
|
|
179
|
+
self.execute_with_params(template, None, params)?;
|
|
180
|
+
stats.rows += batch_len;
|
|
181
|
+
stats.batches += 1;
|
|
182
|
+
Ok(())
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
fn io_err(err: std::io::Error) -> LoraError {
|
|
187
|
+
LoraError::with_source(LoraErrorCode::Io, format!("{err}"), err)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
impl Database<InMemoryGraph> {
|
|
191
|
+
/// Stream a query's results through the chosen [`Format`] into
|
|
192
|
+
/// `writer` using the engine's true pull cursor.
|
|
193
|
+
///
|
|
194
|
+
/// Where [`Database::export_query`] materialises the full result
|
|
195
|
+
/// set first (`RowArrays` projection), this variant pulls rows
|
|
196
|
+
/// row-at-a-time off [`Self::stream_with_params`] and feeds each
|
|
197
|
+
/// one to the encoder. Peak engine-side memory stays bounded by
|
|
198
|
+
/// the encoder's internal buffer — typically tens of KiB —
|
|
199
|
+
/// regardless of total row count.
|
|
200
|
+
///
|
|
201
|
+
/// Specialised on [`InMemoryGraph`] because the true streaming
|
|
202
|
+
/// cursor lives on that impl block.
|
|
203
|
+
pub fn export_query_streaming<W: Write>(
|
|
204
|
+
&self,
|
|
205
|
+
query: &str,
|
|
206
|
+
params: BTreeMap<String, LoraValue>,
|
|
207
|
+
format: Format,
|
|
208
|
+
writer: W,
|
|
209
|
+
) -> Result<ExportStats, LoraError> {
|
|
210
|
+
match format {
|
|
211
|
+
Format::Jsonl => self.drive_streaming_export(query, params, JsonlEncoder::new(writer)),
|
|
212
|
+
Format::Json => {
|
|
213
|
+
self.drive_streaming_export(query, params, JsonArrayEncoder::new(writer))
|
|
214
|
+
}
|
|
215
|
+
Format::Csv => self.drive_streaming_export(query, params, CsvEncoder::new(writer)),
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
fn drive_streaming_export<E: RowEncoder>(
|
|
220
|
+
&self,
|
|
221
|
+
query: &str,
|
|
222
|
+
params: BTreeMap<String, LoraValue>,
|
|
223
|
+
mut encoder: E,
|
|
224
|
+
) -> Result<ExportStats, LoraError> {
|
|
225
|
+
let mut stream = self.stream_with_params(query, params)?;
|
|
226
|
+
let columns = stream.columns().to_vec();
|
|
227
|
+
encoder.begin(&columns).map_err(io_err)?;
|
|
228
|
+
let mut rows = 0u64;
|
|
229
|
+
while let Some(row) = stream.next_row().map_err(LoraError::from_anyhow)? {
|
|
230
|
+
encoder.write_row(&row).map_err(io_err)?;
|
|
231
|
+
rows += 1;
|
|
232
|
+
}
|
|
233
|
+
encoder.finish().map_err(io_err)?;
|
|
234
|
+
Ok(ExportStats { rows })
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
#[cfg(test)]
|
|
239
|
+
mod tests {
|
|
240
|
+
use super::*;
|
|
241
|
+
|
|
242
|
+
#[test]
|
|
243
|
+
fn round_trip_node_import_then_export() {
|
|
244
|
+
let db = Database::in_memory();
|
|
245
|
+
|
|
246
|
+
let csv = "name:string,age:int\nalice,30\nbob,25\n";
|
|
247
|
+
let mapping = RowMapping::Node {
|
|
248
|
+
label: "User".into(),
|
|
249
|
+
id_column: None,
|
|
250
|
+
id_property: None,
|
|
251
|
+
properties: vec![
|
|
252
|
+
lora_io::ColumnSpec::identity("name"),
|
|
253
|
+
lora_io::ColumnSpec::identity("age"),
|
|
254
|
+
],
|
|
255
|
+
};
|
|
256
|
+
let stats = db
|
|
257
|
+
.import_rows(std::io::Cursor::new(csv), Format::Csv, &mapping, Some(10))
|
|
258
|
+
.unwrap();
|
|
259
|
+
assert_eq!(stats.rows, 2);
|
|
260
|
+
assert_eq!(stats.batches, 1);
|
|
261
|
+
|
|
262
|
+
let mut out = Vec::new();
|
|
263
|
+
let export = db
|
|
264
|
+
.export_query(
|
|
265
|
+
"MATCH (u:User) RETURN u.name AS name, u.age AS age ORDER BY name",
|
|
266
|
+
BTreeMap::new(),
|
|
267
|
+
Format::Jsonl,
|
|
268
|
+
&mut out,
|
|
269
|
+
)
|
|
270
|
+
.unwrap();
|
|
271
|
+
assert_eq!(export.rows, 2);
|
|
272
|
+
let text = std::str::from_utf8(&out).unwrap();
|
|
273
|
+
let lines: Vec<_> = text.lines().collect();
|
|
274
|
+
assert_eq!(lines.len(), 2);
|
|
275
|
+
assert!(lines[0].contains("\"alice\""));
|
|
276
|
+
assert!(lines[1].contains("\"bob\""));
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/// Property names with spaces — e.g. `User Id` from a CSV header —
|
|
280
|
+
/// are backtick-quoted by `RowMapping::to_cypher` and must analyze
|
|
281
|
+
/// even when the graph already holds unrelated nodes. Regression
|
|
282
|
+
/// for the playground bug where the second batch raised
|
|
283
|
+
/// `unknown property `User Id``.
|
|
284
|
+
#[test]
|
|
285
|
+
fn import_handles_property_names_with_spaces_in_non_empty_graph() {
|
|
286
|
+
let db = Database::in_memory();
|
|
287
|
+
db.execute("CREATE (:Other {tag: 1})", None).unwrap();
|
|
288
|
+
|
|
289
|
+
let csv = "User Id,First Name\nu1,Alice\nu2,Bob\nu3,Carol\n";
|
|
290
|
+
let mapping = RowMapping::Node {
|
|
291
|
+
label: "People".into(),
|
|
292
|
+
id_column: None,
|
|
293
|
+
id_property: None,
|
|
294
|
+
properties: vec![
|
|
295
|
+
lora_io::ColumnSpec::identity("User Id"),
|
|
296
|
+
lora_io::ColumnSpec::identity("First Name"),
|
|
297
|
+
],
|
|
298
|
+
};
|
|
299
|
+
let stats = db
|
|
300
|
+
.import_rows(std::io::Cursor::new(csv), Format::Csv, &mapping, Some(2))
|
|
301
|
+
.expect("import with quoted property names should succeed");
|
|
302
|
+
assert_eq!(stats.rows, 3);
|
|
303
|
+
assert!(stats.batches >= 2, "expected at least 2 batches");
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
#[test]
|
|
307
|
+
fn cypher_template_import() {
|
|
308
|
+
let db = Database::in_memory();
|
|
309
|
+
let jsonl = "{\"name\":\"alice\",\"age\":30}\n{\"name\":\"bob\",\"age\":25}\n";
|
|
310
|
+
let stats = db
|
|
311
|
+
.import_with_template(
|
|
312
|
+
std::io::Cursor::new(jsonl),
|
|
313
|
+
Format::Jsonl,
|
|
314
|
+
"UNWIND $rows AS r CREATE (:Person {name: r.name, age: r.age})",
|
|
315
|
+
Some(50),
|
|
316
|
+
)
|
|
317
|
+
.unwrap();
|
|
318
|
+
assert_eq!(stats.rows, 2);
|
|
319
|
+
|
|
320
|
+
let res = db
|
|
321
|
+
.execute(
|
|
322
|
+
"MATCH (p:Person) RETURN count(p) AS c",
|
|
323
|
+
Some(ExecuteOptions {
|
|
324
|
+
format: ResultFormat::RowArrays,
|
|
325
|
+
}),
|
|
326
|
+
)
|
|
327
|
+
.unwrap();
|
|
328
|
+
match res {
|
|
329
|
+
QueryResult::RowArrays(r) => {
|
|
330
|
+
let LoraValue::Int(c) = &r.rows[0][0] else {
|
|
331
|
+
panic!("expected Int");
|
|
332
|
+
};
|
|
333
|
+
assert_eq!(*c, 2);
|
|
334
|
+
}
|
|
335
|
+
other => panic!("unexpected result {other:?}"),
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|