hyperstreamdb 0.1.3__tar.gz → 0.1.6__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 (214) hide show
  1. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/Cargo.lock +1 -1
  2. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/Cargo.toml +1 -1
  3. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/PKG-INFO +3 -1
  4. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/pyproject.toml +3 -2
  5. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/iceberg.rs +9 -2
  6. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/dist.rs +2 -1
  7. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/hnswio.rs +8 -10
  8. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/metadata.rs +6 -1
  9. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/reader.rs +1 -1
  10. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/segment.rs +14 -17
  11. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/table.rs +132 -8
  12. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/lib.rs +2 -2
  13. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/python_binding.rs +1 -1
  14. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/python_gpu_context.rs +1 -1
  15. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/.gitattributes +0 -0
  16. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/.gitignore +0 -0
  17. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/.hypothesis/constants/32b327793848e7d8 +0 -0
  18. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/.hypothesis/constants/67b0a8ccf18bf5d2 +0 -0
  19. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/.hypothesis/constants/84828557b4ee7be4 +0 -0
  20. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/.instructions.md +0 -0
  21. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/DORIS_OPTIMIZATION_PATTERNS.md +0 -0
  22. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/LICENSE-APACHE +0 -0
  23. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/LICENSE-MIT +0 -0
  24. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/README.md +0 -0
  25. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/RUN_COMPLIANCE_TESTS.sh +0 -0
  26. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/STEERING.md +0 -0
  27. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/THIRDPARTY_NOTICES.md +0 -0
  28. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/benches/bench_table.rs +0 -0
  29. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/benches/performance.rs +0 -0
  30. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/book.toml +0 -0
  31. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/build-connectors.sh +0 -0
  32. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/build.rs +0 -0
  33. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/build_out.txt +0 -0
  34. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/check_iceberg_compliance.py +0 -0
  35. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/clippy_output.txt +0 -0
  36. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docker-compose-minio-nessie.yml +0 -0
  37. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docker-compose.yml +0 -0
  38. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/BENCHMARKING.md +0 -0
  39. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/COMPREHENSIVE_GUIDE.md +0 -0
  40. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/GPU_SETUP_GUIDE.md +0 -0
  41. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/ICEBERG_V2_V3_API.md +0 -0
  42. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/PGVECTOR_SQL_GUIDE.md +0 -0
  43. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/PYTHON_VECTOR_API.md +0 -0
  44. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/VECTOR_CONFIGURATION.md +0 -0
  45. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/api_reference.md +0 -0
  46. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/architecture.md +0 -0
  47. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/catalog_usage.md +0 -0
  48. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/index.md +0 -0
  49. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/integrations/README.md +0 -0
  50. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/integrations/java_jni.md +0 -0
  51. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/integrations/python.md +0 -0
  52. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/integrations/spark.md +0 -0
  53. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/integrations/trino.md +0 -0
  54. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/fix_cache.patch +0 -0
  55. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/fix_nb.py +0 -0
  56. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/fix_schema.patch +0 -0
  57. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/proptest-regressions/core/index/gpu.txt +0 -0
  58. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/proptest-regressions/core/sql/vector_literal.txt +0 -0
  59. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/proptest-regressions/core/sql/vector_udf.txt +0 -0
  60. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/python/hyperstreamdb/__init__.py +0 -0
  61. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/python/hyperstreamdb/embeddings.py +0 -0
  62. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/.bloop/bloop.settings.json +0 -0
  63. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/.bloop/spark-hyperstream-test.json +0 -0
  64. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/.bloop/spark-hyperstream.json +0 -0
  65. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/pom.xml +0 -0
  66. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/DefaultSource.java +0 -0
  67. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamPartition.java +0 -0
  68. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamPartitionReader.java +0 -0
  69. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamPartitionReaderFactory.java +0 -0
  70. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamScanBuilder.java +0 -0
  71. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamTable.java +0 -0
  72. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/bin/gateway.rs +0 -0
  73. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/bin/hdb.rs +0 -0
  74. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/bin/iceberg_rest.rs +0 -0
  75. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/bin/probe_datafusion.rs +0 -0
  76. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/bin/setup_test_data.rs +0 -0
  77. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/bin/verify_layered_indexing.rs +0 -0
  78. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/cache.rs +0 -0
  79. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/config.rs +0 -0
  80. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/glue.rs +0 -0
  81. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/hive.rs +0 -0
  82. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/jdbc.rs +0 -0
  83. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/mod.rs +0 -0
  84. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/nessie.rs +0 -0
  85. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/rest.rs +0 -0
  86. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/unity.rs +0 -0
  87. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/clustering.rs +0 -0
  88. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/compaction.rs +0 -0
  89. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/embeddings.rs +0 -0
  90. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/ffi.rs +0 -0
  91. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/iceberg/iceberg_delete.rs +0 -0
  92. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/cosine_distance.cu +0 -0
  93. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/hamming_distance.cu +0 -0
  94. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/inner_product.cu +0 -0
  95. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/jaccard_distance.cu +0 -0
  96. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/kmeans_assignment.cu +0 -0
  97. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/l1_distance.cu +0 -0
  98. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/l2_distance.cu +0 -0
  99. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/distance.rs +0 -0
  100. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/gpu.rs +0 -0
  101. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_ivf.rs +0 -0
  102. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/annhdf5.rs +0 -0
  103. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/api.rs +0 -0
  104. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/flatten.rs +0 -0
  105. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/hnsw.rs +0 -0
  106. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/libext.rs +0 -0
  107. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/mod.rs +0 -0
  108. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/prelude.rs +0 -0
  109. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/test.rs +0 -0
  110. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/ivf.rs +0 -0
  111. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/memory.rs +0 -0
  112. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mod.rs +0 -0
  113. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/cosine_distance.metal +0 -0
  114. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/hamming_distance.metal +0 -0
  115. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/inner_product.metal +0 -0
  116. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/jaccard_distance.metal +0 -0
  117. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/kmeans_assignment.metal +0 -0
  118. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/l1_distance.metal +0 -0
  119. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/l2_distance.metal +0 -0
  120. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/cosine_distance.cl +0 -0
  121. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/hamming_distance.cl +0 -0
  122. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/inner_product.cl +0 -0
  123. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/jaccard_distance.cl +0 -0
  124. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/kmeans_assignment.cl +0 -0
  125. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/l1_distance.cl +0 -0
  126. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/l2_distance.cl +0 -0
  127. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/pq.rs +0 -0
  128. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/tokenizer.rs +0 -0
  129. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/maintenance.rs +0 -0
  130. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/manifest.rs +0 -0
  131. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/merge.rs +0 -0
  132. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/mod.rs +0 -0
  133. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/nessie.rs +0 -0
  134. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/planner.rs +0 -0
  135. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/puffin.rs +0 -0
  136. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/query.rs +0 -0
  137. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/mod.rs +0 -0
  138. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/optimizer.rs +0 -0
  139. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/pgvector_rewriter.rs +0 -0
  140. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/physical_plan/index_join.rs +0 -0
  141. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/physical_plan.rs +0 -0
  142. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/session.rs +0 -0
  143. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/vector_literal.rs +0 -0
  144. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/vector_operators.rs +0 -0
  145. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/vector_udf.rs +0 -0
  146. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/storage.rs +0 -0
  147. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/table.rs.orig +0 -0
  148. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/wal.rs +0 -0
  149. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/enterprise/continuous_indexing.rs +0 -0
  150. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/enterprise/license.rs +0 -0
  151. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/enterprise/mod.rs +0 -0
  152. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/index.rs.old +0 -0
  153. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/python_distance.rs +0 -0
  154. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/telemetry/metrics.rs +0 -0
  155. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/telemetry/mod.rs +0 -0
  156. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/telemetry/tracing.rs +0 -0
  157. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/task.md +0 -0
  158. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/all_types_index_test.rs +0 -0
  159. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/bin/generate_iceberg_manifests.rs +0 -0
  160. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/bin/verify_iceberg_read_check.rs +0 -0
  161. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/data/download_nyc_taxi.sh +0 -0
  162. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/data/generate_embeddings.py +0 -0
  163. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/data/generate_wikipedia.py +0 -0
  164. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/data/start_nessie.sh +0 -0
  165. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/datafusion_rust_test.rs +0 -0
  166. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/debug_murmur3.rs +0 -0
  167. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/fuzz_murmur3.rs +0 -0
  168. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/integration_test_hnsw_ivf_native.rs +0 -0
  169. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/performance/README.md +0 -0
  170. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/prototype_merge.py +0 -0
  171. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/schema_evolution_test.rs +0 -0
  172. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_catalog_commit.rs +0 -0
  173. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_compliance.rs +0 -0
  174. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_delete_correctness.rs +0 -0
  175. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_iceberg_python_delete.sh +0 -0
  176. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_iceberg_rest.sh +0 -0
  177. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_iceberg_rest_create.sh +0 -0
  178. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_iceberg_rest_delete.sh +0 -0
  179. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_iceberg_rest_remove_index.sh +0 -0
  180. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_iceberg_rest_update.sh +0 -0
  181. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_metadata_creation.rs +0 -0
  182. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_mor_reads.rs +0 -0
  183. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_mor_writes.rs +0 -0
  184. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_partition_transforms.rs +0 -0
  185. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_partitioned_writes.rs +0 -0
  186. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_puffin_index.sh +0 -0
  187. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_rest_updates.sh +0 -0
  188. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_schema_compat.rs +0 -0
  189. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/.DS_Store +0 -0
  190. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/catalog/glue_catalog.properties +0 -0
  191. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/catalog/hyperstreamdb.properties +0 -0
  192. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/catalog/iceberg.properties +0 -0
  193. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/catalog/memory.properties +0 -0
  194. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/catalog/postgres.properties +0 -0
  195. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/config.properties +0 -0
  196. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/entrypoint.sh +0 -0
  197. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/jvm.config +0 -0
  198. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/node.properties +0 -0
  199. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config.zip +0 -0
  200. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/pom.xml +0 -0
  201. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBColumnHandle.java +0 -0
  202. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBConnectorFactory.java +0 -0
  203. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBMetadata.java +0 -0
  204. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBPageSource.java +0 -0
  205. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBPageSourceProvider.java +0 -0
  206. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBPlugin.java +0 -0
  207. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBSplit.java +0 -0
  208. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBSplitManager.java +0 -0
  209. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBTableHandle.java +0 -0
  210. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/update_schema_patch.py +0 -0
  211. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/update_schema_patch2.py +0 -0
  212. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/verify_docstrings.py +0 -0
  213. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/verify_fluent_api.py +0 -0
  214. {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/verify_unified_ingest.py +0 -0
@@ -3755,7 +3755,7 @@ dependencies = [
3755
3755
 
3756
3756
  [[package]]
3757
3757
  name = "hyperstreamdb"
3758
- version = "0.1.3"
3758
+ version = "0.1.6"
3759
3759
  dependencies = [
3760
3760
  "ahash 0.8.12",
3761
3761
  "anyhow",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "hyperstreamdb"
3
- version = "0.1.3"
3
+ version = "0.1.6"
4
4
  edition = "2021"
5
5
  license = "MIT AND Apache-2.0"
6
6
  description = "HyperStreamDB - Serverless Index-Streaming Database with Overlay Indexing and Vector Search"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hyperstreamdb
3
- Version: 0.1.3
3
+ Version: 0.1.6
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Programming Language :: Rust
@@ -23,6 +23,7 @@ Requires-Dist: intel-gpu ; extra == 'all-gpu'
23
23
  Requires-Dist: pytest>=7.0 ; extra == 'dev'
24
24
  Requires-Dist: pytest-asyncio>=0.21 ; extra == 'dev'
25
25
  Requires-Dist: maturin>=1.7 ; extra == 'dev'
26
+ Requires-Dist: maturin>=1.7 ; extra == 'src'
26
27
  Provides-Extra: all_gpu
27
28
  Provides-Extra: cuda
28
29
  Provides-Extra: dev
@@ -30,6 +31,7 @@ Provides-Extra: intel_cpu
30
31
  Provides-Extra: intel_gpu
31
32
  Provides-Extra: mps
32
33
  Provides-Extra: rocm
34
+ Provides-Extra: src
33
35
  License-File: LICENSE-APACHE
34
36
  License-File: LICENSE-MIT
35
37
  Summary: HyperStreamDB - Serverless Index-Streaming Database with Overlay Indexing
@@ -47,6 +47,7 @@ rocm = [] # AMD (via OpenCL/ROCm)
47
47
  intel_gpu = [] # Intel (OpenCL)
48
48
  intel_cpu = [] # Intel (SIMD/AVX2)
49
49
  all_gpu = ["mps", "cuda", "rocm", "intel_gpu"]
50
+ src = ["maturin>=1.7"]
50
51
 
51
52
  [project.urls]
52
53
  Homepage = "https://github.com/rla3rd/hyperstreamdb"
@@ -56,12 +57,12 @@ Repository = "https://github.com/rla3rd/hyperstreamdb"
56
57
  features = ["python"]
57
58
  # Map Python extras to Rust features
58
59
  extra-features = { mps = ["mps"], cuda = ["cuda"], rocm = ["rocm"], intel_gpu = ["intel_gpu"], intel_cpu = ["intel_cpu"] }
59
- module-name = "hyperstreamdb"
60
+ module-name = "hyperstreamdb.hyperstreamdb"
60
61
  python-source = "python"
61
62
  # Build both the Rust library and Python bindings
62
63
  bindings = "pyo3"
63
64
  sdist-include = ["LICENSE*", "README.md", "THIRDPARTY_NOTICES.md", "vendor/**/*", "tests/**/*", "benches/**/*"]
64
65
  # Optimizations for WHEEL builds
65
- strip = true
66
+ strip = false
66
67
  # Use sccache if available during build
67
68
  sccache = false
@@ -712,7 +712,10 @@ impl PositionDeleteReader {
712
712
  }
713
713
 
714
714
  if let (Some(fp), Some(p)) = (file_path, pos) {
715
- if fp == target_data_file_path {
715
+ let fp_clean = fp.replace("file://", "");
716
+ let target_clean = target_data_file_path.replace("file://", "");
717
+
718
+ if fp_clean == target_clean || target_clean.ends_with(&fp_clean) || fp_clean.ends_with(&target_clean) {
716
719
  deleted_positions.insert(p);
717
720
  }
718
721
  }
@@ -740,7 +743,11 @@ impl PositionDeleteReader {
740
743
  .ok_or_else(|| anyhow::anyhow!("pos column is not int64"))?;
741
744
 
742
745
  for i in 0..batch.num_rows() {
743
- if file_paths.value(i) == target_data_file_path {
746
+ let fp = file_paths.value(i);
747
+ let fp_clean = fp.replace("file://", "");
748
+ let target_clean = target_data_file_path.replace("file://", "");
749
+
750
+ if fp_clean == target_clean || target_clean.ends_with(&fp_clean) || fp_clean.ends_with(&target_clean) {
744
751
  deleted_positions.insert(positions.value(i));
745
752
  }
746
753
  }
@@ -14,6 +14,7 @@ use simdeez::sse2::*;
14
14
  use simdeez::*;
15
15
 
16
16
 
17
+
17
18
  /// The trait describing distance.
18
19
  /// For example for the L1 distance
19
20
  ///
@@ -1222,7 +1223,7 @@ fn test_jaccard_u16() {
1222
1223
 
1223
1224
 
1224
1225
 
1225
- extern "C" fn dist_func_float(va : *const f32, vb : *const f32, len : c_ulonglong) -> f32 {
1226
+ extern "C" fn dist_func_float(va : *const f32, vb : *const f32, len : u64) -> f32 {
1226
1227
  let mut dist : f32 = 0.;
1227
1228
  let sa = unsafe {std::slice::from_raw_parts(va, len as usize) };
1228
1229
  let sb = unsafe { std::slice::from_raw_parts(vb, len as usize) };
@@ -625,11 +625,10 @@ pub fn load_hnsw<T:'static+Serialize+DeserializeOwned+Clone+Sized+Send+Sync, D:D
625
625
  // for that we check for short names equality stripping
626
626
  log::debug!("distance in description = {:?}", distname);
627
627
  let d_type_name = type_name::<D>().to_string();
628
- let v: Vec<&str> = d_type_name.rsplit_terminator("::").collect();
629
- for s in v {
630
- log::info!(" distname in generic type argument {:?}", s);
631
- }
632
- if (std::any::TypeId::of::<T>() != std::any::TypeId::of::<NoData>()) && (d_type_name != distname) {
628
+ let d_short_name = d_type_name.rsplit("::").next().unwrap_or(&d_type_name);
629
+ let dist_short_name = distname.rsplit("::").next().unwrap_or(&distname);
630
+
631
+ if (std::any::TypeId::of::<T>() != std::any::TypeId::of::<NoData>()) && (d_short_name != dist_short_name) {
633
632
  // for all types except NoData , distance asked in reload declaration and distance in dump must be equal!
634
633
  let mut errmsg = String::from("error in distances : dumped distance is : ");
635
634
  errmsg.push_str(&distname);
@@ -687,11 +686,10 @@ pub fn load_hnsw_with_dist<T:'static+Serialize+DeserializeOwned+Clone+Sized+Send
687
686
  // for that we check for short names equality stripping
688
687
  log::debug!("distance in description = {:?}", distname);
689
688
  let d_type_name = type_name::<D>().to_string();
690
- let v: Vec<&str> = d_type_name.rsplit_terminator("::").collect();
691
- for s in v {
692
- log::info!(" distname in generic type argument {:?}", s);
693
- }
694
- if (std::any::TypeId::of::<T>() != std::any::TypeId::of::<NoData>()) && (d_type_name != distname) {
689
+ let d_short_name = d_type_name.rsplit("::").next().unwrap_or(&d_type_name);
690
+ let dist_short_name = distname.rsplit("::").next().unwrap_or(&distname);
691
+
692
+ if (std::any::TypeId::of::<T>() != std::any::TypeId::of::<NoData>()) && (d_short_name != dist_short_name) {
695
693
  // for all types except NoData , distance asked in reload declaration and distance in dump must be equal!
696
694
  let mut errmsg = String::from("error in distances : dumped distance is : ");
697
695
  errmsg.push_str(&distname);
@@ -61,6 +61,10 @@ pub struct TableMetadata {
61
61
  pub default_sort_order_id: i32,
62
62
  pub sort_orders: Vec<SortOrder>,
63
63
 
64
+ // Primary Key (Iceberg Identifier Fields)
65
+ #[serde(rename = "identifier-field-ids", default, skip_serializing_if = "Vec::is_empty")]
66
+ pub identifier_field_ids: Vec<i32>,
67
+
64
68
  // Properties
65
69
  #[serde(default)]
66
70
  pub properties: HashMap<String, String>,
@@ -109,7 +113,7 @@ impl TableMetadata {
109
113
  last_updated_ms: chrono::Utc::now().timestamp_millis(),
110
114
  last_column_id: schema.fields.iter().map(|f| f.id).max().unwrap_or(0),
111
115
  current_schema_id: schema.schema_id,
112
- schemas: vec![schema],
116
+ schemas: vec![schema.clone()],
113
117
  default_spec_id: partition_spec.spec_id,
114
118
  partition_specs: vec![partition_spec],
115
119
  default_sort_order_id: sort_order.order_id,
@@ -120,6 +124,7 @@ impl TableMetadata {
120
124
  snapshot_log: Vec::new(),
121
125
  metadata_log: Vec::new(),
122
126
  next_row_id: if format_version >= 3 { Some(0) } else { None },
127
+ identifier_field_ids: schema.identifier_field_ids.clone(),
123
128
  }
124
129
  }
125
130
 
@@ -203,7 +203,7 @@ impl HybridReader {
203
203
  }
204
204
 
205
205
  /// Load and merge all .del files into a single RoaringBitmap
206
- async fn load_merged_deletes(&self) -> Result<RoaringBitmap> {
206
+ pub async fn load_merged_deletes(&self) -> Result<RoaringBitmap> {
207
207
  let mut deleted_bitmap = RoaringBitmap::new();
208
208
 
209
209
  // Determine target path for Iceberg delete matching
@@ -464,24 +464,21 @@ impl HybridSegmentWriter {
464
464
 
465
465
  // Build Indexes
466
466
 
467
- if self.config.index_all {
468
- batch.schema().fields().iter().enumerate().collect::<Vec<_>>().into_par_iter()
469
- .try_for_each(|(i, field)| {
470
- let col_name = field.name();
471
- let col = batch.column(i);
467
+ batch.schema().fields().iter().enumerate().collect::<Vec<_>>().into_par_iter()
468
+ .try_for_each(|(i, field)| {
469
+ let col_name = field.name();
470
+ let col = batch.column(i);
471
+
472
+ let is_pk = self.primary_key.contains(&col_name.to_string());
473
+ let is_vector = matches!(col.data_type(), arrow::datatypes::DataType::FixedSizeList(_, _) | arrow::datatypes::DataType::List(_));
474
+ let in_config_list = self.config.columns_to_index.as_ref().map(|cols| cols.contains(&col_name.to_string())).unwrap_or(false);
475
+
476
+ if self.config.index_all || is_pk || is_vector || in_config_list {
472
477
  self.index_column(col_name, col)
473
- })?;
474
- } else if let Some(ref cols) = self.config.columns_to_index {
475
- cols.into_par_iter()
476
- .try_for_each(|col_name| {
477
- if let Ok(idx) = batch.schema().index_of(col_name) {
478
- let col = batch.column(idx);
479
- self.index_column(col_name, col)
480
- } else {
481
- Ok(())
482
- }
483
- })?;
484
- }
478
+ } else {
479
+ Ok(())
480
+ }
481
+ })?;
485
482
 
486
483
  Ok(())
487
484
  }
@@ -345,13 +345,13 @@ impl Table {
345
345
  }
346
346
  }
347
347
 
348
- Ok(Table {
349
- uri,
350
- store,
348
+ let table = Table {
349
+ uri: uri.clone(),
350
+ store: store.clone(),
351
351
  data_store: None,
352
352
  rt: Some(rt),
353
353
  query_config: QueryConfig::default(),
354
- index_all: true, // Default: Index Everything
354
+ index_all: true,
355
355
  index_columns: Arc::new(std::sync::RwLock::new(Vec::new())),
356
356
  index_configs: Arc::new(std::sync::RwLock::new(HashMap::new())),
357
357
  default_device: Arc::new(std::sync::RwLock::new(None)),
@@ -369,7 +369,11 @@ impl Table {
369
369
  enterprise_license: None,
370
370
  primary_key: Arc::new(std::sync::RwLock::new(Vec::new())),
371
371
  autocommit: Arc::new(std::sync::atomic::AtomicBool::new(true)),
372
- })
372
+ };
373
+
374
+ // Sync PKs after initialization
375
+ let _ = table.rt.as_ref().unwrap().block_on(table.sync_primary_key_from_schema_async());
376
+ Ok(table)
373
377
  }
374
378
 
375
379
  /// Load a table from Nessie Catalog at specific branch/tag/hash
@@ -966,7 +970,7 @@ impl Table {
966
970
  // Correct.
967
971
  }
968
972
 
969
- Ok(Table {
973
+ let table = Table {
970
974
  uri: uri.to_string(),
971
975
  store,
972
976
  data_store: None,
@@ -990,7 +994,10 @@ impl Table {
990
994
  enterprise_license: None,
991
995
  primary_key: Arc::new(std::sync::RwLock::new(Vec::new())),
992
996
  autocommit: Arc::new(std::sync::atomic::AtomicBool::new(true)),
993
- })
997
+ };
998
+
999
+ table.sync_primary_key_from_schema_async().await?;
1000
+ Ok(table)
994
1001
  }
995
1002
 
996
1003
  /// Create a new table with an explicit schema (Asynchronous)
@@ -2481,6 +2488,14 @@ impl Table {
2481
2488
  })
2482
2489
  });
2483
2490
 
2491
+ // 0. Primary Key Uniqueness Check (if defined)
2492
+ let primary_keys = self.get_primary_key();
2493
+ if !primary_keys.is_empty() {
2494
+ for batch in &batches {
2495
+ self.check_primary_key_uniqueness_async(batch, &primary_keys).await?;
2496
+ }
2497
+ }
2498
+
2484
2499
  let buffer_len_before = {
2485
2500
  let buffer = self.write_buffer.read().unwrap();
2486
2501
  buffer.iter().map(|b| b.num_rows()).sum()
@@ -2690,7 +2705,8 @@ impl Table {
2690
2705
  all_new_entries.push(entry.clone());
2691
2706
 
2692
2707
  // 2. Queue index building asynchronously (if needed)
2693
- if index_all_flag || !index_cols.is_empty() {
2708
+ let has_pks = !self.primary_key.read().unwrap().is_empty();
2709
+ if index_all_flag || !index_cols.is_empty() || has_pks {
2694
2710
  let index_cols_clone = index_cols.clone();
2695
2711
  let base_path_clone = base_path.to_string();
2696
2712
  let segment_id_clone = segment_id.clone();
@@ -3075,6 +3091,114 @@ impl Table {
3075
3091
  Ok(())
3076
3092
  }
3077
3093
 
3094
+ /// Check if any keys in the batch already exist in the table (Primary Key Enforcement)
3095
+ async fn check_primary_key_uniqueness_async(&self, batch: &RecordBatch, columns: &[String]) -> Result<()> {
3096
+
3097
+ if batch.num_rows() == 0 { return Ok(()); }
3098
+
3099
+ let schema = batch.schema();
3100
+ let col_indices: Vec<usize> = columns.iter()
3101
+ .map(|c| schema.index_of(c))
3102
+ .collect::<Result<Vec<usize>, _>>()?;
3103
+
3104
+ // OPTIMIZATION: Use IN clause for batches (efficient via Inverted Index)
3105
+ // For now, we take the first row as a sample check to avoid huge expression generation
3106
+ // until we have a proper Row-Value In-List implementation.
3107
+ for i in 0..batch.num_rows().min(100) { // Limit samples for performance in MVP
3108
+ let mut filters_str_vec = Vec::new();
3109
+ for (col_name, col_idx) in columns.iter().zip(col_indices.iter()) {
3110
+ let col = batch.column(*col_idx);
3111
+ let val = if let Some(arr) = col.as_any().downcast_ref::<arrow::array::Int32Array>() {
3112
+ format!("{}", arr.value(i))
3113
+ } else if let Some(arr) = col.as_any().downcast_ref::<arrow::array::Int64Array>() {
3114
+ format!("{}", arr.value(i))
3115
+ } else if let Some(arr) = col.as_any().downcast_ref::<arrow::array::StringArray>() {
3116
+ format!("'{}'", arr.value(i).replace("'", "''"))
3117
+ } else {
3118
+ continue;
3119
+ };
3120
+ filters_str_vec.push(format!("{} = {}", col_name, val));
3121
+ }
3122
+
3123
+ if !filters_str_vec.is_empty() {
3124
+ let filter_str = filters_str_vec.join(" AND ");
3125
+ let expr = FilterExpr::parse_sql(&filter_str, self.arrow_schema()).await?;
3126
+
3127
+ // Check manifests
3128
+ let manifest_manager = ManifestManager::new(self.store.clone(), "", &self.uri);
3129
+ let (_, all_entries, _) = manifest_manager.load_latest_full().await?;
3130
+ let planner = QueryPlanner::new();
3131
+ let candidates = planner.prune_entries(&all_entries, Some(&expr), None);
3132
+
3133
+ if !candidates.is_empty() {
3134
+ // Refine search within candidates (Index lookup)
3135
+ for (entry, _) in candidates {
3136
+ let config = SegmentConfig::new(&self.uri, &entry.file_path.replace(".parquet", ""))
3137
+ .with_index_files(entry.index_files.clone())
3138
+ .with_delete_files(entry.delete_files.clone());
3139
+ let reader = HybridReader::new(config, self.store.clone(), &self.uri);
3140
+
3141
+ let filters = expr.extract_and_conditions();
3142
+ let mut bitmap_opt: Option<roaring::RoaringBitmap> = None;
3143
+
3144
+ for f in filters {
3145
+ if let Ok(Some(bm)) = reader.get_scalar_filter_bitmap(&f).await {
3146
+ // Subtract logically deleted rows!
3147
+ let deleted = reader.load_merged_deletes().await?;
3148
+ let alive_bm = bm.clone() - deleted.clone();
3149
+
3150
+ println!("DEBUG: PK Check for {}: Index bits: {}, Deleted bits: {}, Alive bits: {}",
3151
+ f.column, bm.len(), deleted.len(), alive_bm.len());
3152
+
3153
+ if let Some(current) = bitmap_opt {
3154
+ bitmap_opt = Some(current & alive_bm);
3155
+ } else {
3156
+ bitmap_opt = Some(alive_bm);
3157
+ }
3158
+ } else {
3159
+ bitmap_opt = None;
3160
+ break;
3161
+ }
3162
+ }
3163
+
3164
+ if let Some(bm) = bitmap_opt {
3165
+ if !bm.is_empty() {
3166
+ let pk_val = columns.iter().zip(filters_str_vec.iter())
3167
+ .map(|(c, f)| format!("{}={}", c, f))
3168
+ .collect::<Vec<_>>().join(", ");
3169
+ return Err(anyhow::anyhow!("Duplicate primary key error: {} already exists", pk_val));
3170
+ }
3171
+ }
3172
+ }
3173
+ }
3174
+ }
3175
+ }
3176
+
3177
+ Ok(())
3178
+ }
3179
+
3180
+ /// Synchronize PK columns from Iceberg schema identifier-field-ids (Internal Async)
3181
+ async fn sync_primary_key_from_schema_async(&self) -> Result<()> {
3182
+ let manifest_manager = ManifestManager::new(self.store.clone(), "", &self.uri);
3183
+ let latest_manifest = manifest_manager.load_latest_full().await?.0;
3184
+
3185
+ if let Some(schema) = latest_manifest.schemas.last() {
3186
+ let pk_cols: Vec<String> = schema.identifier_field_ids.iter().map(|id| {
3187
+ schema.fields.iter().find(|f| f.id == *id).map(|f| f.name.clone()).unwrap_or_default()
3188
+ }).filter(|n| !n.is_empty()).collect();
3189
+
3190
+ if !pk_cols.is_empty() {
3191
+ self.set_primary_key(pk_cols);
3192
+ }
3193
+ }
3194
+ Ok(())
3195
+ }
3196
+
3197
+ /// Synchronize PK columns (Public Sync)
3198
+ pub fn sync_primary_key_from_schema(&self) -> Result<()> {
3199
+ self.runtime().block_on(self.sync_primary_key_from_schema_async())
3200
+ }
3201
+
3078
3202
  /// Merge (Upsert) batches into the table
3079
3203
  pub fn merge(&self, batches: Vec<RecordBatch>, key_column: &str, mode: MergeMode) -> Result<()> {
3080
3204
  match mode {
@@ -31,8 +31,8 @@ pub use crate::core::catalog::{CatalogType, create_catalog, create_catalog_async
31
31
  use pyo3::prelude::*;
32
32
 
33
33
  #[cfg(feature = "python")]
34
- #[pymodule]
35
- fn hyperstreamdb(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
34
+ #[pymodule(name = "hyperstreamdb")]
35
+ fn hyperstreamdb_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
36
36
  m.add_function(wrap_pyfunction!(python_binding::init_logging, m)?)?;
37
37
  m.add_function(wrap_pyfunction!(python_binding::create_catalog, m)?)?;
38
38
  m.add_function(wrap_pyfunction!(python_binding::create_catalog_from_config, m)?)?;
@@ -1038,7 +1038,7 @@ impl PyTable {
1038
1038
  let batch_result: Result<(Vec<RecordBatch>, arrow::datatypes::SchemaRef), String> = rt.block_on(async {
1039
1039
  use datafusion::prelude::SessionContext;
1040
1040
  let mut ctx = SessionContext::new();
1041
- crate::core::sql::vector_operators::register_vector_operators(&mut ctx);
1041
+ let _ = crate::core::sql::vector_operators::register_vector_operators(&mut ctx);
1042
1042
 
1043
1043
  // Register table as 't' (short alias, safe from keywords)
1044
1044
  let provider = Arc::new(crate::core::sql::HyperStreamTableProvider::new(Arc::new(self.table.clone())));
@@ -366,7 +366,7 @@ impl PyComputeContext {
366
366
  impl PyComputeContext {
367
367
  /// Internal helper to list available backends
368
368
  fn list_available_backends_internal() -> Vec<String> {
369
- let mut backends = vec!["cpu".to_string()];
369
+ let backends = vec!["cpu".to_string()];
370
370
 
371
371
  #[cfg(feature = "cuda")]
372
372
  backends.push("cuda".to_string());
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes