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

tkhurana pushed a commit to branch 5.2
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/5.2 by this push:
     new 5b87b3376e PHOENIX-7690 Add a config to enable using bloom filters for 
multi-key point lookups
5b87b3376e is described below

commit 5b87b3376e6eb08a5092b97c35bac8afc04b40c8
Author: tkhurana <[email protected]>
AuthorDate: Wed Aug 20 08:16:04 2025 -0700

    PHOENIX-7690 Add a config to enable using bloom filters for multi-key point 
lookups
---
 .../org/apache/phoenix/query/QueryServices.java    |  2 ++
 .../phoenix/coprocessor/PagingRegionScanner.java   | 16 ++++++++++++++-
 .../java/org/apache/phoenix/end2end/InListIT.java  |  2 ++
 .../org/apache/phoenix/end2end/ServerPagingIT.java | 24 ++++++++++++++++++++++
 .../phoenix/monitoring/CountRowsScannedIT.java     | 11 +++++++++-
 5 files changed, 53 insertions(+), 2 deletions(-)

diff --git 
a/phoenix-core-client/src/main/java/org/apache/phoenix/query/QueryServices.java 
b/phoenix-core-client/src/main/java/org/apache/phoenix/query/QueryServices.java
index 8174562471..5ed24f77a6 100644
--- 
a/phoenix-core-client/src/main/java/org/apache/phoenix/query/QueryServices.java
+++ 
b/phoenix-core-client/src/main/java/org/apache/phoenix/query/QueryServices.java
@@ -573,6 +573,8 @@ public interface QueryServices extends SQLCloseable {
 
   String CQSI_THREAD_POOL_METRICS_ENABLED = 
"phoenix.cqsi.thread.pool.metrics.enabled";
 
+  String USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP = 
"phoenix.bloomfilter.multikey.pointlookup";
+
   /**
    * Get executor service used for parallel scans
    */
diff --git 
a/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/PagingRegionScanner.java
 
b/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/PagingRegionScanner.java
index 462f4420fe..e3f1d6afea 100644
--- 
a/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/PagingRegionScanner.java
+++ 
b/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/PagingRegionScanner.java
@@ -17,6 +17,8 @@
  */
 package org.apache.phoenix.coprocessor;
 
+import static 
org.apache.phoenix.query.QueryServices.USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP;
+
 import java.io.IOException;
 import java.util.List;
 import org.apache.hadoop.hbase.Cell;
@@ -37,6 +39,8 @@ import org.apache.phoenix.util.ScanUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import 
org.apache.phoenix.thirdparty.com.google.common.annotations.VisibleForTesting;
+
 /**
  * PagingRegionScanner works with PagingFilter to make sure that the time 
between two rows returned
  * by the HBase region scanner should not exceed the configured page size in 
ms (on PagingFilter).
@@ -185,13 +189,23 @@ public class PagingRegionScanner extends 
BaseRegionScanner {
     pagingFilter = ScanUtil.getPhoenixPagingFilter(scan);
   }
 
+  @VisibleForTesting
+  public static boolean useBloomFilterForMultiKeyPointLookup(TableDescriptor 
tableDescriptor) {
+    String useBloomFilter = 
tableDescriptor.getValue(USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP);
+    return Boolean.valueOf(useBloomFilter);
+  }
+
+  private boolean useBloomFilterForMultiKeyPointLookup() {
+    return useBloomFilterForMultiKeyPointLookup(region.getTableDescriptor());
+  }
+
   void init() throws IOException {
     if (initialized) {
       return;
     }
     TableDescriptor tableDescriptor = region.getTableDescriptor();
     BloomType bloomFilterType = 
tableDescriptor.getColumnFamilies()[0].getBloomFilterType();
-    if (bloomFilterType == BloomType.ROW) {
+    if (bloomFilterType == BloomType.ROW && 
useBloomFilterForMultiKeyPointLookup()) {
       // Check if the scan is a multi-point-lookup scan if so remove it from 
the scan
       SkipScanFilter skipScanFilter = ScanUtil.removeSkipScanFilter(scan);
       if (skipScanFilter != null) {
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/InListIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/InListIT.java
index e3f8885d2e..8d16b3a1c2 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/InListIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/InListIT.java
@@ -18,6 +18,7 @@
 package org.apache.phoenix.end2end;
 
 import static java.util.Collections.singletonList;
+import static 
org.apache.phoenix.query.QueryServices.USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP;
 import static org.apache.phoenix.util.PhoenixRuntime.TENANT_ID_ATTRIB;
 import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
 import static org.junit.Assert.assertEquals;
@@ -313,6 +314,7 @@ public class InListIT extends ParallelStatsDisabledIT {
         ddlBuilder.append(", ");
       }
       ddlBuilder.append("BLOOMFILTER='ROW'");
+      ddlBuilder.append(String.format(", \"%s\" = true", 
USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP));
     }
     return ddlBuilder.toString();
   }
diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ServerPagingIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ServerPagingIT.java
index a3df397a0f..dfd72201e3 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ServerPagingIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ServerPagingIT.java
@@ -20,6 +20,7 @@ package org.apache.phoenix.end2end;
 import static 
org.apache.phoenix.end2end.index.GlobalIndexCheckerIT.assertExplainPlan;
 import static 
org.apache.phoenix.end2end.index.GlobalIndexCheckerIT.assertExplainPlanWithLimit;
 import static 
org.apache.phoenix.monitoring.GlobalClientMetrics.GLOBAL_PAGED_ROWS_COUNTER;
+import static 
org.apache.phoenix.query.QueryServices.USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP;
 import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -34,7 +35,11 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Map;
 import java.util.Properties;
+import org.apache.hadoop.hbase.client.TableDescriptor;
+import org.apache.hadoop.hbase.regionserver.BloomType;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.phoenix.coprocessor.PagingRegionScanner;
+import org.apache.phoenix.jdbc.PhoenixConnection;
 import org.apache.phoenix.jdbc.PhoenixResultSet;
 import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.monitoring.MetricType;
@@ -451,6 +456,25 @@ public class ServerPagingIT extends 
ParallelStatsDisabledIT {
     Assert.assertEquals(101, numRpc);
   }
 
+  @Test
+  public void testBloomFilterDefaults() throws Exception {
+    String dataTableName = generateUniqueName();
+    populateTable(dataTableName);
+    try (Connection conn = DriverManager.getConnection(getUrl())) {
+      PhoenixConnection pconn = conn.unwrap(PhoenixConnection.class);
+      TableDescriptor td =
+        
pconn.getQueryServices().getTableDescriptor(Bytes.toBytes(dataTableName));
+      BloomType bloomType = td.getColumnFamilies()[0].getBloomFilterType();
+      assertEquals(BloomType.ROW, bloomType);
+      
assertFalse(PagingRegionScanner.useBloomFilterForMultiKeyPointLookup(td));
+      String ddl = String.format("alter table %s set \"%s\" = true", 
dataTableName,
+        USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP);
+      conn.createStatement().execute(ddl);
+      td = 
pconn.getQueryServices().getTableDescriptor(Bytes.toBytes(dataTableName));
+      assertTrue(PagingRegionScanner.useBloomFilterForMultiKeyPointLookup(td));
+    }
+  }
+
   private void populateTable(String tableName) throws Exception {
     Connection conn = DriverManager.getConnection(getUrl());
     conn.createStatement()
diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/monitoring/CountRowsScannedIT.java
 
b/phoenix-core/src/it/java/org/apache/phoenix/monitoring/CountRowsScannedIT.java
index 89bbc62b61..d8ca7e0c79 100644
--- 
a/phoenix-core/src/it/java/org/apache/phoenix/monitoring/CountRowsScannedIT.java
+++ 
b/phoenix-core/src/it/java/org/apache/phoenix/monitoring/CountRowsScannedIT.java
@@ -17,6 +17,7 @@
  */
 package org.apache.phoenix.monitoring;
 
+import static 
org.apache.phoenix.query.QueryServices.USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP;
 import static org.junit.Assert.assertEquals;
 
 import java.sql.Connection;
@@ -122,7 +123,15 @@ public class CountRowsScannedIT extends BaseTest {
     // skip scan
     long count12 =
       countRowsScannedFromSql(stmt, "SELECT A,Z FROM " + tableName + " WHERE A 
in (20, 45, 68, 3)");
-    assertEquals(4, count12);
+    assertEquals(7, count12); // 2n - 1 where n is number of keys
+
+    // Query again but this time enable bloom filters for multi key point 
lookup
+    String ddl = String.format("alter table %s set \"%s\" = true", tableName,
+      USE_BLOOMFILTER_FOR_MULTIKEY_POINTLOOKUP);
+    conn.createStatement().execute(ddl);
+    long count13 =
+      countRowsScannedFromSql(stmt, "SELECT A,Z FROM " + tableName + " WHERE A 
in (20, 45, 68, 3)");
+    assertEquals(4, count13);
   }
 
   @Test

Reply via email to