Conversation
Implements Collection(Edm.*) field types end-to-end: multi-valued indexing via Lucene's native multi-field model, JSON-array round-trip through a sidecar stored field, and OData any/all lambda support (Tags/any(t: t eq 'red'), Sizes/all(s: s ge 12), search.in inside lambdas, any() with no body). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Collection(Edm.String|Int32|Int64|Double|Boolean|DateTimeOffset)indexing using Lucene's native multi-valued field model, plus a__azs_collection__<name>sidecarStoredFieldso JSON arrays round-trip with order, type fidelity, and emptiness preserved.ODataQueryVisitor:Tags/any(t: t eq 'red'),Tags/any()(non-empty collection),Tags/all(t: t ne 'x'),search.ininside lambdas, numeric range comparisons (s ge 12), and combinations withand/or/not. Range-variable references resolve back to the collection's field path via a context stack so nested lambdas would compose cleanly.all(t: P(t))is rewritten asMatchAll MUST_NOT P′where the leaf comparison is inverted, which keeps the resulting Lucene query a single clean negation against the multi-valued field.Test plan
CollectionFieldTests.cscovering indexing, retrieval, lambda translation, merge-replace of collections throughLuceneNetSearchIndexer, and empty-collection semantics. 134/134 unit tests pass.EmulatorIntegrationTests.csexercising the full SDK → HTTP → emulator path with the officialAzure.Search.Documentsclient: upload + GetDocument round-trip,any(eq),any(search.in),all(ne), numericany(ge), and free-text search across a searchable string collection. 25/25 integration tests pass against a Testcontainer-hosted emulator.Fixes #6
🤖 Generated with Claude Code