You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by an...@apache.org on 2014/02/05 06:50:20 UTC

[1/2] git commit: PHOENIX-18 Distinct based aggregations not working correctly when query contains ORDER BY.(Anoop)

Updated Branches:
  refs/heads/master ff1c1af6f -> 974ad584b


PHOENIX-18 Distinct based aggregations not working correctly when query contains ORDER BY.(Anoop)


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

Branch: refs/heads/master
Commit: 4e2398404f5672df4f1160099f3d9a4a681c8445
Parents: bc21d8e
Author: anoopsjohn <an...@gmail.com>
Authored: Wed Feb 5 11:16:58 2014 +0530
Committer: anoopsjohn <an...@gmail.com>
Committed: Wed Feb 5 11:16:58 2014 +0530

----------------------------------------------------------------------
 .../aggregator/BaseDecimalStddevAggregator.java | 21 ++---
 .../aggregator/BaseStddevAggregator.java        | 14 +---
 .../DistinctCountClientAggregator.java          | 12 +--
 .../DistinctValueWithCountClientAggregator.java | 80 +++++++++++---------
 .../aggregator/PercentRankClientAggregator.java | 12 +--
 .../aggregator/PercentileClientAggregator.java  | 12 +--
 .../PercentileDiscClientAggregator.java         | 16 ++--
 .../phoenix/end2end/DistinctCountTest.java      | 63 ++++++++++++++-
 .../apache/phoenix/end2end/PercentileTest.java  | 72 +++++++++++++++++-
 9 files changed, 201 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/4e239840/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/BaseDecimalStddevAggregator.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/BaseDecimalStddevAggregator.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/BaseDecimalStddevAggregator.java
index b28cb92..85dbc4f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/BaseDecimalStddevAggregator.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/BaseDecimalStddevAggregator.java
@@ -23,16 +23,15 @@ import java.math.*;
 import java.util.List;
 import java.util.Map.Entry;
 
+import org.apache.hadoop.hbase.index.util.ImmutableBytesPtr;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.util.Pair;
-
-import org.apache.hadoop.hbase.index.util.ImmutableBytesPtr;
 import org.apache.phoenix.expression.ColumnExpression;
 import org.apache.phoenix.expression.Expression;
 import org.apache.phoenix.schema.ColumnModifier;
 import org.apache.phoenix.schema.PDataType;
 import org.apache.phoenix.schema.tuple.Tuple;
-import org.apache.phoenix.util.*;
+import org.apache.phoenix.util.BigDecimalUtil;
 import org.apache.phoenix.util.BigDecimalUtil.Operation;
 
 /**
@@ -42,7 +41,6 @@ import org.apache.phoenix.util.BigDecimalUtil.Operation;
  */
 public abstract class BaseDecimalStddevAggregator extends DistinctValueWithCountClientAggregator {
 
-    private BigDecimal cachedResult = null;
     private int colPrecision;
     private int colScale;
 
@@ -54,11 +52,6 @@ public abstract class BaseDecimalStddevAggregator extends DistinctValueWithCount
     }
 
     @Override
-    protected int getBufferLength() {
-        return PDataType.DECIMAL.getByteSize();
-    }
-
-    @Override
     public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) {
         if (cachedResult == null) {
             BigDecimal ssd = sumSquaredDeviation();
@@ -77,9 +70,10 @@ public abstract class BaseDecimalStddevAggregator extends DistinctValueWithCount
                         this.colScale, this.colPrecision, this.colScale, Operation.OTHERS);
                 resultPrecision = precisionScale.getFirst();
             }
-            cachedResult = new BigDecimal(Math.sqrt(ssd.doubleValue()), new MathContext(resultPrecision,
+            BigDecimal result = new BigDecimal(Math.sqrt(ssd.doubleValue()), new MathContext(resultPrecision,
                     RoundingMode.HALF_UP));
-            cachedResult.setScale(this.colScale, RoundingMode.HALF_UP);
+            result.setScale(this.colScale, RoundingMode.HALF_UP);
+            cachedResult = result;
         }
         if (buffer == null) {
             initBuffer();
@@ -112,8 +106,7 @@ public abstract class BaseDecimalStddevAggregator extends DistinctValueWithCount
     }
 
     @Override
-    public void reset() {
-        super.reset();
-        this.cachedResult = null;
+    protected PDataType getResultDataType() {
+        return PDataType.DECIMAL;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/4e239840/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/BaseStddevAggregator.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/BaseStddevAggregator.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/BaseStddevAggregator.java
index eaafc79..b140ff6 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/BaseStddevAggregator.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/BaseStddevAggregator.java
@@ -23,9 +23,8 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map.Entry;
 
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
-
 import org.apache.hadoop.hbase.index.util.ImmutableBytesPtr;
+import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.phoenix.expression.Expression;
 import org.apache.phoenix.schema.ColumnModifier;
 import org.apache.phoenix.schema.PDataType;
@@ -39,7 +38,6 @@ import org.apache.phoenix.schema.tuple.Tuple;
 public abstract class BaseStddevAggregator extends DistinctValueWithCountClientAggregator {
 
     protected Expression stdDevColExp;
-    private BigDecimal cachedResult = null;
 
     public BaseStddevAggregator(List<Expression> exps, ColumnModifier columnModifier) {
         super(columnModifier);
@@ -47,11 +45,6 @@ public abstract class BaseStddevAggregator extends DistinctValueWithCountClientA
     }
 
     @Override
-    protected int getBufferLength() {
-        return PDataType.DECIMAL.getByteSize();
-    }
-
-    @Override
     public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) {
         if (cachedResult == null) {
             double ssd = sumSquaredDeviation();
@@ -89,8 +82,7 @@ public abstract class BaseStddevAggregator extends DistinctValueWithCountClientA
     }
     
     @Override
-    public void reset() {
-        super.reset();
-        this.cachedResult = null;
+    protected PDataType getResultDataType() {
+        return PDataType.DECIMAL;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/4e239840/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/DistinctCountClientAggregator.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/DistinctCountClientAggregator.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/DistinctCountClientAggregator.java
index d221e91..b568687 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/DistinctCountClientAggregator.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/DistinctCountClientAggregator.java
@@ -20,7 +20,6 @@
 package org.apache.phoenix.expression.aggregator;
 
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
-
 import org.apache.phoenix.schema.ColumnModifier;
 import org.apache.phoenix.schema.PDataType;
 import org.apache.phoenix.schema.tuple.Tuple;
@@ -42,14 +41,17 @@ public class DistinctCountClientAggregator extends DistinctValueWithCountClientA
         if (buffer == null) {
             initBuffer();
         }
-        long value = this.valueVsCount.size();
-        buffer = PDataType.LONG.toBytes(value);
+        if (cachedResult != null) {
+            buffer = PDataType.LONG.toBytes(cachedResult);
+        } else {
+            buffer = PDataType.LONG.toBytes(this.valueVsCount.size());
+        }
         ptr.set(buffer);
         return true;
     }
 
     @Override
-    protected int getBufferLength() {
-        return PDataType.LONG.getByteSize();
+    protected PDataType getResultDataType() {
+        return PDataType.LONG;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/4e239840/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/DistinctValueWithCountClientAggregator.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/DistinctValueWithCountClientAggregator.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/DistinctValueWithCountClientAggregator.java
index c009a28..7d2b93a 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/DistinctValueWithCountClientAggregator.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/DistinctValueWithCountClientAggregator.java
@@ -19,23 +19,17 @@
  */
 package org.apache.phoenix.expression.aggregator;
 
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
+import java.io.*;
+import java.util.*;
 import java.util.Map.Entry;
-import java.util.TreeMap;
 
+import org.apache.hadoop.hbase.index.util.ImmutableBytesPtr;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.io.WritableUtils;
-
-import org.apache.hadoop.hbase.index.util.ImmutableBytesPtr;
 import org.apache.phoenix.schema.ColumnModifier;
 import org.apache.phoenix.schema.PDataType;
+import org.apache.phoenix.schema.tuple.SingleKeyValueTuple;
 import org.apache.phoenix.schema.tuple.Tuple;
 
 /**
@@ -48,6 +42,7 @@ public abstract class DistinctValueWithCountClientAggregator extends BaseAggrega
     protected Map<ImmutableBytesPtr, Integer> valueVsCount = new HashMap<ImmutableBytesPtr, Integer>();
     protected byte[] buffer;
     protected long totalCount = 0L;
+    protected Object cachedResult;
 
     public DistinctValueWithCountClientAggregator(ColumnModifier columnModifier) {
         super(columnModifier);
@@ -55,41 +50,45 @@ public abstract class DistinctValueWithCountClientAggregator extends BaseAggrega
 
     @Override
     public void aggregate(Tuple tuple, ImmutableBytesWritable ptr) {
-        InputStream is = new ByteArrayInputStream(ptr.get(), ptr.getOffset() + 1, ptr.getLength() - 1);
-        try {
-            if (Bytes.equals(ptr.get(), ptr.getOffset(), 1, DistinctValueWithCountServerAggregator.COMPRESS_MARKER, 0,
-                    1)) {
-                InputStream decompressionStream = DistinctValueWithCountServerAggregator.COMPRESS_ALGO
-                        .createDecompressionStream(is,
-                                DistinctValueWithCountServerAggregator.COMPRESS_ALGO.getDecompressor(), 0);
-                is = decompressionStream;
-            }
-            DataInputStream in = new DataInputStream(is);
-            int mapSize = WritableUtils.readVInt(in);
-            for (int i = 0; i < mapSize; i++) {
-                int keyLen = WritableUtils.readVInt(in);
-                byte[] keyBytes = new byte[keyLen];
-                in.read(keyBytes, 0, keyLen);
-                ImmutableBytesPtr key = new ImmutableBytesPtr(keyBytes);
-                int value = WritableUtils.readVInt(in);
-                Integer curCount = valueVsCount.get(key);
-                if (curCount == null) {
-                    valueVsCount.put(key, value);
-                } else {
-                    valueVsCount.put(key, curCount + value);
+        if (tuple instanceof SingleKeyValueTuple) {
+            // Case when scanners do look ahead and re-aggregate result row.The result is already available in the ptr
+            PDataType resultDataType = getResultDataType();
+            cachedResult = resultDataType.toObject(ptr, resultDataType, columnModifier);
+        } else {
+            InputStream is = new ByteArrayInputStream(ptr.get(), ptr.getOffset() + 1, ptr.getLength() - 1);
+            try {
+                if (Bytes.equals(ptr.get(), ptr.getOffset(), 1, DistinctValueWithCountServerAggregator.COMPRESS_MARKER,
+                        0, 1)) {
+                    InputStream decompressionStream = DistinctValueWithCountServerAggregator.COMPRESS_ALGO
+                            .createDecompressionStream(is,
+                                    DistinctValueWithCountServerAggregator.COMPRESS_ALGO.getDecompressor(), 0);
+                    is = decompressionStream;
+                }
+                DataInputStream in = new DataInputStream(is);
+                int mapSize = WritableUtils.readVInt(in);
+                for (int i = 0; i < mapSize; i++) {
+                    int keyLen = WritableUtils.readVInt(in);
+                    byte[] keyBytes = new byte[keyLen];
+                    in.read(keyBytes, 0, keyLen);
+                    ImmutableBytesPtr key = new ImmutableBytesPtr(keyBytes);
+                    int value = WritableUtils.readVInt(in);
+                    Integer curCount = valueVsCount.get(key);
+                    if (curCount == null) {
+                        valueVsCount.put(key, value);
+                    } else {
+                        valueVsCount.put(key, curCount + value);
+                    }
+                    totalCount += value;
                 }
-                totalCount += value;
+            } catch (IOException ioe) {
+                throw new RuntimeException(ioe); // Impossible as we're using a ByteArrayInputStream
             }
-        } catch (IOException ioe) {
-            throw new RuntimeException(ioe); // Impossible as we're using a ByteArrayInputStream
         }
         if (buffer == null) {
             initBuffer();
         }
     }
 
-    protected abstract int getBufferLength();
-
     protected void initBuffer() {
         buffer = new byte[getBufferLength()];
     }
@@ -109,6 +108,7 @@ public abstract class DistinctValueWithCountClientAggregator extends BaseAggrega
         valueVsCount = new HashMap<ImmutableBytesPtr, Integer>();
         buffer = null;
         totalCount = 0L;
+        cachedResult = null;
         super.reset();
     }
     
@@ -129,4 +129,10 @@ public abstract class DistinctValueWithCountClientAggregator extends BaseAggrega
         }
         return sorted;
     }
+
+    protected int getBufferLength() {
+        return getResultDataType().getByteSize();
+    }
+
+    protected abstract PDataType getResultDataType();
 }

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/4e239840/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentRankClientAggregator.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentRankClientAggregator.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentRankClientAggregator.java
index 42ca267..13a1f6e 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentRankClientAggregator.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentRankClientAggregator.java
@@ -24,7 +24,6 @@ import java.util.*;
 import java.util.Map.Entry;
 
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
-
 import org.apache.phoenix.expression.*;
 import org.apache.phoenix.schema.ColumnModifier;
 import org.apache.phoenix.schema.PDataType;
@@ -39,7 +38,6 @@ import org.apache.phoenix.schema.tuple.Tuple;
 public class PercentRankClientAggregator extends DistinctValueWithCountClientAggregator {
 
     private final List<Expression> exps;
-    private BigDecimal cachedResult = null;
 
     public PercentRankClientAggregator(List<Expression> exps, ColumnModifier columnModifier) {
         super(columnModifier);
@@ -80,13 +78,7 @@ public class PercentRankClientAggregator extends DistinctValueWithCountClientAgg
     }
 
     @Override
-    protected int getBufferLength() {
-        return PDataType.DECIMAL.getByteSize();
-    }
-    
-    @Override
-    public void reset() {
-        super.reset();
-        this.cachedResult = null;
+    protected PDataType getResultDataType() {
+        return PDataType.DECIMAL;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/4e239840/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentileClientAggregator.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentileClientAggregator.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentileClientAggregator.java
index 095842a..945387b 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentileClientAggregator.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentileClientAggregator.java
@@ -24,7 +24,6 @@ import java.util.*;
 import java.util.Map.Entry;
 
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
-
 import org.apache.phoenix.expression.*;
 import org.apache.phoenix.schema.ColumnModifier;
 import org.apache.phoenix.schema.PDataType;
@@ -39,7 +38,6 @@ import org.apache.phoenix.schema.tuple.Tuple;
 public class PercentileClientAggregator extends DistinctValueWithCountClientAggregator {
 
     private final List<Expression> exps;
-    private BigDecimal cachedResult = null;
 
     public PercentileClientAggregator(List<Expression> exps, ColumnModifier columnModifier) {
         super(columnModifier);
@@ -98,13 +96,7 @@ public class PercentileClientAggregator extends DistinctValueWithCountClientAggr
     }
 
     @Override
-    protected int getBufferLength() {
-        return PDataType.DECIMAL.getByteSize();
-    }
-    
-    @Override
-    public void reset() {
-        super.reset();
-        this.cachedResult = null;
+    protected PDataType getResultDataType() {
+        return PDataType.DECIMAL;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/4e239840/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentileDiscClientAggregator.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentileDiscClientAggregator.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentileDiscClientAggregator.java
index 206ed1d..53d9526 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentileDiscClientAggregator.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/aggregator/PercentileDiscClientAggregator.java
@@ -23,7 +23,6 @@ import java.util.*;
 import java.util.Map.Entry;
 
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
-
 import org.apache.phoenix.expression.*;
 import org.apache.phoenix.schema.ColumnModifier;
 import org.apache.phoenix.schema.PDataType;
@@ -36,11 +35,9 @@ import org.apache.phoenix.schema.tuple.Tuple;
  * @author ramkrishna
  * @since 1.2.1
  */
-public class PercentileDiscClientAggregator extends
-		DistinctValueWithCountClientAggregator {
+public class PercentileDiscClientAggregator extends DistinctValueWithCountClientAggregator {
 
 	private final List<Expression> exps;
-	private Object cachedResult = null;
 	ColumnExpression columnExp = null;
 
 	public PercentileDiscClientAggregator(List<Expression> exps, ColumnModifier columnModifier) {
@@ -92,15 +89,14 @@ public class PercentileDiscClientAggregator extends
 	}
 
 	@Override
-	public void reset() {
-		super.reset();
-		this.cachedResult = null;
-	}
-
-	@Override
 	protected int getBufferLength() {
 		// Will be used in the aggregate() call
 		return PDataType.DECIMAL.getByteSize();
 	}
+
+    @Override
+    protected PDataType getResultDataType() {
+        return columnExp.getDataType();
+    }
 	
 }

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/4e239840/phoenix-core/src/test/java/org/apache/phoenix/end2end/DistinctCountTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/end2end/DistinctCountTest.java b/phoenix-core/src/test/java/org/apache/phoenix/end2end/DistinctCountTest.java
index 928828b..c508f5c 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/end2end/DistinctCountTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/end2end/DistinctCountTest.java
@@ -26,9 +26,8 @@ import java.math.BigDecimal;
 import java.sql.*;
 import java.util.Properties;
 
-import org.junit.Test;
-
 import org.apache.phoenix.util.PhoenixRuntime;
+import org.junit.Test;
 
 public class DistinctCountTest extends BaseClientManagedTimeTest {
 
@@ -109,6 +108,66 @@ public class DistinctCountTest extends BaseClientManagedTimeTest {
     }
 
     @Test
+    public void testDistinctCountWithGroupByAndOrderBy() throws Exception {
+        long ts = nextTimestamp();
+        String tenantId = getOrganizationId();
+        initATableValues(tenantId, null, getDefaultSplits(tenantId), null, ts);
+
+        String query = "SELECT A_STRING, count(DISTINCT B_STRING) FROM aTable group by A_STRING order by A_STRING desc";
+
+        Properties props = new Properties(TEST_PROPERTIES);
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at
+                                                                                     // timestamp 2
+        Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
+        try {
+            PreparedStatement statement = conn.prepareStatement(query);
+            ResultSet rs = statement.executeQuery();
+            assertTrue(rs.next());
+            assertEquals(C_VALUE, rs.getString(1));
+            assertEquals(1, rs.getLong(2));
+            assertTrue(rs.next());
+            assertEquals(B_VALUE, rs.getString(1));
+            assertEquals(1, rs.getLong(2));
+            assertTrue(rs.next());
+            assertEquals(A_VALUE, rs.getString(1));
+            assertEquals(2, rs.getLong(2));
+            assertFalse(rs.next());
+        } finally {
+            conn.close();
+        }
+    }
+
+    @Test
+    public void testDistinctCountWithGroupByAndOrderByOnDistinctCount() throws Exception {
+        long ts = nextTimestamp();
+        String tenantId = getOrganizationId();
+        initATableValues(tenantId, null, getDefaultSplits(tenantId), null, ts);
+
+        String query = "SELECT A_STRING, count(DISTINCT B_STRING) as COUNT_B_STRING FROM aTable group by A_STRING order by COUNT_B_STRING";
+
+        Properties props = new Properties(TEST_PROPERTIES);
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at
+                                                                                     // timestamp 2
+        Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
+        try {
+            PreparedStatement statement = conn.prepareStatement(query);
+            ResultSet rs = statement.executeQuery();
+            assertTrue(rs.next());
+            assertEquals(B_VALUE, rs.getString(1));
+            assertEquals(1, rs.getLong(2));
+            assertTrue(rs.next());
+            assertEquals(C_VALUE, rs.getString(1));
+            assertEquals(1, rs.getLong(2));
+            assertTrue(rs.next());
+            assertEquals(A_VALUE, rs.getString(1));
+            assertEquals(2, rs.getLong(2));
+            assertFalse(rs.next());
+        } finally {
+            conn.close();
+        }
+    }
+
+    @Test
     public void testDistinctCountWithGroupByOrdered() throws Exception {
         long ts = nextTimestamp();
         String tenantId = getOrganizationId();

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/4e239840/phoenix-core/src/test/java/org/apache/phoenix/end2end/PercentileTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/end2end/PercentileTest.java b/phoenix-core/src/test/java/org/apache/phoenix/end2end/PercentileTest.java
index f5cd102..e28804e 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/end2end/PercentileTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/end2end/PercentileTest.java
@@ -27,10 +27,9 @@ import java.math.RoundingMode;
 import java.sql.*;
 import java.util.Properties;
 
-import org.junit.Test;
-
 import org.apache.phoenix.query.QueryConstants;
 import org.apache.phoenix.util.PhoenixRuntime;
+import org.junit.Test;
 
 public class PercentileTest extends BaseClientManagedTimeTest {
 
@@ -121,6 +120,42 @@ public class PercentileTest extends BaseClientManagedTimeTest {
     }
 
     @Test
+    public void testPercentileWithGroupbyAndOrderBy() throws Exception {
+        long ts = nextTimestamp();
+        String tenantId = getOrganizationId();
+        initATableValues(tenantId, null, getDefaultSplits(tenantId), null, ts);
+
+        String query = "SELECT A_STRING, PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY A_INTEGER ASC) AS PC FROM aTable GROUP BY A_STRING ORDER BY PC";
+
+        Properties props = new Properties(TEST_PROPERTIES);
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at
+                                                                                     // timestamp 2
+        Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
+        try {
+            PreparedStatement statement = conn.prepareStatement(query);
+            ResultSet rs = statement.executeQuery();
+            assertTrue(rs.next());
+            assertEquals("a",rs.getString(1));
+            BigDecimal percentile = rs.getBigDecimal(2);
+            percentile = percentile.setScale(1, RoundingMode.HALF_UP);
+            assertEquals(7.0, percentile.doubleValue(),0.0);
+            assertTrue(rs.next());
+            assertEquals("c",rs.getString(1));
+            percentile = rs.getBigDecimal(2);
+            percentile = percentile.setScale(1, RoundingMode.HALF_UP);
+            assertEquals(8.0, percentile.doubleValue(),0.0);
+            assertTrue(rs.next());
+            assertEquals("b",rs.getString(1));
+            percentile = rs.getBigDecimal(2);
+            percentile = percentile.setScale(1, RoundingMode.HALF_UP);
+            assertEquals(9.0, percentile.doubleValue(),0.0);
+            assertFalse(rs.next());
+        } finally {
+            conn.close();
+        }
+    }
+
+    @Test
 	public void testPercentileDiscAsc() throws Exception {
 		long ts = nextTimestamp();
 		String tenantId = getOrganizationId();
@@ -204,6 +239,39 @@ public class PercentileTest extends BaseClientManagedTimeTest {
     }
 
     @Test
+    public void testPercentileDiscWithGroupbyAndOrderBy() throws Exception {
+        long ts = nextTimestamp();
+        String tenantId = getOrganizationId();
+        initATableValues(tenantId, null, getDefaultSplits(tenantId), null, ts);
+
+        String query = "SELECT A_STRING, PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY A_INTEGER ASC) FROM aTable GROUP BY A_STRING ORDER BY A_STRING DESC";
+
+        Properties props = new Properties(TEST_PROPERTIES);
+        props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 2)); // Execute at
+                                                                                     // timestamp 2
+        Connection conn = DriverManager.getConnection(PHOENIX_JDBC_URL, props);
+        try {
+            PreparedStatement statement = conn.prepareStatement(query);
+            ResultSet rs = statement.executeQuery();
+            assertTrue(rs.next());
+            assertEquals("c",rs.getString(1));
+            int percentile_disc = rs.getInt(2);
+            assertEquals(8, percentile_disc);
+            assertTrue(rs.next());
+            assertEquals("b",rs.getString(1));
+            percentile_disc = rs.getInt(2);
+            assertEquals(5, percentile_disc);
+            assertTrue(rs.next());
+            assertEquals("a",rs.getString(1));
+            percentile_disc = rs.getInt(2);
+            assertEquals(2, percentile_disc);
+            assertFalse(rs.next());
+        } finally {
+            conn.close();
+        }
+    }
+
+    @Test
     public void testPercentRank() throws Exception {
         long ts = nextTimestamp();
         String tenantId = getOrganizationId();


[2/2] git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-phoenix

Posted by an...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-phoenix


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

Branch: refs/heads/master
Commit: 974ad584b0aef1fcb2f946961c7538c0f012794b
Parents: 4e23984 ff1c1af
Author: anoopsjohn <an...@gmail.com>
Authored: Wed Feb 5 11:19:27 2014 +0530
Committer: anoopsjohn <an...@gmail.com>
Committed: Wed Feb 5 11:19:27 2014 +0530

----------------------------------------------------------------------
 .../apache/phoenix/compile/DeleteCompiler.java  |  13 +-
 .../phoenix/compile/ExpressionCompiler.java     |   6 +-
 .../phoenix/compile/IndexStatementRewriter.java |  11 +-
 .../apache/phoenix/compile/JoinCompiler.java    |  75 +++--
 .../apache/phoenix/compile/QueryCompiler.java   |   9 +-
 .../org/apache/phoenix/compile/ScanRanges.java  |  62 +++-
 .../phoenix/compile/StatementNormalizer.java    |   5 +-
 .../apache/phoenix/compile/WhereOptimizer.java  |  59 ++--
 .../phoenix/coprocessor/ScanProjector.java      | 202 -----------
 .../phoenix/expression/InListExpression.java    |  22 +-
 .../apache/phoenix/iterate/ExplainTable.java    |  16 +-
 .../apache/phoenix/optimize/QueryOptimizer.java |   1 +
 .../org/apache/phoenix/parse/BindTableNode.java |  11 +-
 .../apache/phoenix/parse/ConcreteTableNode.java |   7 +-
 .../org/apache/phoenix/parse/JoinTableNode.java |   3 +-
 .../apache/phoenix/parse/LiteralParseNode.java  |   4 +-
 .../apache/phoenix/parse/NamedTableNode.java    |  13 +-
 .../apache/phoenix/parse/ParseNodeRewriter.java |  37 ++-
 .../org/apache/phoenix/parse/TableNode.java     |  11 +
 .../apache/phoenix/schema/MetaDataClient.java   |  69 ++--
 .../org/apache/phoenix/schema/PDataType.java    |  18 +-
 .../org/apache/phoenix/schema/SaltingUtil.java  |  36 +-
 .../org/apache/phoenix/util/SchemaUtil.java     |   5 +-
 .../phoenix/compile/JoinQueryCompileTest.java   |  28 +-
 .../phoenix/compile/WhereClauseCompileTest.java |  57 ++--
 .../compile/WhereClauseOptimizerTest.java       |   8 +-
 .../phoenix/end2end/BaseConnectedQueryTest.java |   4 +-
 .../apache/phoenix/end2end/HashJoinTest.java    | 331 +++++++++----------
 .../apache/phoenix/end2end/QueryPlanTest.java   |   4 +-
 .../end2end/RowValueConstructorTest.java        |   9 +-
 .../end2end/TenantSpecificTablesDMLTest.java    | 109 ++++--
 .../phoenix/end2end/index/BaseIndexTest.java    |  31 ++
 .../end2end/index/BaseMutableIndexTest.java     |  10 +-
 .../end2end/index/ImmutableIndexTest.java       | 149 ---------
 .../phoenix/end2end/index/MutableIndexTest.java |   8 +-
 .../end2end/index/MutableSaltedIndexTest.java   | 183 ----------
 .../phoenix/end2end/index/SaltedIndexTest.java  | 207 ++++++++++++
 .../java/org/apache/phoenix/query/BaseTest.java |  22 +-
 .../java/org/apache/phoenix/util/TestUtil.java  |  22 +-
 39 files changed, 830 insertions(+), 1047 deletions(-)
----------------------------------------------------------------------