You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by xe...@apache.org on 2011/11/03 20:00:01 UTC

svn commit: r1197270 - in /cassandra/trunk: ./ src/java/org/apache/cassandra/cql/

Author: xedin
Date: Thu Nov  3 19:00:00 2011
New Revision: 1197270

URL: http://svn.apache.org/viewvc?rev=1197270&view=rev
Log:
recognize that "SELECT first ... *" isn't really "SELECT *"
patch by Pavel Yaskevich; reviewed by Jonathan Ellis for CASSANDRA-3445

Modified:
    cassandra/trunk/CHANGES.txt
    cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g
    cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/SelectExpression.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java

Modified: cassandra/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1197270&r1=1197269&r2=1197270&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Thu Nov  3 19:00:00 2011
@@ -2,7 +2,7 @@
  * off-heap cache to use sun.misc.Unsafe instead of JNA (CASSANDRA-3271)
  * EACH_QUORUM is only supported for writes (CASSANDRA-3272)
  * replace compactionlock use in schema migration by checking CFS.isInvalidD
-
+ * recognize that "SELECT first ... *" isn't really "SELECT *" (CASSANDRA-3445)
 
 1.0.2
  * "defragment" rows for name-based queries under STCS (CASSANDRA-2503)

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g?rev=1197270&r1=1197269&r2=1197270&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g Thu Nov  3 19:00:00 2011
@@ -169,13 +169,14 @@ selectExpression returns [SelectExpressi
     : {
           int count = 10000;
           boolean reversed = false;
+          boolean hasFirstSet = false;
       }
-      ( K_FIRST cols=INTEGER { count = Integer.parseInt($cols.text); } )?
+      ( K_FIRST { hasFirstSet = true; } cols=INTEGER { count = Integer.parseInt($cols.text); } )?
       ( K_REVERSED { reversed = true; } )?
-      ( first=term { $expr = new SelectExpression(first, count, reversed); }
+      ( first=term { $expr = new SelectExpression(first, count, reversed, hasFirstSet); }
             (',' next=term { $expr.and(next); })*
-      | start=term RANGEOP finish=term { $expr = new SelectExpression(start, finish, count, reversed, false); }
-      | '\*' { $expr = new SelectExpression(new Term(), new Term(), count, reversed, true); }
+      | start=term RANGEOP finish=term { $expr = new SelectExpression(start, finish, count, reversed, false, hasFirstSet); }
+      | '\*' { $expr = new SelectExpression(new Term(), new Term(), count, reversed, true, hasFirstSet); }
       )
     ;
 

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java?rev=1197270&r1=1197269&r2=1197270&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java Thu Nov  3 19:00:00 2011
@@ -587,7 +587,7 @@ public class QueryProcessor
                     List<Column> thriftColumns = new ArrayList<Column>();
                     if (select.isColumnRange())
                     {
-                        if (select.isWildcard())
+                        if (select.isFullWildcard())
                         {
                             // prepend key
                             thriftColumns.add(new Column(metadata.getKeyName()).setValue(row.key.key).setTimestamp(-1));

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/SelectExpression.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/SelectExpression.java?rev=1197270&r1=1197269&r2=1197270&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/SelectExpression.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/SelectExpression.java Thu Nov  3 19:00:00 2011
@@ -37,6 +37,7 @@ public class SelectExpression
     
     private int numColumns = MAX_COLUMNS_DEFAULT;
     private boolean reverseColumns = false;
+    private boolean hasFirstSet;
     private final boolean wildcard;
     private Term start, finish;
     private List<Term> columns;
@@ -48,14 +49,17 @@ public class SelectExpression
      * @param finish the finishing column name
      * @param count the number of columns to limit the results to
      * @param reverse true to reverse column order
+     * @param wildcard determines weather this statement is wildcard
+     * @param firstSet determines weather "FIRST" keyword was set
      */
-    public SelectExpression(Term start, Term finish, int count, boolean reverse, boolean wildcard)
+    public SelectExpression(Term start, Term finish, int count, boolean reverse, boolean wildcard, boolean firstSet)
     {
         this.start = start;
         this.finish = finish;
         numColumns = count;
         reverseColumns = reverse;
         this.wildcard = wildcard;
+        hasFirstSet = firstSet;
     }
     
     /**
@@ -64,14 +68,16 @@ public class SelectExpression
      * @param first the first (possibly only) column name to select on.
      * @param count the number of columns to limit the results on
      * @param reverse true to reverse column order
+     * @param firstSet determines weather "FIRST" keyword was set
      */
-    public SelectExpression(Term first, int count, boolean reverse)
+    public SelectExpression(Term first, int count, boolean reverse, boolean firstSet)
     {
         wildcard = false;
         columns = new ArrayList<Term>();
         columns.add(first);
         numColumns = count;
         reverseColumns = reverse;
+        hasFirstSet = firstSet;
     }
     
     /**
@@ -114,6 +120,14 @@ public class SelectExpression
         numColumns = limit;
     }
 
+    /**
+     * @return weather expression includes "FIRST" keyword
+     */
+    public boolean hasFirstSet()
+    {
+        return hasFirstSet;
+    }
+
     public Term getStart()
     {
         return start;

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java?rev=1197270&r1=1197269&r2=1197270&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java Thu Nov  3 19:00:00 2011
@@ -90,7 +90,11 @@ public class SelectStatement
     {
         return expression.isWildcard();
     }
-    
+    public boolean isFullWildcard()
+    {
+        return expression.isWildcard() && !expression.hasFirstSet();
+    }
+
     public List<Term> getColumnNames()
     {
         return expression.getColumns();