Skip to content

Conversation

xzfc
Copy link
Contributor

@xzfc xzfc commented Jun 17, 2025

This PR replaces some trait generic parameters with associated types. Consequentially, these generic parameters could be omitted in places where they are redundant.

@xzfc xzfc added the chore Nice to have improvement label Jun 17, 2025
Copy link
Contributor

coderabbitai bot commented Jun 17, 2025

📝 Walkthrough

Walkthrough

This change refactors several core traits and their implementations in the quantization and vector storage modules. The EncodedStorageBuilder and EncodedVectors traits are updated to use associated types instead of generic parameters, affecting their method signatures and trait bounds throughout the codebase. Corresponding changes are made to trait implementations and struct definitions, removing redundant generic parameters and phantom types. The QueryScorer trait is similarly refactored to use an associated type for the vector type, and all related scorer implementations are updated accordingly. Additionally, generic parameters related to encoded query types are removed in favor of using associated types from the EncodedVectors trait. Type aliases and function signatures are simplified to reflect these trait changes, improving type coherence and reducing redundancy.

Possibly related PRs

Suggested reviewers

  • timvisee
  • generall

📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f9120ef and bcf77bf.

📒 Files selected for processing (1)
  • lib/segment/src/vector_storage/raw_scorer.rs (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • lib/segment/src/vector_storage/raw_scorer.rs
⏰ Context from checks skipped due to timeout of 90000ms (13)
  • GitHub Check: Basic TLS/HTTPS tests
  • GitHub Check: test-consistency
  • GitHub Check: test-shard-snapshot-api-s3-minio
  • GitHub Check: test-snapshot-operations-s3-minio
  • GitHub Check: test-consensus-compose
  • GitHub Check: test-low-resources
  • GitHub Check: rust-tests-no-rocksdb (ubuntu-latest)
  • GitHub Check: rust-tests (windows-latest)
  • GitHub Check: storage-compat-test
  • GitHub Check: rust-tests (macos-latest)
  • GitHub Check: rust-tests (ubuntu-latest)
  • GitHub Check: integration-tests-consensus
  • GitHub Check: lint
✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🔭 Outside diff range comments (6)
lib/segment/src/vector_storage/quantized/quantized_mmap_storage.rs (2)

61-65: unwrap()s leave the builder fallible path unchecked

Both flush() and make_read_only() may fail (I/O, SIGBUS, …). Panicking here will crash the process at index-build time. Propagate the errors instead:

-    fn build(self) -> QuantizedMmapStorage {
-        self.mmap.flush().unwrap();
-        let mmap = self.mmap.make_read_only().unwrap(); // TODO: remove unwrap
-        QuantizedMmapStorage { mmap }
+    fn build(self) -> QuantizedMmapStorage {
+        // Flush the data to disk first
+        self.mmap
+            .flush()
+            .expect("failed to flush mmap while building QuantizedMmapStorage");
+
+        let mmap = self
+            .mmap
+            .make_read_only()
+            .expect("failed to switch mmap to read-only");
+
+        QuantizedMmapStorage { mmap }
     }

(or return std::io::Result<QuantizedMmapStorage> and bubble the error upstream).


68-70: Bounds check missing in push_vector_data

cursor_pos + other.len() can overflow the mmap slice and cause UB.
Consider an assert:

     fn push_vector_data(&mut self, other: &[u8]) {
-        self.mmap[self.cursor_pos..self.cursor_pos + other.len()].copy_from_slice(other);
+        debug_assert!(
+            self.cursor_pos + other.len() <= self.mmap.len(),
+            "Encoded vector data exceeds allocated mmap size"
+        );
+        self.mmap[self.cursor_pos..self.cursor_pos + other.len()].copy_from_slice(other);
         self.cursor_pos += other.len();
     }
lib/segment/src/vector_storage/query_scorer/multi_metric_query_scorer.rs (1)

48-48: size_of isn’t in scope – compilation will fail

size_of::<TElement>() is used but std::mem::size_of is not imported in this module.
Add the import or fully-qualify the call:

-use std::mem::MaybeUninit;
+use std::mem::{size_of, MaybeUninit};

(or std::mem::size_of::<TElement>() inline).

lib/segment/src/vector_storage/query_scorer/multi_custom_query_scorer.rs (1)

66-70: Missing size_of import mirrors the previous file

size_of::<TElement>() is used to compute multipliers but size_of is not imported. Same fix as in multi_metric_query_scorer.rs.

lib/segment/src/vector_storage/quantized/quantized_custom_query_scorer.rs (1)

69-72: size_of used without import – compilation will fail

size_of::<TElement>() is referenced, but size_of is not in scope. Add the import or qualify the call:

 use std::borrow::Cow;
 use std::marker::PhantomData;
+use std::mem::size_of;

or

-hardware_counter.set_cpu_multiplier(size_of::<TElement>());
+hardware_counter.set_cpu_multiplier(std::mem::size_of::<TElement>());
lib/segment/src/vector_storage/quantized/quantized_multi_custom_query_scorer.rs (1)

74-78: Same missing size_of import here

size_of::<TElement>() is used in new_multi without bringing it into scope.

 use std::marker::PhantomData;
+use std::mem::size_of;

(or qualify the call).

🧹 Nitpick comments (13)
lib/segment/src/vector_storage/chunked_vectors.rs (1)

251-253: Prefer Self instead of repeating the concrete type

Using Self keeps the implementation resilient to renames and reduces duplication:

 impl quantization::EncodedStorageBuilder for ChunkedVectors<u8> {
-    type Storage = ChunkedVectors<u8>;
+    type Storage = Self;

Purely cosmetic but improves maintainability.

lib/segment/src/vector_storage/query_scorer/mod.rs (2)

16-18: Nice move to an associated type – consider documenting TVector

The trait is now more ergonomic; adding a short rustdoc line describing what TVector represents will help implementers and future maintainers.


34-35: Inline hint for tiny hot loop

score is on the hot-path for every search. An #[inline(always)] (or at least #[inline]) could be added to encourage inlining across crate boundaries:

-    fn score(&self, v2: &Self::TVector) -> ScoreType;
+    #[inline] // hot path
+    fn score(&self, v2: &Self::TVector) -> ScoreType;

Minor, but can shave a few cycles in tight loops.

lib/quantization/src/encoded_vectors.rs (2)

23-25: Associated type introduction looks good but consider trait-object usability

Switching from a generic to an associated type simplifies downstream generics – nice.
If you ever need dyn EncodedVectors, the free associated type makes the trait not object-safe. That limitation existed before, but it becomes more apparent now. Documenting it (or adding #[object_safe] tests) would avoid surprises.


36-44: Add bounds on EncodedQuery for better compile-time guarantees

encode_query/score_point implicitly rely on Self::EncodedQuery being Sized (stored in structs) and usually Send + Sync.
Adding explicit bounds can prevent accidental unsized / non-thread-safe implementations:

-pub trait EncodedVectors: Sized {
-    type EncodedQuery;
+pub trait EncodedVectors: Sized {
+    type EncodedQuery: Sized + Send + Sync + 'static;
lib/segment/src/vector_storage/quantized/quantized_query_scorer.rs (2)

13-24: Struct remains generic over TElement although it is only a marker

TElement is kept solely for the PhantomDatas – fine for type-level bookkeeping.
If you notice growing compile times, consider removing the parameter and using phantom: PhantomData<fn() -> TElement> in the few scorers that actually depend on it.


59-67: Implement score with unreachable!() instead of unimplemented!()

unimplemented!() triggers a panic without optimisation hints.
Using unreachable!() conveys intent and allows LLVM to optimise better:

-    fn score(&self, _v2: &[TElement]) -> ScoreType {
-        unimplemented!("This method is not expected to be called for quantized scorer");
-    }
+    fn score(&self, _v2: &[TElement]) -> ScoreType {
+        unreachable!("`score` should never be called for quantized scorers");
+    }
lib/segment/src/vector_storage/quantized/quantized_multivector_storage.rs (2)

261-270: Capacity hint can avoid reallocations when encoding query

collect() on an iterator of known length reallocates.
Pre-allocate with Vec::with_capacity(inner_count) to save a few mallocs:

-        multi_vector
-            .multi_vectors()
-            .map(|inner_vector| self.quantized_storage.encode_query(inner_vector))
-            .collect()
+        {
+            let inner_cnt = multi_vector.multi_vectors().count();
+            let mut result = Vec::with_capacity(inner_cnt);
+            for v in multi_vector.multi_vectors() {
+                result.push(self.quantized_storage.encode_query(v));
+            }
+            result
+        }

233-241: type EncodedQuery alias is clear – consider documenting multi-vector order

Because the returned Vec flattens inner vectors in insertion order, a short doc comment on the associated type or on encode_query explaining the ordering assumption would help implementors avoid subtle bugs.

lib/segment/src/vector_storage/raw_scorer.rs (1)

443-447: Return impl RawScorer to avoid unnecessary boxing

You could make the helper zero-cost by returning impl RawScorer (still dyn-compatible if needed by callers):

-pub fn raw_scorer_from_query_scorer<'a>(
-    query_scorer: impl QueryScorer + 'a,
-) -> OperationResult<Box<dyn RawScorer + 'a>> {
-    Ok(Box::new(RawScorerImpl { query_scorer }))
+pub fn raw_scorer_from_query_scorer<'a>(
+    query_scorer: impl QueryScorer + 'a,
+) -> OperationResult<RawScorerImpl<impl QueryScorer + 'a>> {
+    Ok(RawScorerImpl { query_scorer })
 }

Only convert to Box<dyn RawScorer> at the outermost API boundary if necessary.

lib/segment/src/vector_storage/quantized/quantized_multi_query_scorer.rs (2)

39-51: Pre-allocate flattened query buffer

query grows with extend_from_slice inside the loop.
Pre-allocating:

let mut query = Vec::with_capacity(raw_query.multi_vectors().count() * self.dim);

(or derive capacity from raw_query) reduces reallocations on large inputs.


66-74: Same unimplemented!() remark as for single-vector scorer

Consider replacing with unreachable!() for optimisation consistency.

lib/segment/src/vector_storage/quantized/quantized_scorer_builder.rs (1)

132-136: Consider naming the “shadowed” struct field for clarity

quantized_storage: _same_as_quantized_storage_in_args exists solely to satisfy the move out of self.
Although the leading underscore silences lints, the name is opaque. A shorter _unused (or simply omit by pattern ..) improves readability.

-let Self {
-    quantized_storage: _same_as_quantized_storage_in_args,
-    ...
-} = self;
+let Self { .. } = self;

Also applies to: 203-207

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between da8da97 and f9120ef.

📒 Files selected for processing (23)
  • lib/quantization/src/encoded_storage.rs (2 hunks)
  • lib/quantization/src/encoded_vectors.rs (2 hunks)
  • lib/quantization/src/encoded_vectors_binary.rs (2 hunks)
  • lib/quantization/src/encoded_vectors_pq.rs (4 hunks)
  • lib/quantization/src/encoded_vectors_u8.rs (2 hunks)
  • lib/segment/src/index/hnsw_index/gpu/gpu_vector_storage/gpu_multivectors.rs (1 hunks)
  • lib/segment/src/vector_storage/async_raw_scorer.rs (3 hunks)
  • lib/segment/src/vector_storage/chunked_vectors.rs (1 hunks)
  • lib/segment/src/vector_storage/quantized/quantized_custom_query_scorer.rs (3 hunks)
  • lib/segment/src/vector_storage/quantized/quantized_mmap_storage.rs (1 hunks)
  • lib/segment/src/vector_storage/quantized/quantized_multi_custom_query_scorer.rs (3 hunks)
  • lib/segment/src/vector_storage/quantized/quantized_multi_query_scorer.rs (2 hunks)
  • lib/segment/src/vector_storage/quantized/quantized_multivector_storage.rs (6 hunks)
  • lib/segment/src/vector_storage/quantized/quantized_query_scorer.rs (2 hunks)
  • lib/segment/src/vector_storage/quantized/quantized_scorer_builder.rs (12 hunks)
  • lib/segment/src/vector_storage/quantized/quantized_vectors.rs (2 hunks)
  • lib/segment/src/vector_storage/query_scorer/custom_query_scorer.rs (1 hunks)
  • lib/segment/src/vector_storage/query_scorer/metric_query_scorer.rs (1 hunks)
  • lib/segment/src/vector_storage/query_scorer/mod.rs (2 hunks)
  • lib/segment/src/vector_storage/query_scorer/multi_custom_query_scorer.rs (1 hunks)
  • lib/segment/src/vector_storage/query_scorer/multi_metric_query_scorer.rs (1 hunks)
  • lib/segment/src/vector_storage/query_scorer/sparse_custom_query_scorer.rs (1 hunks)
  • lib/segment/src/vector_storage/raw_scorer.rs (3 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (2)
lib/segment/src/vector_storage/quantized/quantized_multivector_storage.rs (3)
lib/quantization/src/encoded_vectors_u8.rs (3)
  • query (346-346)
  • query (352-355)
  • encode_query (327-369)
lib/quantization/src/encoded_vectors_pq.rs (1)
  • encode_query (484-506)
lib/quantization/src/encoded_vectors.rs (1)
  • encode_query (36-36)
lib/segment/src/vector_storage/quantized/quantized_scorer_builder.rs (4)
lib/segment/src/vector_storage/quantized/quantized_custom_query_scorer.rs (1)
  • new (36-80)
lib/segment/src/vector_storage/quantized/quantized_query_scorer.rs (1)
  • new (33-57)
lib/segment/src/vector_storage/quantized/quantized_multi_custom_query_scorer.rs (1)
  • new_multi (36-86)
lib/segment/src/vector_storage/quantized/quantized_multi_query_scorer.rs (1)
  • new_multi (33-63)
⏰ Context from checks skipped due to timeout of 90000ms (14)
  • GitHub Check: Basic TLS/HTTPS tests
  • GitHub Check: test-shard-snapshot-api-s3-minio
  • GitHub Check: test-consistency
  • GitHub Check: test-snapshot-operations-s3-minio
  • GitHub Check: test-consensus-compose
  • GitHub Check: test-low-resources
  • GitHub Check: rust-tests (windows-latest)
  • GitHub Check: rust-tests (ubuntu-latest)
  • GitHub Check: rust-tests (macos-latest)
  • GitHub Check: integration-tests-consensus
  • GitHub Check: rust-tests-no-rocksdb (ubuntu-latest)
  • GitHub Check: storage-compat-test
  • GitHub Check: integration-tests
  • GitHub Check: lint
🔇 Additional comments (23)
lib/segment/src/vector_storage/query_scorer/custom_query_scorer.rs (1)

80-83: Same missing size_of import here

size_of::<TElement>() is used on l. 58, but only MaybeUninit is imported from std::mem. Bring size_of into scope:

-use std::mem::MaybeUninit;
+use std::mem::{MaybeUninit, size_of};

Without this, the crate will not compile.

⛔ Skipped due to learnings
Learnt from: JojiiOfficial
PR: qdrant/qdrant#5954
File: lib/segment/src/index/field_index/bool_index/simple_bool_index.rs:219-228
Timestamp: 2025-03-12T13:40:56.980Z
Learning: In Rust 1.80.0 and later, `std::mem::size_of` is included in the prelude and doesn't need to be explicitly imported.
Learnt from: JojiiOfficial
PR: qdrant/qdrant#5954
File: lib/segment/src/index/field_index/bool_index/simple_bool_index.rs:219-228
Timestamp: 2025-03-12T13:40:56.980Z
Learning: In Rust 1.80.0 and later, `std::mem::size_of` is included in the prelude and doesn't need to be explicitly imported.
lib/segment/src/vector_storage/quantized/quantized_mmap_storage.rs (1)

58-60: Trait migration looks correct

QuantizedMmapStorageBuilder now implements EncodedStorageBuilder via an associated Storage type, matching the new trait definition. No issues spotted.

lib/segment/src/vector_storage/query_scorer/multi_metric_query_scorer.rs (1)

90-93: Associated-type migration LGTM

The scorer now declares type TVector and compiles against the new QueryScorer signature. No issues with the change itself.

lib/segment/src/vector_storage/query_scorer/multi_custom_query_scorer.rs (1)

113-116: Associated-type declaration correct

type TVector = TypedMultiDenseVector<TElement> correctly adapts to the new QueryScorer trait. Looks good.

lib/quantization/src/encoded_storage.rs (2)

23-27: Trait refactor is sound

Introducing the associated type Storage removes redundancy and keeps the API intuitive. Method signature updated accordingly – 👍


68-70: Implementation for Vec<u8> matches the new trait

type Storage = Vec<u8> and unchanged logic compile cleanly.

lib/segment/src/index/hnsw_index/gpu/gpu_vector_storage/gpu_multivectors.rs (1)

61-62: Generic bound updated correctly

QuantizedStorage: EncodedVectors now relies on the trait’s associated EncodedQuery type. Change aligns with the new API.

lib/segment/src/vector_storage/quantized/quantized_multivector_storage.rs (1)

159-190: Possible double-count of vector I/O in score_point_max_similarity

You pre-increment vector_io_read once (👍) but each inner call to
self.quantized_storage.score_point(...) is likely to increment the same counter again, effectively over-counting.
Verify that score_point doesn’t touch vector_io_read when the caller already did. If it does, consider adding a “caller already counted” flag or a specialised internal method to avoid duplication.

lib/segment/src/vector_storage/raw_scorer.rs (2)

43-47: Nice generic simplification

Dropping the explicit TVector parameter cleans up the wrapper without behavioural change – good refactor.


709-734: Batch scoring loop is safe and cache-friendly – LGTM

Chunking with VECTOR_READ_BATCH_SIZE avoids oversized mutable borrows; implementation is sound.

lib/segment/src/vector_storage/async_raw_scorer.rs (1)

27-35: Trait-bound update looks correct

The new QueryScorer<TVector = [VectorElementType]> bound cleanly follows the associated-type refactor and keeps the compiler‐level guarantees unchanged. No functional or coherence issues spotted.

Also applies to: 46-47, 179-180

lib/segment/src/vector_storage/quantized/quantized_vectors.rs (3)

70-72: Binary*Multi now uses u8 instead of u128 – verify performance/size trade-off

Previous single-vector variants keep u128, while the new multivector aliases switch to u8.
This compiles, but it silently changes:

  • bit-packing granularity (8 × more elements processed per scalar op, fewer SIMD opportunities);
  • memory layout returned by get_quantized_vector_size_from_params.

If the change is intentional, consider documenting the rationale and benchmarking; otherwise reverting to u128 keeps consistency with the non-multi variants.

-type BinaryRamMulti =
-    QuantizedMultivectorStorage<EncodedVectorsBin<u8, ChunkedVectors<u8>>, Vec<MultivectorOffset>>;
+// Was u128 in the single-vector storage – revisit if SIMD throughput is important

54-56: Aliases updated to drop the redundant encoded-query parameter – good
The new type aliases read cleaner and match the trait changes.

Also applies to: 62-64


9-11: Import cleanup is fine
Unused imports removed; the module compiles leaner.

lib/quantization/src/encoded_vectors_binary.rs (2)

176-178: Correct use of the builder’s associated Storage type

Switching the bound to impl EncodedStorageBuilder<Storage = TStorage> reflects the new trait shape and keeps the type information explicit.


278-283: EncodedVectors impl updated with EncodedQuery associated type – looks good

The associated-type definition lines up with the trait and downstream code. No further action needed.

lib/segment/src/vector_storage/quantized/quantized_scorer_builder.rs (1)

94-110: Helper calls simplified – no functional change

Replacing the three-parameter generic with &impl EncodedVectors keeps monomorphisation while dropping redundant types. 👍

Also applies to: 112-128

lib/quantization/src/encoded_vectors_u8.rs (2)

43-45: Builder bound migrated to associated type – correct
The new EncodedStorageBuilder<Storage = TStorage> signature matches the refactor; implementation untouched.


294-296: Associated EncodedQuery type set – implementation consistent
Interface users now rely on the trait’s associated type; no issues found.

lib/segment/src/vector_storage/quantized/quantized_custom_query_scorer.rs (2)

14-20: Good migration to associated type.

Switching from the explicit TEncodedQuery generic to TEncodedVectors::EncodedQuery trims noise and makes the struct signature easier to read.


83-92: Verify trait bound vs. unsized associated type

type TVector = [TElement]; introduces an unsized associated type. Ensure QueryScorer defines
type TVector: ?Sized (or similar) – otherwise this will not compile.

lib/segment/src/vector_storage/quantized/quantized_multi_custom_query_scorer.rs (1)

14-20: Clean generic reduction acknowledged

The move to TEncodedVectors::EncodedQuery keeps the public surface smaller and avoids phantom types. Nice.

lib/quantization/src/encoded_vectors_pq.rs (1)

58-61: Updated builder bound aligns with new EncodedStorageBuilder design

Using impl EncodedStorageBuilder<Storage = TStorage> reflects the new associated-type pattern and removes a redundant generic. Looks correct.

@xzfc xzfc merged commit 6717d38 into dev Jun 17, 2025
18 checks passed
@xzfc xzfc deleted the assoc-types branch June 17, 2025 07:32
generall pushed a commit that referenced this pull request Jul 17, 2025
* Make EncodedVectors::EncodedQuery associated type

* Make EncodedStorageBuilder::Storage associated type

* Make QueryScorer::TVector associated type

* Remove TVector from RawScorerImpl generic parameters
@xzfc xzfc mentioned this pull request Aug 18, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
chore Nice to have improvement
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants