Updated Branches:
  refs/heads/trunk 07ca445e5 -> 4cd087f44

Commit 3rd (and hopefully last) part of 5619


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

Branch: refs/heads/trunk
Commit: 4cd087f44a0fdaaaa49ea82745d4f7aeaeace1fa
Parents: 07ca445
Author: Sylvain Lebresne <sylv...@datastax.com>
Authored: Mon Jul 8 18:08:33 2013 +0200
Committer: Sylvain Lebresne <sylv...@datastax.com>
Committed: Mon Jul 8 18:08:33 2013 +0200

----------------------------------------------------------------------
 .../cql3/statements/ModificationStatement.java  | 47 ++++++++++++++++++--
 1 file changed, 43 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/4cd087f4/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
index ed30748..63655a8 100644
--- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
@@ -38,13 +38,14 @@ import org.apache.cassandra.service.pager.PagingState;
 import org.apache.cassandra.thrift.ThriftValidation;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.ByteBufferUtil;
 
 /*
  * Abstract parent class of individual modifications, i.e. INSERT, UPDATE and 
DELETE.
  */
 public abstract class ModificationStatement implements CQLStatement
 {
-    private static final ColumnIdentifier RESULT_COLUMN = new 
ColumnIdentifier("result", false);
+    private static final ColumnIdentifier CAS_RESULT_COLUMN = new 
ColumnIdentifier("[applied]", false);
 
     private final int boundTerms;
     public final CFMetaData cfm;
@@ -374,9 +375,37 @@ public abstract class ModificationStatement implements 
CQLStatement
         ColumnFamily expected = buildConditions(key, clusteringPrefix, params);
 
         ColumnFamily result = StorageProxy.cas(keyspace(), columnFamily(), 
key, clusteringPrefix, expected, updates, cl);
-        return result == null
-             ? new ResultMessage.Void()
-             : new ResultMessage.Rows(buildCasFailureResultSet(key, result));
+        return new ResultMessage.Rows(buildCasResultSet(key, result));
+    }
+
+    private ResultSet buildCasResultSet(ByteBuffer key, ColumnFamily cf) 
throws InvalidRequestException
+    {
+        boolean success = cf == null;
+
+        ColumnSpecification spec = new ColumnSpecification(keyspace(), 
columnFamily(), CAS_RESULT_COLUMN, BooleanType.instance);
+        ResultSet.Metadata metadata = new 
ResultSet.Metadata(Collections.singletonList(spec));
+        List<List<ByteBuffer>> rows = 
Collections.singletonList(Collections.singletonList(BooleanType.instance.decompose(success)));
+
+        ResultSet rs = new ResultSet(metadata, rows);
+        return success ? rs : merge(rs, buildCasFailureResultSet(key, cf));
+    }
+
+    private static ResultSet merge(ResultSet left, ResultSet right)
+    {
+        if (left.size() == 0)
+            return right;
+        else if (right.size() == 0)
+            return left;
+
+        assert left.size() == 1 && right.size() == 1;
+        int size = left.metadata.names.size() + right.metadata.names.size();
+        List<ColumnSpecification> specs = new 
ArrayList<ColumnSpecification>(size);
+        specs.addAll(left.metadata.names);
+        specs.addAll(right.metadata.names);
+        List<ByteBuffer> row = new ArrayList<ByteBuffer>(size);
+        row.addAll(left.rows.get(0));
+        row.addAll(right.rows.get(0));
+        return new ResultSet(new ResultSet.Metadata(specs), 
Collections.singletonList(row));
     }
 
     private ResultSet buildCasFailureResultSet(ByteBuffer key, ColumnFamily 
cf) throws InvalidRequestException
@@ -467,6 +496,16 @@ public abstract class ModificationStatement implements 
CQLStatement
             return null;
 
         ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(cfm);
+
+        // CQL row marker
+        CFDefinition cfDef = cfm.getCfDef();
+        if (cfDef.isComposite && !cfDef.isCompact && !cfm.isSuper())
+        {
+            ByteBuffer name = 
clusteringPrefix.copy().add(ByteBufferUtil.EMPTY_BYTE_BUFFER).build();
+            cf.addColumn(params.makeColumn(name, 
ByteBufferUtil.EMPTY_BYTE_BUFFER));
+        }
+
+        // Conditions
         for (Operation condition : columnConditions)
             condition.execute(key, cf, clusteringPrefix.copy(), params);
 

Reply via email to