You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ja...@apache.org on 2015/03/28 00:05:53 UTC
phoenix git commit: PHOENIX-1749 ORDER BY should support column
position as well as column alias (Alicia Ying Shu)
Repository: phoenix
Updated Branches:
refs/heads/4.x-HBase-0.98 fa4680fea -> f1d10c7b2
PHOENIX-1749 ORDER BY should support column position as well as column alias (Alicia Ying Shu)
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/f1d10c7b
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/f1d10c7b
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/f1d10c7b
Branch: refs/heads/4.x-HBase-0.98
Commit: f1d10c7b256d44bdd3dd2f9119d0b8caa5e16b1b
Parents: fa4680f
Author: James Taylor <ja...@apache.org>
Authored: Fri Mar 27 16:05:21 2015 -0700
Committer: James Taylor <ja...@apache.org>
Committed: Fri Mar 27 16:05:21 2015 -0700
----------------------------------------------------------------------
.../org/apache/phoenix/end2end/OrderByIT.java | 55 +++++++++++++++++++-
.../apache/phoenix/compile/OrderByCompiler.java | 22 ++++++--
2 files changed, 73 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/f1d10c7b/phoenix-core/src/it/java/org/apache/phoenix/end2end/OrderByIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/OrderByIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/OrderByIT.java
index a8beb1e..0e961c1 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/OrderByIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/OrderByIT.java
@@ -80,7 +80,7 @@ public class OrderByIT extends BaseClientManagedTimeIT {
conn.close();
}
}
-
+
@Test
public void testDescMultiOrderByExpr() throws Exception {
@@ -118,4 +118,57 @@ public class OrderByIT extends BaseClientManagedTimeIT {
conn.close();
}
}
+
+ @Test
+ public void testOrderByWithPosition() throws Exception {
+ Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ Connection conn = DriverManager.getConnection(getUrl(), props);
+ conn.setAutoCommit(false);
+
+ try {
+ String ddl = "CREATE TABLE t_table " +
+ " (a_string varchar not null, col1 integer" +
+ " CONSTRAINT pk PRIMARY KEY (a_string))\n";
+ createTestTable(getUrl(), ddl);
+
+ String dml = "UPSERT INTO t_table VALUES(?, ?)";
+ PreparedStatement stmt = conn.prepareStatement(dml);
+ stmt.setString(1, "a");
+ stmt.setInt(2, 40);
+ stmt.execute();
+ stmt.setString(1, "b");
+ stmt.setInt(2, 20);
+ stmt.execute();
+ stmt.setString(1, "c");
+ stmt.setInt(2, 30);
+ stmt.execute();
+ conn.commit();
+
+ String aggregate = "select count(*), col1 from t_table group by col1 order by 2";
+ ResultSet rs = conn.createStatement().executeQuery(aggregate);
+ assertTrue(rs.next());
+ assertEquals(1,rs.getInt(1));
+ assertTrue(rs.next());
+ assertEquals(1,rs.getInt(1));
+ assertTrue(rs.next());
+ assertEquals(1,rs.getInt(1));
+ assertFalse(rs.next());
+
+ aggregate = "select a_string x, col1 y from t_table order by x";
+ rs = conn.createStatement().executeQuery(aggregate);
+ assertTrue(rs.next());
+ assertEquals("a",rs.getString(1));
+ assertEquals(40,rs.getInt(2));
+ assertTrue(rs.next());
+ assertEquals("b",rs.getString(1));
+ assertEquals(20,rs.getInt(2));
+ assertTrue(rs.next());
+ assertEquals("c",rs.getString(1));
+ assertEquals(30,rs.getInt(2));
+ assertFalse(rs.next());
+ } finally {
+ conn.close();
+ }
+ }
+
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/phoenix/blob/f1d10c7b/phoenix-core/src/main/java/org/apache/phoenix/compile/OrderByCompiler.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/OrderByCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/OrderByCompiler.java
index 215f59e..f138ce0 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/OrderByCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/OrderByCompiler.java
@@ -29,12 +29,15 @@ import org.apache.phoenix.exception.SQLExceptionCode;
import org.apache.phoenix.exception.SQLExceptionInfo;
import org.apache.phoenix.expression.Expression;
import org.apache.phoenix.expression.OrderByExpression;
-import org.apache.phoenix.parse.FilterableStatement;
+import org.apache.phoenix.parse.LiteralParseNode;
import org.apache.phoenix.parse.OrderByNode;
+import org.apache.phoenix.parse.ParseNode;
+import org.apache.phoenix.parse.SelectStatement;
import org.apache.phoenix.query.QueryServices;
import org.apache.phoenix.query.QueryServicesOptions;
import org.apache.phoenix.schema.PTableType;
import org.apache.phoenix.schema.SortOrder;
+import org.apache.phoenix.schema.types.PInteger;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
@@ -77,7 +80,7 @@ public class OrderByCompiler {
* @throws SQLException
*/
public static OrderBy compile(StatementContext context,
- FilterableStatement statement,
+ SelectStatement statement,
GroupBy groupBy, Integer limit,
boolean isInRowKeyOrder) throws SQLException {
List<OrderByNode> orderByNodes = statement.getOrderBy();
@@ -91,7 +94,20 @@ public class OrderByCompiler {
LinkedHashSet<OrderByExpression> orderByExpressions = Sets.newLinkedHashSetWithExpectedSize(orderByNodes.size());
for (OrderByNode node : orderByNodes) {
boolean isAscending = node.isAscending();
- Expression expression = node.getNode().accept(visitor);
+ ParseNode parseNode = node.getNode();
+ Expression expression = null;
+ if (parseNode instanceof LiteralParseNode && ((LiteralParseNode)parseNode).getType() == PInteger.INSTANCE){
+ Integer index = (Integer)((LiteralParseNode)parseNode).getValue();
+ int size = statement.getSelect().size();
+ if (index > size || index <= 0 ) {
+ throw new SQLExceptionInfo.Builder(SQLExceptionCode.PARAM_INDEX_OUT_OF_BOUND)
+ .setMessage("Order by by positions ").build().buildException();
+ }
+ ParseNode orderNode = statement.getSelect().get(index-1).getNode();
+ expression = orderNode.accept(visitor);
+ } else {
+ expression = node.getNode().accept(visitor);
+ }
if (!expression.isStateless() && visitor.addEntry(expression, isAscending ? SortOrder.ASC : SortOrder.DESC)) {
// Detect mix of aggregate and non aggregates (i.e. ORDER BY txns, SUM(txns)
if (!visitor.isAggregate()) {