Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.2 da4b97164 -> b0fd5178e


Improve COPY command to work with Counter columns

patch by jasonstack; reviewed by Stefania for CASSANDRA-9043


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

Branch: refs/heads/cassandra-2.2
Commit: 05ccdc6411b9d3388a74ba06d1ce153d33ffe1c3
Parents: 882adf0
Author: Stefania Alborghetti <stefania.alborghe...@datastax.com>
Authored: Thu Nov 19 09:02:03 2015 +0800
Committer: Sylvain Lebresne <sylv...@datastax.com>
Committed: Fri Nov 20 15:03:47 2015 +0100

----------------------------------------------------------------------
 CHANGES.txt |  1 +
 bin/cqlsh   | 27 +++++++++++++++++++++------
 2 files changed, 22 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/05ccdc64/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 9e2869e..86e5cb2 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.12
+ * (cqlsh) Support counters in COPY commands (CASSANDRA-9043)
  * Try next replica if not possible to connect to primary replica on
    ColumnFamilyRecordReader (CASSANDRA-2388)
  * Limit window size in DTCS (CASSANDRA-10280)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/05ccdc64/bin/cqlsh
----------------------------------------------------------------------
diff --git a/bin/cqlsh b/bin/cqlsh
index 5459d67..56cd218 100755
--- a/bin/cqlsh
+++ b/bin/cqlsh
@@ -1696,10 +1696,16 @@ class Shell(cmd.Cmd):
         pk_cols = [col.name for col in table_meta.primary_key]
         cqltypes = [table_meta.columns[name].typestring for name in columns]
         pk_indexes = [columns.index(col.name) for col in 
table_meta.primary_key]
-        query = 'INSERT INTO %s.%s (%s) VALUES (%%s)' % (
-            protect_name(ks),
-            protect_name(cf),
-            ', '.join(protect_names(columns)))
+        is_counter_table = ("counter" in cqltypes)
+        if is_counter_table:
+            query = 'Update %s.%s SET %%s WHERE %%s' % (
+                protect_name(ks),
+                protect_name(cf))
+        else:
+            query = 'INSERT INTO %s.%s (%s) VALUES (%%s)' % (
+                protect_name(ks),
+                protect_name(cf),
+                ', '.join(protect_names(columns)))
 
         # we need to handle some types specially
         should_escape = [t in ('ascii', 'text', 'timestamp', 'date', 'time', 
'inet') for t in cqltypes]
@@ -1764,8 +1770,17 @@ class Shell(cmd.Cmd):
                         return
                     else:
                         row[i] = 'null'
-
-                full_query = query % (','.join(row),)
+                if is_counter_table:
+                    where_clause = []
+                    set_clause = []
+                    for i, value in enumerate(row):
+                        if i in pk_indexes:
+                            where_clause.append("%s=%s" % (columns[i], value))
+                        else:
+                            set_clause.append("%s=%s+%s" % (columns[i], 
columns[i], value))
+                    full_query = query % (','.join(set_clause), ' AND 
'.join(where_clause))
+                else:
+                    full_query = query % (','.join(row),)
                 query_message = QueryMessage(
                     full_query, self.consistency_level, 
serial_consistency_level=None,
                     fetch_size=None, paging_state=None, 
timestamp=insert_timestamp)

Reply via email to