Repository: phoenix
Updated Branches:
  refs/heads/3.0 38de8fd56 -> 343d9262c


PHOENIX-1102 Query Finds No Rows When Using Multiple Column Families in where 
clause. (Anoop)


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/343d9262
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/343d9262
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/343d9262

Branch: refs/heads/3.0
Commit: 343d9262cda3a10461bb301ee0089e6df3867d99
Parents: 38de8fd
Author: anoopsjohn <anoopsamj...@gmail.com>
Authored: Tue Jul 22 22:51:49 2014 +0530
Committer: anoopsjohn <anoopsamj...@gmail.com>
Committed: Tue Jul 22 22:51:49 2014 +0530

----------------------------------------------------------------------
 .../end2end/ColumnProjectionOptimizationIT.java | 16 +++++++++++
 .../MultiCFCQKeyValueComparisonFilter.java      | 20 +------------
 .../filter/MultiCQKeyValueComparisonFilter.java | 19 ++++---------
 .../filter/MultiKeyValueComparisonFilter.java   | 11 +++++++
 .../java/org/apache/phoenix/query/BaseTest.java | 30 ++++++++++++++++++++
 5 files changed, 64 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/343d9262/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnProjectionOptimizationIT.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnProjectionOptimizationIT.java
 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnProjectionOptimizationIT.java
index 6fe7aec..ccdc7b7 100644
--- 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnProjectionOptimizationIT.java
+++ 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ColumnProjectionOptimizationIT.java
@@ -37,6 +37,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import java.math.BigDecimal;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
@@ -307,4 +308,19 @@ public class ColumnProjectionOptimizationIT extends 
BaseClientManagedTimeIT {
             admin.close();
         }
     }
+
+    @Test
+    public void testSelectWithConditionOnMultiCF() throws Exception {
+        initMultiCFTable(getUrl());
+        Connection conn = DriverManager.getConnection(getUrl());
+        String query = "SELECT c.db_cpu_utilization FROM MULTI_CF WHERE 
a.unique_user_count = ? and b.unique_org_count = ?";
+        PreparedStatement statement = conn.prepareStatement(query);
+        statement.setInt(1, 1);
+        statement.setInt(2, 1);
+        ResultSet rs = statement.executeQuery();
+        boolean b = rs.next();
+        assertTrue(b);
+        assertEquals(BigDecimal.valueOf(40.1), rs.getBigDecimal(1));
+        assertFalse(rs.next());
+    }
 }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/343d9262/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiCFCQKeyValueComparisonFilter.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiCFCQKeyValueComparisonFilter.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiCFCQKeyValueComparisonFilter.java
index 4f0e0eb..0b158c7 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiCFCQKeyValueComparisonFilter.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiCFCQKeyValueComparisonFilter.java
@@ -17,10 +17,7 @@
  */
 package org.apache.phoenix.filter;
 
-import java.util.TreeSet;
-
 import org.apache.hadoop.hbase.util.Bytes;
-
 import org.apache.phoenix.expression.Expression;
 
 
@@ -28,13 +25,12 @@ import org.apache.phoenix.expression.Expression;
  *
  * Filter that evaluates WHERE clause expression, used in the case where there
  * are references to multiple column qualifiers over multiple column families.
- *
+ * Also there same qualifier names in different families.
  * 
  * @since 0.1
  */
 public class MultiCFCQKeyValueComparisonFilter extends 
MultiKeyValueComparisonFilter {
     private final ImmutablePairBytesPtr ptr = new ImmutablePairBytesPtr();
-    private TreeSet<byte[]> cfSet;
 
     public MultiCFCQKeyValueComparisonFilter() {
     }
@@ -44,12 +40,6 @@ public class MultiCFCQKeyValueComparisonFilter extends 
MultiKeyValueComparisonFi
     }
 
     @Override
-    protected void init() {
-        cfSet = new TreeSet<byte[]>(Bytes.BYTES_COMPARATOR);
-        super.init();
-    }
-
-    @Override
     protected Object setColumnKey(byte[] cf, int cfOffset, int cfLength,
             byte[] cq, int cqOffset, int cqLength) {
         ptr.set(cf, cfOffset, cfLength, cq, cqOffset, cqLength);
@@ -121,12 +111,4 @@ public class MultiCFCQKeyValueComparisonFilter extends 
MultiKeyValueComparisonFi
             return true;
         }
     }
-
-
-    @SuppressWarnings("all") // suppressing missing @Override since this 
doesn't exist for HBase 0.94.4
-    public boolean isFamilyEssential(byte[] name) {
-        // Only the column families involved in the expression are essential.
-        // The others are for columns projected in the select expression.
-        return cfSet.contains(name);
-    }
 }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/343d9262/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiCQKeyValueComparisonFilter.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiCQKeyValueComparisonFilter.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiCQKeyValueComparisonFilter.java
index e46b435..36557fd 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiCQKeyValueComparisonFilter.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiCQKeyValueComparisonFilter.java
@@ -17,22 +17,19 @@
  */
 package org.apache.phoenix.filter;
 
-import org.apache.hadoop.hbase.util.Bytes;
-
 import org.apache.phoenix.expression.Expression;
 import org.apache.phoenix.hbase.index.util.ImmutableBytesPtr;
 
 /**
  *
  * Filter that evaluates WHERE clause expression, used in the case where there
- * are references to multiple column qualifiers over a single column family.
+ * are references to multiple unique column qualifiers over one or more column 
families.
  *
  * 
  * @since 0.1
  */
 public class MultiCQKeyValueComparisonFilter extends 
MultiKeyValueComparisonFilter {
     private ImmutableBytesPtr ptr = new ImmutableBytesPtr();
-    private byte[] cf;
 
     public MultiCQKeyValueComparisonFilter() {
     }
@@ -51,18 +48,14 @@ public class MultiCQKeyValueComparisonFilter extends 
MultiKeyValueComparisonFilt
     @Override
     protected Object newColumnKey(byte[] cf, int cfOffset, int cfLength, 
byte[] cq, int cqOffset,
             int cqLength) {
+        byte[] cfKey;
         if (cfOffset == 0 && cf.length == cfLength) {
-            this.cf = cf;
+            cfKey = cf;
         } else {
-            this.cf = new byte[cfLength];
-            System.arraycopy(cf, cfOffset, this.cf, 0, cfLength);
+            cfKey = new byte[cfLength];
+            System.arraycopy(cf, cfOffset, cfKey, 0, cfLength);
         }
+        cfSet.add(cfKey);
         return new ImmutableBytesPtr(cq, cqOffset, cqLength);
     }
-
-
-    @SuppressWarnings("all") // suppressing missing @Override since this 
doesn't exist for HBase 0.94.4
-    public boolean isFamilyEssential(byte[] name) {
-        return Bytes.compareTo(cf, name) == 0;
-    }
 }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/343d9262/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiKeyValueComparisonFilter.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiKeyValueComparisonFilter.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiKeyValueComparisonFilter.java
index 63f7452..953b9d5 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiKeyValueComparisonFilter.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/filter/MultiKeyValueComparisonFilter.java
@@ -21,6 +21,7 @@ import java.io.DataInput;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.TreeSet;
 
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
@@ -45,6 +46,7 @@ public abstract class MultiKeyValueComparisonFilter extends 
BooleanExpressionFil
 
     private Boolean matchedColumn;
     protected final IncrementalResultTuple inputTuple = new 
IncrementalResultTuple();
+    protected TreeSet<byte[]> cfSet;
 
     public MultiKeyValueComparisonFilter() {
     }
@@ -178,6 +180,7 @@ public abstract class MultiKeyValueComparisonFilter extends 
BooleanExpressionFil
     }
     
     protected void init() {
+        cfSet = new TreeSet<byte[]>(Bytes.BYTES_COMPARATOR);
         TraverseAllExpressionVisitor<Void> visitor = new 
TraverseAllExpressionVisitor<Void>() {
             @Override
             public Void visit(KeyValueColumnExpression expression) {
@@ -236,6 +239,14 @@ public abstract class MultiKeyValueComparisonFilter 
extends BooleanExpressionFil
         super.reset();
     }
 
+    @SuppressWarnings("all")
+    // suppressing missing @Override since this doesn't exist for HBase 0.94.4
+    public boolean isFamilyEssential(byte[] name) {
+        // Only the column families involved in the expression are essential.
+        // The others are for columns projected in the select expression.
+        return cfSet.contains(name);
+    }
+
     @Override
     public void readFields(DataInput input) throws IOException {
         super.readFields(input);

http://git-wip-us.apache.org/repos/asf/phoenix/blob/343d9262/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java 
b/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
index 10c12ed..4aa3bea 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
@@ -987,6 +987,36 @@ public abstract class BaseTest {
         }
     }
     
+    protected static void initMultiCFTable(String url) throws Exception {
+        ensureTableCreated(url, MULTI_CF_NAME);
+
+        Connection conn = DriverManager.getConnection(url);
+        try {
+            PreparedStatement stmt = conn.prepareStatement(
+                    "upsert into " +
+                    "MULTI_CF(" +
+                    "    id, " +
+                    "    a.unique_user_count, " +
+                    "    b.unique_org_count, " +
+                    "    c.db_cpu_utilization) " +
+                    "VALUES (?, ?, ?, ?)");
+            stmt.setString(1, "id1");
+            stmt.setInt(2, 1);
+            stmt.setInt(3, 1);
+            stmt.setBigDecimal(4, BigDecimal.valueOf(40.1));
+            stmt.execute();
+
+            stmt.setString(1, "id2");
+            stmt.setInt(2, 2);
+            stmt.setInt(3, 2);
+        stmt.setBigDecimal(4, BigDecimal.valueOf(20.9));
+            stmt.execute();
+            conn.commit();
+        } finally {
+            conn.close();
+        }
+    }
+
     protected static void initTablesWithArrays(String tenantId, Date date, 
Long ts, boolean useNull, String url) throws Exception {
         Properties props = new Properties();
         if (ts != null) {

Reply via email to