Skip to content

Add Alternator vector search support#87

Closed
nyh wants to merge 2 commits into
scylladb:mainfrom
nyh:vector-1
Closed

Add Alternator vector search support#87
nyh wants to merge 2 commits into
scylladb:mainfrom
nyh:vector-1

Conversation

@nyh

@nyh nyh commented May 6, 2026

Copy link
Copy Markdown
Add Alternator vector search support

Alternator extends the DynamoDB API with vector indexes and vector
similarity search. These features are not available on AWS DynamoDB,
so the standard AWS SDK for Java has no knowledge of the new
parameters - `VectorIndexes`, `VectorSearch`, `FLOAT32VECTOR`, etc.

In this patch we introduce these features into the Alternator Java
Clien library without modifying the SDK source. Our implementation uses
an `ExecutionInterceptor` that intercepts the serialised JSON body of
each request before it is sent, and of each response before the SDK
parses it into Java objects:

  * For requests, extra parameters are injected into the JSON body
    before transmission.
  * For Responses, extra fields are extracted from the JSON body before
    the SDK discards them.

The Java implementation is in a new package:
com.scylladb.alternator.vectorsearch

The new VectorSearchInterceptor is registered by AlternatorDynamoDbClient
and AlternatorDynamoDbAsyncClient so no manual setup is needed when
using the Alternator builders.

Besides the implementation, this patch also includes documentation in
README.md of how to create vector indexes and use them for vector
searches in Alternator. And also tests:

- VectorSearchInterceptorTest: 27 unit tests covering JSON serialisation,
  Float32Vector encoding/decoding, request/response interception, scores
  extraction, and the List<AttributeValue> round-trip. No server needed.
- VectorSearchIT: integration tests requiring a live Alternator instance
  with vector store support (enabled via INTEGRATION_TESTS=true).

Signed-off-by: Nadav Har'El nyh@scylladb.com

@nyh

nyh commented May 6, 2026

Copy link
Copy Markdown
Author

@dkropachev how come I'm not allowed to invited reviewers? Not even copilot? To set labels? This is really odd. Who can fix this?

@swasik here is an initial, but full-feature, Java SDK v2 support for Alternator Vector search without modifying the SDK - just continuing with our tradition of wrapper classes around the existing SDK. Check out the README.md on how to use it - it requires learning a few new classes, but they are very much in the usual style of the Java SDK v2 (which means - in my opinion - ugly, long, and repetitive API, but that's the Java SDK v2 style which we can't change).

@nyh

nyh commented May 6, 2026

Copy link
Copy Markdown
Author

@dkropachev the "integration tests" in this repository, how do they run Alternator? Which Alternator? Would it have the vector search feature?

@nyh
nyh force-pushed the vector-1 branch 2 times, most recently from add0db7 to 7d443e5 Compare May 6, 2026 19:57

@m-szymon m-szymon left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think Interceptor is registered at wrong moment.
Otherwise I don't see serious issues.

Comment thread README.md Outdated
.attributeName("embedding")
.dimensions(128)
.build())
.similarityFunction("cosine") // optional; "dot_product" and "l2_norm" are also supported

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar issue as in Python driver - EUCLIDEAN not l2_norm and uppercase

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! You're right! It also means I'm missing a test for this int he Java client :-(

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And by writing this test and running it (not easy, requires a complex setup of Alternator and this test, probably doesn't run in CI), I realized that none of this patch actually works correctly! I'm fixing it now.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in replacement PR #145: similarity function docs/tests now use uppercase COSINE, DOT_PRODUCT, and EUCLIDEAN.

Comment thread README.md
re-encode it using the `List<AttributeValue>` overload of `Float32Vector.toAttributeValue()`:

```java
AttributeValue reEncoded = Float32Vector.toAttributeValue(av.l());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can't "copy" items, right?
PutItemRequest.builder().tableName("items").item(response.item()) will use list of numbers when "item" had a vector.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right. I'll add a warning about that in the document.

I got the AI to explain to me (and you?) why we did it this way:

So there were two real options on the read side:

Emit {"L": [...]} (current approach) — transparent; callers use av.l() with no knowledge of FLOAT32VECTOR. Standard SDK code works unmodified. Downside: silent degradation on copy.

Emit {"B": "<base64(magic+floats)>"} (the magic-prefixed encoding) — Float32Vector.isFloat32Vector(av) would return true, callers would call Float32Vector.extractFloats(av). Advantage: round-trip safe, a copy would automatically re-encode as FLOAT32VECTOR on the next write. Downside: all read code needs to be Float32Vector-aware; you can't just use av.l().

The design chose option 1 for read transparency — the goal was that existing DynamoDB code doesn't need to change to read items with vectors. The Float32Vector class was intentionally write-side-only.

Option 2 would have been the safer choice for copy correctness, but at the cost of making reads non-transparent. Neither option is strictly better; it's a deliberate trade-off. The warning in the docs is the acknowledgment of that trade-off.So there were two real options on the read side:

Emit {"L": [...]} (current approach) — transparent; callers use av.l() with no knowledge of FLOAT32VECTOR. Standard SDK code works unmodified. Downside: silent degradation on copy.

Emit {"B": "<base64(magic+floats)>"} (the magic-prefixed encoding) — Float32Vector.isFloat32Vector(av) would return true, callers would call Float32Vector.extractFloats(av). Advantage: round-trip safe, a copy would automatically re-encode as FLOAT32VECTOR on the next write. Downside: all read code needs to be Float32Vector-aware; you can't just use av.l().

The design chose option 1 for read transparency — the goal was that existing DynamoDB code doesn't need to change to read items with vectors. The Float32Vector class was intentionally write-side-only.

Option 2 would have been the safer choice for copy correctness, but at the cost of making reads non-transparent. Neither option is strictly better; it's a deliberate trade-off. The warning in the docs is the acknowledgment of that trade-off.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in replacement PR #145: the README includes the copy-item warning and explicit re-encoding example for preserving FLOAT32VECTOR storage.

} else {
overrideBuilder.addExecutionInterceptor(new BasicQueryPlanInterceptor(liveNodes));
}
overrideBuilder.addExecutionInterceptor(VectorSearchInterceptor.INSTANCE);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't it be the first Interceptor added? Especially when used with compression...

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch! I'll fix.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in replacement PR #145: the vector interceptor is registered before gzip/query-plan interceptors, with regression coverage for vector-before-gzip request bodies.


/** Builds the {@link DeleteVectorIndexAction}. */
public DeleteVectorIndexAction build() {
return new DeleteVectorIndexAction(this);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No if (indexName == null) { new IllegalStateException("indexName must be set"); }?
CreateTable checks it.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right. I'll fix.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in replacement PR #145: DeleteVectorIndexAction validates indexName, with a unit test.

@nyh

nyh commented Jun 16, 2026

Copy link
Copy Markdown
Author

@dkropachev how come I'm not allowed to invited reviewers? Not even copilot? To set labels? This is really odd. Who can fix this?

@dkropachev or @mykaul or whoever owns this repository, please fix this. It's very frustrating. Developers who don't have write permissions should not have write permissions - but should be able to do everything else. Especially invite reviewers, double-especially to invite copilot to review.

@mykaul

mykaul commented Jun 16, 2026

Copy link
Copy Markdown

@dkropachev how come I'm not allowed to invited reviewers? Not even copilot? To set labels? This is really odd. Who can fix this?

@dkropachev or @mykaul or whoever owns this repository, please fix this. It's very frustrating. Developers who don't have write permissions should not have write permissions - but should be able to do everything else. Especially invite reviewers, double-especially to invite copilot to review.

@dani-tweig - can you work with IT to align permissions?
I see that the organization permission is also wrong here - 3 individuals makes no sense.

@dani-tweig

Copy link
Copy Markdown

@dkropachev how come I'm not allowed to invited reviewers? Not even copilot? To set labels? This is really odd. Who can fix this?

@dkropachev or @mykaul or whoever owns this repository, please fix this. It's very frustrating. Developers who don't have write permissions should not have write permissions - but should be able to do everything else. Especially invite reviewers, double-especially to invite copilot to review.

@dani-tweig - can you work with IT to align permissions? I see that the organization permission is also wrong here - 3 individuals makes no sense.

This is the reason for the limited access. I dont know who created this repo, and why is the access too limited.
I will add dev with triage rights. I see this is how it is done in scylladb.git

image

@dani-tweig

Copy link
Copy Markdown

@dkropachev how come I'm not allowed to invited reviewers? Not even copilot? To set labels? This is really odd. Who can fix this?

@dkropachev or @mykaul or whoever owns this repository, please fix this. It's very frustrating. Developers who don't have write permissions should not have write permissions - but should be able to do everything else. Especially invite reviewers, double-especially to invite copilot to review.

@nyh please check it now.

@nyh

nyh commented Jun 16, 2026

Copy link
Copy Markdown
Author

Surprisingly, or not, the implementation was broken and I didn't notice this because I never ran the integration tests (which need the Java driver but also Alternator and Vector store running concurrently) because it was too difficult. With test/alternator/run --vs --stay from scylladb/scylladb#30317 it's actually very easy to run the integration tests:

INTEGRATION_TESTS=true \
ALTERNATOR_HOST=127.9.162.96 \
ALTERNATOR_PORT=8000 \
ALTERNATOR_HTTPS_PORT= \
mvn test -Dtest=VectorSearchIT 

So I'm fixing all the bugs and will push a fixed version.

@nyh

nyh commented Jun 16, 2026

Copy link
Copy Markdown
Author

@dkropachev how come I'm not allowed to invited reviewers? Not even copilot? To set labels? This is really odd. Who can fix this?

@dkropachev or @mykaul or whoever owns this repository, please fix this. It's very frustrating. Developers who don't have write permissions should not have write permissions - but should be able to do everything else. Especially invite reviewers, double-especially to invite copilot to review.

@nyh please check it now.

Thanks! I can now invite copilot to review, for example. Great.

By the way, I don't know if there are other repositories with a similar problem or this one was just a fluke. This is the one I noticed because I am sending a pull request to it.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds first-class support for Alternator’s vector search extensions (vector indexes, vector similarity queries, and FLOAT32VECTOR encoding) by introducing an AWS SDK v2 ExecutionInterceptor plus a small convenience facade, along with tests and documentation updates.

Changes:

  • Introduce VectorSearchInterceptor + vectorsearch domain types and a VectorSearchSupport facade to inject/extract Alternator-specific JSON fields.
  • Automatically register the interceptor in sync/async Alternator client builders, ensuring correct interceptor ordering with gzip/query-plan interceptors.
  • Add unit + integration tests and extend docs; make HTTPS integration test variants optionally disable-able via env var.

Reviewed changes

Copilot reviewed 18 out of 18 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
src/test/java/com/scylladb/alternator/VectorSearchInterceptorTest.java Adds unit tests for vectorsearch builders, JSON serialization, and Float32Vector behavior.
src/test/java/com/scylladb/alternator/IntegrationTestConfig.java Allows disabling HTTPS parameterized test variants by setting ALTERNATOR_HTTPS_PORT to empty.
src/main/java/com/scylladb/alternator/vectorsearch/VectorSearchSupport.java Adds a public facade to enrich requests and bundle query/describe results (including scores/indexes).
src/main/java/com/scylladb/alternator/vectorsearch/VectorSearchResultHolder.java Adds per-request holder for extra response fields extracted by the interceptor.
src/main/java/com/scylladb/alternator/vectorsearch/VectorSearchInterceptor.java Implements request/response JSON mutation for vector params and FLOAT32VECTOR conversion.
src/main/java/com/scylladb/alternator/vectorsearch/VectorSearch.java Adds a request-side model for vector query parameters (float[] or AttributeValue).
src/main/java/com/scylladb/alternator/vectorsearch/VectorQueryResult.java Wraps QueryResponse and exposes similarity scores.
src/main/java/com/scylladb/alternator/vectorsearch/VectorIndexUpdate.java Adds model for UpdateTable vector-index create/delete actions.
src/main/java/com/scylladb/alternator/vectorsearch/VectorIndex.java Adds model for vector index definitions (incl. response-only fields).
src/main/java/com/scylladb/alternator/vectorsearch/VectorAttribute.java Adds model for vector attribute name + dimensions.
src/main/java/com/scylladb/alternator/vectorsearch/Float32Vector.java Adds marker-based Binary encoding/decoding for FLOAT32VECTOR write/read paths.
src/main/java/com/scylladb/alternator/vectorsearch/DeleteVectorIndexAction.java Adds model for vector index deletion via UpdateTable.
src/main/java/com/scylladb/alternator/vectorsearch/CreateVectorIndexAction.java Adds model for vector index creation via UpdateTable.
src/main/java/com/scylladb/alternator/AlternatorDynamoDbClient.java Registers VectorSearchInterceptor and fixes interceptor order relative to gzip/query plan.
src/main/java/com/scylladb/alternator/AlternatorDynamoDbAsyncClient.java Same as sync client: registers interceptor and fixes ordering.
src/integration-test/java/com/scylladb/alternator/VectorSearchIT.java Adds end-to-end coverage for Create/Describe/Query vector search behaviors.
pom.xml Adds (provided) jackson-databind dependency declaration for interceptor JSON manipulation.
README.md Documents vector search setup and APIs, plus FLOAT32VECTOR read/write behavior.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +7 to +8
import java.util.List;
import software.amazon.awssdk.services.dynamodb.model.Projection;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in replacement PR #145: the unused import is gone.

Comment thread README.md
Comment thread pom.xml
Comment thread src/test/java/com/scylladb/alternator/VectorSearchInterceptorTest.java Outdated
@nyh

nyh commented Jun 16, 2026

Copy link
Copy Markdown
Author

I pushed a new version. Beyond addressing @m-szymon's review comments, I actually ran the integration tests with Alternator with vector store (it wasn't trivial) and discovered a bunch of serious bugs and fixed them (and added even more integration tests). All integration tests now pass. To run them, run the following two commands in two windows:

est/alternator/run --vs --stay
Scylla is: /home/nyh/scylla/build/dev/scylla.
Booting Scylla on 127.9.162.96 in /tmp/scylla-test-565856...
Vector Store is: /home/nyh/vector-store/target/release/vector-store.
Booting Vector Store on 127.9.162.96 in /tmp/scylla-test-565857...
Boot successful (0.6 seconds).
Scylla with Alternator is running without authorization enforced.
Connect at: http://127.9.162.96:8000
Press Ctrl-C to stop.
INTEGRATION_TESTS=true \
ALTERNATOR_HOST=127.9.162.96 \
ALTERNATOR_PORT=8000 \
ALTERNATOR_HTTPS_PORT= \
mvn test -Dtest=VectorSearchIT 

@nyh
nyh force-pushed the vector-1 branch 2 times, most recently from 9e52c97 to 98c53ab Compare June 16, 2026 15:08
@nyh

nyh commented Jun 16, 2026

Copy link
Copy Markdown
Author

Pushed a new version fixing copilot's review and the pedantic style-checker google-java-format. My AI seems to have the same frustration with pendantic style checks as I do, and never remembers to run them before pushing.

@nyh
nyh force-pushed the vector-1 branch 2 times, most recently from 435c1ab to e2d73c0 Compare June 16, 2026 15:51
@nyh

nyh commented Jun 16, 2026

Copy link
Copy Markdown
Author

I keep pushing new versions attempting to make the CI pass, specifically the integration tests. The "integration tests" run an older version of Alternator (I'm not sure which) and run the Java driver against it. But crucially for this patch - about vector search support - the CI does not run the vector store. So the integration tests cannot actually fully use all the vector search capabilities when running in CI. So I modified the integration tests to skip themselves when they need the vector store but it's not running. When I run the integration tests locally, against Scylla's test/alternator/run --vs --stay (the --vs means "also run vector store"), the full vector search integration tests run and I can see them passing.

It's not a perfect situation, but it's a good way forward, in my opinion. It allows me to manually test the entire patch, and the CI to do regression tests on parts of which which don't need a running vector store. In the future we can improve this driver's test framework to also run the vector store automatically, just for the sake of these vector-search tests.

nyh added 2 commits June 16, 2026 19:44
Alternator extends the DynamoDB API with vector indexes and vector
similarity search. These features are not available on AWS DynamoDB,
so the standard AWS SDK for Java has no knowledge of the new
parameters - `VectorIndexes`, `VectorSearch`, `FLOAT32VECTOR`, etc.

In this patch we introduce these features into the Alternator Java
Clien library without modifying the SDK source. Our implementation uses
an `ExecutionInterceptor` that intercepts the serialised JSON body of
each request before it is sent, and of each response before the SDK
parses it into Java objects:

  * For requests, extra parameters are injected into the JSON body
    before transmission.
  * For Responses, extra fields are extracted from the JSON body before
    the SDK discards them.

The Java implementation is in a new package:
com.scylladb.alternator.vectorsearch

The new VectorSearchInterceptor is registered by AlternatorDynamoDbClient
and AlternatorDynamoDbAsyncClient so no manual setup is needed when
using the Alternator builders.

Besides the implementation, this patch also includes documentation in
README.md of how to create vector indexes and use them for vector
searches in Alternator. And also tests:

- VectorSearchInterceptorTest: 27 unit tests covering JSON serialisation,
  Float32Vector encoding/decoding, request/response interception, scores
  extraction, and the List<AttributeValue> round-trip. No server needed.
- VectorSearchIT: integration tests requiring a live Alternator instance
  with vector store support (enabled via INTEGRATION_TESTS=true).

Signed-off-by: Nadav Har'El <nyh@scylladb.com>
When ALTERNATOR_HTTPS_PORT is set to an empty string, httpAndHttpsEndpoints()
returns only the HTTP entry, so parameterized test classes run only the HTTP
variant. This avoids spurious connection-refused errors when testing against
an Alternator node that is only reachable over HTTP.

Example — run integration tests against an HTTP-only node:

  INTEGRATION_TESTS=true \
  ALTERNATOR_HOST=127.8.209.117 \
  ALTERNATOR_PORT=8000 \
  ALTERNATOR_HTTPS_PORT= \
  mvn test -Dtest=VectorSearchIT
@nyh

nyh commented Jun 16, 2026

Copy link
Copy Markdown
Author

Hallelujah! The tests all passed! (some of were actually skipped because the CI uses some antique docker of Alternator - but at least it doesn't fail).

Let's consider merging this PR.

I have to admit, I don't love the way this PR came out. While the AI found some ingenious ways to hack the Java SDK to support things it doesn't support, this "hacking" is not as pretty and simple as in Python, and is in fact quite ugly and even scary-looking (we have a magic binary constant, among other things).

I think at some point we will need to stop pretending that we are only a wrapper over the existing SDK, and instead produce patches to the SDK source code. But this patch is good while we have not made the decision to move from the "wrapper on SDK" mindset to the "patched SDK" mindset.

@nyh
nyh requested review from ScyllaPiotr and dkropachev June 16, 2026 20:01
@dkropachev

Copy link
Copy Markdown
Collaborator

@m-szymon , @ScyllaPiotr , i am ready to merge, please complete the review.

@m-szymon m-szymon left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should have some tests for async client, as I suspect it is missing implementation.
I am also very confused about order of interceptors and hooks, so please verify this. Maybe Vector Search + request compression will be rare and unlikely, but I think there is something wrong.

Comment on lines +140 to +144
* <p>The AWS SDK sets {@code Content-Length} from the original (pre-interceptor) body length. If
* we only change the body in {@code modifyHttpContent}, the server receives a stale {@code
* Content-Length}. We therefore read the cached modified bytes (written by {@code
* modifyHttpContent}) here and update the header to match.
*

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that true? modifyHttpContent is intended to modify content, so I would expect it adjusts Content-Lenght accordingly.
AI may be confused as is seems modifyHttpContent didn't exist in SDKv1 and documentation is poor.
Compression interceptor doesn't change this header, so either we have a bug there or don't have to do it here.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in replacement PR #145: request body changes update Content-Length; gzip now also recalculates it after compression.

* #modifyHttpRequest}, and returns the new body.
*/
@Override
public Optional<RequestBody> modifyHttpContent(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't we also implement modifyAsyncHttpContent for AsyncClient?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in replacement PR #145: async DynamoDB non-streaming requests are covered with a fake async HTTP client test proving vector search request injection works through the async SDK path.

* </ol>
*/
@Override
public Optional<InputStream> modifyHttpResponseContent(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again don't we need modifyAsyncHttpResponseContent?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in replacement PR #145: modifyAsyncHttpResponseContent is implemented and covered for async Scores extraction and FLOAT32VECTOR response conversion.

Comment on lines +145 to +149
* <p><b>Call order:</b> The SDK calls {@code modifyHttpContent} before {@code modifyHttpRequest}
* for each interceptor (verified from {@code ExecutionInterceptorChain} bytecode), passing the
* same {@link ExecutionAttributes} instance to both, so the cache is always populated by the time
* this method runs.
*/

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This part also seems to be not true. This is not documented and AI struggled to tell it definitly, but it seems modifyHttpRequest is called before modifyHttpContent. And compression implementation seems to confirm that.
What is more modifyHttpRequest from all interceptors is called and then modifyHttpContent from all interceptors.
GzipRequestInterceptor caches content in modifyHttpRequest (it needs to calculate size, to make a decision), and then it uses it in modifyHttpContent so it seems it will skip any vector search modifications.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in replacement PR #145: gzip no longer depends on a particular request/content hook order, and a regression test verifies vector search modifications are compressed correctly.

@dkropachev

Copy link
Copy Markdown
Collaborator

Closing in favor of replacement PR #145, which carries this work forward with the unresolved review items addressed.

@dkropachev dkropachev closed this Jul 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants