hyperstreamdb 0.4.1__tar.gz → 0.5.1__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 (367) hide show
  1. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/CHANGELOG.md +12 -1
  2. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/Cargo.lock +1 -1
  3. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/Cargo.toml +1 -1
  4. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/PKG-INFO +1 -1
  5. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/python/hyperstreamdb/__init__.py +38 -7
  6. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/distance.rs +234 -2
  7. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/hnsw_ivf.rs +52 -19
  8. hyperstreamdb-0.5.1/src/core/index/pq.rs +302 -0
  9. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/segment.rs +8 -85
  10. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/table/builder.rs +2 -2
  11. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/table/mod.rs +5 -4
  12. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/table/write.rs +38 -58
  13. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/wal.rs +18 -0
  14. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/helpers.rs +1 -1
  15. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/table.rs +16 -8
  16. hyperstreamdb-0.4.1/scratch/check_os_error.rs +0 -29
  17. hyperstreamdb-0.4.1/src/core/index/pq.rs +0 -151
  18. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/.env.example +0 -0
  19. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/.gitattributes +0 -0
  20. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/.gitignore +0 -0
  21. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/.hypothesis/constants/32b327793848e7d8 +0 -0
  22. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/.hypothesis/constants/67b0a8ccf18bf5d2 +0 -0
  23. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/.hypothesis/constants/84828557b4ee7be4 +0 -0
  24. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/.instructions.md +0 -0
  25. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/.ipynb_checkpoints/Untitled-checkpoint.ipynb +0 -0
  26. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/.qwen/settings.json +0 -0
  27. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/.qwen/settings.json.orig +0 -0
  28. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/CNAME +0 -0
  29. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/CONTRIBUTING.md +0 -0
  30. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/Dockerfile +0 -0
  31. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/HyperStreamDB.png +0 -0
  32. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/LICENSE-APACHE +0 -0
  33. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/LICENSE-MIT +0 -0
  34. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/README.md +0 -0
  35. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/RUN_COMPLIANCE_TESTS.sh +0 -0
  36. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/SECURITY.md +0 -0
  37. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/STEERING.md +0 -0
  38. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/THIRDPARTY_NOTICES.md +0 -0
  39. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/Untitled.ipynb +0 -0
  40. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benches/bench_table.rs +0 -0
  41. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benches/performance.rs +0 -0
  42. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/BENCHMARK_REPORT.md +0 -0
  43. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/benchmark_charts.png +0 -0
  44. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/benchmark_results.csv +0 -0
  45. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/concurrent_queries_20260409_214245.json +0 -0
  46. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/concurrent_queries_20260409_214245.md +0 -0
  47. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/filtered_search_comparison_20260409_222607.json +0 -0
  48. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/filtered_search_comparison_20260409_222607.md +0 -0
  49. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/filtered_vector_search_20260409_214355.json +0 -0
  50. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/filtered_vector_search_20260409_214355.md +0 -0
  51. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/filtered_vector_search_20260409_220418.json +0 -0
  52. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/filtered_vector_search_20260409_220418.md +0 -0
  53. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/filtered_vector_search_20260409_222053.json +0 -0
  54. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/filtered_vector_search_20260409_222053.md +0 -0
  55. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/filtered_vector_search_20260409_225907.json +0 -0
  56. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/filtered_vector_search_20260409_225907.md +0 -0
  57. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/full_scan_baseline_20260409_222303.json +0 -0
  58. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/full_scan_baseline_20260409_222303.md +0 -0
  59. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/high_selectivity_filter_20260409_222302.json +0 -0
  60. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/high_selectivity_filter_20260409_222302.md +0 -0
  61. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/ingestion_comparison_20260409_222516.json +0 -0
  62. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/ingestion_comparison_20260409_222516.md +0 -0
  63. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/multi_filter_vector_20260409_214428.json +0 -0
  64. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/multi_filter_vector_20260409_214428.md +0 -0
  65. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/multi_filter_vector_20260409_220450.json +0 -0
  66. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/multi_filter_vector_20260409_220450.md +0 -0
  67. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/multi_filter_vector_20260409_222131.json +0 -0
  68. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/multi_filter_vector_20260409_222131.md +0 -0
  69. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/multi_filter_vector_20260409_225938.json +0 -0
  70. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/multi_filter_vector_20260409_225938.md +0 -0
  71. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/multi_filter_vector_20260409_231713.json +0 -0
  72. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/multi_filter_vector_20260409_231713.md +0 -0
  73. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/post_vs_pre_filter_20260409_214501.json +0 -0
  74. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/post_vs_pre_filter_20260409_214501.md +0 -0
  75. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/post_vs_pre_filter_20260409_220524.json +0 -0
  76. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/post_vs_pre_filter_20260409_220524.md +0 -0
  77. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/post_vs_pre_filter_20260409_222204.json +0 -0
  78. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/post_vs_pre_filter_20260409_222204.md +0 -0
  79. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/post_vs_pre_filter_20260409_230010.json +0 -0
  80. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/post_vs_pre_filter_20260409_230010.md +0 -0
  81. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/query_comparison_20260409_222541.json +0 -0
  82. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/query_comparison_20260409_222541.md +0 -0
  83. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/range_query_20260409_222302.json +0 -0
  84. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/range_query_20260409_222302.md +0 -0
  85. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/search_filtered_high_selectivity_20260409_214144.json +0 -0
  86. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/search_filtered_high_selectivity_20260409_214144.md +0 -0
  87. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/search_unfiltered_20260409_214028.json +0 -0
  88. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/benchmark_results/search_unfiltered_20260409_214028.md +0 -0
  89. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/book.toml +0 -0
  90. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/build-connectors.sh +0 -0
  91. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/build.rs +0 -0
  92. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/check_iceberg_compliance.py +0 -0
  93. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/clippy.toml +0 -0
  94. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/deny.toml +0 -0
  95. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docker-compose-minio-nessie.yml +0 -0
  96. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docker-compose.production.yml +0 -0
  97. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docker-compose.yml +0 -0
  98. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/.nojekyll +0 -0
  99. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/BENCHMARKING.md +0 -0
  100. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/COMPREHENSIVE_GUIDE.md +0 -0
  101. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/CONCURRENCY.md +0 -0
  102. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/CONFIGURATION.md +0 -0
  103. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/DORIS_OPTIMIZATION_PATTERNS.md +0 -0
  104. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/GPU_SETUP_GUIDE.md +0 -0
  105. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/ICEBERG_V2_V3_API.md +0 -0
  106. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/INSTALLATION.md +0 -0
  107. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/PGVECTOR_SQL_GUIDE.md +0 -0
  108. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/PYTHON_VECTOR_API.md +0 -0
  109. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/VECTOR_CONFIGURATION.md +0 -0
  110. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/api_reference.md +0 -0
  111. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/architecture.md +0 -0
  112. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/catalog_usage.md +0 -0
  113. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/index.md +0 -0
  114. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/integrations/README.md +0 -0
  115. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/integrations/java_jni.md +0 -0
  116. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/integrations/python.md +0 -0
  117. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/integrations/spark.md +0 -0
  118. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/integrations/trino.md +0 -0
  119. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/monitoring.md +0 -0
  120. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/requirements.txt +0 -0
  121. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/source/_static/HyperStreamDB.png +0 -0
  122. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/source/api/python.rst +0 -0
  123. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/source/api/rust.rst +0 -0
  124. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/source/conf.py +0 -0
  125. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/source/index.rst +0 -0
  126. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/source/roadmap.md +0 -0
  127. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/docs/task_status.md +0 -0
  128. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/proptest-regressions/core/index/gpu.txt +0 -0
  129. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/proptest-regressions/core/sql/vector_literal.txt +0 -0
  130. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/proptest-regressions/core/sql/vector_udf.txt +0 -0
  131. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/pyproject.toml +0 -0
  132. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/python/hyperstreamdb/embeddings.py +0 -0
  133. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/recovered_plan.txt +0 -0
  134. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/rust-toolchain.toml +0 -0
  135. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/scripts/fix_nb.py +0 -0
  136. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/scripts/split_table.py +0 -0
  137. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/scripts/update_cache.py +0 -0
  138. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/scripts/update_reader.py +0 -0
  139. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/scripts/update_schema_patch.py +0 -0
  140. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/scripts/update_schema_patch2.py +0 -0
  141. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/spark-hyperstream/.bloop/bloop.settings.json +0 -0
  142. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/spark-hyperstream/.bloop/spark-hyperstream-test.json +0 -0
  143. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/spark-hyperstream/.bloop/spark-hyperstream.json +0 -0
  144. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/spark-hyperstream/pom.xml +0 -0
  145. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/DefaultSource.java +0 -0
  146. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamPartition.java +0 -0
  147. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamPartitionReader.java +0 -0
  148. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamPartitionReaderFactory.java +0 -0
  149. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamScanBuilder.java +0 -0
  150. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamTable.java +0 -0
  151. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/spark-hyperstream/src/test/java/com/hyperstreamdb/spark/SparkConnectorTest.java +0 -0
  152. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/bin/gateway.rs +0 -0
  153. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/bin/hdb.rs +0 -0
  154. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/bin/iceberg_rest.rs +0 -0
  155. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/bin/probe_datafusion.rs +0 -0
  156. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/bin/setup_test_data.rs +0 -0
  157. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/bin/verify_layered_indexing.rs +0 -0
  158. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/cache.rs +0 -0
  159. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/catalog/config.rs +0 -0
  160. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/catalog/glue.rs +0 -0
  161. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/catalog/hive.rs +0 -0
  162. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/catalog/jdbc.rs +0 -0
  163. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/catalog/mod.rs +0 -0
  164. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/catalog/nessie.rs +0 -0
  165. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/catalog/rest.rs +0 -0
  166. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/catalog/unity.rs +0 -0
  167. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/clustering.rs +0 -0
  168. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/compaction.rs +0 -0
  169. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/embeddings.rs +0 -0
  170. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/error.rs +0 -0
  171. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/ffi.rs +0 -0
  172. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/iceberg/delete.rs +0 -0
  173. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/iceberg/iceberg_delete.rs +0 -0
  174. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/iceberg/manifest.rs +0 -0
  175. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/iceberg/mod.rs +0 -0
  176. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/iceberg/schema.rs +0 -0
  177. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/iceberg/transform.rs +0 -0
  178. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/iceberg/types.rs +0 -0
  179. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/iceberg/value.rs +0 -0
  180. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/iceberg/writer.rs +0 -0
  181. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/build_inverted.rs +0 -0
  182. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/build_vector.rs +0 -0
  183. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/cuda/cosine_distance.cu +0 -0
  184. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/cuda/hamming_distance.cu +0 -0
  185. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/cuda/inner_product.cu +0 -0
  186. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/cuda/jaccard_distance.cu +0 -0
  187. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/cuda/kmeans_assignment.cu +0 -0
  188. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/cuda/l1_distance.cu +0 -0
  189. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/cuda/l2_distance.cu +0 -0
  190. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/gpu.rs +0 -0
  191. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/hnsw_rs/annhdf5.rs +0 -0
  192. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/hnsw_rs/api.rs +0 -0
  193. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/hnsw_rs/dist.rs +0 -0
  194. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/hnsw_rs/flatten.rs +0 -0
  195. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/hnsw_rs/hnsw.rs +0 -0
  196. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/hnsw_rs/hnswio.rs +0 -0
  197. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/hnsw_rs/libext.rs +0 -0
  198. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/hnsw_rs/mod.rs +0 -0
  199. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/hnsw_rs/prelude.rs +0 -0
  200. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/hnsw_rs/test.rs +0 -0
  201. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/ivf.rs +0 -0
  202. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/memory.rs +0 -0
  203. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/mod.rs +0 -0
  204. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/mps/cosine_distance.metal +0 -0
  205. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/mps/hamming_distance.metal +0 -0
  206. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/mps/inner_product.metal +0 -0
  207. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/mps/jaccard_distance.metal +0 -0
  208. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/mps/kmeans_assignment.metal +0 -0
  209. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/mps/l1_distance.metal +0 -0
  210. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/mps/l2_distance.metal +0 -0
  211. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/opencl/cosine_distance.cl +0 -0
  212. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/opencl/hamming_distance.cl +0 -0
  213. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/opencl/inner_product.cl +0 -0
  214. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/opencl/jaccard_distance.cl +0 -0
  215. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/opencl/kmeans_assignment.cl +0 -0
  216. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/opencl/l1_distance.cl +0 -0
  217. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/opencl/l2_distance.cl +0 -0
  218. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/tokenizer.rs +0 -0
  219. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/turboquant.rs +0 -0
  220. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/index/wgpu_kernel.wgsl +0 -0
  221. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/license.rs +0 -0
  222. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/lock.rs +0 -0
  223. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/maintenance.rs +0 -0
  224. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/manifest/manager/commit.rs +0 -0
  225. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/manifest/manager/load.rs +0 -0
  226. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/manifest/manager/partition.rs +0 -0
  227. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/manifest/manager/schema.rs +0 -0
  228. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/manifest/manager.rs +0 -0
  229. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/manifest/mod.rs +0 -0
  230. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/manifest/types.rs +0 -0
  231. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/merge.rs +0 -0
  232. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/metadata.rs +0 -0
  233. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/mod.rs +0 -0
  234. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/nessie.rs +0 -0
  235. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/planner/filter.rs +0 -0
  236. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/planner/pruning.rs +0 -0
  237. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/planner/vector_search.rs +0 -0
  238. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/planner.rs +0 -0
  239. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/puffin.rs +0 -0
  240. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/query.rs +0 -0
  241. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/reader/delete.rs +0 -0
  242. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/reader/filter.rs +0 -0
  243. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/reader/mod.rs +0 -0
  244. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/reader/scan.rs +0 -0
  245. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/search/mod.rs +0 -0
  246. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/search/rrf.rs +0 -0
  247. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/literal/binary.rs +0 -0
  248. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/literal/dense.rs +0 -0
  249. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/literal/mod.rs +0 -0
  250. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/literal/sparse.rs +0 -0
  251. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/mod.rs +0 -0
  252. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/optimizer/config.rs +0 -0
  253. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/optimizer/index_join.rs +0 -0
  254. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/optimizer/vector_search/mod.rs +0 -0
  255. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/optimizer/vector_search/plan_detection.rs +0 -0
  256. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/optimizer/vector_search/plan_rewriter.rs +0 -0
  257. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/optimizer/vector_search/sort_expr_parser.rs +0 -0
  258. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/optimizer.rs +0 -0
  259. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/pgvector_rewriter.rs +0 -0
  260. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/physical_plan/index_join.rs +0 -0
  261. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/physical_plan/vector_merge.rs +0 -0
  262. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/physical_plan/vector_scan.rs +0 -0
  263. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/physical_plan.rs +0 -0
  264. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/session.rs +0 -0
  265. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/udf/aggregate.rs +0 -0
  266. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/udf/distance.rs +0 -0
  267. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/udf/mod.rs +0 -0
  268. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/udf/sparse.rs +0 -0
  269. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/udf/transform.rs +0 -0
  270. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/vector_literal.rs +0 -0
  271. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/vector_operators.rs +0 -0
  272. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/vector_udf/aggregate.rs +0 -0
  273. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/vector_udf/distance.rs +0 -0
  274. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/vector_udf/mod.rs +0 -0
  275. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/vector_udf/sparse.rs +0 -0
  276. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/vector_udf/transform.rs +0 -0
  277. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/sql/vector_udf.rs +0 -0
  278. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/storage.rs +0 -0
  279. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/table/fluent.rs +0 -0
  280. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/table/index_config.rs +0 -0
  281. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/table/primary_key.rs +0 -0
  282. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/table/read.rs +0 -0
  283. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/table/schema.rs +0 -0
  284. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/table/state.rs +0 -0
  285. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/core/table/stats.rs +0 -0
  286. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/enterprise/continuous_indexing.rs +0 -0
  287. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/enterprise/mod.rs +0 -0
  288. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/index.rs.old +0 -0
  289. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/lib.rs +0 -0
  290. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/catalog/glue.rs +0 -0
  291. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/catalog/hive.rs +0 -0
  292. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/catalog/jdbc.rs +0 -0
  293. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/catalog/mod.rs +0 -0
  294. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/catalog/nessie.rs +0 -0
  295. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/catalog/rest.rs +0 -0
  296. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/catalog/unity.rs +0 -0
  297. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/manifest.rs +0 -0
  298. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/mod.rs +0 -0
  299. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/schema.rs +0 -0
  300. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/session.rs +0 -0
  301. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python/stats.rs +0 -0
  302. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python_binding.rs +0 -0
  303. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python_distance.rs +0 -0
  304. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/python_gpu_context.rs +0 -0
  305. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/telemetry/metrics.rs +0 -0
  306. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/telemetry/mod.rs +0 -0
  307. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/src/telemetry/tracing.rs +0 -0
  308. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/all_types_index_test.rs +0 -0
  309. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/bin/generate_iceberg_manifests.rs +0 -0
  310. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/bin/verify_iceberg_read_check.rs +0 -0
  311. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/check_mmh3.py +0 -0
  312. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/data/download_nyc_taxi.sh +0 -0
  313. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/data/generate_embeddings.py +0 -0
  314. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/data/generate_wikipedia.py +0 -0
  315. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/data/start_nessie.sh +0 -0
  316. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/datafusion_rust_test.rs +0 -0
  317. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/debug_murmur3.rs +0 -0
  318. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/fuzz_murmur3.rs +0 -0
  319. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/gpu_test_helpers.rs +0 -0
  320. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/integration_test_hnsw_ivf_native.rs +0 -0
  321. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/performance/README.md +0 -0
  322. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/prototype_merge.py +0 -0
  323. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/python/verify_docstrings.py +0 -0
  324. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/python/verify_fluent_api.py +0 -0
  325. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/python/verify_unified_ingest.py +0 -0
  326. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/schema_evolution_test.rs +0 -0
  327. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/stability.rs +0 -0
  328. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_all_algos.py +0 -0
  329. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_catalog_commit.rs +0 -0
  330. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_compliance.rs +0 -0
  331. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_delete_correctness.rs +0 -0
  332. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_iceberg_python_delete.sh +0 -0
  333. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_iceberg_rest.sh +0 -0
  334. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_iceberg_rest_create.sh +0 -0
  335. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_iceberg_rest_delete.sh +0 -0
  336. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_iceberg_rest_remove_index.sh +0 -0
  337. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_iceberg_rest_update.sh +0 -0
  338. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_metadata_creation.rs +0 -0
  339. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_mor_reads.rs +0 -0
  340. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_mor_writes.rs +0 -0
  341. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_partition_transforms.rs +0 -0
  342. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_partitioned_writes.rs +0 -0
  343. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_puffin_index.sh +0 -0
  344. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_rest_updates.sh +0 -0
  345. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/tests/verify_schema_compat.rs +0 -0
  346. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-config/.DS_Store +0 -0
  347. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-config/catalog/glue_catalog.properties +0 -0
  348. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-config/catalog/hyperstreamdb.properties +0 -0
  349. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-config/catalog/iceberg.properties +0 -0
  350. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-config/catalog/memory.properties +0 -0
  351. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-config/catalog/postgres.properties +0 -0
  352. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-config/config.properties +0 -0
  353. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-config/entrypoint.sh +0 -0
  354. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-config/jvm.config +0 -0
  355. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-config/node.properties +0 -0
  356. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-config.zip +0 -0
  357. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-hyperstream/pom.xml +0 -0
  358. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBColumnHandle.java +0 -0
  359. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBConnectorFactory.java +0 -0
  360. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBMetadata.java +0 -0
  361. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBPageSource.java +0 -0
  362. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBPageSourceProvider.java +0 -0
  363. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBPlugin.java +0 -0
  364. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBSplit.java +0 -0
  365. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBSplitManager.java +0 -0
  366. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBTableHandle.java +0 -0
  367. {hyperstreamdb-0.4.1 → hyperstreamdb-0.5.1}/trino-hyperstream/src/test/java/com/hyperstreamdb/trino/TrinoConnectorTest.java +0 -0
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ---
11
+
12
+ ## [0.5.0] - 2026-06-03
13
+
10
14
  ### Added
11
15
  - Comprehensive unit test suites for Spark and Trino connectors
12
16
  - Thread-local GPU context for concurrent query safety
@@ -14,11 +18,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
14
18
  - Query configuration API
15
19
  - Metrics instrumentation for observability
16
20
  - Release profiles (`release` and `release-lto`) in Cargo.toml
21
+ - `WriteAheadLog::append_fire_and_forget` — non-blocking WAL append that hands off batches to the WAL worker without blocking on `fdatasync`, eliminating ~800 ms write latency per call
17
22
 
18
23
  ### Changed
19
24
  - CUDA is now an optional feature (no longer required for CI builds)
20
25
  - FFI bounds hardened with panic safety guarantees
21
26
  - Public APIs documented with rustdoc
27
+ - **`Table(index_all=False)` is now the default** (previously `True`). Automatic HNSW/BM25 index building on commit is now opt-in. This eliminates a silent 15–18 s background build that previously fired on every `commit()` for any table containing a vector column. To restore the old behaviour: `Table(uri, index_all=True)` or `table.index_all = True`.
28
+ - **`Table(autocommit=False)` is now the default** (previously `True`). Writes accumulate in an in-memory buffer and must be explicitly committed with `table.commit()`. This eliminates unexpected auto-flush overhead during ingestion loops.
29
+ - `write_async` no longer auto-detects columns named `"embedding"` as implicit HNSW index targets. Only columns explicitly registered via `add_index()` or `set_index_columns()` are indexed.
30
+ - `manifest_manager.load_latest_full` replaced with `load_latest` in the `flush_async` hot path, eliminating two unnecessary full manifest scans per commit.
31
+ - Primary key uniqueness check upgraded from O(N²) to O(N) using `HashSet`.
22
32
 
23
33
  ### Fixed
24
34
  - Rustdoc warnings across the codebase
@@ -282,7 +292,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
282
292
 
283
293
  ---
284
294
 
285
- [Unreleased]: https://github.com/rla3rd/hyperstreamdb/compare/v0.4.0...HEAD
295
+ [Unreleased]: https://github.com/rla3rd/hyperstreamdb/compare/v0.5.0...HEAD
296
+ [0.5.0]: https://github.com/rla3rd/hyperstreamdb/compare/v0.4.1...v0.5.0
286
297
  [0.4.0]: https://github.com/rla3rd/hyperstreamdb/compare/v0.3.3...v0.4.0
287
298
  [0.3.3]: https://github.com/rla3rd/hyperstreamdb/compare/v0.3.2...v0.3.3
288
299
  [0.3.2]: https://github.com/rla3rd/hyperstreamdb/compare/v0.3.1...v0.3.2
@@ -3392,7 +3392,7 @@ dependencies = [
3392
3392
 
3393
3393
  [[package]]
3394
3394
  name = "hyperstreamdb"
3395
- version = "0.4.1"
3395
+ version = "0.5.1"
3396
3396
  dependencies = [
3397
3397
  "ahash",
3398
3398
  "anyhow",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "hyperstreamdb"
3
- version = "0.4.1"
3
+ version = "0.5.1"
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.4.1
3
+ Version: 0.5.1
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Programming Language :: Rust
@@ -181,9 +181,31 @@ class Query:
181
181
 
182
182
  class Table:
183
183
  """
184
- Enhanced HyperStreamDB Table with auto-vectorization and embedding registry support.
184
+ HyperStreamDB Table Apache Iceberg/Parquet-compatible columnar vector store.
185
+
186
+ **Default behaviour (v0.4.1+)**
187
+
188
+ - ``index_all = False`` — Vector indexes are *not* built automatically.
189
+ Call ``table.index_all = True`` or ``table.add_index(column, 'hnsw')``
190
+ to enable indexing for a specific session or column.
191
+ - ``autocommit = False`` — Writes accumulate in an in-memory buffer.
192
+ Call ``table.commit()`` (or ``await table.commit_async()``) to persist
193
+ data to Parquet and advance the Iceberg snapshot.
194
+
195
+ These defaults exist for performance: automatic indexing previously caused
196
+ silent 15-18 s HNSW build latency on every ``commit()`` for tables with
197
+ vector columns, even when the user had not requested an index.
198
+
199
+ Args:
200
+ uri: Table location (``file:///path`` or cloud URI).
201
+ inner_table: Internal — do not pass directly.
202
+ device: Optional compute device for GPU-accelerated index builds.
203
+ index_all: Enable automatic indexing of all compatible columns.
204
+ Defaults to ``False``. Set ``True`` to restore legacy behaviour.
205
+ primary_key: Column name (or list) to use as primary key.
206
+ explain: If ``True``, return query plans instead of results.
185
207
  """
186
- def __init__(self, uri: str, inner_table: Optional[_RustTable] = None, device: Optional[Any] = None, index_all: bool = True, primary_key: Optional[str] = None, explain: bool = False):
208
+ def __init__(self, uri: str, inner_table: Optional[_RustTable] = None, device: Optional[Any] = None, index_all: bool = False, primary_key: Optional[str] = None, explain: bool = False):
187
209
  uri = _resolve_uri(uri)
188
210
  self.explain = explain
189
211
  if inner_table:
@@ -522,15 +544,15 @@ class Table:
522
544
  """
523
545
  return self.to_arrow(filter, vector_filter, columns, device=device, **kwargs)
524
546
 
525
- def vector_search(self, column: str, query: List[float], k: int = 10, filter: Optional[str] = None, device: Optional[Any] = None, **kwargs):
547
+ def vector_search(self, column: str, query: List[float], k: int = 10, filter: Optional[str] = None, columns: Optional[List[str]] = None, device: Optional[Any] = None, **kwargs):
526
548
  """Backward compatibility alias for to_pandas with vector filter."""
527
549
  vf = {"column": column, "query": query, "k": k}
528
550
  vf.update(kwargs)
529
- return self.to_pandas(filter=filter, vector_filter=vf, device=device)
551
+ return self.to_pandas(filter=filter, vector_filter=vf, columns=columns, device=device)
530
552
 
531
- def search(self, column: str, query: List[float], k: int = 10, filter: Optional[str] = None, device: Optional[Any] = None, **kwargs):
553
+ def search(self, column: str, query: List[float], k: int = 10, filter: Optional[str] = None, columns: Optional[List[str]] = None, device: Optional[Any] = None, **kwargs):
532
554
  """Alias for vector_search."""
533
- return self.vector_search(column, query, k, filter, device, **kwargs)
555
+ return self.vector_search(column, query, k, filter, columns, device, **kwargs)
534
556
 
535
557
  def filter(self, expr: Optional[str] = None, vector_filter: Optional[Union[Dict[str, Any], List[float]]] = None, **kwargs) -> 'Query':
536
558
  """
@@ -569,7 +591,16 @@ class Table:
569
591
 
570
592
  @property
571
593
  def index_all(self):
572
- """Whether to index all compatible columns by default."""
594
+ """
595
+ Whether to build HNSW/BM25 indexes for all compatible columns on commit.
596
+
597
+ Defaults to ``False`` (opt-in). Setting this to ``True`` triggers
598
+ background index builds after every ``commit()`` call — useful when
599
+ you want fast ANN search but be aware of the additional commit latency
600
+ (~15 s per 100 K rows with 768-dim vectors on CPU).
601
+
602
+ For selective indexing, prefer ``table.add_index(column, 'hnsw')``.
603
+ """
573
604
  return self._inner.get_index_all()
574
605
 
575
606
  @index_all.setter
@@ -52,8 +52,66 @@ fn l2_distance_squared_portable(a: &[f32], b: &[f32]) -> f32 {
52
52
  #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
53
53
  #[target_feature(enable = "avx2,fma")]
54
54
  unsafe fn l2_distance_squared_avx2(a: &[f32], b: &[f32]) -> f32 {
55
- // LLVM will now generate aggressive AVX2/FMA instructions here
56
- l2_distance_squared_portable(a, b)
55
+ #[cfg(target_arch = "x86")]
56
+ use std::arch::x86::*;
57
+ #[cfg(target_arch = "x86_64")]
58
+ use std::arch::x86_64::*;
59
+
60
+ let n = a.len();
61
+ let mut i = 0;
62
+
63
+ let mut sum0 = _mm256_setzero_ps();
64
+ let mut sum1 = _mm256_setzero_ps();
65
+ let mut sum2 = _mm256_setzero_ps();
66
+ let mut sum3 = _mm256_setzero_ps();
67
+
68
+ while i + 31 < n {
69
+ let a0 = _mm256_loadu_ps(a.as_ptr().add(i));
70
+ let b0 = _mm256_loadu_ps(b.as_ptr().add(i));
71
+ let diff0 = _mm256_sub_ps(a0, b0);
72
+ sum0 = _mm256_fmadd_ps(diff0, diff0, sum0);
73
+
74
+ let a1 = _mm256_loadu_ps(a.as_ptr().add(i + 8));
75
+ let b1 = _mm256_loadu_ps(b.as_ptr().add(i + 8));
76
+ let diff1 = _mm256_sub_ps(a1, b1);
77
+ sum1 = _mm256_fmadd_ps(diff1, diff1, sum1);
78
+
79
+ let a2 = _mm256_loadu_ps(a.as_ptr().add(i + 16));
80
+ let b2 = _mm256_loadu_ps(b.as_ptr().add(i + 16));
81
+ let diff2 = _mm256_sub_ps(a2, b2);
82
+ sum2 = _mm256_fmadd_ps(diff2, diff2, sum2);
83
+
84
+ let a3 = _mm256_loadu_ps(a.as_ptr().add(i + 24));
85
+ let b3 = _mm256_loadu_ps(b.as_ptr().add(i + 24));
86
+ let diff3 = _mm256_sub_ps(a3, b3);
87
+ sum3 = _mm256_fmadd_ps(diff3, diff3, sum3);
88
+
89
+ i += 32;
90
+ }
91
+
92
+ sum0 = _mm256_add_ps(sum0, sum1);
93
+ sum2 = _mm256_add_ps(sum2, sum3);
94
+ sum0 = _mm256_add_ps(sum0, sum2);
95
+
96
+ while i + 7 < n {
97
+ let a0 = _mm256_loadu_ps(a.as_ptr().add(i));
98
+ let b0 = _mm256_loadu_ps(b.as_ptr().add(i));
99
+ let diff0 = _mm256_sub_ps(a0, b0);
100
+ sum0 = _mm256_fmadd_ps(diff0, diff0, sum0);
101
+ i += 8;
102
+ }
103
+
104
+ let mut sum_array = [0.0f32; 8];
105
+ _mm256_storeu_ps(sum_array.as_mut_ptr(), sum0);
106
+ let mut total = sum_array.iter().sum::<f32>();
107
+
108
+ while i < n {
109
+ let diff = a[i] - b[i];
110
+ total += diff * diff;
111
+ i += 1;
112
+ }
113
+
114
+ total
57
115
  }
58
116
 
59
117
  #[inline(always)]
@@ -76,6 +134,17 @@ pub fn cosine_similarity(a: &[f32], b: &[f32]) -> f32 {
76
134
 
77
135
  #[inline(always)]
78
136
  pub fn dot_product(a: &[f32], b: &[f32]) -> f32 {
137
+ #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
138
+ {
139
+ if is_x86_feature_detected!("avx2") && is_x86_feature_detected!("fma") {
140
+ return unsafe { dot_product_avx2(a, b) };
141
+ }
142
+ }
143
+ dot_product_portable(a, b)
144
+ }
145
+
146
+ #[inline(always)]
147
+ fn dot_product_portable(a: &[f32], b: &[f32]) -> f32 {
79
148
  let n = a.len();
80
149
  assert_eq!(n, b.len(), "Vectors must have the same length");
81
150
 
@@ -100,6 +169,65 @@ pub fn dot_product(a: &[f32], b: &[f32]) -> f32 {
100
169
  sum
101
170
  }
102
171
 
172
+ #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
173
+ #[target_feature(enable = "avx2,fma")]
174
+ unsafe fn dot_product_avx2(a: &[f32], b: &[f32]) -> f32 {
175
+ #[cfg(target_arch = "x86")]
176
+ use std::arch::x86::*;
177
+ #[cfg(target_arch = "x86_64")]
178
+ use std::arch::x86_64::*;
179
+
180
+ let n = a.len();
181
+ let mut i = 0;
182
+
183
+ let mut sum0 = _mm256_setzero_ps();
184
+ let mut sum1 = _mm256_setzero_ps();
185
+ let mut sum2 = _mm256_setzero_ps();
186
+ let mut sum3 = _mm256_setzero_ps();
187
+
188
+ while i + 31 < n {
189
+ let a0 = _mm256_loadu_ps(a.as_ptr().add(i));
190
+ let b0 = _mm256_loadu_ps(b.as_ptr().add(i));
191
+ sum0 = _mm256_fmadd_ps(a0, b0, sum0);
192
+
193
+ let a1 = _mm256_loadu_ps(a.as_ptr().add(i + 8));
194
+ let b1 = _mm256_loadu_ps(b.as_ptr().add(i + 8));
195
+ sum1 = _mm256_fmadd_ps(a1, b1, sum1);
196
+
197
+ let a2 = _mm256_loadu_ps(a.as_ptr().add(i + 16));
198
+ let b2 = _mm256_loadu_ps(b.as_ptr().add(i + 16));
199
+ sum2 = _mm256_fmadd_ps(a2, b2, sum2);
200
+
201
+ let a3 = _mm256_loadu_ps(a.as_ptr().add(i + 24));
202
+ let b3 = _mm256_loadu_ps(b.as_ptr().add(i + 24));
203
+ sum3 = _mm256_fmadd_ps(a3, b3, sum3);
204
+
205
+ i += 32;
206
+ }
207
+
208
+ sum0 = _mm256_add_ps(sum0, sum1);
209
+ sum2 = _mm256_add_ps(sum2, sum3);
210
+ sum0 = _mm256_add_ps(sum0, sum2);
211
+
212
+ while i + 7 < n {
213
+ let a0 = _mm256_loadu_ps(a.as_ptr().add(i));
214
+ let b0 = _mm256_loadu_ps(b.as_ptr().add(i));
215
+ sum0 = _mm256_fmadd_ps(a0, b0, sum0);
216
+ i += 8;
217
+ }
218
+
219
+ let mut sum_array = [0.0f32; 8];
220
+ _mm256_storeu_ps(sum_array.as_mut_ptr(), sum0);
221
+ let mut total = sum_array.iter().sum::<f32>();
222
+
223
+ while i < n {
224
+ total += a[i] * b[i];
225
+ i += 1;
226
+ }
227
+
228
+ total
229
+ }
230
+
103
231
  /// Vectorized batch L2 distance calculation
104
232
  pub fn l2_distance_batch<V: AsRef<[f32]> + Sync>(query: &[f32], vectors: &[V]) -> Vec<f32> {
105
233
  use rayon::prelude::*;
@@ -217,9 +345,53 @@ pub fn jaccard_distance(a: &[f32], b: &[f32]) -> f32 {
217
345
 
218
346
  /// Bit-optimized Hamming distance for packed binary vectors (e.g. 1 bit per element)
219
347
  pub fn hamming_distance_packed(a: &[u8], b: &[u8]) -> u32 {
348
+ #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
349
+ {
350
+ if is_x86_feature_detected!("popcnt") {
351
+ return unsafe { hamming_distance_packed_popcnt(a, b) };
352
+ }
353
+ }
354
+ hamming_distance_packed_portable(a, b)
355
+ }
356
+
357
+ #[inline(always)]
358
+ fn hamming_distance_packed_portable(a: &[u8], b: &[u8]) -> u32 {
220
359
  a.iter().zip(b.iter()).map(|(&x, &y)| (x ^ y).count_ones()).sum()
221
360
  }
222
361
 
362
+ #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
363
+ #[target_feature(enable = "popcnt")]
364
+ unsafe fn hamming_distance_packed_popcnt(a: &[u8], b: &[u8]) -> u32 {
365
+ #[cfg(target_arch = "x86")]
366
+ use std::arch::x86::*;
367
+ #[cfg(target_arch = "x86_64")]
368
+ use std::arch::x86_64::*;
369
+
370
+ let n = a.len();
371
+ let mut i = 0;
372
+ let mut sum = 0;
373
+
374
+ let a_ptr = a.as_ptr();
375
+ let b_ptr = b.as_ptr();
376
+
377
+ #[cfg(target_arch = "x86_64")]
378
+ {
379
+ while i + 7 < n {
380
+ let a_val = std::ptr::read_unaligned(a_ptr.add(i) as *const u64);
381
+ let b_val = std::ptr::read_unaligned(b_ptr.add(i) as *const u64);
382
+ sum += _popcnt64((a_val ^ b_val) as i64) as u32;
383
+ i += 8;
384
+ }
385
+ }
386
+
387
+ while i < n {
388
+ sum += (a[i] ^ b[i]).count_ones();
389
+ i += 1;
390
+ }
391
+
392
+ sum
393
+ }
394
+
223
395
  /// Sparse dot product: intersection of two sorted index/value pairs
224
396
  pub fn sparse_dot_product(
225
397
  a_indices: &[u32], a_values: &[f32],
@@ -283,6 +455,17 @@ pub fn sparse_l2_distance_squared(
283
455
  /// Optimized L2 distance for quantized u8 vectors
284
456
  #[inline(always)]
285
457
  pub fn l2_distance_u8(a: &[u8], b: &[u8]) -> f32 {
458
+ #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
459
+ {
460
+ if is_x86_feature_detected!("avx2") {
461
+ return unsafe { l2_distance_u8_avx2(a, b) };
462
+ }
463
+ }
464
+ l2_distance_u8_portable(a, b)
465
+ }
466
+
467
+ #[inline(always)]
468
+ fn l2_distance_u8_portable(a: &[u8], b: &[u8]) -> f32 {
286
469
  let mut sum = 0;
287
470
  let chunks_a = a.chunks_exact(16);
288
471
  let chunks_b = b.chunks_exact(16);
@@ -303,6 +486,55 @@ pub fn l2_distance_u8(a: &[u8], b: &[u8]) -> f32 {
303
486
  sum as f32
304
487
  }
305
488
 
489
+ #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
490
+ #[target_feature(enable = "avx2")]
491
+ unsafe fn l2_distance_u8_avx2(a: &[u8], b: &[u8]) -> f32 {
492
+ #[cfg(target_arch = "x86")]
493
+ use std::arch::x86::*;
494
+ #[cfg(target_arch = "x86_64")]
495
+ use std::arch::x86_64::*;
496
+
497
+ let n = a.len();
498
+ let mut i = 0;
499
+ let mut sum_vec = _mm256_setzero_si256();
500
+
501
+ while i + 31 < n {
502
+ let a_vec = _mm256_loadu_si256(a.as_ptr().add(i) as *const __m256i);
503
+ let b_vec = _mm256_loadu_si256(b.as_ptr().add(i) as *const __m256i);
504
+
505
+ let zero = _mm256_setzero_si256();
506
+
507
+ let a_lo = _mm256_unpacklo_epi8(a_vec, zero);
508
+ let a_hi = _mm256_unpackhi_epi8(a_vec, zero);
509
+
510
+ let b_lo = _mm256_unpacklo_epi8(b_vec, zero);
511
+ let b_hi = _mm256_unpackhi_epi8(b_vec, zero);
512
+
513
+ let diff_lo = _mm256_sub_epi16(a_lo, b_lo);
514
+ let diff_hi = _mm256_sub_epi16(a_hi, b_hi);
515
+
516
+ let sq_lo = _mm256_madd_epi16(diff_lo, diff_lo);
517
+ let sq_hi = _mm256_madd_epi16(diff_hi, diff_hi);
518
+
519
+ sum_vec = _mm256_add_epi32(sum_vec, sq_lo);
520
+ sum_vec = _mm256_add_epi32(sum_vec, sq_hi);
521
+
522
+ i += 32;
523
+ }
524
+
525
+ let mut sum_array = [0i32; 8];
526
+ _mm256_storeu_si256(sum_array.as_mut_ptr() as *mut __m256i, sum_vec);
527
+ let mut total = sum_array.iter().sum::<i32>();
528
+
529
+ while i < n {
530
+ let diff = (a[i] as i32) - (b[i] as i32);
531
+ total += diff * diff;
532
+ i += 1;
533
+ }
534
+
535
+ total as f32
536
+ }
537
+
306
538
  /// Asymmetric Distance Calculation (ADC) for quantized vectors.
307
539
  /// Calculates L2 distance between a float32 query and a quantized u8 vector.
308
540
  #[inline(always)]
@@ -88,6 +88,7 @@ pub enum HnswGraph {
88
88
  TurboQuant8(Hnsw<u8, crate::core::index::distance::DistL2u8>),
89
89
  TurboQuant4(Hnsw<u8, crate::core::index::distance::DistL2u4>),
90
90
  SparseDot(Hnsw<crate::core::index::SparseVector, DistSparseDot>),
91
+ Pq(Hnsw<u8, crate::core::index::pq::DistPqSdc>),
91
92
  }
92
93
 
93
94
  impl HnswGraph {
@@ -103,6 +104,7 @@ impl HnswGraph {
103
104
  (HnswGraph::BinaryHamming(h), VectorValue::Binary(q)) => h.search(q, k, ef, filter),
104
105
  (HnswGraph::TurboQuant8(h), VectorValue::Binary(q)) => h.search(q, k, ef, filter),
105
106
  (HnswGraph::TurboQuant4(h), VectorValue::Binary(q)) => h.search(q, k, ef, filter),
107
+ (HnswGraph::Pq(h), VectorValue::Binary(q)) => h.search(q, k, ef, filter),
106
108
  (HnswGraph::SparseDot(h), VectorValue::Sparse(q)) => h.search(std::slice::from_ref(q), k, ef, filter),
107
109
 
108
110
  // Casting paths
@@ -128,6 +130,7 @@ impl HnswGraph {
128
130
  (HnswGraph::BinaryHamming(h), VectorValue::Binary(v)) => h.insert_slice((&v, local_id)),
129
131
  (HnswGraph::TurboQuant8(h), VectorValue::Binary(v)) => h.insert_slice((&v, local_id)),
130
132
  (HnswGraph::TurboQuant4(h), VectorValue::Binary(v)) => h.insert_slice((&v, local_id)),
133
+ (HnswGraph::Pq(h), VectorValue::Binary(v)) => h.insert_slice((&v, local_id)),
131
134
  (HnswGraph::SparseDot(h), VectorValue::Sparse(v)) => h.insert_slice((&vec![v], local_id)),
132
135
 
133
136
  (HnswGraph::L2(h), VectorValue::Float16(v)) => h.insert_slice((&v, local_id)),
@@ -167,6 +170,7 @@ impl HnswGraph {
167
170
  HnswGraph::BinaryHamming(h) => h.file_dump(&path_string).map(|_| ()).map_err(|e| Box::new(std::io::Error::other(e)) as Box<dyn std::error::Error>),
168
171
  HnswGraph::TurboQuant8(h) => h.file_dump(&path_string).map(|_| ()).map_err(|e| Box::new(std::io::Error::other(e)) as Box<dyn std::error::Error>),
169
172
  HnswGraph::TurboQuant4(h) => h.file_dump(&path_string).map(|_| ()).map_err(|e| Box::new(std::io::Error::other(e)) as Box<dyn std::error::Error>),
173
+ HnswGraph::Pq(h) => h.file_dump(&path_string).map(|_| ()).map_err(|e| Box::new(std::io::Error::other(e)) as Box<dyn std::error::Error>),
170
174
  HnswGraph::SparseDot(h) => h.file_dump(&path_string).map(|_| ()).map_err(|e| Box::new(std::io::Error::other(e)) as Box<dyn std::error::Error>),
171
175
  }
172
176
  }
@@ -285,10 +289,18 @@ impl HnswIvfIndex {
285
289
 
286
290
  // Determine HNSW node type and distance metric
287
291
  let hnsw = if let Some(q) = quantizer.as_ref() {
288
- if q.bits() == 4 {
289
- HnswGraph::TurboQuant4(Hnsw::new(hnsw_m, vecs.len(), max_layers, ef_construction, crate::core::index::distance::DistL2u4))
290
- } else {
291
- HnswGraph::TurboQuant8(Hnsw::new(hnsw_m, vecs.len(), max_layers, ef_construction, crate::core::index::distance::DistL2u8))
292
+ match q {
293
+ QuantizerImpl::TurboQuant(tq) => {
294
+ if tq.bits() == 4 {
295
+ HnswGraph::TurboQuant4(Hnsw::new(hnsw_m, vecs.len(), max_layers, ef_construction, crate::core::index::distance::DistL2u4))
296
+ } else {
297
+ HnswGraph::TurboQuant8(Hnsw::new(hnsw_m, vecs.len(), max_layers, ef_construction, crate::core::index::distance::DistL2u8))
298
+ }
299
+ },
300
+ QuantizerImpl::Pq(pq) => {
301
+ let dist = crate::core::index::pq::DistPqSdc { pq: std::sync::Arc::new(pq.clone()) };
302
+ HnswGraph::Pq(Hnsw::new(hnsw_m, vecs.len(), max_layers, ef_construction, dist))
303
+ }
292
304
  }
293
305
  } else {
294
306
  match metric {
@@ -333,6 +345,7 @@ impl HnswIvfIndex {
333
345
 
334
346
  /// Search for k nearest neighbors
335
347
  pub fn search(&self, query: &VectorValue, k: usize, n_probe: usize, filter: Option<&roaring::RoaringBitmap>) -> Result<Vec<(usize, f32)>> {
348
+ let t_start = std::time::Instant::now();
336
349
  let query_f32 = match query {
337
350
  VectorValue::Float32(v) => v,
338
351
  VectorValue::Float16(v) => v,
@@ -342,10 +355,10 @@ impl HnswIvfIndex {
342
355
  };
343
356
 
344
357
  // Pre-quantize query if needed for faster graph traversal (SDC)
345
- let effective_query = if let Some(QuantizerImpl::TurboQuant(ref q)) = self.quantizer {
346
- VectorValue::Binary(q.encode(query_f32))
347
- } else {
348
- query.clone()
358
+ let effective_query = match self.quantizer {
359
+ Some(QuantizerImpl::TurboQuant(ref q)) => VectorValue::Binary(q.encode(query_f32)),
360
+ Some(QuantizerImpl::Pq(ref q)) => VectorValue::Binary(q.encode(query_f32)),
361
+ _ => query.clone()
349
362
  };
350
363
 
351
364
  // Step 1: Find n_probe nearest clusters (coarse search)
@@ -368,10 +381,14 @@ impl HnswIvfIndex {
368
381
  cluster_distances.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap_or(std::cmp::Ordering::Equal));
369
382
 
370
383
  let clusters_to_search: Vec<usize> = cluster_distances.iter().take(n_probe).map(|(i, _)| *i).collect();
384
+ let t_coarse = t_start.elapsed();
385
+ let t_fine_start = std::time::Instant::now();
371
386
 
372
- // Step 2: Search HNSW graphs in selected clusters in parallel (fine search)
387
+ // Step 2: Search HNSW graphs in selected clusters sequentially (fine search)
388
+ // Avoid into_par_iter() here to prevent Rayon thread pool contention,
389
+ // since queries are already parallelized across segments in query.rs
373
390
  let mut candidates: Vec<(usize, f32)> = clusters_to_search
374
- .into_par_iter()
391
+ .into_iter()
375
392
  .flat_map(|cluster_id| {
376
393
  if let Some((hnsw, row_id_mapping)) = self.cluster_graphs.get(&cluster_id) {
377
394
  let cluster_k = if filter.is_some() { k * 4 } else { k * 2 };
@@ -416,9 +433,11 @@ impl HnswIvfIndex {
416
433
  .collect();
417
434
 
418
435
  // Step 3: Merge and return top-k
419
- candidates.par_sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap());
436
+ candidates.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap());
420
437
  candidates.dedup_by_key(|x| x.0); // Remove duplicates
421
438
  candidates.truncate(k);
439
+ let t_fine = t_fine_start.elapsed();
440
+ println!("Search Profile -> Coarse: {:?}, Fine: {:?}", t_coarse, t_fine);
422
441
  Ok(candidates)
423
442
  }
424
443
 
@@ -745,7 +764,12 @@ impl HnswIvfIndex {
745
764
  }
746
765
  } else if kv.key == "quantizer_config" {
747
766
  if let Some(ref val) = kv.value {
748
- loaded_quantizer = serde_json::from_str::<QuantizerImpl>(val).ok();
767
+ if let Some(mut q) = serde_json::from_str::<QuantizerImpl>(val).ok() {
768
+ if let QuantizerImpl::Pq(ref mut pq) = q {
769
+ pq.init_lut();
770
+ }
771
+ loaded_quantizer = Some(q);
772
+ }
749
773
  }
750
774
  }
751
775
  }
@@ -805,13 +829,22 @@ impl HnswIvfIndex {
805
829
  // For now we assume L2 if not specified or derive from path?
806
830
  // Better: HnswIvfIndex should save metric in centroids parquet metadata.
807
831
 
808
- let hnsw = if let Some(QuantizerImpl::TurboQuant(q)) = q_inner {
809
- if q.bits == 4 {
810
- HnswGraph::TurboQuant4(crate::core::index::hnsw_rs::hnswio::load_hnsw_with_dist(&mut graph_reader, &description, crate::core::index::distance::DistL2u4, &mut data_reader)
811
- .map_err(|e| anyhow::anyhow!("HNSW load failed: {}", e))?)
812
- } else {
813
- HnswGraph::TurboQuant8(crate::core::index::hnsw_rs::hnswio::load_hnsw_with_dist(&mut graph_reader, &description, crate::core::index::distance::DistL2u8, &mut data_reader)
814
- .map_err(|e| anyhow::anyhow!("HNSW load failed: {}", e))?)
832
+ let hnsw = if let Some(q_impl) = q_inner {
833
+ match q_impl {
834
+ QuantizerImpl::TurboQuant(q) => {
835
+ if q.bits() == 4 {
836
+ HnswGraph::TurboQuant4(crate::core::index::hnsw_rs::hnswio::load_hnsw_with_dist(&mut graph_reader, &description, crate::core::index::distance::DistL2u4, &mut data_reader)
837
+ .map_err(|e| anyhow::anyhow!("HNSW load failed: {}", e))?)
838
+ } else {
839
+ HnswGraph::TurboQuant8(crate::core::index::hnsw_rs::hnswio::load_hnsw_with_dist(&mut graph_reader, &description, crate::core::index::distance::DistL2u8, &mut data_reader)
840
+ .map_err(|e| anyhow::anyhow!("HNSW load failed: {}", e))?)
841
+ }
842
+ },
843
+ QuantizerImpl::Pq(pq) => {
844
+ let dist = crate::core::index::pq::DistPqSdc { pq: std::sync::Arc::new(pq.clone()) };
845
+ HnswGraph::Pq(crate::core::index::hnsw_rs::hnswio::load_hnsw_with_dist(&mut graph_reader, &description, dist, &mut data_reader)
846
+ .map_err(|e| anyhow::anyhow!("HNSW load failed: {}", e))?)
847
+ }
815
848
  }
816
849
  } else {
817
850
  match metric {