You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by "xiangfu0 (via GitHub)" <gi...@apache.org> on 2026/08/18 05:13:34 UTC

[PR] Fix FULL-upsert vector candidate generation [pinot]

xiangfu0 opened a new pull request, #19287:
URL: https://github.com/apache/pinot/pull/19287

   ## Summary
   
   Fix FULL-upsert vector queries so obsolete physical versions cannot consume the per-segment top-K candidate budget before Pinot applies the query-scoped upsert snapshot.
   
   - Treat the upsert snapshot as a mandatory candidate-generation scope while retaining the final outer bitmap AND as defense in depth.
   - Keep required upsert/publication scopes separate from optimizer-selected metadata filters.
   - Use filtered ANN when the reader supports it; otherwise scan exact distances only over allowed document IDs and fail clearly when no safe path exists.
   - Apply the same allowed-document contract to no-index exact search, threshold search, and vector radius predicates.
   - Make mutable HNSW filter-aware with explicit Pinot document IDs, same-generation NRT lookup/filtering, immutable async inputs, and a captured publication boundary.
   - Preserve adaptive metadata behavior for ordinary non-upsert queries and avoid vector bitmap allocation for non-vector plans.
   - Add explain attributes for candidate-filter cardinality, execution mode, skipped generation, and fallback reason.
   
   ## Root cause
   
   `FilterPlanNode` constructed and executed `VECTOR_SIMILARITY` before adding `SegmentContext.getDocIdsSnapshot()` as an outer AND. Obsolete versions could therefore occupy ANN top-K slots and be removed only afterward, producing fewer than K rows or omitting nearer current rows.
   
   ## Validation
   
   All commands ran with JDK 25 and `GITHUB_ACTIONS=true`.
   
   - Core vector/filter suite: 101 tests passed.
   - Mutable and immutable HNSW suite: 16 tests passed.
   - `VectorUpsertTableTest`: 2 query-engine invocations passed, covering both a single consuming segment and sealed-plus-consuming segments.
   - Fresh affected-reactor `clean test-compile` with `-Xlint:all` passed.
   - Spotless, Checkstyle, license format/check, and `git diff --check` passed.
   
   The integration test verifies six physical records/four current records, exact K and entity membership, scalar-distance equivalence, both query engines, two replicas, and a `skipUpsert=true` control proving obsolete rows are physically nearest.
   
   ## Performance and compatibility
   
   ANN approximation semantics are unchanged. Readers that cannot honor the mandatory bitmap use a correctness-first exact scan whose cost is proportional to the allowed-document count times vector dimension. Mutable HNSW currently opens an NRT reader per search; reusable reader management can be optimized separately.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org


Re: [PR] Fix FULL-upsert vector candidate generation [pinot]

Posted by "xiangfu0 (via GitHub)" <gi...@apache.org>.
xiangfu0 closed pull request #19287: Fix FULL-upsert vector candidate generation
URL: https://github.com/apache/pinot/pull/19287


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org


Re: [PR] Fix FULL-upsert vector candidate generation [pinot]

Posted by "Copilot (via GitHub)" <gi...@apache.org>.
Copilot commented on code in PR #19287:
URL: https://github.com/apache/pinot/pull/19287#discussion_r3801830487


##########
pinot-core/src/main/java/org/apache/pinot/core/operator/filter/VectorSimilarityFilterOperator.java:
##########
@@ -292,31 +381,80 @@ protected void explainAttributes(ExplainAttributeBuilder attributeBuilder) {
     if (explainContext.getFilterSelectivity() >= 0) {
       attributeBuilder.putString("filterSelectivity", String.format("%.4f", explainContext.getFilterSelectivity()));
     }
+    attributeBuilder.putBool("upsertCandidateFilterApplied", _requiredUpsertCandidateBitmap != null);
+    attributeBuilder.putLongIdempotent("upsertCandidateFilterCardinality", getRequiredUpsertCandidateCardinality());
+    attributeBuilder.putBool("publishedDocRangeApplied", _publishedDocIdsBitmap != null);
+    attributeBuilder.putLongIdempotent("publishedDocRangeCardinality", getPublishedDocIdsCardinality());
+    attributeBuilder.putBool("requiredMetadataCandidateFilterApplied", _requiredMetadataCandidateBitmap != null);
+    attributeBuilder.putLongIdempotent("requiredMetadataCandidateFilterCardinality",
+        getRequiredMetadataCandidateCardinality());
+    attributeBuilder.putLongIdempotent("effectiveAllowedDocIdsCardinality",
+        getEffectiveAllowedDocIdsCardinality());
+    attributeBuilder.putBool("candidateGenerationSkipped", _candidateGenerationSkipped);
+    if (_candidateGenerationSkipped) {
+      attributeBuilder.putString("candidateGenerationSkipReason", getCandidateGenerationSkipReason());
+    }
+    if (_runtimeFallbackReason != null) {
+      attributeBuilder.putString("fallbackReason", _runtimeFallbackReason);
+    }
   }
 
   /// Returns true if the underlying vector index reader supports pre-filter ANN search.
   public boolean supportsPreFilter() {
-    return _vectorIndexReader instanceof FilterAwareVectorIndexReader
-        && ((FilterAwareVectorIndexReader) _vectorIndexReader).supportsPreFilter();
+    return readerSupportsPreFilter();
   }
 
   /// Executes the vector search with backend-specific parameter dispatch and optional rerank.
   private ImmutableRoaringBitmap executeSearch() {
     String column = _predicate.getLhs().getIdentifier();
     float[] queryVector = _predicate.getValue();
     VectorExplainContext explainContext = _vectorExplainContext;
+    boolean backendParamsConfigured = false;
+    boolean searchExecuted = false;
     try {
+      ImmutableRoaringBitmap effectiveAllowedDocIds = _effectiveAllowedDocIds;
+      if (hasMandatoryCandidateScope() && effectiveAllowedDocIds.isEmpty()) {
+        _candidateGenerationSkipped = true;
+        _annCandidateCount = 0;
+        _rerankedCandidateCount = 0;
+        return new MutableRoaringBitmap();
+      }
+      _candidateGenerationSkipped = false;
+
+      if (hasMandatoryCandidateScope() && !readerSupportsPreFilter()) {
+        if (_forwardIndexReader == null) {
+          throw new IllegalStateException("Cannot honor mandatory vector candidate scope on vector column: "
+              + column + " -- vector index reader does not support filtered search and no forward index is available");
+        }
+        _vectorSearchMode = VectorSearchMode.EXACT_SCAN;
+        _runtimeFallbackReason = _requiredCandidateFallbackReason != null ? _requiredCandidateFallbackReason
+            : "vector_index_not_filter_aware_for_mandatory_scope";
+        VectorSearchMetrics.getInstance().recordFallback(_runtimeFallbackReason);
+        LOGGER.warn("Performing exact allowed-document vector scan on column: {} because {}. allowedDocs={}",
+            column, _runtimeFallbackReason, effectiveAllowedDocIds.getCardinality());
+        Float threshold = _hasThresholdPredicate ? _distanceThreshold : null;
+        searchExecuted = true;
+        ImmutableRoaringBitmap exactResults = ExactVectorScanFilterOperator.computeExactMatches(
+            _forwardIndexReader, queryVector, _predicate.getTopK(), _numDocs, _distanceFunction, threshold,
+            effectiveAllowedDocIds, column);
+        _annCandidateCount = -1;
+        _rerankedCandidateCount = exactResults.getCardinality();
+        return exactResults;
+      }
+
       // 1. Configure backend-specific parameters via interfaces
       configureBackendParams(column);
-      refreshExplainContext(null);
+      backendParamsConfigured = true;
+      refreshExplainContext();
       explainContext = _vectorExplainContext;

Review Comment:
   clearBackendParams(column) is now conditional on backendParamsConfigured, but backendParamsConfigured is set only after configureBackendParams(column) returns. If configureBackendParams throws after partially mutating reader state (e.g., thread-local overrides), the cleanup won’t run. To make the code exception-safe, consider setting the flag before invoking configureBackendParams, or wrapping configure/clear in their own try/finally so any partial configuration is reliably cleared.



##########
pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BaseFilterOperator.java:
##########
@@ -126,9 +127,30 @@ public FilteredDocIds getFilteredDocIds() {
     return _filteredDocIds;
   }
 
+  /// Returns the true-document set for execution, reusing an exact bitmap that was already materialized through
+  /// [#getFilteredDocIds()] when available. Package-private so boolean filter operators can avoid evaluating a scan
+  /// child twice without adding a new external API surface.
+  BlockDocIdSet getTruesForExecution() {
+    FilteredDocIds filteredDocIds = _filteredDocIds;
+    if (filteredDocIds == null) {
+      return getTrues();
+    }
+    ImmutableRoaringBitmap docIds = filteredDocIds.getDocIds();
+    if (docIds == null) {
+      return new MatchAllDocIdSet(_numDocs);
+    }
+    long numEntriesScannedInFilter = filteredDocIds.getNumEntriesScannedInFilter();
+    return new BitmapDocIdSet(docIds, _numDocs) {
+      @Override
+      public long getNumEntriesScannedInFilter() {
+        return numEntriesScannedInFilter;
+      }
+    };
+  }

Review Comment:
   When filteredDocIds.getDocIds() is null (match-all), getTruesForExecution() returns MatchAllDocIdSet without preserving the already-accounted getNumEntriesScannedInFilter() from the materialization. This can regress filter accounting/metrics for scan-based operators that materialize to match-all. Consider returning a MatchAllDocIdSet that overrides getNumEntriesScannedInFilter() to return the captured numEntriesScannedInFilter (similar to the BitmapDocIdSet wrapper).



##########
pinot-core/src/main/java/org/apache/pinot/core/operator/filter/VectorSimilarityFilterOperator.java:
##########
@@ -381,11 +523,14 @@ private ImmutableRoaringBitmap executeSearch() {
 
       return annResults;
     } finally {
-      // Record search metrics for observability — always, regardless of which path was taken
-      VectorSearchMetrics.getInstance().recordSearch(_vectorSearchMode, _backendType);
+      if (searchExecuted) {
+        VectorSearchMetrics.getInstance().recordSearch(_vectorSearchMode, _backendType);
+      }
       // Refresh explain context with the final search mode decided during execution
-      refreshExplainContext(null);
-      clearBackendParams(column);
+      refreshExplainContext();
+      if (backendParamsConfigured) {
+        clearBackendParams(column);
+      }

Review Comment:
   clearBackendParams(column) is now conditional on backendParamsConfigured, but backendParamsConfigured is set only after configureBackendParams(column) returns. If configureBackendParams throws after partially mutating reader state (e.g., thread-local overrides), the cleanup won’t run. To make the code exception-safe, consider setting the flag before invoking configureBackendParams, or wrapping configure/clear in their own try/finally so any partial configuration is reliably cleared.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org


Re: [PR] Fix FULL-upsert vector candidate generation [pinot]

Posted by "xiangfu0 (via GitHub)" <gi...@apache.org>.
xiangfu0 commented on code in PR #19287:
URL: https://github.com/apache/pinot/pull/19287#discussion_r3801910230


##########
pinot-core/src/main/java/org/apache/pinot/core/operator/filter/VectorSimilarityFilterOperator.java:
##########
@@ -381,11 +523,14 @@ private ImmutableRoaringBitmap executeSearch() {
 
       return annResults;
     } finally {
-      // Record search metrics for observability — always, regardless of which path was taken
-      VectorSearchMetrics.getInstance().recordSearch(_vectorSearchMode, _backendType);
+      if (searchExecuted) {
+        VectorSearchMetrics.getInstance().recordSearch(_vectorSearchMode, _backendType);
+      }
       // Refresh explain context with the final search mode decided during execution
-      refreshExplainContext(null);
-      clearBackendParams(column);
+      refreshExplainContext();
+      if (backendParamsConfigured) {
+        clearBackendParams(column);
+      }

Review Comment:
   Addressed by the same exception-safety fix in 2c163f07e9: cleanup is armed before backend configuration and runs from an inner finally even if configuration only partially succeeds. The regression verifies the cleanup calls after an injected setter failure.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org


Re: [PR] Fix FULL-upsert vector candidate generation [pinot]

Posted by "xiangfu0 (via GitHub)" <gi...@apache.org>.
xiangfu0 commented on code in PR #19287:
URL: https://github.com/apache/pinot/pull/19287#discussion_r3801908973


##########
pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BaseFilterOperator.java:
##########
@@ -126,9 +127,30 @@ public FilteredDocIds getFilteredDocIds() {
     return _filteredDocIds;
   }
 
+  /// Returns the true-document set for execution, reusing an exact bitmap that was already materialized through
+  /// [#getFilteredDocIds()] when available. Package-private so boolean filter operators can avoid evaluating a scan
+  /// child twice without adding a new external API surface.
+  BlockDocIdSet getTruesForExecution() {
+    FilteredDocIds filteredDocIds = _filteredDocIds;
+    if (filteredDocIds == null) {
+      return getTrues();
+    }
+    ImmutableRoaringBitmap docIds = filteredDocIds.getDocIds();
+    if (docIds == null) {
+      return new MatchAllDocIdSet(_numDocs);
+    }
+    long numEntriesScannedInFilter = filteredDocIds.getNumEntriesScannedInFilter();
+    return new BitmapDocIdSet(docIds, _numDocs) {
+      @Override
+      public long getNumEntriesScannedInFilter() {
+        return numEntriesScannedInFilter;
+      }
+    };
+  }

Review Comment:
   Thanks. I traced every cache assignment: the only null docIds value is created by the statically match-all branch as FilteredDocIds(null, 0L). Scan materialization always caches a non-null bitmap together with its scan count, including when every document matches, and both the cache field and constructor are private. Therefore the alleged null-plus-nonzero-count state is unreachable and current execution accounting is preserved; no production change is needed.



##########
pinot-core/src/main/java/org/apache/pinot/core/operator/filter/VectorSimilarityFilterOperator.java:
##########
@@ -292,31 +381,80 @@ protected void explainAttributes(ExplainAttributeBuilder attributeBuilder) {
     if (explainContext.getFilterSelectivity() >= 0) {
       attributeBuilder.putString("filterSelectivity", String.format("%.4f", explainContext.getFilterSelectivity()));
     }
+    attributeBuilder.putBool("upsertCandidateFilterApplied", _requiredUpsertCandidateBitmap != null);
+    attributeBuilder.putLongIdempotent("upsertCandidateFilterCardinality", getRequiredUpsertCandidateCardinality());
+    attributeBuilder.putBool("publishedDocRangeApplied", _publishedDocIdsBitmap != null);
+    attributeBuilder.putLongIdempotent("publishedDocRangeCardinality", getPublishedDocIdsCardinality());
+    attributeBuilder.putBool("requiredMetadataCandidateFilterApplied", _requiredMetadataCandidateBitmap != null);
+    attributeBuilder.putLongIdempotent("requiredMetadataCandidateFilterCardinality",
+        getRequiredMetadataCandidateCardinality());
+    attributeBuilder.putLongIdempotent("effectiveAllowedDocIdsCardinality",
+        getEffectiveAllowedDocIdsCardinality());
+    attributeBuilder.putBool("candidateGenerationSkipped", _candidateGenerationSkipped);
+    if (_candidateGenerationSkipped) {
+      attributeBuilder.putString("candidateGenerationSkipReason", getCandidateGenerationSkipReason());
+    }
+    if (_runtimeFallbackReason != null) {
+      attributeBuilder.putString("fallbackReason", _runtimeFallbackReason);
+    }
   }
 
   /// Returns true if the underlying vector index reader supports pre-filter ANN search.
   public boolean supportsPreFilter() {
-    return _vectorIndexReader instanceof FilterAwareVectorIndexReader
-        && ((FilterAwareVectorIndexReader) _vectorIndexReader).supportsPreFilter();
+    return readerSupportsPreFilter();
   }
 
   /// Executes the vector search with backend-specific parameter dispatch and optional rerank.
   private ImmutableRoaringBitmap executeSearch() {
     String column = _predicate.getLhs().getIdentifier();
     float[] queryVector = _predicate.getValue();
     VectorExplainContext explainContext = _vectorExplainContext;
+    boolean backendParamsConfigured = false;
+    boolean searchExecuted = false;
     try {
+      ImmutableRoaringBitmap effectiveAllowedDocIds = _effectiveAllowedDocIds;
+      if (hasMandatoryCandidateScope() && effectiveAllowedDocIds.isEmpty()) {
+        _candidateGenerationSkipped = true;
+        _annCandidateCount = 0;
+        _rerankedCandidateCount = 0;
+        return new MutableRoaringBitmap();
+      }
+      _candidateGenerationSkipped = false;
+
+      if (hasMandatoryCandidateScope() && !readerSupportsPreFilter()) {
+        if (_forwardIndexReader == null) {
+          throw new IllegalStateException("Cannot honor mandatory vector candidate scope on vector column: "
+              + column + " -- vector index reader does not support filtered search and no forward index is available");
+        }
+        _vectorSearchMode = VectorSearchMode.EXACT_SCAN;
+        _runtimeFallbackReason = _requiredCandidateFallbackReason != null ? _requiredCandidateFallbackReason
+            : "vector_index_not_filter_aware_for_mandatory_scope";
+        VectorSearchMetrics.getInstance().recordFallback(_runtimeFallbackReason);
+        LOGGER.warn("Performing exact allowed-document vector scan on column: {} because {}. allowedDocs={}",
+            column, _runtimeFallbackReason, effectiveAllowedDocIds.getCardinality());
+        Float threshold = _hasThresholdPredicate ? _distanceThreshold : null;
+        searchExecuted = true;
+        ImmutableRoaringBitmap exactResults = ExactVectorScanFilterOperator.computeExactMatches(
+            _forwardIndexReader, queryVector, _predicate.getTopK(), _numDocs, _distanceFunction, threshold,
+            effectiveAllowedDocIds, column);
+        _annCandidateCount = -1;
+        _rerankedCandidateCount = exactResults.getCardinality();
+        return exactResults;
+      }
+
       // 1. Configure backend-specific parameters via interfaces
       configureBackendParams(column);
-      refreshExplainContext(null);
+      backendParamsConfigured = true;
+      refreshExplainContext();
       explainContext = _vectorExplainContext;

Review Comment:
   Fixed in 2c163f07e9. The operator now claims cleanup responsibility before the first backend setter and nests cleanup in its own finally so a partial configuration or explain refresh failure cannot skip it. The new regression configures nprobe, throws while setting efSearch, verifies every cleanup method runs, and verifies ANN search never starts. The focused core run passed 64 tests.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org


Re: [PR] Fix FULL-upsert vector candidate generation [pinot]

Posted by "Jackie-Jiang (via GitHub)" <gi...@apache.org>.
Jackie-Jiang commented on code in PR #19287:
URL: https://github.com/apache/pinot/pull/19287#discussion_r3806749799


##########
pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BaseFilterOperator.java:
##########
@@ -126,9 +127,30 @@ public FilteredDocIds getFilteredDocIds() {
     return _filteredDocIds;
   }
 
+  /// Returns the true-document set for execution, reusing an exact bitmap that was already materialized through
+  /// [#getFilteredDocIds()] when available. Package-private so boolean filter operators can avoid evaluating a scan
+  /// child twice without adding a new external API surface.
+  BlockDocIdSet getTruesForExecution() {

Review Comment:
   Suggest separating this change in a separate PR as this is not closely related to the change, and this is quite an important abstraction change, and requires more discussion.
   
   Seems this one should be treated as the public facing method. The existing `getTrues()`/`getNulls()`/`getFalses()` are internal facing. Should we consider renaming existing ones instead?
   Within the current change, only some invocations are switched to this new one, and I feel it is actually half done



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org


Re: [PR] Fix FULL-upsert vector candidate generation [pinot]

Posted by "codecov-commenter (via GitHub)" <gi...@apache.org>.
codecov-commenter commented on PR #19287:
URL: https://github.com/apache/pinot/pull/19287#issuecomment-5324221385

   ## [Codecov](https://app.codecov.io/gh/apache/pinot/pull/19287?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) Report
   :x: Patch coverage is `10.97308%` with `430 lines` in your changes missing coverage. Please review.
   :white_check_mark: Project coverage is 39.16%. Comparing base ([`7701cfd`](https://app.codecov.io/gh/apache/pinot/commit/7701cfd92374fd22a0ffe85f5fcc3b49a8f04669?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)) to head ([`cd967d6`](https://app.codecov.io/gh/apache/pinot/commit/cd967d6d38cd84a72ece7a32906694ba0bbcbf12?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)).
   
   | [Files with missing lines](https://app.codecov.io/gh/apache/pinot/pull/19287?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Patch % | Lines |
   |---|---|---|
   | [...perator/filter/VectorSimilarityFilterOperator.java](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&filepath=pinot-core%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fpinot%2Fcore%2Foperator%2Ffilter%2FVectorSimilarityFilterOperator.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-cGlub3QtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvcGlub3QvY29yZS9vcGVyYXRvci9maWx0ZXIvVmVjdG9yU2ltaWxhcml0eUZpbHRlck9wZXJhdG9yLmphdmE=) | 0.00% | [138 Missing :warning: ](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [...ava/org/apache/pinot/core/plan/FilterPlanNode.java](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&filepath=pinot-core%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fpinot%2Fcore%2Fplan%2FFilterPlanNode.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-cGlub3QtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvcGlub3QvY29yZS9wbGFuL0ZpbHRlclBsYW5Ob2RlLmphdmE=) | 5.05% | [90 Missing and 4 partials :warning: ](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [...operator/filter/ExactVectorScanFilterOperator.java](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&filepath=pinot-core%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fpinot%2Fcore%2Foperator%2Ffilter%2FExactVectorScanFilterOperator.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-cGlub3QtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvcGlub3QvY29yZS9vcGVyYXRvci9maWx0ZXIvRXhhY3RWZWN0b3JTY2FuRmlsdGVyT3BlcmF0b3IuamF2YQ==) | 0.00% | [93 Missing :warning: ](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [...re/operator/filter/VectorRadiusFilterOperator.java](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&filepath=pinot-core%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fpinot%2Fcore%2Foperator%2Ffilter%2FVectorRadiusFilterOperator.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-cGlub3QtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvcGlub3QvY29yZS9vcGVyYXRvci9maWx0ZXIvVmVjdG9yUmFkaXVzRmlsdGVyT3BlcmF0b3IuamF2YQ==) | 0.00% | [65 Missing :warning: ](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [...local/realtime/impl/vector/MutableVectorIndex.java](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&filepath=pinot-segment-local%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fpinot%2Fsegment%2Flocal%2Frealtime%2Fimpl%2Fvector%2FMutableVectorIndex.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-cGlub3Qtc2VnbWVudC1sb2NhbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvcGlub3Qvc2VnbWVudC9sb2NhbC9yZWFsdGltZS9pbXBsL3ZlY3Rvci9NdXRhYmxlVmVjdG9ySW5kZXguamF2YQ==) | 68.57% | [18 Missing and 4 partials :warning: ](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [...pinot/core/operator/filter/BaseFilterOperator.java](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&filepath=pinot-core%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fpinot%2Fcore%2Foperator%2Ffilter%2FBaseFilterOperator.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-cGlub3QtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvcGlub3QvY29yZS9vcGVyYXRvci9maWx0ZXIvQmFzZUZpbHRlck9wZXJhdG9yLmphdmE=) | 0.00% | [11 Missing :warning: ](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [.../pinot/core/operator/filter/AndFilterOperator.java](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&filepath=pinot-core%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fpinot%2Fcore%2Foperator%2Ffilter%2FAndFilterOperator.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-cGlub3QtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvcGlub3QvY29yZS9vcGVyYXRvci9maWx0ZXIvQW5kRmlsdGVyT3BlcmF0b3IuamF2YQ==) | 0.00% | [2 Missing :warning: ](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [...e/pinot/core/operator/filter/OrFilterOperator.java](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&filepath=pinot-core%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fpinot%2Fcore%2Foperator%2Ffilter%2FOrFilterOperator.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-cGlub3QtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvcGlub3QvY29yZS9vcGVyYXRvci9maWx0ZXIvT3JGaWx0ZXJPcGVyYXRvci5qYXZh) | 0.00% | [2 Missing :warning: ](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [...not/core/operator/filter/VectorSearchStrategy.java](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&filepath=pinot-core%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fpinot%2Fcore%2Foperator%2Ffilter%2FVectorSearchStrategy.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-cGlub3QtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvcGlub3QvY29yZS9vcGVyYXRvci9maWx0ZXIvVmVjdG9yU2VhcmNoU3RyYXRlZ3kuamF2YQ==) | 0.00% | [2 Missing :warning: ](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [.../pinot/core/operator/filter/NotFilterOperator.java](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&filepath=pinot-core%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fpinot%2Fcore%2Foperator%2Ffilter%2FNotFilterOperator.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-cGlub3QtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvcGlub3QvY29yZS9vcGVyYXRvci9maWx0ZXIvTm90RmlsdGVyT3BlcmF0b3IuamF2YQ==) | 0.00% | [1 Missing :warning: ](https://app.codecov.io/gh/apache/pinot/pull/19287?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   > :exclamation:  There is a different number of reports uploaded between BASE (7701cfd) and HEAD (cd967d6). Click for more details.
   > 
   > <details><summary>HEAD has 24 uploads less than BASE</summary>
   >
   >| Flag | BASE (7701cfd) | HEAD (cd967d6) |
   >|------|------|------|
   >|unittests1|1|0|
   >|unittests|2|1|
   >|java-25|6|1|
   >|temurin|6|1|
   >|lane-a|2|0|
   >|integration|4|0|
   >|integration1|2|0|
   >|lane-b|2|0|
   >|integration2|2|0|
   ></details>
   
   <details><summary>Additional details and impacted files</summary>
   
   
   
   ```diff
   @@              Coverage Diff              @@
   ##             master   #19287       +/-   ##
   =============================================
   - Coverage     67.10%   39.16%   -27.94%     
   + Complexity     1424     1417        -7     
   =============================================
     Files          3459     3459               
     Lines        219764   220141      +377     
     Branches      35004    35107      +103     
   =============================================
   - Hits         147480    86226    -61254     
   - Misses        60496   126061    +65565     
   + Partials      11788     7854     -3934     
   ```
   
   | [Flag](https://app.codecov.io/gh/apache/pinot/pull/19287/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Coverage Δ | |
   |---|---|---|
   | [integration](https://app.codecov.io/gh/apache/pinot/pull/19287/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
   | [integration1](https://app.codecov.io/gh/apache/pinot/pull/19287/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
   | [integration2](https://app.codecov.io/gh/apache/pinot/pull/19287/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
   | [java-25](https://app.codecov.io/gh/apache/pinot/pull/19287/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `39.16% <10.97%> (-27.94%)` | :arrow_down: |
   | [lane-a](https://app.codecov.io/gh/apache/pinot/pull/19287/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
   | [lane-b](https://app.codecov.io/gh/apache/pinot/pull/19287/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
   | [temurin](https://app.codecov.io/gh/apache/pinot/pull/19287/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `39.16% <10.97%> (-27.94%)` | :arrow_down: |
   | [unittests](https://app.codecov.io/gh/apache/pinot/pull/19287/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `39.16% <10.97%> (-27.94%)` | :arrow_down: |
   | [unittests1](https://app.codecov.io/gh/apache/pinot/pull/19287/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
   | [unittests2](https://app.codecov.io/gh/apache/pinot/pull/19287/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `39.16% <10.97%> (-0.05%)` | :arrow_down: |
   
   Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#carryforward-flags-in-the-pull-request-comment) to find out more.
   </details>
   
   [:umbrella: View full report in Codecov by Harness](https://app.codecov.io/gh/apache/pinot/pull/19287?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache).   
   :loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache).
   <details><summary> :rocket: New features to boost your workflow: </summary>
   
   - :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org