You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2012/11/10 00:36:04 UTC

[3/7] git commit: allow CLI to GET cql3 columnfamily data patch by jbellis; reviewed by Jason Brown and Aleksey Yeschenko for CASSANDRA-424

allow CLI to GET cql3 columnfamily data
patch by jbellis; reviewed by Jason Brown and Aleksey Yeschenko for CASSANDRA-424


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

Branch: refs/heads/cassandra-1.2
Commit: 5c81f4b928b3a94d317c2e3829a07447ea21ea77
Parents: fc5f877
Author: Jonathan Ellis <jb...@apache.org>
Authored: Thu Nov 8 11:13:10 2012 -0600
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Fri Nov 9 17:35:44 2012 -0600

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 src/java/org/apache/cassandra/cli/CliClient.java   |  118 +++++++++++----
 src/java/org/apache/cassandra/cli/CliCompiler.java |    4 +-
 src/java/org/apache/cassandra/cli/Cql3CfDef.java   |    5 -
 4 files changed, 92 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/5c81f4b9/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index f6769fe..b73b14d 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 1.2-rc1
+ * allow CLI to GET cql3 columnfamily data (CASSANDRA-4924)
  * Fix rare race condition in getExpireTimeForEndpoint (CASSANDRA-4402)
  * acquire references to overlapping sstables during compaction so bloom filter
    doesn't get free'd prematurely (CASSANDRA-4934)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5c81f4b9/src/java/org/apache/cassandra/cli/CliClient.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cli/CliClient.java b/src/java/org/apache/cassandra/cli/CliClient.java
index 9594525..3060359 100644
--- a/src/java/org/apache/cassandra/cli/CliClient.java
+++ b/src/java/org/apache/cassandra/cli/CliClient.java
@@ -30,6 +30,7 @@ import java.util.*;
 import com.google.common.base.Charsets;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
+import com.google.common.collect.Iterables;
 import org.apache.commons.lang.StringUtils;
 
 import org.antlr.runtime.tree.Tree;
@@ -148,6 +149,7 @@ public class CliClient
     private String keySpace = null;
     private String username = null;
     private final Map<String, KsDef> keyspacesMap = new HashMap<String, KsDef>();
+    private final Map<String, Map<String, CfDef>> cql3KeyspacesMap = new HashMap<String, Map<String, CfDef>>();
     private final Map<String, AbstractType<?>> cfKeysComparators;
     private ConsistencyLevel consistencyLevel = ConsistencyLevel.ONE;
     private final CfAssumptions assumptions = new CfAssumptions();
@@ -317,13 +319,72 @@ public class CliClient
         // Lazily lookup keyspace meta-data.
         if (!(keyspacesMap.containsKey(keyspace)))
         {
-            keyspacesMap.put(keyspace, thriftClient.describe_keyspace(keyspace));
+            KsDef ksDef = thriftClient.describe_keyspace(keyspace);
+            keyspacesMap.put(keyspace, ksDef);
+            cql3KeyspacesMap.put(keyspace, loadCql3Defs(thriftClient, ksDef));
             assumptions.replayAssumptions(keyspace);
         }
 
         return keyspacesMap.get(keyspace);
     }
 
+    public static Map<String, CfDef> loadCql3Defs(Cassandra.Client thriftClient, KsDef thriftKs)
+    {
+        try
+        {
+            return loadCql3DefsUnchecked(thriftClient, thriftKs);
+        }
+        catch (Exception e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static Map<String, CfDef> loadCql3DefsUnchecked(Cassandra.Client thriftClient, KsDef thriftKs) throws Exception
+    {
+        Map<String, CfDef> cql3Defs = new HashMap<String, CfDef>();
+
+        String query = "SELECT columnfamily_name, comparator, default_validator, key_validator FROM system.schema_columnfamilies WHERE keyspace_name='%s'";
+        String formatted = String.format(query, thriftKs.name);
+        CqlResult result = thriftClient.execute_cql3_query(ByteBufferUtil.bytes(formatted),
+                                                           Compression.NONE,
+                                                           ConsistencyLevel.ONE);
+        outer:
+        for (CqlRow row : result.rows)
+        {
+            Column rawName = row.columns.get(0);
+            assert ByteBufferUtil.string(ByteBuffer.wrap(rawName.getName())).equals("columnfamily_name");
+            String name = ByteBufferUtil.string(ByteBuffer.wrap(rawName.getValue()));
+
+            Column rawComparator = row.columns.get(1);
+            assert ByteBufferUtil.string(ByteBuffer.wrap(rawComparator.getName())).equals("comparator");
+            String comparator = ByteBufferUtil.string(ByteBuffer.wrap(rawComparator.getValue()));
+
+            Column rawValidator = row.columns.get(2);
+            assert ByteBufferUtil.string(ByteBuffer.wrap(rawValidator.getName())).equals("default_validator");
+            String validator = ByteBufferUtil.string(ByteBuffer.wrap(rawValidator.getValue()));
+
+            Column rawKeyValidator = row.columns.get(3);
+            assert ByteBufferUtil.string(ByteBuffer.wrap(rawKeyValidator.getName())).equals("key_validator");
+            String keyValidator = ByteBufferUtil.string(ByteBuffer.wrap(rawKeyValidator.getValue()));
+
+            for (CfDef cf_def : thriftKs.cf_defs)
+            {
+                if (cf_def.name.equals(name))
+                    continue outer;
+            }
+
+            CfDef thriftDef = new CfDef(thriftKs.name, name)
+                              .setComparator_type(comparator)
+                              .setDefault_validation_class(validator)
+                              .setKey_validation_class(keyValidator)
+                              .setColumn_metadata(Collections.<ColumnDef>emptyList());
+            cql3Defs.put(name, thriftDef);
+        }
+
+        return cql3Defs;
+    }
+
     private void executeHelp(Tree tree)
     {
         if (tree.getChildCount() > 0)
@@ -352,7 +413,7 @@ public class CliClient
 
         Tree columnFamilySpec = statement.getChild(0);
 
-        String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, keyspacesMap.get(keySpace).cf_defs);
+        String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, currentCfDefs());
         int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec);
 
         ColumnParent colParent = new ColumnParent(columnFamily).setSuper_column((ByteBuffer) null);
@@ -375,6 +436,11 @@ public class CliClient
         sessionState.out.printf("%d columns%n", count);
     }
 
+    private Iterable<CfDef> currentCfDefs()
+    {
+        return Iterables.concat(keyspacesMap.get(keySpace).cf_defs, cql3KeyspacesMap.get(keySpace).values());
+    }
+
     private void executeDelete(Tree statement)
             throws TException, InvalidRequestException, UnavailableException, TimedOutException
     {
@@ -383,7 +449,7 @@ public class CliClient
 
         Tree columnFamilySpec = statement.getChild(0);
 
-        String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, keyspacesMap.get(keySpace).cf_defs);
+        String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, currentCfDefs());
         CfDef cfDef = getCfDef(columnFamily);
 
         ByteBuffer key = getKeyAsBytes(columnFamily, columnFamilySpec.getChild(1));
@@ -567,7 +633,7 @@ public class CliClient
             return;
         long startTime = System.nanoTime();
         Tree columnFamilySpec = statement.getChild(0);
-        String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, keyspacesMap.get(keySpace).cf_defs);
+        String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, currentCfDefs());
         ByteBuffer key = getKeyAsBytes(columnFamily, columnFamilySpec.getChild(1));
         int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec);
         CfDef cfDef = getCfDef(columnFamily);
@@ -737,7 +803,7 @@ public class CliClient
         long startTime = System.nanoTime();
 
         IndexClause clause = new IndexClause();
-        String columnFamily = CliCompiler.getColumnFamily(statement, keyspacesMap.get(keySpace).cf_defs);
+        String columnFamily = CliCompiler.getColumnFamily(statement, currentCfDefs());
         // ^(CONDITIONS ^(CONDITION $column $value) ...)
         Tree conditions = statement.getChild(1);
 
@@ -833,7 +899,7 @@ public class CliClient
         Tree columnFamilySpec = statement.getChild(0);
         Tree keyTree = columnFamilySpec.getChild(1); // could be a function or regular text
 
-        String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, keyspacesMap.get(keySpace).cf_defs);
+        String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, currentCfDefs());
         CfDef cfDef = getCfDef(columnFamily);
         int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec);
         String value = CliUtils.unescapeSQLString(statement.getChild(1).getText());
@@ -920,7 +986,7 @@ public class CliClient
 
         Tree columnFamilySpec = statement.getChild(0);
 
-        String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, keyspacesMap.get(keySpace).cf_defs);
+        String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, currentCfDefs());
         ByteBuffer key = getKeyAsBytes(columnFamily, columnFamilySpec.getChild(1));
         int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec);
 
@@ -1086,7 +1152,7 @@ public class CliClient
         if (!CliMain.isConnected() || !hasKeySpace())
             return;
 
-        String cfName = CliCompiler.getColumnFamily(statement, keyspacesMap.get(keySpace).cf_defs);
+        String cfName = CliCompiler.getColumnFamily(statement, currentCfDefs());
 
         try
         {
@@ -1306,7 +1372,7 @@ public class CliClient
         if (!CliMain.isConnected() || !hasKeySpace())
             return;
 
-        String cfName = CliCompiler.getColumnFamily(statement, keyspacesMap.get(keySpace).cf_defs);
+        String cfName = CliCompiler.getColumnFamily(statement, currentCfDefs());
         String mySchemaVersion = thriftClient.system_drop_column_family(cfName);
         sessionState.out.println(mySchemaVersion);
     }
@@ -1320,7 +1386,7 @@ public class CliClient
         long startTime = System.nanoTime();
 
         // extract column family
-        String columnFamily = CliCompiler.getColumnFamily(statement, keyspacesMap.get(keySpace).cf_defs);
+        String columnFamily = CliCompiler.getColumnFamily(statement, currentCfDefs());
 
         String rawStartKey = "";
         String rawEndKey = "";
@@ -1428,7 +1494,7 @@ public class CliClient
             return;
 
         // getColumnFamily will check if CF exists for us
-        String columnFamily = CliCompiler.getColumnFamily(statement, keyspacesMap.get(keySpace).cf_defs);
+        String columnFamily = CliCompiler.getColumnFamily(statement, currentCfDefs());
         String rawColumName = CliUtils.unescapeSQLString(statement.getChild(1).getText());
 
         CfDef cfDef = getCfDef(columnFamily);
@@ -1468,7 +1534,7 @@ public class CliClient
             return;
 
         // getting CfDef, it will fail if there is no such column family in current keySpace.
-        CfDef cfDef = getCfDef(CliCompiler.getColumnFamily(columnFamily, keyspacesMap.get(keySpace).cf_defs));
+        CfDef cfDef = getCfDef(CliCompiler.getColumnFamily(columnFamily, currentCfDefs()));
 
         thriftClient.truncate(cfDef.getName());
         sessionState.out.println(columnFamily + " truncated.");
@@ -1510,7 +1576,7 @@ public class CliClient
         if (!CliMain.isConnected() || !hasKeySpace())
             return;
 
-        String cfName = CliCompiler.getColumnFamily(statement, keyspacesMap.get(keySpace).cf_defs);
+        String cfName = CliCompiler.getColumnFamily(statement, currentCfDefs());
 
         // VALIDATOR | COMPARATOR | KEYS | SUB_COMPARATOR
         String assumptionElement = statement.getChild(1).getText().toUpperCase();
@@ -2285,17 +2351,11 @@ public class CliClient
      */
     private CfDef getCfDef(String keySpaceName, String columnFamilyName)
     {
-        KsDef keySpaceDefinition = keyspacesMap.get(keySpaceName);
-
-        for (CfDef columnFamilyDef : keySpaceDefinition.cf_defs)
-        {
-            if (columnFamilyDef.name.equals(columnFamilyName))
-            {
-                return columnFamilyDef;
-            }
-        }
-
-        throw new RuntimeException("No such column family: " + columnFamilyName);
+        KsDef ksDef = keyspacesMap.get(keySpaceName);
+        CfDef cfDef = getCfDef(ksDef, columnFamilyName);
+        if (cfDef == null)
+            throw new RuntimeException("No such column family: " + columnFamilyName);
+        return cfDef;
     }
 
     /**
@@ -2316,7 +2376,7 @@ public class CliClient
                 return cfDef;
         }
 
-        return null;
+        return cql3KeyspacesMap.get(keyspace.name).get(columnFamilyName);
     }
 
     /**
@@ -2571,15 +2631,15 @@ public class CliClient
 
     /**
      * Get validator for specific column value
-     * @param ColumnFamilyDef - CfDef object representing column family with metadata
+     * @param cfDef - CfDef object representing column family with metadata
      * @param columnNameInBytes - column name as byte array
      * @return AbstractType - validator for column value
      */
-    private AbstractType<?> getValidatorForValue(CfDef ColumnFamilyDef, byte[] columnNameInBytes)
+    private AbstractType<?> getValidatorForValue(CfDef cfDef, byte[] columnNameInBytes)
     {
-        String defaultValidator = ColumnFamilyDef.default_validation_class;
+        String defaultValidator = cfDef.default_validation_class;
 
-        for (ColumnDef columnDefinition : ColumnFamilyDef.getColumn_metadata())
+        for (ColumnDef columnDefinition : cfDef.getColumn_metadata())
         {
             byte[] nameInBytes = columnDefinition.getName();
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5c81f4b9/src/java/org/apache/cassandra/cli/CliCompiler.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cli/CliCompiler.java b/src/java/org/apache/cassandra/cli/CliCompiler.java
index a6db0e3..ad12821 100644
--- a/src/java/org/apache/cassandra/cli/CliCompiler.java
+++ b/src/java/org/apache/cassandra/cli/CliCompiler.java
@@ -93,12 +93,12 @@ public class CliCompiler
      * NODE_COLUMN_ACCESS related functions.
      */
 
-    public static String getColumnFamily(Tree astNode, List<CfDef> cfDefs)
+    public static String getColumnFamily(Tree astNode, Iterable<CfDef> cfDefs)
     {
         return getColumnFamily(CliUtils.unescapeSQLString(astNode.getChild(0).getText()), cfDefs);
     }
 
-    public static String getColumnFamily(String cfName, List<CfDef> cfDefs)
+    public static String getColumnFamily(String cfName, Iterable<CfDef> cfDefs)
     {
         int matches = 0;
         String lastMatchedName = "";

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5c81f4b9/src/java/org/apache/cassandra/cli/Cql3CfDef.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cli/Cql3CfDef.java b/src/java/org/apache/cassandra/cli/Cql3CfDef.java
deleted file mode 100644
index 6828e3d..0000000
--- a/src/java/org/apache/cassandra/cli/Cql3CfDef.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.apache.cassandra.cli;
-
-public class Cql3CfDef
-{
-}