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.
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/Cargo.lock +1 -1
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/Cargo.toml +1 -1
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/PKG-INFO +3 -1
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/pyproject.toml +3 -2
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/iceberg.rs +9 -2
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/dist.rs +2 -1
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/hnswio.rs +8 -10
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/metadata.rs +6 -1
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/reader.rs +1 -1
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/segment.rs +14 -17
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/table.rs +132 -8
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/lib.rs +2 -2
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/python_binding.rs +1 -1
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/python_gpu_context.rs +1 -1
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/.gitattributes +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/.gitignore +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/.hypothesis/constants/32b327793848e7d8 +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/.hypothesis/constants/67b0a8ccf18bf5d2 +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/.hypothesis/constants/84828557b4ee7be4 +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/.instructions.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/DORIS_OPTIMIZATION_PATTERNS.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/LICENSE-APACHE +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/LICENSE-MIT +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/README.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/RUN_COMPLIANCE_TESTS.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/STEERING.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/THIRDPARTY_NOTICES.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/benches/bench_table.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/benches/performance.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/book.toml +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/build-connectors.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/build.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/build_out.txt +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/check_iceberg_compliance.py +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/clippy_output.txt +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docker-compose-minio-nessie.yml +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docker-compose.yml +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/BENCHMARKING.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/COMPREHENSIVE_GUIDE.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/GPU_SETUP_GUIDE.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/ICEBERG_V2_V3_API.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/PGVECTOR_SQL_GUIDE.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/PYTHON_VECTOR_API.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/VECTOR_CONFIGURATION.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/api_reference.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/architecture.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/catalog_usage.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/index.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/integrations/README.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/integrations/java_jni.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/integrations/python.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/integrations/spark.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/docs/integrations/trino.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/fix_cache.patch +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/fix_nb.py +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/fix_schema.patch +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/proptest-regressions/core/index/gpu.txt +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/proptest-regressions/core/sql/vector_literal.txt +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/proptest-regressions/core/sql/vector_udf.txt +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/python/hyperstreamdb/__init__.py +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/python/hyperstreamdb/embeddings.py +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/.bloop/bloop.settings.json +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/.bloop/spark-hyperstream-test.json +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/.bloop/spark-hyperstream.json +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/pom.xml +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/DefaultSource.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamPartition.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamPartitionReader.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamPartitionReaderFactory.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamScanBuilder.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/src/main/java/com/hyperstreamdb/spark/HyperStreamTable.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/bin/gateway.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/bin/hdb.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/bin/iceberg_rest.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/bin/probe_datafusion.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/bin/setup_test_data.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/bin/verify_layered_indexing.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/cache.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/config.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/glue.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/hive.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/jdbc.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/mod.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/nessie.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/rest.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/catalog/unity.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/clustering.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/compaction.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/embeddings.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/ffi.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/iceberg/iceberg_delete.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/cosine_distance.cu +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/hamming_distance.cu +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/inner_product.cu +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/jaccard_distance.cu +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/kmeans_assignment.cu +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/l1_distance.cu +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/cuda/l2_distance.cu +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/distance.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/gpu.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_ivf.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/annhdf5.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/api.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/flatten.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/hnsw.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/libext.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/mod.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/prelude.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/hnsw_rs/test.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/ivf.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/memory.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mod.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/cosine_distance.metal +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/hamming_distance.metal +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/inner_product.metal +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/jaccard_distance.metal +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/kmeans_assignment.metal +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/l1_distance.metal +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/mps/l2_distance.metal +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/cosine_distance.cl +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/hamming_distance.cl +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/inner_product.cl +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/jaccard_distance.cl +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/kmeans_assignment.cl +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/l1_distance.cl +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/opencl/l2_distance.cl +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/pq.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/index/tokenizer.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/maintenance.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/manifest.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/merge.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/mod.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/nessie.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/planner.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/puffin.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/query.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/mod.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/optimizer.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/pgvector_rewriter.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/physical_plan/index_join.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/physical_plan.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/session.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/vector_literal.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/vector_operators.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/sql/vector_udf.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/storage.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/table.rs.orig +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/core/wal.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/enterprise/continuous_indexing.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/enterprise/license.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/enterprise/mod.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/index.rs.old +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/python_distance.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/telemetry/metrics.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/telemetry/mod.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/src/telemetry/tracing.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/task.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/all_types_index_test.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/bin/generate_iceberg_manifests.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/bin/verify_iceberg_read_check.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/data/download_nyc_taxi.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/data/generate_embeddings.py +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/data/generate_wikipedia.py +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/data/start_nessie.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/datafusion_rust_test.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/debug_murmur3.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/fuzz_murmur3.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/integration_test_hnsw_ivf_native.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/performance/README.md +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/prototype_merge.py +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/schema_evolution_test.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_catalog_commit.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_compliance.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_delete_correctness.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_iceberg_python_delete.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_iceberg_rest.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_iceberg_rest_create.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_iceberg_rest_delete.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_iceberg_rest_remove_index.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_iceberg_rest_update.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_metadata_creation.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_mor_reads.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_mor_writes.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_partition_transforms.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_partitioned_writes.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_puffin_index.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_rest_updates.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/tests/verify_schema_compat.rs +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/.DS_Store +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/catalog/glue_catalog.properties +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/catalog/hyperstreamdb.properties +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/catalog/iceberg.properties +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/catalog/memory.properties +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/catalog/postgres.properties +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/config.properties +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/entrypoint.sh +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/jvm.config +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config/node.properties +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-config.zip +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/pom.xml +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBColumnHandle.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBConnectorFactory.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBMetadata.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBPageSource.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBPageSourceProvider.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBPlugin.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBSplit.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBSplitManager.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/trino-hyperstream/src/main/java/com/hyperstreamdb/trino/HyperStreamDBTableHandle.java +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/update_schema_patch.py +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/update_schema_patch2.py +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/verify_docstrings.py +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/verify_fluent_api.py +0 -0
- {hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/verify_unified_ingest.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hyperstreamdb
|
|
3
|
-
Version: 0.1.
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 :
|
|
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
|
|
629
|
-
|
|
630
|
-
|
|
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
|
|
691
|
-
|
|
692
|
-
|
|
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
|
-
|
|
468
|
-
|
|
469
|
-
.
|
|
470
|
-
|
|
471
|
-
|
|
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
|
-
|
|
475
|
-
|
|
476
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/proptest-regressions/core/sql/vector_literal.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hyperstreamdb-0.1.3 → hyperstreamdb-0.1.6}/spark-hyperstream/.bloop/spark-hyperstream-test.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|