Updated Branches:
  refs/heads/trunk ab13579a3 -> f3e24bd51

Merge branch 'cassandra-1.1' into trunk

Conflicts:
        src/java/org/apache/cassandra/cql3/statements/SelectStatement.java


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

Branch: refs/heads/trunk
Commit: f3e24bd5162eede8ad13abc9c85c90dd971fc110
Parents: ab13579 6ddcf03
Author: Sylvain Lebresne <[email protected]>
Authored: Tue Oct 2 18:51:58 2012 +0200
Committer: Sylvain Lebresne <[email protected]>
Committed: Tue Oct 2 18:51:58 2012 +0200

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 .../cassandra/cql3/statements/SelectStatement.java |   31 ++++++++++-----
 2 files changed, 22 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f3e24bd5/CHANGES.txt
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f3e24bd5/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
index 4af9afd,fac0deb..08b8211
--- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
@@@ -280,26 -319,19 +286,26 @@@ public class SelectStatement implement
          return bounds;
      }
  
 -    private SlicePredicate makeSlicePredicate(List<ByteBuffer> variables)
 +    private IFilter makeFilter(List<ByteBuffer> variables)
      throws InvalidRequestException
      {
 -        SlicePredicate thriftSlicePredicate = new SlicePredicate();
 -
          if (isColumnRange())
          {
 -            SliceRange sliceRange = new SliceRange();
 -            sliceRange.start = getRequestedBound(isReversed ? Bound.END : 
Bound.START, variables);
 -            sliceRange.finish = getRequestedBound(isReversed ? Bound.START : 
Bound.END, variables);
 -            sliceRange.reversed = isReversed;
 -            sliceRange.count = -1; // We use this for range slices, where the 
count is ignored in favor of the global column count
 -            thriftSlicePredicate.slice_range = sliceRange;
 +            // For sparse, we used to ask for 'defined columns' * 'asked 
limit' (where defined columns includes the row marker)
 +            // to account for the grouping of columns.
 +            // Since that doesn't work for maps/sets/lists, we now use the 
compositesToGroup option of SliceQueryFilter.
 +            // But we must preserve backward compatibility too (for mixed 
version cluster that is).
 +            int multiplier = cfDef.isCompact ? 1 : (cfDef.metadata.size() + 
1);
 +            int toGroup = cfDef.isCompact ? -1 : cfDef.columns.size();
-             ColumnSlice slice = new ColumnSlice(getRequestedBound(isReversed 
? Bound.END : Bound.START, variables),
-                                                 getRequestedBound(isReversed 
? Bound.START : Bound.END, variables));
++            ColumnSlice slice = new 
ColumnSlice(getRequestedBound(Bound.START, variables),
++                                                getRequestedBound(Bound.END, 
variables));
 +            SliceQueryFilter filter = new SliceQueryFilter(new 
ColumnSlice[]{slice},
 +                                                           isReversed,
 +                                                           getLimit(),
 +                                                           toGroup,
 +                                                           multiplier);
 +            QueryProcessor.validateSliceFilter(cfDef.cfm, filter);
 +            return filter;
          }
          else
          {
@@@ -493,10 -484,18 +499,15 @@@
          }
      }
  
-     private ByteBuffer buildBound(Bound b, Restriction[] restrictions, 
ColumnNameBuilder builder, List<ByteBuffer> variables) throws 
InvalidRequestException
 -    private ByteBuffer getRequestedBound(Bound bound, List<ByteBuffer> 
variables) throws InvalidRequestException
++    private ByteBuffer buildBound(Bound bound, Restriction[] restrictions, 
ColumnNameBuilder builder, List<ByteBuffer> variables) throws 
InvalidRequestException
      {
-         for (Restriction r : restrictions)
 -        assert isColumnRange();
 -
 -        ColumnNameBuilder builder = cfDef.getColumnNameBuilder();
+         for (CFDefinition.Name name : cfDef.columns.values())
          {
+             // In a restriction, we always have Bound.START < Bound.END for 
the "base" comparator.
+             // So if we're doing a reverse slice, we must inverse the bounds 
when giving them as start and end of the slice filter.
+             // But if the actual comparator itself is reversed, we must 
inversed the bounds too.
+             Bound b = isReversed == isReversedType(name) ? bound : 
Bound.reverse(bound);
+             Restriction r = columnRestrictions[name.position];
              if (r == null || (!r.isEquality() && r.bound(b) == null))
              {
                  // There wasn't any non EQ relation on that key, we select 
all records having the preceding component as prefix.
@@@ -521,13 -520,7 +532,13 @@@
              }
          }
          // Means no relation at all or everything was an equal
-         return (b == Bound.END) ? builder.buildAsEndOfRange() : 
builder.build();
 -        return builder.build();
++        return (bound == Bound.END) ? builder.buildAsEndOfRange() : 
builder.build();
 +    }
 +
 +    private ByteBuffer getRequestedBound(Bound b, List<ByteBuffer> variables) 
throws InvalidRequestException
 +    {
 +        assert isColumnRange();
 +        return buildBound(b, columnRestrictions, 
cfDef.getColumnNameBuilder(), variables);
      }
  
      private List<IndexExpression> getIndexExpressions(List<ByteBuffer> 
variables) throws InvalidRequestException
@@@ -925,9 -932,16 +936,14 @@@
                  default:
                      throw new AssertionError();
              }
 -            thriftColumns.add(col);
          }
 -        return new CqlRow(key, thriftColumns);
      }
  
+     private static boolean isReversedType(CFDefinition.Name name)
+     {
+         return name.type instanceof ReversedType;
+     }
+ 
      public static class RawStatement extends CFStatement
      {
          private final Parameters parameters;
@@@ -1218,15 -1168,13 +1234,10 @@@
                  stmt.isReversed = isReversed;
              }
  
 -            // If this is a query on tokens, it's necessary a range query 
(there can be more than one key per token), so reject IN queries (as we don't 
know how to do them)
 -            if (stmt.keyRestriction != null && stmt.keyRestriction.onToken && 
stmt.keyRestriction.isEquality() && stmt.keyRestriction.eqValues.size() > 1)
 -                throw new InvalidRequestException("Select using the token() 
function don't support IN clause");
  
 -            return new ParsedStatement.Prepared(stmt, 
Arrays.<CFDefinition.Name>asList(names));
 +            return new ParsedStatement.Prepared(stmt, 
Arrays.<ColumnSpecification>asList(names));
          }
  
-         private static boolean isReversedType(CFDefinition.Name name)
-         {
-             return name.type instanceof ReversedType;
-         }
- 
          Restriction updateRestriction(CFDefinition.Name name, Restriction 
restriction, Relation newRel) throws InvalidRequestException
          {
              if (newRel.onToken && name.kind != 
CFDefinition.Name.Kind.KEY_ALIAS)

Reply via email to