This is an automated email from the ASF dual-hosted git repository.

jackie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 0c19741  Do not prune segments for selection queries over upsert table 
(#6158)
0c19741 is described below

commit 0c197417b5aabc38358bf9a90f60309d1cadbe02
Author: Yupeng Fu <yupe...@users.noreply.github.com>
AuthorDate: Mon Oct 19 17:49:21 2020 -0700

    Do not prune segments for selection queries over upsert table (#6158)
    
    Part of a series of PRs for #4261
---
 .../query/pruner/SelectionQuerySegmentPruner.java  |  9 +++++--
 .../pruner/SelectionQuerySegmentPrunerTest.java    | 30 ++++++++++++++++++++++
 2 files changed, 37 insertions(+), 2 deletions(-)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/pruner/SelectionQuerySegmentPruner.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/pruner/SelectionQuerySegmentPruner.java
index d5b5145..82d46b2 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/pruner/SelectionQuerySegmentPruner.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/pruner/SelectionQuerySegmentPruner.java
@@ -76,13 +76,18 @@ public class SelectionQuerySegmentPruner implements 
SegmentPruner {
     }
 
     // If LIMIT is not 0, only prune segments for selection queries without 
filter
-    // TODO: This does not take upsert valid doc ids filter into account, 
which can cause less than expected records
-    //       returned for upsert table
     FilterContext filter = queryContext.getFilter();
     if (filter != null) {
       return segmentDataManagers;
     }
 
+    // Do not prune for upsert table
+    if (!segmentDataManagers.isEmpty()) {
+      if (segmentDataManagers.get(0).getSegment().getValidDocIndex() != null) {
+        return segmentDataManagers;
+      }
+    }
+
     if (queryContext.getOrderByExpressions() == null) {
       return pruneSelectionOnly(tableDataManager, segmentDataManagers, 
queryContext);
     } else {
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/core/query/pruner/SelectionQuerySegmentPrunerTest.java
 
b/pinot-core/src/test/java/org/apache/pinot/core/query/pruner/SelectionQuerySegmentPrunerTest.java
index 09e83be..ae1d6c7 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/core/query/pruner/SelectionQuerySegmentPrunerTest.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/core/query/pruner/SelectionQuerySegmentPrunerTest.java
@@ -30,6 +30,7 @@ import org.apache.pinot.core.query.request.ServerQueryRequest;
 import org.apache.pinot.core.query.request.context.QueryContext;
 import 
org.apache.pinot.core.query.request.context.utils.QueryContextConverterUtils;
 import org.apache.pinot.core.segment.index.metadata.SegmentMetadata;
+import org.apache.pinot.core.segment.index.readers.ValidDocIndexReader;
 import org.testng.annotations.Test;
 
 import static org.mockito.Mockito.mock;
@@ -64,6 +65,26 @@ public class SelectionQuerySegmentPrunerTest {
   }
 
   @Test
+  public void testSelectionOnlyUpsert() {
+    List<SegmentDataManager> segmentDataManagers = Arrays
+        .asList(getSegmentDataManager(null, null, 10, true), 
getSegmentDataManager(0L, 10L, 10, true),
+            getSegmentDataManager(-5L, 5L, 15, true));
+
+    // Should keep enough documents to fulfill the LIMIT requirement
+    ServerQueryRequest queryRequest = getQueryRequest("SELECT * FROM testTable 
LIMIT 5");
+    List<SegmentDataManager> result = _segmentPruner.prune(_tableDataManager, 
segmentDataManagers, queryRequest);
+    assertEquals(result.size(), 3);
+
+    queryRequest = getQueryRequest("SELECT * FROM testTable LIMIT 10");
+    result = _segmentPruner.prune(_tableDataManager, segmentDataManagers, 
queryRequest);
+    assertEquals(result.size(), 3);
+
+    queryRequest = getQueryRequest("SELECT * FROM testTable LIMIT 15");
+    result = _segmentPruner.prune(_tableDataManager, segmentDataManagers, 
queryRequest);
+    assertEquals(result.size(), 3);
+  }
+
+  @Test
   public void testSelectionOnly() {
     List<SegmentDataManager> segmentDataManagers = Arrays
         .asList(getSegmentDataManager(null, null, 10), 
getSegmentDataManager(0L, 10L, 10),
@@ -182,6 +203,11 @@ public class SelectionQuerySegmentPrunerTest {
   }
 
   private SegmentDataManager getSegmentDataManager(@Nullable Long minValue, 
@Nullable Long maxValue, int totalDocs) {
+    return getSegmentDataManager(minValue, maxValue, totalDocs, false);
+  }
+
+  private SegmentDataManager getSegmentDataManager(@Nullable Long minValue, 
@Nullable Long maxValue, int totalDocs,
+      boolean upsert) {
     SegmentDataManager segmentDataManager = mock(SegmentDataManager.class);
     IndexSegment segment = mock(IndexSegment.class);
     when(segmentDataManager.getSegment()).thenReturn(segment);
@@ -194,6 +220,10 @@ public class SelectionQuerySegmentPrunerTest {
     SegmentMetadata segmentMetadata = mock(SegmentMetadata.class);
     when(segment.getSegmentMetadata()).thenReturn(segmentMetadata);
     when(segmentMetadata.getTotalDocs()).thenReturn(totalDocs);
+    if (upsert) {
+      ValidDocIndexReader reader = mock(ValidDocIndexReader.class);
+      when(segment.getValidDocIndex()).thenReturn(reader);
+    }
     return segmentDataManager;
   }
 


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

Reply via email to