Repository: cassandra
Updated Branches:
  refs/heads/trunk 4effabc8f -> 2a4b8f10e


Fix NativeSSTableLoaderClient post CASSANDRA-10365


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

Branch: refs/heads/trunk
Commit: 454f32dcb67dda3151da993dc74b5b0d0f5817b0
Parents: 18e2fca
Author: Aleksey Yeschenko <alek...@apache.org>
Authored: Thu Nov 5 13:02:03 2015 +0000
Committer: Aleksey Yeschenko <alek...@apache.org>
Committed: Thu Nov 5 13:02:03 2015 +0000

----------------------------------------------------------------------
 src/java/org/apache/cassandra/schema/Types.java |  2 +-
 .../utils/NativeSSTableLoaderClient.java        | 54 +++++++++++++++-----
 2 files changed, 42 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/454f32dc/src/java/org/apache/cassandra/schema/Types.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/schema/Types.java 
b/src/java/org/apache/cassandra/schema/Types.java
index 4f3d78c..258be9f 100644
--- a/src/java/org/apache/cassandra/schema/Types.java
+++ b/src/java/org/apache/cassandra/schema/Types.java
@@ -237,7 +237,7 @@ public final class Types implements Iterable<UserType>
             return Types.builder().add(types).build();
         }
 
-        void add(String name, List<String> fieldNames, List<String> fieldTypes)
+        public void add(String name, List<String> fieldNames, List<String> 
fieldTypes)
         {
             List<CQL3Type.Raw> rawFieldTypes =
                 fieldTypes.stream()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/454f32dc/src/java/org/apache/cassandra/utils/NativeSSTableLoaderClient.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/NativeSSTableLoaderClient.java 
b/src/java/org/apache/cassandra/utils/NativeSSTableLoaderClient.java
index 8dff532..cebee4a 100644
--- a/src/java/org/apache/cassandra/utils/NativeSSTableLoaderClient.java
+++ b/src/java/org/apache/cassandra/utils/NativeSSTableLoaderClient.java
@@ -30,7 +30,9 @@ import org.apache.cassandra.dht.*;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.dht.Token.TokenFactory;
 import org.apache.cassandra.io.sstable.SSTableLoader;
+import org.apache.cassandra.schema.CQLTypeParser;
 import org.apache.cassandra.schema.SchemaKeyspace;
+import org.apache.cassandra.schema.Types;
 
 public class NativeSSTableLoaderClient extends SSTableLoader.Client
 {
@@ -79,9 +81,11 @@ public class NativeSSTableLoaderClient extends 
SSTableLoader.Client
                     addRangeForEndpoint(range, endpoint.getAddress());
             }
 
-            tables.putAll(fetchTablesMetadata(keyspace, session, partitioner));
+            Types types = fetchTypes(keyspace, session);
+
+            tables.putAll(fetchTables(keyspace, session, partitioner, types));
             // We only need the CFMetaData for the views, so we only load that.
-            tables.putAll(fetchViewMetadata(keyspace, session, partitioner));
+            tables.putAll(fetchViews(keyspace, session, partitioner, types));
         }
     }
 
@@ -96,6 +100,21 @@ public class NativeSSTableLoaderClient extends 
SSTableLoader.Client
         tables.put(cfm.cfName, cfm);
     }
 
+    private static Types fetchTypes(String keyspace, Session session)
+    {
+        String query = String.format("SELECT * FROM %s.%s WHERE keyspace_name 
= ?", SchemaKeyspace.NAME, SchemaKeyspace.TYPES);
+
+        Types.RawBuilder types = Types.rawBuilder(keyspace);
+        for (Row row : session.execute(query, keyspace))
+        {
+            String name = row.getString("type_name");
+            List<String> fieldNames = row.getList("field_names", String.class);
+            List<String> fieldTypes = row.getList("field_types", String.class);
+            types.add(name, fieldNames, fieldTypes);
+        }
+        return types.build();
+    }
+
     /*
      * The following is a slightly simplified but otherwise duplicated version 
of
      * SchemaKeyspace.createTableFromTableRowAndColumnRows().
@@ -105,7 +124,7 @@ public class NativeSSTableLoaderClient extends 
SSTableLoader.Client
      * Note: It is not safe for this class to use static methods from 
SchemaKeyspace (static final fields are ok)
      * as that triggers initialization of the class, which fails in client 
mode.
      */
-    private static Map<String, CFMetaData> fetchTablesMetadata(String 
keyspace, Session session, IPartitioner partitioner)
+    private static Map<String, CFMetaData> fetchTables(String keyspace, 
Session session, IPartitioner partitioner, Types types)
     {
         Map<String, CFMetaData> tables = new HashMap<>();
         String query = String.format("SELECT * FROM %s.%s WHERE keyspace_name 
= ?", SchemaKeyspace.NAME, SchemaKeyspace.TABLES);
@@ -113,7 +132,7 @@ public class NativeSSTableLoaderClient extends 
SSTableLoader.Client
         for (Row row : session.execute(query, keyspace))
         {
             String name = row.getString("table_name");
-            tables.put(name, createTableMetadata(keyspace, session, 
partitioner, false, row, name));
+            tables.put(name, createTableMetadata(keyspace, session, 
partitioner, false, row, name, types));
         }
 
         return tables;
@@ -122,7 +141,7 @@ public class NativeSSTableLoaderClient extends 
SSTableLoader.Client
     /*
      * In the case where we are creating View CFMetaDatas, we
      */
-    private static Map<String, CFMetaData> fetchViewMetadata(String keyspace, 
Session session, IPartitioner partitioner)
+    private static Map<String, CFMetaData> fetchViews(String keyspace, Session 
session, IPartitioner partitioner, Types types)
     {
         Map<String, CFMetaData> tables = new HashMap<>();
         String query = String.format("SELECT * FROM %s.%s WHERE keyspace_name 
= ?", SchemaKeyspace.NAME, SchemaKeyspace.VIEWS);
@@ -130,18 +149,22 @@ public class NativeSSTableLoaderClient extends 
SSTableLoader.Client
         for (Row row : session.execute(query, keyspace))
         {
             String name = row.getString("view_name");
-            tables.put(name, createTableMetadata(keyspace, session, 
partitioner, true, row, name));
+            tables.put(name, createTableMetadata(keyspace, session, 
partitioner, true, row, name, types));
         }
 
         return tables;
     }
 
-    private static CFMetaData createTableMetadata(String keyspace, Session 
session, IPartitioner partitioner, boolean isView, Row row, String name)
+    private static CFMetaData createTableMetadata(String keyspace,
+                                                  Session session,
+                                                  IPartitioner partitioner,
+                                                  boolean isView,
+                                                  Row row,
+                                                  String name,
+                                                  Types types)
     {
         UUID id = row.getUUID("id");
-        Set<CFMetaData.Flag> flags = row.isNull("flags")
-                                     ? Collections.emptySet()
-                                     : 
CFMetaData.flagsFromStrings(row.getSet("flags", String.class));
+        Set<CFMetaData.Flag> flags = 
CFMetaData.flagsFromStrings(row.getSet("flags", String.class));
 
         boolean isSuper = flags.contains(CFMetaData.Flag.SUPER);
         boolean isCounter = flags.contains(CFMetaData.Flag.COUNTER);
@@ -154,7 +177,7 @@ public class NativeSSTableLoaderClient extends 
SSTableLoader.Client
 
         List<ColumnDefinition> defs = new ArrayList<>();
         for (Row colRow : session.execute(columnsQuery, keyspace, name))
-            defs.add(createDefinitionFromRow(colRow, keyspace, name));
+            defs.add(createDefinitionFromRow(colRow, keyspace, name, types));
 
         return CFMetaData.create(keyspace,
                                  name,
@@ -168,10 +191,15 @@ public class NativeSSTableLoaderClient extends 
SSTableLoader.Client
                                  partitioner);
     }
 
-    private static ColumnDefinition createDefinitionFromRow(Row row, String 
keyspace, String table)
+    private static ColumnDefinition createDefinitionFromRow(Row row, String 
keyspace, String table, Types types)
     {
         ColumnIdentifier name = 
ColumnIdentifier.getInterned(row.getBytes("column_name_bytes"), 
row.getString("column_name"));
-        AbstractType<?> type = TypeParser.parse(row.getString("type"));
+
+        ClusteringOrder order = 
ClusteringOrder.valueOf(row.getString("clustering_order").toUpperCase());
+        AbstractType<?> type = CQLTypeParser.parse(keyspace, 
row.getString("type"), types);
+        if (order == ClusteringOrder.DESC)
+            type = ReversedType.getInstance(type);
+
         int position = row.getInt("position");
         ColumnDefinition.Kind kind = 
ColumnDefinition.Kind.valueOf(row.getString("kind").toUpperCase());
         return new ColumnDefinition(keyspace, table, name, type, position, 
kind);

Reply via email to