You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@parquet.apache.org by ga...@apache.org on 2023/02/23 13:36:56 UTC

[parquet-mr] branch master updated: PARQUET-2246: Add short circuit logic to column index filter. (#1030)

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

gabor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/parquet-mr.git


The following commit(s) were added to refs/heads/master by this push:
     new c9cfe8214 PARQUET-2246: Add short circuit logic to column index filter. (#1030)
c9cfe8214 is described below

commit c9cfe821448a2f99797fda7f46c70a16cc1250a9
Author: Yujiang Zhong <42...@users.noreply.github.com>
AuthorDate: Thu Feb 23 21:36:46 2023 +0800

    PARQUET-2246: Add short circuit logic to column index filter. (#1030)
    
    ColumnIndexFilter can be optimized by adding short-circuit logic to
    `AND` and `OR` operations. It's not necessary to evaluating the
    right node in some cases:
    
    - If the left result row ranges of `AND` is empty
    - If the left result row ranges of `OR` is full range of the row-group
---
 .../internal/filter2/columnindex/ColumnIndexFilter.java    | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/parquet-column/src/main/java/org/apache/parquet/internal/filter2/columnindex/ColumnIndexFilter.java b/parquet-column/src/main/java/org/apache/parquet/internal/filter2/columnindex/ColumnIndexFilter.java
index 6c27f9809..935c25942 100644
--- a/parquet-column/src/main/java/org/apache/parquet/internal/filter2/columnindex/ColumnIndexFilter.java
+++ b/parquet-column/src/main/java/org/apache/parquet/internal/filter2/columnindex/ColumnIndexFilter.java
@@ -191,12 +191,22 @@ public class ColumnIndexFilter implements Visitor<RowRanges> {
 
   @Override
   public RowRanges visit(And and) {
-    return RowRanges.intersection(and.getLeft().accept(this), and.getRight().accept(this));
+    RowRanges leftResult = and.getLeft().accept(this);
+    if (leftResult.getRanges().size() == 0) {
+      return leftResult;
+    }
+
+    return RowRanges.intersection(leftResult, and.getRight().accept(this));
   }
 
   @Override
   public RowRanges visit(Or or) {
-    return RowRanges.union(or.getLeft().accept(this), or.getRight().accept(this));
+    RowRanges leftResult = or.getLeft().accept(this);
+    if (leftResult.getRanges().size() == 1 && leftResult.rowCount() == rowCount) {
+      return leftResult;
+    }
+
+    return RowRanges.union(leftResult, or.getRight().accept(this));
   }
 
   @Override