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) {