Author: jbellis
Date: Fri Jun 26 22:37:42 2009
New Revision: 788895

URL: http://svn.apache.org/viewvc?rev=788895&view=rev
Log:
Enhance describeTable to return Map of Column Family so that it can be 
programatically parsed.  patch by Sammy Yu; reviewed by jbellis for 
CASSANDRA-258

Modified:
    incubator/cassandra/trunk/interface/cassandra.thrift
    
incubator/cassandra/trunk/interface/gen-java/org/apache/cassandra/service/Cassandra.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java
    
incubator/cassandra/trunk/src/java/org/apache/cassandra/service/CassandraServer.java

Modified: incubator/cassandra/trunk/interface/cassandra.thrift
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/trunk/interface/cassandra.thrift?rev=788895&r1=788894&r2=788895&view=diff
==============================================================================
--- incubator/cassandra/trunk/interface/cassandra.thrift (original)
+++ incubator/cassandra/trunk/interface/cassandra.thrift Fri Jun 26 22:37:42 
2009
@@ -155,7 +155,8 @@
   list<string>   getStringListProperty(1:string propertyName),
 
   // describe specified table
-  string         describeTable(1:string tableName),
+  map<string, map<string, string>>  describeTable(1:string tableName)
+  throws (1: NotFoundException nfe),
 
   // execute a CQL query
   CqlResult_t    executeQuery(1:string query)

Modified: 
incubator/cassandra/trunk/interface/gen-java/org/apache/cassandra/service/Cassandra.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/trunk/interface/gen-java/org/apache/cassandra/service/Cassandra.java?rev=788895&r1=788894&r2=788895&view=diff
==============================================================================
--- 
incubator/cassandra/trunk/interface/gen-java/org/apache/cassandra/service/Cassandra.java
 (original)
+++ 
incubator/cassandra/trunk/interface/gen-java/org/apache/cassandra/service/Cassandra.java
 Fri Jun 26 22:37:42 2009
@@ -54,7 +54,7 @@
 
     public List<String> getStringListProperty(String propertyName) throws 
TException;
 
-    public String describeTable(String tableName) throws TException;
+    public Map<String,Map<String,String>> describeTable(String tableName) 
throws NotFoundException, TException;
 
     public CqlResult_t executeQuery(String query) throws TException;
 
@@ -718,7 +718,7 @@
       throw new TApplicationException(TApplicationException.MISSING_RESULT, 
"getStringListProperty failed: unknown result");
     }
 
-    public String describeTable(String tableName) throws TException
+    public Map<String,Map<String,String>> describeTable(String tableName) 
throws NotFoundException, TException
     {
       send_describeTable(tableName);
       return recv_describeTable();
@@ -734,7 +734,7 @@
       oprot_.getTransport().flush();
     }
 
-    public String recv_describeTable() throws TException
+    public Map<String,Map<String,String>> recv_describeTable() throws 
NotFoundException, TException
     {
       TMessage msg = iprot_.readMessageBegin();
       if (msg.type == TMessageType.EXCEPTION) {
@@ -748,6 +748,9 @@
       if (result.isSetSuccess()) {
         return result.success;
       }
+      if (result.nfe != null) {
+        throw result.nfe;
+      }
       throw new TApplicationException(TApplicationException.MISSING_RESULT, 
"describeTable failed: unknown result");
     }
 
@@ -1287,7 +1290,19 @@
         args.read(iprot);
         iprot.readMessageEnd();
         describeTable_result result = new describeTable_result();
-        result.success = iface_.describeTable(args.tableName);
+        try {
+          result.success = iface_.describeTable(args.tableName);
+        } catch (NotFoundException nfe) {
+          result.nfe = nfe;
+        } catch (Throwable th) {
+          LOGGER.error("Internal error processing describeTable", th);
+          TApplicationException x = new 
TApplicationException(TApplicationException.INTERNAL_ERROR, "Internal error 
processing describeTable");
+          oprot.writeMessageBegin(new TMessage("describeTable", 
TMessageType.EXCEPTION, seqid));
+          x.write(oprot);
+          oprot.writeMessageEnd();
+          oprot.getTransport().flush();
+          return;
+        }
         oprot.writeMessageBegin(new TMessage("describeTable", 
TMessageType.REPLY, seqid));
         result.write(oprot);
         oprot.writeMessageEnd();
@@ -12958,10 +12973,13 @@
 
   public static class describeTable_result implements TBase, 
java.io.Serializable, Cloneable   {
     private static final TStruct STRUCT_DESC = new 
TStruct("describeTable_result");
-    private static final TField SUCCESS_FIELD_DESC = new TField("success", 
TType.STRING, (short)0);
+    private static final TField SUCCESS_FIELD_DESC = new TField("success", 
TType.MAP, (short)0);
+    private static final TField NFE_FIELD_DESC = new TField("nfe", 
TType.STRUCT, (short)1);
 
-    public String success;
+    public Map<String,Map<String,String>> success;
     public static final int SUCCESS = 0;
+    public NotFoundException nfe;
+    public static final int NFE = 1;
 
     private final Isset __isset = new Isset();
     private static final class Isset implements java.io.Serializable {
@@ -12969,7 +12987,13 @@
 
     public static final Map<Integer, FieldMetaData> metaDataMap = 
Collections.unmodifiableMap(new HashMap<Integer, FieldMetaData>() {{
       put(SUCCESS, new FieldMetaData("success", TFieldRequirementType.DEFAULT, 
-          new FieldValueMetaData(TType.STRING)));
+          new MapMetaData(TType.MAP, 
+              new FieldValueMetaData(TType.STRING), 
+              new MapMetaData(TType.MAP, 
+                  new FieldValueMetaData(TType.STRING), 
+                  new FieldValueMetaData(TType.STRING)))));
+      put(NFE, new FieldMetaData("nfe", TFieldRequirementType.DEFAULT, 
+          new FieldValueMetaData(TType.STRUCT)));
     }});
 
     static {
@@ -12980,10 +13004,12 @@
     }
 
     public describeTable_result(
-      String success)
+      Map<String,Map<String,String>> success,
+      NotFoundException nfe)
     {
       this();
       this.success = success;
+      this.nfe = nfe;
     }
 
     /**
@@ -12991,7 +13017,33 @@
      */
     public describeTable_result(describeTable_result other) {
       if (other.isSetSuccess()) {
-        this.success = other.success;
+        Map<String,Map<String,String>> __this__success = new 
HashMap<String,Map<String,String>>();
+        for (Map.Entry<String, Map<String,String>> other_element : 
other.success.entrySet()) {
+
+          String other_element_key = other_element.getKey();
+          Map<String,String> other_element_value = other_element.getValue();
+
+          String __this__success_copy_key = other_element_key;
+
+          Map<String,String> __this__success_copy_value = new 
HashMap<String,String>();
+          for (Map.Entry<String, String> other_element_value_element : 
other_element_value.entrySet()) {
+
+            String other_element_value_element_key = 
other_element_value_element.getKey();
+            String other_element_value_element_value = 
other_element_value_element.getValue();
+
+            String __this__success_copy_value_copy_key = 
other_element_value_element_key;
+
+            String __this__success_copy_value_copy_value = 
other_element_value_element_value;
+
+            
__this__success_copy_value.put(__this__success_copy_value_copy_key, 
__this__success_copy_value_copy_value);
+          }
+
+          __this__success.put(__this__success_copy_key, 
__this__success_copy_value);
+        }
+        this.success = __this__success;
+      }
+      if (other.isSetNfe()) {
+        this.nfe = new NotFoundException(other.nfe);
       }
     }
 
@@ -13000,11 +13052,22 @@
       return new describeTable_result(this);
     }
 
-    public String getSuccess() {
+    public int getSuccessSize() {
+      return (this.success == null) ? 0 : this.success.size();
+    }
+
+    public void putToSuccess(String key, Map<String,String> val) {
+      if (this.success == null) {
+        this.success = new HashMap<String,Map<String,String>>();
+      }
+      this.success.put(key, val);
+    }
+
+    public Map<String,Map<String,String>> getSuccess() {
       return this.success;
     }
 
-    public void setSuccess(String success) {
+    public void setSuccess(Map<String,Map<String,String>> success) {
       this.success = success;
     }
 
@@ -13023,13 +13086,44 @@
       }
     }
 
+    public NotFoundException getNfe() {
+      return this.nfe;
+    }
+
+    public void setNfe(NotFoundException nfe) {
+      this.nfe = nfe;
+    }
+
+    public void unsetNfe() {
+      this.nfe = null;
+    }
+
+    // Returns true if field nfe is set (has been asigned a value) and false 
otherwise
+    public boolean isSetNfe() {
+      return this.nfe != null;
+    }
+
+    public void setNfeIsSet(boolean value) {
+      if (!value) {
+        this.nfe = null;
+      }
+    }
+
     public void setFieldValue(int fieldID, Object value) {
       switch (fieldID) {
       case SUCCESS:
         if (value == null) {
           unsetSuccess();
         } else {
-          setSuccess((String)value);
+          setSuccess((Map<String,Map<String,String>>)value);
+        }
+        break;
+
+      case NFE:
+        if (value == null) {
+          unsetNfe();
+        } else {
+          setNfe((NotFoundException)value);
         }
         break;
 
@@ -13043,6 +13137,9 @@
       case SUCCESS:
         return getSuccess();
 
+      case NFE:
+        return getNfe();
+
       default:
         throw new IllegalArgumentException("Field " + fieldID + " doesn't 
exist!");
       }
@@ -13053,6 +13150,8 @@
       switch (fieldID) {
       case SUCCESS:
         return isSetSuccess();
+      case NFE:
+        return isSetNfe();
       default:
         throw new IllegalArgumentException("Field " + fieldID + " doesn't 
exist!");
       }
@@ -13080,6 +13179,15 @@
           return false;
       }
 
+      boolean this_present_nfe = true && this.isSetNfe();
+      boolean that_present_nfe = true && that.isSetNfe();
+      if (this_present_nfe || that_present_nfe) {
+        if (!(this_present_nfe && that_present_nfe))
+          return false;
+        if (!this.nfe.equals(that.nfe))
+          return false;
+      }
+
       return true;
     }
 
@@ -13100,8 +13208,40 @@
         switch (field.id)
         {
           case SUCCESS:
-            if (field.type == TType.STRING) {
-              this.success = iprot.readString();
+            if (field.type == TType.MAP) {
+              {
+                TMap _map75 = iprot.readMapBegin();
+                this.success = new 
HashMap<String,Map<String,String>>(2*_map75.size);
+                for (int _i76 = 0; _i76 < _map75.size; ++_i76)
+                {
+                  String _key77;
+                  Map<String,String> _val78;
+                  _key77 = iprot.readString();
+                  {
+                    TMap _map79 = iprot.readMapBegin();
+                    _val78 = new HashMap<String,String>(2*_map79.size);
+                    for (int _i80 = 0; _i80 < _map79.size; ++_i80)
+                    {
+                      String _key81;
+                      String _val82;
+                      _key81 = iprot.readString();
+                      _val82 = iprot.readString();
+                      _val78.put(_key81, _val82);
+                    }
+                    iprot.readMapEnd();
+                  }
+                  this.success.put(_key77, _val78);
+                }
+                iprot.readMapEnd();
+              }
+            } else { 
+              TProtocolUtil.skip(iprot, field.type);
+            }
+            break;
+          case NFE:
+            if (field.type == TType.STRUCT) {
+              this.nfe = new NotFoundException();
+              this.nfe.read(iprot);
             } else { 
               TProtocolUtil.skip(iprot, field.type);
             }
@@ -13124,7 +13264,25 @@
 
       if (this.isSetSuccess()) {
         oprot.writeFieldBegin(SUCCESS_FIELD_DESC);
-        oprot.writeString(this.success);
+        {
+          oprot.writeMapBegin(new TMap(TType.STRING, TType.MAP, 
this.success.size()));
+          for (Map.Entry<String, Map<String,String>> _iter83 : 
this.success.entrySet())          {
+            oprot.writeString(_iter83.getKey());
+            {
+              oprot.writeMapBegin(new TMap(TType.STRING, TType.STRING, 
_iter83.getValue().size()));
+              for (Map.Entry<String, String> _iter84 : 
_iter83.getValue().entrySet())              {
+                oprot.writeString(_iter84.getKey());
+                oprot.writeString(_iter84.getValue());
+              }
+              oprot.writeMapEnd();
+            }
+          }
+          oprot.writeMapEnd();
+        }
+        oprot.writeFieldEnd();
+      } else if (this.isSetNfe()) {
+        oprot.writeFieldBegin(NFE_FIELD_DESC);
+        this.nfe.write(oprot);
         oprot.writeFieldEnd();
       }
       oprot.writeFieldStop();
@@ -13143,6 +13301,14 @@
         sb.append(this.success);
       }
       first = false;
+      if (!first) sb.append(", ");
+      sb.append("nfe:");
+      if (this.nfe == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.nfe);
+      }
+      first = false;
       sb.append(")");
       return sb.toString();
     }

Modified: 
incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java?rev=788895&r1=788894&r2=788895&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java 
(original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java 
Fri Jun 26 22:37:42 2009
@@ -234,8 +234,25 @@
         String tableName = ast.getChild(0).getText();
         
         // Describe and display
-        String describe = thriftClient_.describeTable(tableName);
-        css_.out.println(describe);
+        Map<String, Map<String, String>> columnFamiliesMap;
+        try {
+            columnFamiliesMap = thriftClient_.describeTable(tableName);
+            for (String columnFamilyName: columnFamiliesMap.keySet()) {
+                Map<String, String> columnMap = 
columnFamiliesMap.get(columnFamilyName);
+                String desc = columnMap.get("desc");
+                String columnFamilyType = columnMap.get("type");
+                String sort = columnMap.get("sort");
+                Integer flushperiod = 
Integer.parseInt(columnMap.get("flushperiod"));
+                css_.out.println(desc);
+                css_.out.println("Column Family Type: " + columnFamilyType);
+                css_.out.println("Column Sorted By: " + sort);
+                css_.out.println("flush period: " + flushperiod + " minutes");
+                css_.out.println("------");
+            }
+        } catch (NotFoundException e) {
+            css_.out.println("Table " + tableName + " could not be found.");
+        }
+        
         return;
     }
 

Modified: 
incubator/cassandra/trunk/src/java/org/apache/cassandra/service/CassandraServer.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/CassandraServer.java?rev=788895&r1=788894&r2=788895&view=diff
==============================================================================
--- 
incubator/cassandra/trunk/src/java/org/apache/cassandra/service/CassandraServer.java
 (original)
+++ 
incubator/cassandra/trunk/src/java/org/apache/cassandra/service/CassandraServer.java
 Fri Jun 26 22:37:42 2009
@@ -467,23 +467,43 @@
         }
     }
 
-    public String describeTable(String tableName)
+    public Map<String,Map<String,String>> describeTable(String tableName) 
throws NotFoundException
     {
-        String desc = "";
-        Map<String, CFMetaData> tableMetaData = 
DatabaseDescriptor.getTableMetaData(tableName);
+        Map <String, Map<String, String>> columnFamiliesMap = new 
HashMap<String, Map<String, String>> ();
 
-        if (tableMetaData == null)
-        {
-            return "Table " + tableName +  " not found.";
+        Map<String, CFMetaData> tableMetaData = 
DatabaseDescriptor.getTableMetaData(tableName);
+        // table doesn't exist
+        if (tableMetaData == null) {
+            throw new NotFoundException();
         }
-
+        
         Iterator iter = tableMetaData.entrySet().iterator();
         while (iter.hasNext())
         {
-            Map.Entry<String, CFMetaData> pairs = (Map.Entry<String, 
CFMetaData>)iter.next();
-            desc = desc + pairs.getValue().pretty() + "-----\n";
+            Map.Entry<String, CFMetaData> pairs = (Map.Entry<String, 
CFMetaData>) iter.next();
+            CFMetaData columnFamilyMetaData = pairs.getValue();
+
+            String desc = ""; 
+                
+
+            Map<String, String> columnMap = new HashMap<String, String>();
+            desc = columnFamilyMetaData.n_columnMap + "(" + 
columnFamilyMetaData.n_columnKey + ", " + columnFamilyMetaData.n_columnValue + 
", " + columnFamilyMetaData.n_columnTimestamp + ")";
+            if (columnFamilyMetaData.columnType.equals("Super")) {
+                columnMap.put("type", "Super");
+                desc = columnFamilyMetaData.n_superColumnMap + "(" + 
columnFamilyMetaData.n_superColumnKey + ", " + desc + ")"; 
+            } else {
+                columnMap.put("type", "Standard");
+            }
+            
+            desc = columnFamilyMetaData.tableName + "." + 
columnFamilyMetaData.cfName + "(" + 
+                columnFamilyMetaData.n_rowKey + ", " + desc + ")";
+
+            columnMap.put("desc", desc);
+            columnMap.put("sort", columnFamilyMetaData.indexProperty_);
+            columnMap.put("flushperiod", 
columnFamilyMetaData.flushPeriodInMinutes + "");
+            columnFamiliesMap.put(columnFamilyMetaData.cfName, columnMap);
         }
-        return desc;
+        return columnFamiliesMap;
     }
 
     public CqlResult_t executeQuery(String query) throws TException


Reply via email to