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.
Files changed (321) hide show
  1. {lora_python-0.12.0 → lora_python-0.13.0}/Cargo.lock +30 -18
  2. {lora_python-0.12.0 → lora_python-0.13.0}/Cargo.toml +14 -13
  3. {lora_python-0.12.0 → lora_python-0.13.0}/PKG-INFO +1 -1
  4. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/clauses.rs +5 -0
  5. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/state.rs +15 -2
  6. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/tests.rs +36 -0
  7. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/Cargo.toml +1 -0
  8. lora_python-0.13.0/crates/lora-database/src/io.rs +338 -0
  9. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/lib.rs +11 -0
  10. lora_python-0.13.0/crates/lora-io/Cargo.toml +23 -0
  11. lora_python-0.13.0/crates/lora-io/src/csv.rs +1138 -0
  12. lora_python-0.13.0/crates/lora-io/src/format.rs +259 -0
  13. lora_python-0.13.0/crates/lora-io/src/json_array.rs +579 -0
  14. lora_python-0.13.0/crates/lora-io/src/jsonl.rs +379 -0
  15. lora_python-0.13.0/crates/lora-io/src/lib.rs +33 -0
  16. lora_python-0.13.0/crates/lora-io/src/mapping.rs +311 -0
  17. lora_python-0.13.0/crates/lora-io/src/value_json.rs +336 -0
  18. {lora_python-0.12.0 → lora_python-0.13.0}/pyproject.toml +1 -1
  19. {lora_python-0.12.0 → lora_python-0.13.0}/LICENSE +0 -0
  20. {lora_python-0.12.0 → lora_python-0.13.0}/README.md +0 -0
  21. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/.gitignore +0 -0
  22. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/Cargo.toml +0 -0
  23. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/LICENSE +0 -0
  24. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/README.md +0 -0
  25. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/build.rs +0 -0
  26. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/examples/async_demo.py +0 -0
  27. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/examples/basic.py +0 -0
  28. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/src/errors.rs +0 -0
  29. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/src/from_python.rs +0 -0
  30. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/src/lib.rs +0 -0
  31. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/src/to_python.rs +0 -0
  32. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/tests/test_async.py +0 -0
  33. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
  34. {lora_python-0.12.0 → lora_python-0.13.0}/crates/bindings/lora-python/tests/test_sync.py +0 -0
  35. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/Cargo.toml +0 -0
  36. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
  37. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
  38. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
  39. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
  40. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/errors.rs +0 -0
  41. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/lib.rs +0 -0
  42. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/resolved.rs +0 -0
  43. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/scope.rs +0 -0
  44. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/src/symbols.rs +0 -0
  45. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-analyzer/tests/error_messages.rs +0 -0
  46. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-ast/Cargo.toml +0 -0
  47. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-ast/src/ast.rs +0 -0
  48. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-ast/src/lib.rs +0 -0
  49. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-builtins-meta/Cargo.toml +0 -0
  50. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-builtins-meta/src/lib.rs +0 -0
  51. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/Cargo.toml +0 -0
  52. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/lib.rs +0 -0
  53. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/logical.rs +0 -0
  54. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/optimizer.rs +0 -0
  55. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/pattern.rs +0 -0
  56. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/physical.rs +0 -0
  57. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/plan_tree.rs +0 -0
  58. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-compiler/src/planner.rs +0 -0
  59. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/README.md +0 -0
  60. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/advanced.rs +0 -0
  61. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/concurrency_guard.rs +0 -0
  62. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/concurrent.rs +0 -0
  63. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/engine.rs +0 -0
  64. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/fixtures.rs +0 -0
  65. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/index_acceleration.rs +0 -0
  66. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/perf_smoke.rs +0 -0
  67. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
  68. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/query_implementations.rs +0 -0
  69. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/realistic.rs +0 -0
  70. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/scale.rs +0 -0
  71. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/temporal_spatial.rs +0 -0
  72. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/benches/wal.rs +0 -0
  73. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/builder.rs +0 -0
  74. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/compile.rs +0 -0
  75. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/execute.rs +0 -0
  76. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/explain.rs +0 -0
  77. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/graph_api.rs +0 -0
  78. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/mod.rs +0 -0
  79. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/occ.rs +0 -0
  80. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/procedures.rs +0 -0
  81. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/profile.rs +0 -0
  82. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/pull_mode.rs +0 -0
  83. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/replay.rs +0 -0
  84. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/row_projection.rs +0 -0
  85. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/schema.rs +0 -0
  86. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/show_pipeline.rs +0 -0
  87. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/stream.rs +0 -0
  88. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/database/write_guard.rs +0 -0
  89. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/durable_io.rs +0 -0
  90. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/error.rs +0 -0
  91. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/explain.rs +0 -0
  92. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/live_store.rs +0 -0
  93. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/named.rs +0 -0
  94. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/plan_cache.rs +0 -0
  95. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/snapshot/json.rs +0 -0
  96. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/snapshot/mod.rs +0 -0
  97. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/snapshot/store.rs +0 -0
  98. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/stream.rs +0 -0
  99. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/transaction.rs +0 -0
  100. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/admin.rs +0 -0
  101. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/archive/format.rs +0 -0
  102. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/archive/lock.rs +0 -0
  103. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/archive/platform.rs +0 -0
  104. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/archive/worker.rs +0 -0
  105. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
  106. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/archive.rs +0 -0
  107. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/mod.rs +0 -0
  108. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/src/wal/write_scope.rs +0 -0
  109. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/advanced_queries.rs +0 -0
  110. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/aggregation.rs +0 -0
  111. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/backend_stub.rs +0 -0
  112. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/binary.rs +0 -0
  113. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/builtin_namespaces.rs +0 -0
  114. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/constraints.rs +0 -0
  115. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/create.rs +0 -0
  116. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/docs_examples.rs +0 -0
  117. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/error_messages.rs +0 -0
  118. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/errors.rs +0 -0
  119. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/explain_profile.rs +0 -0
  120. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/expressions.rs +0 -0
  121. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/foreach.rs +0 -0
  122. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/fulltext_index.rs +0 -0
  123. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/functions_extended.rs +0 -0
  124. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/index_acceleration.rs +0 -0
  125. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/invariants.rs +0 -0
  126. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/managed_snapshots.rs +0 -0
  127. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/match.rs +0 -0
  128. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/merge.rs +0 -0
  129. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/ordering.rs +0 -0
  130. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/parameters.rs +0 -0
  131. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/parser.rs +0 -0
  132. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/paths.rs +0 -0
  133. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/projection.rs +0 -0
  134. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/scale.rs +0 -0
  135. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/schema.rs +0 -0
  136. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/seeds.rs +0 -0
  137. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/snapshot.rs +0 -0
  138. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/spatial.rs +0 -0
  139. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/temporal.rs +0 -0
  140. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/test_helpers.rs +0 -0
  141. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/transactions.rs +0 -0
  142. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/types_advanced.rs +0 -0
  143. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/union.rs +0 -0
  144. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
  145. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/update.rs +0 -0
  146. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/vector_index.rs +0 -0
  147. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/vectors.rs +0 -0
  148. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/wal.rs +0 -0
  149. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/where_clause.rs +0 -0
  150. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-database/tests/with.rs +0 -0
  151. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/Cargo.toml +0 -0
  152. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/errors.rs +0 -0
  153. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/binops.rs +0 -0
  154. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -0
  155. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
  156. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
  157. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
  158. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
  159. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
  160. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
  161. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/list.rs +0 -0
  162. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
  163. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
  164. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
  165. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
  166. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/number.rs +0 -0
  167. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
  168. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
  169. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
  170. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
  171. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
  172. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
  173. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
  174. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
  175. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/errors.rs +0 -0
  176. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/expr.rs +0 -0
  177. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/functions.rs +0 -0
  178. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/mod.rs +0 -0
  179. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/point.rs +0 -0
  180. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/regex.rs +0 -0
  181. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/eval/vector.rs +0 -0
  182. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/aggregation.rs +0 -0
  183. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/helpers.rs +0 -0
  184. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/immutable.rs +0 -0
  185. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/mod.rs +0 -0
  186. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/mutable.rs +0 -0
  187. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/optional.rs +0 -0
  188. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/executor/sort.rs +0 -0
  189. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/lib.rs +0 -0
  190. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/profile.rs +0 -0
  191. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/aggregate.rs +0 -0
  192. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
  193. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/columns.rs +0 -0
  194. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/context.rs +0 -0
  195. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/expand.rs +0 -0
  196. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/filter.rs +0 -0
  197. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/hydration.rs +0 -0
  198. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/mod.rs +0 -0
  199. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/mutable.rs +0 -0
  200. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/optional.rs +0 -0
  201. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/path.rs +0 -0
  202. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/projection.rs +0 -0
  203. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/scan.rs +0 -0
  204. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/shape.rs +0 -0
  205. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/sort.rs +0 -0
  206. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/source.rs +0 -0
  207. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/tests.rs +0 -0
  208. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/traits.rs +0 -0
  209. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/pull/union.rs +0 -0
  210. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/src/value.rs +0 -0
  211. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-executor/tests/error_messages.rs +0 -0
  212. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/Cargo.toml +0 -0
  213. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/cypher.pest +0 -0
  214. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/errors.rs +0 -0
  215. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/lib.rs +0 -0
  216. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/clauses.rs +0 -0
  217. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/expressions.rs +0 -0
  218. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/literals.rs +0 -0
  219. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/mod.rs +0 -0
  220. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/patterns.rs +0 -0
  221. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/query.rs +0 -0
  222. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/schema.rs +0 -0
  223. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/tests.rs +0 -0
  224. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/src/parser/util.rs +0 -0
  225. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-parser/tests/error_messages.rs +0 -0
  226. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/Cargo.toml +0 -0
  227. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/body.rs +0 -0
  228. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/codec.rs +0 -0
  229. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/columnar.rs +0 -0
  230. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/envelope.rs +0 -0
  231. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/errors.rs +0 -0
  232. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/format.rs +0 -0
  233. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/lib.rs +0 -0
  234. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/options.rs +0 -0
  235. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/tests.rs +0 -0
  236. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/transform.rs +0 -0
  237. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/src/view.rs +0 -0
  238. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-snapshot/tests/error_messages.rs +0 -0
  239. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/Cargo.toml +0 -0
  240. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/codec.rs +0 -0
  241. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/lib.rs +0 -0
  242. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/lock_table.rs +0 -0
  243. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
  244. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/constraint_enforce.rs +0 -0
  245. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/entity_index_store.rs +0 -0
  246. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/fulltext_index.rs +0 -0
  247. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/graph.rs +0 -0
  248. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/hnsw.rs +0 -0
  249. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/impls.rs +0 -0
  250. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/index_catalog.rs +0 -0
  251. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/mod.rs +0 -0
  252. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/point_index.rs +0 -0
  253. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/property_index.rs +0 -0
  254. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/secondary_index_maintenance.rs +0 -0
  255. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/snapshot.rs +0 -0
  256. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/sorted_property_index.rs +0 -0
  257. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/stats.rs +0 -0
  258. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/tests.rs +0 -0
  259. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/text_index.rs +0 -0
  260. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/memory/vector_index.rs +0 -0
  261. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/mutation.rs +0 -0
  262. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/snapshot.rs +0 -0
  263. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/traits.rs +0 -0
  264. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/binary/mod.rs +0 -0
  265. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/binary/tests.rs +0 -0
  266. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/binary/traits.rs +0 -0
  267. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/binary/types.rs +0 -0
  268. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/graph.rs +0 -0
  269. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/mod.rs +0 -0
  270. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/property_value.rs +0 -0
  271. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/spatial/distance.rs +0 -0
  272. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/spatial/mod.rs +0 -0
  273. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/spatial/point.rs +0 -0
  274. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/spatial/srid.rs +0 -0
  275. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/spatial/tests.rs +0 -0
  276. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
  277. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/date.rs +0 -0
  278. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
  279. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/duration.rs +0 -0
  280. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/format.rs +0 -0
  281. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/mod.rs +0 -0
  282. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
  283. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/temporal/time.rs +0 -0
  284. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/vector/build.rs +0 -0
  285. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/vector/mod.rs +0 -0
  286. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/vector/similarity.rs +0 -0
  287. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/vector/tests.rs +0 -0
  288. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/src/types/vector/types.rs +0 -0
  289. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-store/tests/error_messages.rs +0 -0
  290. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/Cargo.toml +0 -0
  291. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/codec/decode.rs +0 -0
  292. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/codec/encode.rs +0 -0
  293. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/codec/format.rs +0 -0
  294. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/codec/mod.rs +0 -0
  295. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/codec/tests.rs +0 -0
  296. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/config.rs +0 -0
  297. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/dir.rs +0 -0
  298. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/errors.rs +0 -0
  299. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/io.rs +0 -0
  300. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/lib.rs +0 -0
  301. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/lock.rs +0 -0
  302. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/lsn.rs +0 -0
  303. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/record.rs +0 -0
  304. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/recorder/errors.rs +0 -0
  305. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/recorder/mirror.rs +0 -0
  306. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/recorder/mod.rs +0 -0
  307. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/recorder/recorder.rs +0 -0
  308. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/recorder/tests.rs +0 -0
  309. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/replay.rs +0 -0
  310. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/segment.rs +0 -0
  311. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/testing.rs +0 -0
  312. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
  313. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/wal/mod.rs +0 -0
  314. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/wal/tests.rs +0 -0
  315. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/src/wal/wal.rs +0 -0
  316. {lora_python-0.12.0 → lora_python-0.13.0}/crates/lora-wal/tests/error_messages.rs +0 -0
  317. {lora_python-0.12.0 → lora_python-0.13.0}/python/lora_python/__init__.py +0 -0
  318. {lora_python-0.12.0 → lora_python-0.13.0}/python/lora_python/_async.py +0 -0
  319. {lora_python-0.12.0 → lora_python-0.13.0}/python/lora_python/_native.pyi +0 -0
  320. {lora_python-0.12.0 → lora_python-0.13.0}/python/lora_python/py.typed +0 -0
  321. {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.12.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.12.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.12.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.12.0"
802
+ version = "0.13.0"
803
803
 
804
804
  [[package]]
805
805
  name = "lora-compiler"
806
- version = "0.12.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.12.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.12.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.12.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.12.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.12.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.12.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.12.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.12.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.12.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.12.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.12.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.12.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.12.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.12.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.12.0" }
19
- lora-parser = { path = "crates/lora-parser", version = "=0.12.0" }
20
- lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.12.0" }
21
- lora-analyzer = { path = "crates/lora-analyzer", version = "=0.12.0" }
22
- lora-compiler = { path = "crates/lora-compiler", version = "=0.12.0" }
23
- lora-store = { path = "crates/lora-store", version = "=0.12.0" }
24
- lora-snapshot = { path = "crates/lora-snapshot", version = "=0.12.0", default-features = false }
25
- lora-wal = { path = "crates/lora-wal", version = "=0.12.0" }
26
- lora-executor = { path = "crates/lora-executor", version = "=0.12.0", default-features = false }
27
- lora-database = { path = "crates/lora-database", version = "=0.12.0" }
28
- lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.12.0" }
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"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lora-python
3
- Version: 0.12.0
3
+ Version: 0.13.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -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
- ResolvedExpr::Map(_) => true,
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]
@@ -36,6 +36,7 @@ lora-compiler.workspace = true
36
36
  lora-executor = { workspace = true, default-features = false }
37
37
  lora-store.workspace = true
38
38
  lora-snapshot.workspace = true
39
+ lora-io.workspace = true
39
40
  lora-wal.workspace = true
40
41
 
41
42
  serde_json.workspace = true
@@ -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
+ }