You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by vi...@apache.org on 2013/06/17 00:58:36 UTC

[2/3] patch by Vijay; reviewed by Aleksey Yeschenko for CASSANDRA-5576

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/interface/thrift/gen-java/org/apache/cassandra/thrift/CfDef.java
----------------------------------------------------------------------
diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/CfDef.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/CfDef.java
index 2155b8e..8943afb 100644
--- a/interface/thrift/gen-java/org/apache/cassandra/thrift/CfDef.java
+++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/CfDef.java
@@ -82,7 +82,7 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
   private static final org.apache.thrift.protocol.TField DEFAULT_TIME_TO_LIVE_FIELD_DESC = new org.apache.thrift.protocol.TField("default_time_to_live", org.apache.thrift.protocol.TType.I32, (short)40);
   private static final org.apache.thrift.protocol.TField INDEX_INTERVAL_FIELD_DESC = new org.apache.thrift.protocol.TField("index_interval", org.apache.thrift.protocol.TType.I32, (short)41);
   private static final org.apache.thrift.protocol.TField SPECULATIVE_RETRY_FIELD_DESC = new org.apache.thrift.protocol.TField("speculative_retry", org.apache.thrift.protocol.TType.STRING, (short)42);
-  private static final org.apache.thrift.protocol.TField TRIGGER_CLASS_FIELD_DESC = new org.apache.thrift.protocol.TField("trigger_class", org.apache.thrift.protocol.TType.SET, (short)43);
+  private static final org.apache.thrift.protocol.TField TRIGGERS_FIELD_DESC = new org.apache.thrift.protocol.TField("triggers", org.apache.thrift.protocol.TType.MAP, (short)43);
   private static final org.apache.thrift.protocol.TField ROW_CACHE_SIZE_FIELD_DESC = new org.apache.thrift.protocol.TField("row_cache_size", org.apache.thrift.protocol.TType.DOUBLE, (short)9);
   private static final org.apache.thrift.protocol.TField KEY_CACHE_SIZE_FIELD_DESC = new org.apache.thrift.protocol.TField("key_cache_size", org.apache.thrift.protocol.TType.DOUBLE, (short)11);
   private static final org.apache.thrift.protocol.TField ROW_CACHE_SAVE_PERIOD_IN_SECONDS_FIELD_DESC = new org.apache.thrift.protocol.TField("row_cache_save_period_in_seconds", org.apache.thrift.protocol.TType.I32, (short)19);
@@ -127,7 +127,7 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
   public int default_time_to_live; // optional
   public int index_interval; // optional
   public String speculative_retry; // optional
-  public Set<String> trigger_class; // optional
+  public Map<String,Map<String,String>> triggers; // optional
   /**
    * @deprecated
    */
@@ -198,7 +198,7 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
     DEFAULT_TIME_TO_LIVE((short)40, "default_time_to_live"),
     INDEX_INTERVAL((short)41, "index_interval"),
     SPECULATIVE_RETRY((short)42, "speculative_retry"),
-    TRIGGER_CLASS((short)43, "trigger_class"),
+    TRIGGERS((short)43, "triggers"),
     /**
      * @deprecated
      */
@@ -307,8 +307,8 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
           return INDEX_INTERVAL;
         case 42: // SPECULATIVE_RETRY
           return SPECULATIVE_RETRY;
-        case 43: // TRIGGER_CLASS
-          return TRIGGER_CLASS;
+        case 43: // TRIGGERS
+          return TRIGGERS;
         case 9: // ROW_CACHE_SIZE
           return ROW_CACHE_SIZE;
         case 11: // KEY_CACHE_SIZE
@@ -391,7 +391,7 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
   private static final int __MERGE_SHARDS_CHANCE_ISSET_ID = 19;
   private static final int __ROW_CACHE_KEYS_TO_SAVE_ISSET_ID = 20;
   private int __isset_bitfield = 0;
-  private _Fields optionals[] = {_Fields.COLUMN_TYPE,_Fields.COMPARATOR_TYPE,_Fields.SUBCOMPARATOR_TYPE,_Fields.COMMENT,_Fields.READ_REPAIR_CHANCE,_Fields.COLUMN_METADATA,_Fields.GC_GRACE_SECONDS,_Fields.DEFAULT_VALIDATION_CLASS,_Fields.ID,_Fields.MIN_COMPACTION_THRESHOLD,_Fields.MAX_COMPACTION_THRESHOLD,_Fields.REPLICATE_ON_WRITE,_Fields.KEY_VALIDATION_CLASS,_Fields.KEY_ALIAS,_Fields.COMPACTION_STRATEGY,_Fields.COMPACTION_STRATEGY_OPTIONS,_Fields.COMPRESSION_OPTIONS,_Fields.BLOOM_FILTER_FP_CHANCE,_Fields.CACHING,_Fields.DCLOCAL_READ_REPAIR_CHANCE,_Fields.POPULATE_IO_CACHE_ON_FLUSH,_Fields.MEMTABLE_FLUSH_PERIOD_IN_MS,_Fields.DEFAULT_TIME_TO_LIVE,_Fields.INDEX_INTERVAL,_Fields.SPECULATIVE_RETRY,_Fields.TRIGGER_CLASS,_Fields.ROW_CACHE_SIZE,_Fields.KEY_CACHE_SIZE,_Fields.ROW_CACHE_SAVE_PERIOD_IN_SECONDS,_Fields.KEY_CACHE_SAVE_PERIOD_IN_SECONDS,_Fields.MEMTABLE_FLUSH_AFTER_MINS,_Fields.MEMTABLE_THROUGHPUT_IN_MB,_Fields.MEMTABLE_OPERATIONS_IN_MILLIONS,_Fields.MERGE_SHARDS_CHANCE,_Fields.
 ROW_CACHE_PROVIDER,_Fields.ROW_CACHE_KEYS_TO_SAVE};
+  private _Fields optionals[] = {_Fields.COLUMN_TYPE,_Fields.COMPARATOR_TYPE,_Fields.SUBCOMPARATOR_TYPE,_Fields.COMMENT,_Fields.READ_REPAIR_CHANCE,_Fields.COLUMN_METADATA,_Fields.GC_GRACE_SECONDS,_Fields.DEFAULT_VALIDATION_CLASS,_Fields.ID,_Fields.MIN_COMPACTION_THRESHOLD,_Fields.MAX_COMPACTION_THRESHOLD,_Fields.REPLICATE_ON_WRITE,_Fields.KEY_VALIDATION_CLASS,_Fields.KEY_ALIAS,_Fields.COMPACTION_STRATEGY,_Fields.COMPACTION_STRATEGY_OPTIONS,_Fields.COMPRESSION_OPTIONS,_Fields.BLOOM_FILTER_FP_CHANCE,_Fields.CACHING,_Fields.DCLOCAL_READ_REPAIR_CHANCE,_Fields.POPULATE_IO_CACHE_ON_FLUSH,_Fields.MEMTABLE_FLUSH_PERIOD_IN_MS,_Fields.DEFAULT_TIME_TO_LIVE,_Fields.INDEX_INTERVAL,_Fields.SPECULATIVE_RETRY,_Fields.TRIGGERS,_Fields.ROW_CACHE_SIZE,_Fields.KEY_CACHE_SIZE,_Fields.ROW_CACHE_SAVE_PERIOD_IN_SECONDS,_Fields.KEY_CACHE_SAVE_PERIOD_IN_SECONDS,_Fields.MEMTABLE_FLUSH_AFTER_MINS,_Fields.MEMTABLE_THROUGHPUT_IN_MB,_Fields.MEMTABLE_OPERATIONS_IN_MILLIONS,_Fields.MERGE_SHARDS_CHANCE,_Fields.ROW_C
 ACHE_PROVIDER,_Fields.ROW_CACHE_KEYS_TO_SAVE};
   public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -454,9 +454,12 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
     tmpMap.put(_Fields.SPECULATIVE_RETRY, new org.apache.thrift.meta_data.FieldMetaData("speculative_retry", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
-    tmpMap.put(_Fields.TRIGGER_CLASS, new org.apache.thrift.meta_data.FieldMetaData("trigger_class", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
-        new org.apache.thrift.meta_data.SetMetaData(org.apache.thrift.protocol.TType.SET, 
-            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))));
+    tmpMap.put(_Fields.TRIGGERS, new org.apache.thrift.meta_data.FieldMetaData("triggers", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.MapMetaData(org.apache.thrift.protocol.TType.MAP, 
+            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING), 
+            new org.apache.thrift.meta_data.MapMetaData(org.apache.thrift.protocol.TType.MAP, 
+                new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING), 
+                new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)))));
     tmpMap.put(_Fields.ROW_CACHE_SIZE, new org.apache.thrift.meta_data.FieldMetaData("row_cache_size", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
     tmpMap.put(_Fields.KEY_CACHE_SIZE, new org.apache.thrift.meta_data.FieldMetaData("key_cache_size", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
@@ -594,12 +597,31 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
     if (other.isSetSpeculative_retry()) {
       this.speculative_retry = other.speculative_retry;
     }
-    if (other.isSetTrigger_class()) {
-      Set<String> __this__trigger_class = new HashSet<String>();
-      for (String other_element : other.trigger_class) {
-        __this__trigger_class.add(other_element);
+    if (other.isSetTriggers()) {
+      Map<String,Map<String,String>> __this__triggers = new HashMap<String,Map<String,String>>();
+      for (Map.Entry<String, Map<String,String>> other_element : other.triggers.entrySet()) {
+
+        String other_element_key = other_element.getKey();
+        Map<String,String> other_element_value = other_element.getValue();
+
+        String __this__triggers_copy_key = other_element_key;
+
+        Map<String,String> __this__triggers_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__triggers_copy_value_copy_key = other_element_value_element_key;
+
+          String __this__triggers_copy_value_copy_value = other_element_value_element_value;
+
+          __this__triggers_copy_value.put(__this__triggers_copy_value_copy_key, __this__triggers_copy_value_copy_value);
+        }
+
+        __this__triggers.put(__this__triggers_copy_key, __this__triggers_copy_value);
       }
-      this.trigger_class = __this__trigger_class;
+      this.triggers = __this__triggers;
     }
     this.row_cache_size = other.row_cache_size;
     this.key_cache_size = other.key_cache_size;
@@ -664,7 +686,7 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
     this.index_interval = 0;
     this.speculative_retry = "NONE";
 
-    this.trigger_class = null;
+    this.triggers = null;
     setRow_cache_sizeIsSet(false);
     this.row_cache_size = 0.0;
     setKey_cache_sizeIsSet(false);
@@ -1369,42 +1391,38 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
     }
   }
 
-  public int getTrigger_classSize() {
-    return (this.trigger_class == null) ? 0 : this.trigger_class.size();
-  }
-
-  public java.util.Iterator<String> getTrigger_classIterator() {
-    return (this.trigger_class == null) ? null : this.trigger_class.iterator();
+  public int getTriggersSize() {
+    return (this.triggers == null) ? 0 : this.triggers.size();
   }
 
-  public void addToTrigger_class(String elem) {
-    if (this.trigger_class == null) {
-      this.trigger_class = new HashSet<String>();
+  public void putToTriggers(String key, Map<String,String> val) {
+    if (this.triggers == null) {
+      this.triggers = new HashMap<String,Map<String,String>>();
     }
-    this.trigger_class.add(elem);
+    this.triggers.put(key, val);
   }
 
-  public Set<String> getTrigger_class() {
-    return this.trigger_class;
+  public Map<String,Map<String,String>> getTriggers() {
+    return this.triggers;
   }
 
-  public CfDef setTrigger_class(Set<String> trigger_class) {
-    this.trigger_class = trigger_class;
+  public CfDef setTriggers(Map<String,Map<String,String>> triggers) {
+    this.triggers = triggers;
     return this;
   }
 
-  public void unsetTrigger_class() {
-    this.trigger_class = null;
+  public void unsetTriggers() {
+    this.triggers = null;
   }
 
-  /** Returns true if field trigger_class is set (has been assigned a value) and false otherwise */
-  public boolean isSetTrigger_class() {
-    return this.trigger_class != null;
+  /** Returns true if field triggers is set (has been assigned a value) and false otherwise */
+  public boolean isSetTriggers() {
+    return this.triggers != null;
   }
 
-  public void setTrigger_classIsSet(boolean value) {
+  public void setTriggersIsSet(boolean value) {
     if (!value) {
-      this.trigger_class = null;
+      this.triggers = null;
     }
   }
 
@@ -1917,11 +1935,11 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
       }
       break;
 
-    case TRIGGER_CLASS:
+    case TRIGGERS:
       if (value == null) {
-        unsetTrigger_class();
+        unsetTriggers();
       } else {
-        setTrigger_class((Set<String>)value);
+        setTriggers((Map<String,Map<String,String>>)value);
       }
       break;
 
@@ -2091,8 +2109,8 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
     case SPECULATIVE_RETRY:
       return getSpeculative_retry();
 
-    case TRIGGER_CLASS:
-      return getTrigger_class();
+    case TRIGGERS:
+      return getTriggers();
 
     case ROW_CACHE_SIZE:
       return Double.valueOf(getRow_cache_size());
@@ -2189,8 +2207,8 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
       return isSetIndex_interval();
     case SPECULATIVE_RETRY:
       return isSetSpeculative_retry();
-    case TRIGGER_CLASS:
-      return isSetTrigger_class();
+    case TRIGGERS:
+      return isSetTriggers();
     case ROW_CACHE_SIZE:
       return isSetRow_cache_size();
     case KEY_CACHE_SIZE:
@@ -2471,12 +2489,12 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
         return false;
     }
 
-    boolean this_present_trigger_class = true && this.isSetTrigger_class();
-    boolean that_present_trigger_class = true && that.isSetTrigger_class();
-    if (this_present_trigger_class || that_present_trigger_class) {
-      if (!(this_present_trigger_class && that_present_trigger_class))
+    boolean this_present_triggers = true && this.isSetTriggers();
+    boolean that_present_triggers = true && that.isSetTriggers();
+    if (this_present_triggers || that_present_triggers) {
+      if (!(this_present_triggers && that_present_triggers))
         return false;
-      if (!this.trigger_class.equals(that.trigger_class))
+      if (!this.triggers.equals(that.triggers))
         return false;
     }
 
@@ -2712,10 +2730,10 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
     if (present_speculative_retry)
       builder.append(speculative_retry);
 
-    boolean present_trigger_class = true && (isSetTrigger_class());
-    builder.append(present_trigger_class);
-    if (present_trigger_class)
-      builder.append(trigger_class);
+    boolean present_triggers = true && (isSetTriggers());
+    builder.append(present_triggers);
+    if (present_triggers)
+      builder.append(triggers);
 
     boolean present_row_cache_size = true && (isSetRow_cache_size());
     builder.append(present_row_cache_size);
@@ -3048,12 +3066,12 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
         return lastComparison;
       }
     }
-    lastComparison = Boolean.valueOf(isSetTrigger_class()).compareTo(typedOther.isSetTrigger_class());
+    lastComparison = Boolean.valueOf(isSetTriggers()).compareTo(typedOther.isSetTriggers());
     if (lastComparison != 0) {
       return lastComparison;
     }
-    if (isSetTrigger_class()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.trigger_class, typedOther.trigger_class);
+    if (isSetTriggers()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.triggers, typedOther.triggers);
       if (lastComparison != 0) {
         return lastComparison;
       }
@@ -3395,13 +3413,13 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
       }
       first = false;
     }
-    if (isSetTrigger_class()) {
+    if (isSetTriggers()) {
       if (!first) sb.append(", ");
-      sb.append("trigger_class:");
-      if (this.trigger_class == null) {
+      sb.append("triggers:");
+      if (this.triggers == null) {
         sb.append("null");
       } else {
-        sb.append(this.trigger_class);
+        sb.append(this.triggers);
       }
       first = false;
     }
@@ -3771,20 +3789,34 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 43: // TRIGGER_CLASS
-            if (schemeField.type == org.apache.thrift.protocol.TType.SET) {
+          case 43: // TRIGGERS
+            if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
               {
-                org.apache.thrift.protocol.TSet _set103 = iprot.readSetBegin();
-                struct.trigger_class = new HashSet<String>(2*_set103.size);
-                for (int _i104 = 0; _i104 < _set103.size; ++_i104)
+                org.apache.thrift.protocol.TMap _map103 = iprot.readMapBegin();
+                struct.triggers = new HashMap<String,Map<String,String>>(2*_map103.size);
+                for (int _i104 = 0; _i104 < _map103.size; ++_i104)
                 {
-                  String _elem105; // optional
-                  _elem105 = iprot.readString();
-                  struct.trigger_class.add(_elem105);
+                  String _key105; // required
+                  Map<String,String> _val106; // required
+                  _key105 = iprot.readString();
+                  {
+                    org.apache.thrift.protocol.TMap _map107 = iprot.readMapBegin();
+                    _val106 = new HashMap<String,String>(2*_map107.size);
+                    for (int _i108 = 0; _i108 < _map107.size; ++_i108)
+                    {
+                      String _key109; // required
+                      String _val110; // required
+                      _key109 = iprot.readString();
+                      _val110 = iprot.readString();
+                      _val106.put(_key109, _val110);
+                    }
+                    iprot.readMapEnd();
+                  }
+                  struct.triggers.put(_key105, _val106);
                 }
-                iprot.readSetEnd();
+                iprot.readMapEnd();
               }
-              struct.setTrigger_classIsSet(true);
+              struct.setTriggersIsSet(true);
             } else { 
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
@@ -3942,9 +3974,9 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
           oprot.writeFieldBegin(COLUMN_METADATA_FIELD_DESC);
           {
             oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.column_metadata.size()));
-            for (ColumnDef _iter106 : struct.column_metadata)
+            for (ColumnDef _iter111 : struct.column_metadata)
             {
-              _iter106.write(oprot);
+              _iter111.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -4046,10 +4078,10 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
           oprot.writeFieldBegin(COMPACTION_STRATEGY_OPTIONS_FIELD_DESC);
           {
             oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, struct.compaction_strategy_options.size()));
-            for (Map.Entry<String, String> _iter107 : struct.compaction_strategy_options.entrySet())
+            for (Map.Entry<String, String> _iter112 : struct.compaction_strategy_options.entrySet())
             {
-              oprot.writeString(_iter107.getKey());
-              oprot.writeString(_iter107.getValue());
+              oprot.writeString(_iter112.getKey());
+              oprot.writeString(_iter112.getValue());
             }
             oprot.writeMapEnd();
           }
@@ -4066,10 +4098,10 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
           oprot.writeFieldBegin(COMPRESSION_OPTIONS_FIELD_DESC);
           {
             oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, struct.compression_options.size()));
-            for (Map.Entry<String, String> _iter108 : struct.compression_options.entrySet())
+            for (Map.Entry<String, String> _iter113 : struct.compression_options.entrySet())
             {
-              oprot.writeString(_iter108.getKey());
-              oprot.writeString(_iter108.getValue());
+              oprot.writeString(_iter113.getKey());
+              oprot.writeString(_iter113.getValue());
             }
             oprot.writeMapEnd();
           }
@@ -4120,16 +4152,25 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
           oprot.writeFieldEnd();
         }
       }
-      if (struct.trigger_class != null) {
-        if (struct.isSetTrigger_class()) {
-          oprot.writeFieldBegin(TRIGGER_CLASS_FIELD_DESC);
+      if (struct.triggers != null) {
+        if (struct.isSetTriggers()) {
+          oprot.writeFieldBegin(TRIGGERS_FIELD_DESC);
           {
-            oprot.writeSetBegin(new org.apache.thrift.protocol.TSet(org.apache.thrift.protocol.TType.STRING, struct.trigger_class.size()));
-            for (String _iter109 : struct.trigger_class)
+            oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.MAP, struct.triggers.size()));
+            for (Map.Entry<String, Map<String,String>> _iter114 : struct.triggers.entrySet())
             {
-              oprot.writeString(_iter109);
+              oprot.writeString(_iter114.getKey());
+              {
+                oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, _iter114.getValue().size()));
+                for (Map.Entry<String, String> _iter115 : _iter114.getValue().entrySet())
+                {
+                  oprot.writeString(_iter115.getKey());
+                  oprot.writeString(_iter115.getValue());
+                }
+                oprot.writeMapEnd();
+              }
             }
-            oprot.writeSetEnd();
+            oprot.writeMapEnd();
           }
           oprot.writeFieldEnd();
         }
@@ -4229,7 +4270,7 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
       if (struct.isSetSpeculative_retry()) {
         optionals.set(24);
       }
-      if (struct.isSetTrigger_class()) {
+      if (struct.isSetTriggers()) {
         optionals.set(25);
       }
       if (struct.isSetRow_cache_size()) {
@@ -4281,9 +4322,9 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
       if (struct.isSetColumn_metadata()) {
         {
           oprot.writeI32(struct.column_metadata.size());
-          for (ColumnDef _iter110 : struct.column_metadata)
+          for (ColumnDef _iter116 : struct.column_metadata)
           {
-            _iter110.write(oprot);
+            _iter116.write(oprot);
           }
         }
       }
@@ -4317,20 +4358,20 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
       if (struct.isSetCompaction_strategy_options()) {
         {
           oprot.writeI32(struct.compaction_strategy_options.size());
-          for (Map.Entry<String, String> _iter111 : struct.compaction_strategy_options.entrySet())
+          for (Map.Entry<String, String> _iter117 : struct.compaction_strategy_options.entrySet())
           {
-            oprot.writeString(_iter111.getKey());
-            oprot.writeString(_iter111.getValue());
+            oprot.writeString(_iter117.getKey());
+            oprot.writeString(_iter117.getValue());
           }
         }
       }
       if (struct.isSetCompression_options()) {
         {
           oprot.writeI32(struct.compression_options.size());
-          for (Map.Entry<String, String> _iter112 : struct.compression_options.entrySet())
+          for (Map.Entry<String, String> _iter118 : struct.compression_options.entrySet())
           {
-            oprot.writeString(_iter112.getKey());
-            oprot.writeString(_iter112.getValue());
+            oprot.writeString(_iter118.getKey());
+            oprot.writeString(_iter118.getValue());
           }
         }
       }
@@ -4358,12 +4399,20 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
       if (struct.isSetSpeculative_retry()) {
         oprot.writeString(struct.speculative_retry);
       }
-      if (struct.isSetTrigger_class()) {
+      if (struct.isSetTriggers()) {
         {
-          oprot.writeI32(struct.trigger_class.size());
-          for (String _iter113 : struct.trigger_class)
+          oprot.writeI32(struct.triggers.size());
+          for (Map.Entry<String, Map<String,String>> _iter119 : struct.triggers.entrySet())
           {
-            oprot.writeString(_iter113);
+            oprot.writeString(_iter119.getKey());
+            {
+              oprot.writeI32(_iter119.getValue().size());
+              for (Map.Entry<String, String> _iter120 : _iter119.getValue().entrySet())
+              {
+                oprot.writeString(_iter120.getKey());
+                oprot.writeString(_iter120.getValue());
+              }
+            }
           }
         }
       }
@@ -4429,14 +4478,14 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
       }
       if (incoming.get(5)) {
         {
-          org.apache.thrift.protocol.TList _list114 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.column_metadata = new ArrayList<ColumnDef>(_list114.size);
-          for (int _i115 = 0; _i115 < _list114.size; ++_i115)
+          org.apache.thrift.protocol.TList _list121 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.column_metadata = new ArrayList<ColumnDef>(_list121.size);
+          for (int _i122 = 0; _i122 < _list121.size; ++_i122)
           {
-            ColumnDef _elem116; // optional
-            _elem116 = new ColumnDef();
-            _elem116.read(iprot);
-            struct.column_metadata.add(_elem116);
+            ColumnDef _elem123; // optional
+            _elem123 = new ColumnDef();
+            _elem123.read(iprot);
+            struct.column_metadata.add(_elem123);
           }
         }
         struct.setColumn_metadataIsSet(true);
@@ -4479,30 +4528,30 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
       }
       if (incoming.get(15)) {
         {
-          org.apache.thrift.protocol.TMap _map117 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-          struct.compaction_strategy_options = new HashMap<String,String>(2*_map117.size);
-          for (int _i118 = 0; _i118 < _map117.size; ++_i118)
+          org.apache.thrift.protocol.TMap _map124 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+          struct.compaction_strategy_options = new HashMap<String,String>(2*_map124.size);
+          for (int _i125 = 0; _i125 < _map124.size; ++_i125)
           {
-            String _key119; // required
-            String _val120; // required
-            _key119 = iprot.readString();
-            _val120 = iprot.readString();
-            struct.compaction_strategy_options.put(_key119, _val120);
+            String _key126; // required
+            String _val127; // required
+            _key126 = iprot.readString();
+            _val127 = iprot.readString();
+            struct.compaction_strategy_options.put(_key126, _val127);
           }
         }
         struct.setCompaction_strategy_optionsIsSet(true);
       }
       if (incoming.get(16)) {
         {
-          org.apache.thrift.protocol.TMap _map121 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-          struct.compression_options = new HashMap<String,String>(2*_map121.size);
-          for (int _i122 = 0; _i122 < _map121.size; ++_i122)
+          org.apache.thrift.protocol.TMap _map128 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+          struct.compression_options = new HashMap<String,String>(2*_map128.size);
+          for (int _i129 = 0; _i129 < _map128.size; ++_i129)
           {
-            String _key123; // required
-            String _val124; // required
-            _key123 = iprot.readString();
-            _val124 = iprot.readString();
-            struct.compression_options.put(_key123, _val124);
+            String _key130; // required
+            String _val131; // required
+            _key130 = iprot.readString();
+            _val131 = iprot.readString();
+            struct.compression_options.put(_key130, _val131);
           }
         }
         struct.setCompression_optionsIsSet(true);
@@ -4541,16 +4590,29 @@ public class CfDef implements org.apache.thrift.TBase<CfDef, CfDef._Fields>, jav
       }
       if (incoming.get(25)) {
         {
-          org.apache.thrift.protocol.TSet _set125 = new org.apache.thrift.protocol.TSet(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-          struct.trigger_class = new HashSet<String>(2*_set125.size);
-          for (int _i126 = 0; _i126 < _set125.size; ++_i126)
+          org.apache.thrift.protocol.TMap _map132 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.MAP, iprot.readI32());
+          struct.triggers = new HashMap<String,Map<String,String>>(2*_map132.size);
+          for (int _i133 = 0; _i133 < _map132.size; ++_i133)
           {
-            String _elem127; // optional
-            _elem127 = iprot.readString();
-            struct.trigger_class.add(_elem127);
+            String _key134; // required
+            Map<String,String> _val135; // required
+            _key134 = iprot.readString();
+            {
+              org.apache.thrift.protocol.TMap _map136 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+              _val135 = new HashMap<String,String>(2*_map136.size);
+              for (int _i137 = 0; _i137 < _map136.size; ++_i137)
+              {
+                String _key138; // required
+                String _val139; // required
+                _key138 = iprot.readString();
+                _val139 = iprot.readString();
+                _val135.put(_key138, _val139);
+              }
+            }
+            struct.triggers.put(_key134, _val135);
           }
         }
-        struct.setTrigger_classIsSet(true);
+        struct.setTriggersIsSet(true);
       }
       if (incoming.get(26)) {
         struct.row_cache_size = iprot.readDouble();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlMetadata.java
----------------------------------------------------------------------
diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlMetadata.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlMetadata.java
index 6b60337..f2d220e 100644
--- a/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlMetadata.java
+++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlMetadata.java
@@ -658,15 +658,15 @@ public class CqlMetadata implements org.apache.thrift.TBase<CqlMetadata, CqlMeta
           case 1: // NAME_TYPES
             if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
               {
-                org.apache.thrift.protocol.TMap _map154 = iprot.readMapBegin();
-                struct.name_types = new HashMap<ByteBuffer,String>(2*_map154.size);
-                for (int _i155 = 0; _i155 < _map154.size; ++_i155)
+                org.apache.thrift.protocol.TMap _map166 = iprot.readMapBegin();
+                struct.name_types = new HashMap<ByteBuffer,String>(2*_map166.size);
+                for (int _i167 = 0; _i167 < _map166.size; ++_i167)
                 {
-                  ByteBuffer _key156; // required
-                  String _val157; // required
-                  _key156 = iprot.readBinary();
-                  _val157 = iprot.readString();
-                  struct.name_types.put(_key156, _val157);
+                  ByteBuffer _key168; // required
+                  String _val169; // required
+                  _key168 = iprot.readBinary();
+                  _val169 = iprot.readString();
+                  struct.name_types.put(_key168, _val169);
                 }
                 iprot.readMapEnd();
               }
@@ -678,15 +678,15 @@ public class CqlMetadata implements org.apache.thrift.TBase<CqlMetadata, CqlMeta
           case 2: // VALUE_TYPES
             if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
               {
-                org.apache.thrift.protocol.TMap _map158 = iprot.readMapBegin();
-                struct.value_types = new HashMap<ByteBuffer,String>(2*_map158.size);
-                for (int _i159 = 0; _i159 < _map158.size; ++_i159)
+                org.apache.thrift.protocol.TMap _map170 = iprot.readMapBegin();
+                struct.value_types = new HashMap<ByteBuffer,String>(2*_map170.size);
+                for (int _i171 = 0; _i171 < _map170.size; ++_i171)
                 {
-                  ByteBuffer _key160; // required
-                  String _val161; // required
-                  _key160 = iprot.readBinary();
-                  _val161 = iprot.readString();
-                  struct.value_types.put(_key160, _val161);
+                  ByteBuffer _key172; // required
+                  String _val173; // required
+                  _key172 = iprot.readBinary();
+                  _val173 = iprot.readString();
+                  struct.value_types.put(_key172, _val173);
                 }
                 iprot.readMapEnd();
               }
@@ -730,10 +730,10 @@ public class CqlMetadata implements org.apache.thrift.TBase<CqlMetadata, CqlMeta
         oprot.writeFieldBegin(NAME_TYPES_FIELD_DESC);
         {
           oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, struct.name_types.size()));
-          for (Map.Entry<ByteBuffer, String> _iter162 : struct.name_types.entrySet())
+          for (Map.Entry<ByteBuffer, String> _iter174 : struct.name_types.entrySet())
           {
-            oprot.writeBinary(_iter162.getKey());
-            oprot.writeString(_iter162.getValue());
+            oprot.writeBinary(_iter174.getKey());
+            oprot.writeString(_iter174.getValue());
           }
           oprot.writeMapEnd();
         }
@@ -743,10 +743,10 @@ public class CqlMetadata implements org.apache.thrift.TBase<CqlMetadata, CqlMeta
         oprot.writeFieldBegin(VALUE_TYPES_FIELD_DESC);
         {
           oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, struct.value_types.size()));
-          for (Map.Entry<ByteBuffer, String> _iter163 : struct.value_types.entrySet())
+          for (Map.Entry<ByteBuffer, String> _iter175 : struct.value_types.entrySet())
           {
-            oprot.writeBinary(_iter163.getKey());
-            oprot.writeString(_iter163.getValue());
+            oprot.writeBinary(_iter175.getKey());
+            oprot.writeString(_iter175.getValue());
           }
           oprot.writeMapEnd();
         }
@@ -781,18 +781,18 @@ public class CqlMetadata implements org.apache.thrift.TBase<CqlMetadata, CqlMeta
       TTupleProtocol oprot = (TTupleProtocol) prot;
       {
         oprot.writeI32(struct.name_types.size());
-        for (Map.Entry<ByteBuffer, String> _iter164 : struct.name_types.entrySet())
+        for (Map.Entry<ByteBuffer, String> _iter176 : struct.name_types.entrySet())
         {
-          oprot.writeBinary(_iter164.getKey());
-          oprot.writeString(_iter164.getValue());
+          oprot.writeBinary(_iter176.getKey());
+          oprot.writeString(_iter176.getValue());
         }
       }
       {
         oprot.writeI32(struct.value_types.size());
-        for (Map.Entry<ByteBuffer, String> _iter165 : struct.value_types.entrySet())
+        for (Map.Entry<ByteBuffer, String> _iter177 : struct.value_types.entrySet())
         {
-          oprot.writeBinary(_iter165.getKey());
-          oprot.writeString(_iter165.getValue());
+          oprot.writeBinary(_iter177.getKey());
+          oprot.writeString(_iter177.getValue());
         }
       }
       oprot.writeString(struct.default_name_type);
@@ -803,28 +803,28 @@ public class CqlMetadata implements org.apache.thrift.TBase<CqlMetadata, CqlMeta
     public void read(org.apache.thrift.protocol.TProtocol prot, CqlMetadata struct) throws org.apache.thrift.TException {
       TTupleProtocol iprot = (TTupleProtocol) prot;
       {
-        org.apache.thrift.protocol.TMap _map166 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-        struct.name_types = new HashMap<ByteBuffer,String>(2*_map166.size);
-        for (int _i167 = 0; _i167 < _map166.size; ++_i167)
+        org.apache.thrift.protocol.TMap _map178 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+        struct.name_types = new HashMap<ByteBuffer,String>(2*_map178.size);
+        for (int _i179 = 0; _i179 < _map178.size; ++_i179)
         {
-          ByteBuffer _key168; // required
-          String _val169; // required
-          _key168 = iprot.readBinary();
-          _val169 = iprot.readString();
-          struct.name_types.put(_key168, _val169);
+          ByteBuffer _key180; // required
+          String _val181; // required
+          _key180 = iprot.readBinary();
+          _val181 = iprot.readString();
+          struct.name_types.put(_key180, _val181);
         }
       }
       struct.setName_typesIsSet(true);
       {
-        org.apache.thrift.protocol.TMap _map170 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-        struct.value_types = new HashMap<ByteBuffer,String>(2*_map170.size);
-        for (int _i171 = 0; _i171 < _map170.size; ++_i171)
+        org.apache.thrift.protocol.TMap _map182 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+        struct.value_types = new HashMap<ByteBuffer,String>(2*_map182.size);
+        for (int _i183 = 0; _i183 < _map182.size; ++_i183)
         {
-          ByteBuffer _key172; // required
-          String _val173; // required
-          _key172 = iprot.readBinary();
-          _val173 = iprot.readString();
-          struct.value_types.put(_key172, _val173);
+          ByteBuffer _key184; // required
+          String _val185; // required
+          _key184 = iprot.readBinary();
+          _val185 = iprot.readString();
+          struct.value_types.put(_key184, _val185);
         }
       }
       struct.setValue_typesIsSet(true);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlPreparedResult.java
----------------------------------------------------------------------
diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlPreparedResult.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlPreparedResult.java
index 8f9146b..3f137de 100644
--- a/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlPreparedResult.java
+++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlPreparedResult.java
@@ -649,13 +649,13 @@ public class CqlPreparedResult implements org.apache.thrift.TBase<CqlPreparedRes
           case 3: // VARIABLE_TYPES
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list182 = iprot.readListBegin();
-                struct.variable_types = new ArrayList<String>(_list182.size);
-                for (int _i183 = 0; _i183 < _list182.size; ++_i183)
+                org.apache.thrift.protocol.TList _list194 = iprot.readListBegin();
+                struct.variable_types = new ArrayList<String>(_list194.size);
+                for (int _i195 = 0; _i195 < _list194.size; ++_i195)
                 {
-                  String _elem184; // optional
-                  _elem184 = iprot.readString();
-                  struct.variable_types.add(_elem184);
+                  String _elem196; // optional
+                  _elem196 = iprot.readString();
+                  struct.variable_types.add(_elem196);
                 }
                 iprot.readListEnd();
               }
@@ -667,13 +667,13 @@ public class CqlPreparedResult implements org.apache.thrift.TBase<CqlPreparedRes
           case 4: // VARIABLE_NAMES
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list185 = iprot.readListBegin();
-                struct.variable_names = new ArrayList<String>(_list185.size);
-                for (int _i186 = 0; _i186 < _list185.size; ++_i186)
+                org.apache.thrift.protocol.TList _list197 = iprot.readListBegin();
+                struct.variable_names = new ArrayList<String>(_list197.size);
+                for (int _i198 = 0; _i198 < _list197.size; ++_i198)
                 {
-                  String _elem187; // optional
-                  _elem187 = iprot.readString();
-                  struct.variable_names.add(_elem187);
+                  String _elem199; // optional
+                  _elem199 = iprot.readString();
+                  struct.variable_names.add(_elem199);
                 }
                 iprot.readListEnd();
               }
@@ -714,9 +714,9 @@ public class CqlPreparedResult implements org.apache.thrift.TBase<CqlPreparedRes
           oprot.writeFieldBegin(VARIABLE_TYPES_FIELD_DESC);
           {
             oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.variable_types.size()));
-            for (String _iter188 : struct.variable_types)
+            for (String _iter200 : struct.variable_types)
             {
-              oprot.writeString(_iter188);
+              oprot.writeString(_iter200);
             }
             oprot.writeListEnd();
           }
@@ -728,9 +728,9 @@ public class CqlPreparedResult implements org.apache.thrift.TBase<CqlPreparedRes
           oprot.writeFieldBegin(VARIABLE_NAMES_FIELD_DESC);
           {
             oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.variable_names.size()));
-            for (String _iter189 : struct.variable_names)
+            for (String _iter201 : struct.variable_names)
             {
-              oprot.writeString(_iter189);
+              oprot.writeString(_iter201);
             }
             oprot.writeListEnd();
           }
@@ -767,18 +767,18 @@ public class CqlPreparedResult implements org.apache.thrift.TBase<CqlPreparedRes
       if (struct.isSetVariable_types()) {
         {
           oprot.writeI32(struct.variable_types.size());
-          for (String _iter190 : struct.variable_types)
+          for (String _iter202 : struct.variable_types)
           {
-            oprot.writeString(_iter190);
+            oprot.writeString(_iter202);
           }
         }
       }
       if (struct.isSetVariable_names()) {
         {
           oprot.writeI32(struct.variable_names.size());
-          for (String _iter191 : struct.variable_names)
+          for (String _iter203 : struct.variable_names)
           {
-            oprot.writeString(_iter191);
+            oprot.writeString(_iter203);
           }
         }
       }
@@ -794,26 +794,26 @@ public class CqlPreparedResult implements org.apache.thrift.TBase<CqlPreparedRes
       BitSet incoming = iprot.readBitSet(2);
       if (incoming.get(0)) {
         {
-          org.apache.thrift.protocol.TList _list192 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-          struct.variable_types = new ArrayList<String>(_list192.size);
-          for (int _i193 = 0; _i193 < _list192.size; ++_i193)
+          org.apache.thrift.protocol.TList _list204 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+          struct.variable_types = new ArrayList<String>(_list204.size);
+          for (int _i205 = 0; _i205 < _list204.size; ++_i205)
           {
-            String _elem194; // optional
-            _elem194 = iprot.readString();
-            struct.variable_types.add(_elem194);
+            String _elem206; // optional
+            _elem206 = iprot.readString();
+            struct.variable_types.add(_elem206);
           }
         }
         struct.setVariable_typesIsSet(true);
       }
       if (incoming.get(1)) {
         {
-          org.apache.thrift.protocol.TList _list195 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-          struct.variable_names = new ArrayList<String>(_list195.size);
-          for (int _i196 = 0; _i196 < _list195.size; ++_i196)
+          org.apache.thrift.protocol.TList _list207 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+          struct.variable_names = new ArrayList<String>(_list207.size);
+          for (int _i208 = 0; _i208 < _list207.size; ++_i208)
           {
-            String _elem197; // optional
-            _elem197 = iprot.readString();
-            struct.variable_names.add(_elem197);
+            String _elem209; // optional
+            _elem209 = iprot.readString();
+            struct.variable_names.add(_elem209);
           }
         }
         struct.setVariable_namesIsSet(true);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlResult.java
----------------------------------------------------------------------
diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlResult.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlResult.java
index 0ef02f7..5867b44 100644
--- a/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlResult.java
+++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlResult.java
@@ -644,14 +644,14 @@ public class CqlResult implements org.apache.thrift.TBase<CqlResult, CqlResult._
           case 2: // ROWS
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list174 = iprot.readListBegin();
-                struct.rows = new ArrayList<CqlRow>(_list174.size);
-                for (int _i175 = 0; _i175 < _list174.size; ++_i175)
+                org.apache.thrift.protocol.TList _list186 = iprot.readListBegin();
+                struct.rows = new ArrayList<CqlRow>(_list186.size);
+                for (int _i187 = 0; _i187 < _list186.size; ++_i187)
                 {
-                  CqlRow _elem176; // optional
-                  _elem176 = new CqlRow();
-                  _elem176.read(iprot);
-                  struct.rows.add(_elem176);
+                  CqlRow _elem188; // optional
+                  _elem188 = new CqlRow();
+                  _elem188.read(iprot);
+                  struct.rows.add(_elem188);
                 }
                 iprot.readListEnd();
               }
@@ -702,9 +702,9 @@ public class CqlResult implements org.apache.thrift.TBase<CqlResult, CqlResult._
           oprot.writeFieldBegin(ROWS_FIELD_DESC);
           {
             oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.rows.size()));
-            for (CqlRow _iter177 : struct.rows)
+            for (CqlRow _iter189 : struct.rows)
             {
-              _iter177.write(oprot);
+              _iter189.write(oprot);
             }
             oprot.writeListEnd();
           }
@@ -755,9 +755,9 @@ public class CqlResult implements org.apache.thrift.TBase<CqlResult, CqlResult._
       if (struct.isSetRows()) {
         {
           oprot.writeI32(struct.rows.size());
-          for (CqlRow _iter178 : struct.rows)
+          for (CqlRow _iter190 : struct.rows)
           {
-            _iter178.write(oprot);
+            _iter190.write(oprot);
           }
         }
       }
@@ -777,14 +777,14 @@ public class CqlResult implements org.apache.thrift.TBase<CqlResult, CqlResult._
       BitSet incoming = iprot.readBitSet(3);
       if (incoming.get(0)) {
         {
-          org.apache.thrift.protocol.TList _list179 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-          struct.rows = new ArrayList<CqlRow>(_list179.size);
-          for (int _i180 = 0; _i180 < _list179.size; ++_i180)
+          org.apache.thrift.protocol.TList _list191 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+          struct.rows = new ArrayList<CqlRow>(_list191.size);
+          for (int _i192 = 0; _i192 < _list191.size; ++_i192)
           {
-            CqlRow _elem181; // optional
-            _elem181 = new CqlRow();
-            _elem181.read(iprot);
-            struct.rows.add(_elem181);
+            CqlRow _elem193; // optional
+            _elem193 = new CqlRow();
+            _elem193.read(iprot);
+            struct.rows.add(_elem193);
           }
         }
         struct.setRowsIsSet(true);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlRow.java
----------------------------------------------------------------------
diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlRow.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlRow.java
index d3816cc..d495530 100644
--- a/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlRow.java
+++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/CqlRow.java
@@ -478,14 +478,14 @@ public class CqlRow implements org.apache.thrift.TBase<CqlRow, CqlRow._Fields>,
           case 2: // COLUMNS
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list146 = iprot.readListBegin();
-                struct.columns = new ArrayList<Column>(_list146.size);
-                for (int _i147 = 0; _i147 < _list146.size; ++_i147)
+                org.apache.thrift.protocol.TList _list158 = iprot.readListBegin();
+                struct.columns = new ArrayList<Column>(_list158.size);
+                for (int _i159 = 0; _i159 < _list158.size; ++_i159)
                 {
-                  Column _elem148; // optional
-                  _elem148 = new Column();
-                  _elem148.read(iprot);
-                  struct.columns.add(_elem148);
+                  Column _elem160; // optional
+                  _elem160 = new Column();
+                  _elem160.read(iprot);
+                  struct.columns.add(_elem160);
                 }
                 iprot.readListEnd();
               }
@@ -518,9 +518,9 @@ public class CqlRow implements org.apache.thrift.TBase<CqlRow, CqlRow._Fields>,
         oprot.writeFieldBegin(COLUMNS_FIELD_DESC);
         {
           oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.columns.size()));
-          for (Column _iter149 : struct.columns)
+          for (Column _iter161 : struct.columns)
           {
-            _iter149.write(oprot);
+            _iter161.write(oprot);
           }
           oprot.writeListEnd();
         }
@@ -546,9 +546,9 @@ public class CqlRow implements org.apache.thrift.TBase<CqlRow, CqlRow._Fields>,
       oprot.writeBinary(struct.key);
       {
         oprot.writeI32(struct.columns.size());
-        for (Column _iter150 : struct.columns)
+        for (Column _iter162 : struct.columns)
         {
-          _iter150.write(oprot);
+          _iter162.write(oprot);
         }
       }
     }
@@ -559,14 +559,14 @@ public class CqlRow implements org.apache.thrift.TBase<CqlRow, CqlRow._Fields>,
       struct.key = iprot.readBinary();
       struct.setKeyIsSet(true);
       {
-        org.apache.thrift.protocol.TList _list151 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-        struct.columns = new ArrayList<Column>(_list151.size);
-        for (int _i152 = 0; _i152 < _list151.size; ++_i152)
+        org.apache.thrift.protocol.TList _list163 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+        struct.columns = new ArrayList<Column>(_list163.size);
+        for (int _i164 = 0; _i164 < _list163.size; ++_i164)
         {
-          Column _elem153; // optional
-          _elem153 = new Column();
-          _elem153.read(iprot);
-          struct.columns.add(_elem153);
+          Column _elem165; // optional
+          _elem165 = new Column();
+          _elem165.read(iprot);
+          struct.columns.add(_elem165);
         }
       }
       struct.setColumnsIsSet(true);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/interface/thrift/gen-java/org/apache/cassandra/thrift/KsDef.java
----------------------------------------------------------------------
diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/KsDef.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/KsDef.java
index f284680..3f2ee29 100644
--- a/interface/thrift/gen-java/org/apache/cassandra/thrift/KsDef.java
+++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/KsDef.java
@@ -837,15 +837,15 @@ public class KsDef implements org.apache.thrift.TBase<KsDef, KsDef._Fields>, jav
           case 3: // STRATEGY_OPTIONS
             if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
               {
-                org.apache.thrift.protocol.TMap _map128 = iprot.readMapBegin();
-                struct.strategy_options = new HashMap<String,String>(2*_map128.size);
-                for (int _i129 = 0; _i129 < _map128.size; ++_i129)
+                org.apache.thrift.protocol.TMap _map140 = iprot.readMapBegin();
+                struct.strategy_options = new HashMap<String,String>(2*_map140.size);
+                for (int _i141 = 0; _i141 < _map140.size; ++_i141)
                 {
-                  String _key130; // required
-                  String _val131; // required
-                  _key130 = iprot.readString();
-                  _val131 = iprot.readString();
-                  struct.strategy_options.put(_key130, _val131);
+                  String _key142; // required
+                  String _val143; // required
+                  _key142 = iprot.readString();
+                  _val143 = iprot.readString();
+                  struct.strategy_options.put(_key142, _val143);
                 }
                 iprot.readMapEnd();
               }
@@ -865,14 +865,14 @@ public class KsDef implements org.apache.thrift.TBase<KsDef, KsDef._Fields>, jav
           case 5: // CF_DEFS
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
-                org.apache.thrift.protocol.TList _list132 = iprot.readListBegin();
-                struct.cf_defs = new ArrayList<CfDef>(_list132.size);
-                for (int _i133 = 0; _i133 < _list132.size; ++_i133)
+                org.apache.thrift.protocol.TList _list144 = iprot.readListBegin();
+                struct.cf_defs = new ArrayList<CfDef>(_list144.size);
+                for (int _i145 = 0; _i145 < _list144.size; ++_i145)
                 {
-                  CfDef _elem134; // optional
-                  _elem134 = new CfDef();
-                  _elem134.read(iprot);
-                  struct.cf_defs.add(_elem134);
+                  CfDef _elem146; // optional
+                  _elem146 = new CfDef();
+                  _elem146.read(iprot);
+                  struct.cf_defs.add(_elem146);
                 }
                 iprot.readListEnd();
               }
@@ -919,10 +919,10 @@ public class KsDef implements org.apache.thrift.TBase<KsDef, KsDef._Fields>, jav
           oprot.writeFieldBegin(STRATEGY_OPTIONS_FIELD_DESC);
           {
             oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, struct.strategy_options.size()));
-            for (Map.Entry<String, String> _iter135 : struct.strategy_options.entrySet())
+            for (Map.Entry<String, String> _iter147 : struct.strategy_options.entrySet())
             {
-              oprot.writeString(_iter135.getKey());
-              oprot.writeString(_iter135.getValue());
+              oprot.writeString(_iter147.getKey());
+              oprot.writeString(_iter147.getValue());
             }
             oprot.writeMapEnd();
           }
@@ -938,9 +938,9 @@ public class KsDef implements org.apache.thrift.TBase<KsDef, KsDef._Fields>, jav
         oprot.writeFieldBegin(CF_DEFS_FIELD_DESC);
         {
           oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.cf_defs.size()));
-          for (CfDef _iter136 : struct.cf_defs)
+          for (CfDef _iter148 : struct.cf_defs)
           {
-            _iter136.write(oprot);
+            _iter148.write(oprot);
           }
           oprot.writeListEnd();
         }
@@ -972,9 +972,9 @@ public class KsDef implements org.apache.thrift.TBase<KsDef, KsDef._Fields>, jav
       oprot.writeString(struct.strategy_class);
       {
         oprot.writeI32(struct.cf_defs.size());
-        for (CfDef _iter137 : struct.cf_defs)
+        for (CfDef _iter149 : struct.cf_defs)
         {
-          _iter137.write(oprot);
+          _iter149.write(oprot);
         }
       }
       BitSet optionals = new BitSet();
@@ -991,10 +991,10 @@ public class KsDef implements org.apache.thrift.TBase<KsDef, KsDef._Fields>, jav
       if (struct.isSetStrategy_options()) {
         {
           oprot.writeI32(struct.strategy_options.size());
-          for (Map.Entry<String, String> _iter138 : struct.strategy_options.entrySet())
+          for (Map.Entry<String, String> _iter150 : struct.strategy_options.entrySet())
           {
-            oprot.writeString(_iter138.getKey());
-            oprot.writeString(_iter138.getValue());
+            oprot.writeString(_iter150.getKey());
+            oprot.writeString(_iter150.getValue());
           }
         }
       }
@@ -1014,29 +1014,29 @@ public class KsDef implements org.apache.thrift.TBase<KsDef, KsDef._Fields>, jav
       struct.strategy_class = iprot.readString();
       struct.setStrategy_classIsSet(true);
       {
-        org.apache.thrift.protocol.TList _list139 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-        struct.cf_defs = new ArrayList<CfDef>(_list139.size);
-        for (int _i140 = 0; _i140 < _list139.size; ++_i140)
+        org.apache.thrift.protocol.TList _list151 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+        struct.cf_defs = new ArrayList<CfDef>(_list151.size);
+        for (int _i152 = 0; _i152 < _list151.size; ++_i152)
         {
-          CfDef _elem141; // optional
-          _elem141 = new CfDef();
-          _elem141.read(iprot);
-          struct.cf_defs.add(_elem141);
+          CfDef _elem153; // optional
+          _elem153 = new CfDef();
+          _elem153.read(iprot);
+          struct.cf_defs.add(_elem153);
         }
       }
       struct.setCf_defsIsSet(true);
       BitSet incoming = iprot.readBitSet(3);
       if (incoming.get(0)) {
         {
-          org.apache.thrift.protocol.TMap _map142 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
-          struct.strategy_options = new HashMap<String,String>(2*_map142.size);
-          for (int _i143 = 0; _i143 < _map142.size; ++_i143)
+          org.apache.thrift.protocol.TMap _map154 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+          struct.strategy_options = new HashMap<String,String>(2*_map154.size);
+          for (int _i155 = 0; _i155 < _map154.size; ++_i155)
           {
-            String _key144; // required
-            String _val145; // required
-            _key144 = iprot.readString();
-            _val145 = iprot.readString();
-            struct.strategy_options.put(_key144, _val145);
+            String _key156; // required
+            String _val157; // required
+            _key156 = iprot.readString();
+            _val157 = iprot.readString();
+            struct.strategy_options.put(_key156, _val157);
           }
         }
         struct.setStrategy_optionsIsSet(true);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/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 c27ee2e..80a6211 100644
--- a/src/java/org/apache/cassandra/cli/CliClient.java
+++ b/src/java/org/apache/cassandra/cli/CliClient.java
@@ -27,13 +27,10 @@ import java.nio.ByteBuffer;
 import java.nio.charset.CharacterCodingException;
 import java.util.*;
 
-import com.google.common.base.CharMatcher;
 import com.google.common.base.Charsets;
 import com.google.common.base.Predicate;
-import com.google.common.base.Splitter;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
 
 import org.apache.commons.lang.StringUtils;
 
@@ -145,7 +142,6 @@ public class CliClient
         DEFAULT_TIME_TO_LIVE,
         SPECULATIVE_RETRY,
         POPULATE_IO_CACHE_ON_FLUSH,
-        TRIGGER_CLASSES
     }
 
     private static final String DEFAULT_PLACEMENT_STRATEGY = "org.apache.cassandra.locator.NetworkTopologyStrategy";
@@ -1359,10 +1355,6 @@ public class CliClient
             case POPULATE_IO_CACHE_ON_FLUSH:
                 cfDef.setPopulate_io_cache_on_flush(Boolean.parseBoolean(mValue));
                 break;
-            case TRIGGER_CLASSES:
-                Iterable<String> tcIt = Splitter.on(',').trimResults(CharMatcher.is('\'')).split(mValue);
-                cfDef.setTrigger_class(Sets.newHashSet(tcIt));
-                break;
             default:
                 //must match one of the above or we'd throw an exception at the valueOf statement above.
                 assert(false);
@@ -1827,9 +1819,6 @@ public class CliClient
 
         if (cfDef.isSetBloom_filter_fp_chance())
             writeAttr(output, false, "bloom_filter_fp_chance", cfDef.bloom_filter_fp_chance);
-        if (cfDef.isSetTrigger_class())
-            writeAttr(output, false, "trigger_class", StringUtils.join(cfDef.trigger_class, ','));
-
         if (!cfDef.compaction_strategy_options.isEmpty())
         {
             StringBuilder cOptions = new StringBuilder();
@@ -2199,9 +2188,6 @@ public class CliClient
         sessionState.out.printf("      Index interval: %s%n", cf_def.isSetIndex_interval() ? cf_def.index_interval : "default");
         sessionState.out.printf("      Speculative Retry: %s%n", cf_def.speculative_retry);
 
-        if (cf_def.trigger_class != null)
-            sessionState.out.printf("      Trigger class: %s%n", cf_def.trigger_class);
-
         // if we have connection to the cfMBean established
         if (cfMBean != null)
             sessionState.out.printf("      Built indexes: %s%n", cfMBean.getBuiltIndexes());

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/src/java/org/apache/cassandra/config/CFMetaData.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java
index 9d35a70..cfe1090 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -23,13 +23,12 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.nio.ByteBuffer;
 import java.util.*;
+import java.util.Map.Entry;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
-import com.google.common.base.Strings;
 import com.google.common.collect.MapDifference;
 import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
 
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
@@ -141,7 +140,6 @@ public final class CFMetaData
                                                                        + "default_write_consistency text,"
                                                                        + "speculative_retry text,"
                                                                        + "populate_io_cache_on_flush boolean,"
-                                                                       + "trigger_class text,"
                                                                        + "dropped_columns map<text, bigint>,"
                                                                        + "PRIMARY KEY (keyspace_name, columnfamily_name)"
                                                                        + ") WITH COMMENT='ColumnFamily definitions' AND gc_grace_seconds=8640");
@@ -159,6 +157,14 @@ public final class CFMetaData
                                                                  + "PRIMARY KEY(keyspace_name, columnfamily_name, column_name)"
                                                                  + ") WITH COMMENT='ColumnFamily column attributes' AND gc_grace_seconds=8640");
 
+    public static final CFMetaData SchemaTriggerCf = compile("CREATE TABLE \"" + SystemTable.SCHEMA_TRIGGERS_CF + "\" ("
+                                                                + "keyspace_name text,"
+                                                                + "column_family text,"
+                                                                + "trigger_name text,"
+                                                                + "trigger_options map<text, text>,"
+                                                                + "PRIMARY KEY (keyspace_name, column_family, trigger_name)"
+                                                                + ") WITH COMMENT='triggers metadata table'");
+
     public static final CFMetaData HintsCf = compile("CREATE TABLE " + SystemTable.HINTS_CF + " ("
                                                      + "target_id uuid,"
                                                      + "hint_id timeuuid,"
@@ -364,7 +370,8 @@ public final class CFMetaData
     private volatile SpeculativeRetry speculativeRetry = DEFAULT_SPECULATIVE_RETRY;
     private volatile boolean populateIoCacheOnFlush = DEFAULT_POPULATE_IO_CACHE_ON_FLUSH;
     private volatile Map<ByteBuffer, Long> droppedColumns = new HashMap<ByteBuffer, Long>();
-    private volatile Set<String> triggerClass = null;
+    private volatile Map<String, Map<String, String>> triggers = new HashMap<>();
+    private volatile Collection<String> cachedTriggers;
 
     /*
      * All CQL3 columns definition are stored in the column_metadata map.
@@ -410,7 +417,7 @@ public final class CFMetaData
     public CFMetaData speculativeRetry(SpeculativeRetry prop) {speculativeRetry = prop; return this;}
     public CFMetaData populateIoCacheOnFlush(boolean prop) {populateIoCacheOnFlush = prop; return this;}
     public CFMetaData droppedColumns(Map<ByteBuffer, Long> cols) {droppedColumns = cols; return this;}
-    public CFMetaData triggerClass(Set<String> prop) {triggerClass = prop; return this;}
+    public CFMetaData triggers(Map<String, Map<String, String>> prop) {triggers = prop; cachedTriggers = TriggerOptions.extractClasses(triggers); return this;}
 
     public CFMetaData(String keyspace, String name, ColumnFamilyType type, AbstractType<?> comp, AbstractType<?> subcc)
     {
@@ -435,6 +442,11 @@ public final class CFMetaData
         updateCfDef(); // init cqlCfDef
     }
 
+    public Map<String, Map<String, String>> getTriggers()
+    {
+        return new HashMap<>(triggers);
+    }
+
     private static CFMetaData compile(String cql, String keyspace)
     {
         return compile(null, cql, keyspace);
@@ -508,7 +520,7 @@ public final class CFMetaData
                              .gcGraceSeconds(0)
                              .caching(indexCaching)
                              .speculativeRetry(parent.speculativeRetry)
-                             .triggerClass(parent.triggerClass)
+                             .triggers(parent.triggers)
                              .compactionStrategyClass(parent.compactionStrategyClass)
                              .compactionStrategyOptions(parent.compactionStrategyOptions)
                              .reloadSecondaryIndexMetadata(parent);
@@ -564,7 +576,7 @@ public final class CFMetaData
                       .memtableFlushPeriod(oldCFMD.memtableFlushPeriod)
                       .populateIoCacheOnFlush(oldCFMD.populateIoCacheOnFlush)
                       .droppedColumns(oldCFMD.droppedColumns)
-                      .triggerClass(oldCFMD.triggerClass);
+                      .triggers(oldCFMD.getTriggers());
     }
 
     /**
@@ -695,9 +707,9 @@ public final class CFMetaData
                : bloomFilterFpChance;
     }
 
-    public Set<String> getTriggerClass()
+    public Collection<String> getTriggerClasses()
     {
-        return triggerClass;
+        return cachedTriggers;
     }
 
     public Caching getCaching()
@@ -769,7 +781,7 @@ public final class CFMetaData
             .append(speculativeRetry, rhs.speculativeRetry)
             .append(populateIoCacheOnFlush, rhs.populateIoCacheOnFlush)
             .append(droppedColumns, rhs.droppedColumns)
-            .append(triggerClass, rhs.triggerClass)
+            .append(triggers, rhs.triggers)
             .isEquals();
     }
 
@@ -802,7 +814,7 @@ public final class CFMetaData
             .append(speculativeRetry)
             .append(populateIoCacheOnFlush)
             .append(droppedColumns)
-            .append(triggerClass)
+            .append(triggers)
             .toHashCode();
     }
 
@@ -892,8 +904,8 @@ public final class CFMetaData
                 newCFMD.speculativeRetry(SpeculativeRetry.fromString(cf_def.speculative_retry));
             if (cf_def.isSetPopulate_io_cache_on_flush())
                 newCFMD.populateIoCacheOnFlush(cf_def.populate_io_cache_on_flush);
-            if (cf_def.isSetTrigger_class())
-                newCFMD.triggerClass(cf_def.trigger_class);
+            if (cf_def.isSetTriggers())
+                newCFMD.triggers(cf_def.triggers);
 
             CompressionParameters cp = CompressionParameters.create(cf_def.compression_options);
 
@@ -975,8 +987,6 @@ public final class CFMetaData
         speculativeRetry = cfm.speculativeRetry;
         populateIoCacheOnFlush = cfm.populateIoCacheOnFlush;
 
-        if (cfm.triggerClass != null)
-            triggerClass = cfm.triggerClass;
         if (!cfm.droppedColumns.isEmpty())
             droppedColumns = cfm.droppedColumns;
 
@@ -995,6 +1005,7 @@ public final class CFMetaData
             oldDef.apply(def, getColumnDefinitionComparator(oldDef));
         }
 
+        triggers(new HashMap<>(cfm.triggers)); // update trigger as an unit.
         compactionStrategyClass = cfm.compactionStrategyClass;
         compactionStrategyOptions = cfm.compactionStrategyOptions;
 
@@ -1137,8 +1148,7 @@ public final class CFMetaData
         def.setCaching(caching.toString());
         def.setDefault_time_to_live(defaultTimeToLive);
         def.setSpeculative_retry(speculativeRetry.toString());
-        if (triggerClass != null)
-            def.setTrigger_class(new HashSet<String>(triggerClass));
+        def.setTriggers(triggers);
         return def;
     }
 
@@ -1430,6 +1440,12 @@ public final class CFMetaData
             cd.toSchema(rm, cfName, getColumnDefinitionComparator(cd), modificationTimestamp);
         }
 
+        MapDifference<String, Map<String, String>> tdiffrence = Maps.difference(triggers, newState.triggers);
+        for (Entry<String, Map<String, String>> tentry : tdiffrence.entriesOnlyOnLeft().entrySet())
+            TriggerOptions.deleteColumns(rm, cfName, tentry, modificationTimestamp);
+        for (Entry<String, Map<String, String>> tentry : tdiffrence.entriesOnlyOnRight().entrySet())
+            TriggerOptions.addColumns(rm, cfName, tentry, modificationTimestamp);
+
         return rm;
     }
 
@@ -1450,6 +1466,11 @@ public final class CFMetaData
         builder.add(ByteBufferUtil.bytes(cfName));
         cf.addAtom(new RangeTombstone(builder.build(), builder.buildAsEndOfRange(), timestamp, ldt));
 
+        ColumnFamily tcf = rm.addOrGet(SystemTable.SCHEMA_TRIGGERS_CF);
+        ColumnNameBuilder tbuilder = SchemaTriggerCf.getCfDef().getColumnNameBuilder();
+        tbuilder.add(ByteBufferUtil.bytes(cfName));
+        tcf.addAtom(new RangeTombstone(tbuilder.build(), tbuilder.buildAsEndOfRange(), timestamp, ldt));
+
         for (ColumnDefinition cd : column_metadata.values())
             cd.deleteFromSchema(rm, cfName, getColumnDefinitionComparator(cd), timestamp);
 
@@ -1509,8 +1530,6 @@ public final class CFMetaData
         cf.addColumn(Column.create(json(compactionStrategyOptions), timestamp, cfName, "compaction_strategy_options"));
         cf.addColumn(Column.create(indexInterval, timestamp, cfName, "index_interval"));
         cf.addColumn(Column.create(speculativeRetry.toString(), timestamp, cfName, "speculative_retry"));
-        cf.addColumn(triggerClass == null ? DeletedColumn.create(ldt, timestamp, cfName, "trigger_class")
-                                          : Column.create(StringUtils.join(triggerClass, ','), timestamp, cfName, "trigger_class"));
 
         for (Map.Entry<ByteBuffer, Long> entry : droppedColumns.entrySet())
             cf.addColumn(new Column(makeDroppedColumnName(entry.getKey()), LongType.instance.decompose(entry.getValue()), timestamp));
@@ -1560,8 +1579,6 @@ public final class CFMetaData
                 cfm.indexInterval(result.getInt("index_interval"));
             if (result.has("populate_io_cache_on_flush"))
                 cfm.populateIoCacheOnFlush(result.getBoolean("populate_io_cache_on_flush"));
-            if (result.has("trigger_class") && !Strings.isNullOrEmpty(result.getString("trigger_class")))
-                cfm.triggerClass(Sets.newHashSet(StringUtils.split(result.getString("trigger_class"), ',')));
 
             /*
              * The info previously hold by key_alias(es), column_alias and value_alias is now stored in column_metadata (because 1) this
@@ -1626,6 +1643,9 @@ public final class CFMetaData
     {
         CFMetaData cfDef = fromSchemaNoColumns(result);
 
+        // read triggers.
+        cfDef.triggers(TriggerOptions.getAllTriggers(cfDef.ksName, cfDef.cfName));
+
         Row serializedColumnDefinitions = ColumnDefinition.readSchema(cfDef.ksName, cfDef.cfName);
         return addColumnDefinitionSchema(cfDef, serializedColumnDefinitions);
     }
@@ -1984,7 +2004,7 @@ public final class CFMetaData
             .append("indexInterval", indexInterval)
             .append("populateIoCacheOnFlush", populateIoCacheOnFlush)
             .append("droppedColumns", droppedColumns)
-            .append("trigger_class", triggerClass)
+            .append("triggers", triggers)
             .toString();
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/src/java/org/apache/cassandra/config/KSMetaData.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/KSMetaData.java b/src/java/org/apache/cassandra/config/KSMetaData.java
index db08da8..f188134 100644
--- a/src/java/org/apache/cassandra/config/KSMetaData.java
+++ b/src/java/org/apache/cassandra/config/KSMetaData.java
@@ -84,6 +84,7 @@ public final class KSMetaData
                                                 CFMetaData.PeerEventsCf,
                                                 CFMetaData.HintsCf,
                                                 CFMetaData.IndexCf,
+                                                CFMetaData.SchemaTriggerCf,
                                                 CFMetaData.CounterIdCf,
                                                 CFMetaData.SchemaKeyspacesCf,
                                                 CFMetaData.SchemaColumnFamiliesCf,
@@ -228,6 +229,7 @@ public final class KSMetaData
         rm.delete(SystemTable.SCHEMA_KEYSPACES_CF, timestamp);
         rm.delete(SystemTable.SCHEMA_COLUMNFAMILIES_CF, timestamp);
         rm.delete(SystemTable.SCHEMA_COLUMNS_CF, timestamp);
+        rm.delete(SystemTable.SCHEMA_TRIGGERS_CF, timestamp);
 
         return rm;
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/src/java/org/apache/cassandra/config/TriggerOptions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/TriggerOptions.java b/src/java/org/apache/cassandra/config/TriggerOptions.java
new file mode 100644
index 0000000..3ab5f86
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/TriggerOptions.java
@@ -0,0 +1,93 @@
+package org.apache.cassandra.config;
+
+import static org.apache.cassandra.cql3.QueryProcessor.processInternal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.cassandra.cql3.ColumnNameBuilder;
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.cql3.UntypedResultSet.Row;
+import org.apache.cassandra.db.ColumnFamily;
+import org.apache.cassandra.db.RangeTombstone;
+import org.apache.cassandra.db.RowMutation;
+import org.apache.cassandra.db.SystemTable;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.utils.ByteBufferUtil;
+
+public class TriggerOptions
+{
+    private static final String CLASS_KEY = "class";
+    private static final String OPTIONS_KEY = "trigger_options";
+
+    public static Map<String, Map<String, String>> getAllTriggers(String ksName, String cfName)
+    {
+        String req = "SELECT * FROM system.%s WHERE keyspace_name='%s' AND column_family='%s'";
+        UntypedResultSet result = processInternal(String.format(req, SystemTable.SCHEMA_TRIGGERS_CF, ksName, cfName));
+        Map<String, Map<String, String>> triggers = new HashMap<>();
+        if (result.isEmpty())
+            return triggers;
+        for (Row row : result)
+            triggers.put(row.getString("trigger_name"), row.getMap(OPTIONS_KEY, UTF8Type.instance, UTF8Type.instance));
+        return triggers;
+    }
+
+    public static void addColumns(RowMutation rm, String cfName, Entry<String, Map<String, String>> tentry, long modificationTimestamp)
+    {
+        ColumnFamily cf = rm.addOrGet(SystemTable.SCHEMA_TRIGGERS_CF);
+        assert tentry.getValue().get(CLASS_KEY) != null;
+        ColumnNameBuilder builder = CFMetaData.SchemaTriggerCf.getCfDef().getColumnNameBuilder();
+        builder.add(ByteBufferUtil.bytes(cfName)).add(ByteBufferUtil.bytes(tentry.getKey())).add(ByteBufferUtil.bytes(OPTIONS_KEY));
+        for (Entry<String, String> entry : tentry.getValue().entrySet())
+        {
+            ColumnNameBuilder builderCopy = builder.copy();
+            builderCopy.add(ByteBufferUtil.bytes(entry.getKey()));
+            cf.addColumn(builderCopy.build(), ByteBufferUtil.bytes(entry.getValue()), modificationTimestamp);
+        }
+    }
+
+    public static void deleteColumns(RowMutation rm, String cfName, Entry<String, Map<String, String>> tentry, long modificationTimestamp)
+    {
+        ColumnFamily cf = rm.addOrGet(SystemTable.SCHEMA_TRIGGERS_CF);
+        int ldt = (int) (System.currentTimeMillis() / 1000);
+        ColumnNameBuilder builder = CFMetaData.SchemaTriggerCf.getCfDef().getColumnNameBuilder();
+        builder.add(ByteBufferUtil.bytes(cfName)).add(ByteBufferUtil.bytes(tentry.getKey()));
+        cf.addAtom(new RangeTombstone(builder.build(), builder.buildAsEndOfRange(), modificationTimestamp, ldt));
+    }
+
+    public static void update(CFMetaData cfm, String triggerName, String clazz)
+    {
+        Map<String, Map<String, String>> existingTriggers = cfm.getTriggers();
+        assert existingTriggers.get(triggerName) == null;
+        Map<String, String> triggerUnit = new HashMap<>();
+        triggerUnit.put(CLASS_KEY, clazz);
+        existingTriggers.put(triggerName, triggerUnit);
+        cfm.triggers(existingTriggers);
+    }
+
+    public static void remove(CFMetaData cfm, String triggerName)
+    {
+        Map<String, Map<String, String>> existingTriggers = cfm.getTriggers(); // have a copy of the triggers
+        existingTriggers.remove(triggerName);
+        cfm.triggers(existingTriggers);
+    }
+
+    public static boolean hasTrigger(CFMetaData cfm, String triggerName)
+    {
+        return cfm.getTriggers().get(triggerName) != null;
+    }
+
+    public static Collection<String> extractClasses(Map<String, Map<String, String>> triggers)
+    {
+        List<String> classes = new ArrayList<>();
+        if (triggers.isEmpty())
+            return null;
+        for (Map<String, String> options : triggers.values())
+            classes.add(options.get(CLASS_KEY));
+        return classes;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/src/java/org/apache/cassandra/cql/AlterTableStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql/AlterTableStatement.java b/src/java/org/apache/cassandra/cql/AlterTableStatement.java
index 951b1bb..662d889 100644
--- a/src/java/org/apache/cassandra/cql/AlterTableStatement.java
+++ b/src/java/org/apache/cassandra/cql/AlterTableStatement.java
@@ -186,7 +186,6 @@ public class AlterTableStatement
         cfm.populateIoCacheOnFlush(cfProps.getPropertyBoolean(CFPropDefs.KW_POPULATE_IO_CACHE_ON_FLUSH, cfm.populateIoCacheOnFlush()));
         cfm.bloomFilterFpChance(cfProps.getPropertyDouble(CFPropDefs.KW_BF_FP_CHANCE, cfm.getBloomFilterFpChance()));
         cfm.memtableFlushPeriod(cfProps.getPropertyInt(CFPropDefs.KW_MEMTABLE_FLUSH_PERIOD, cfm.getMemtableFlushPeriod()));
-        cfm.triggerClass(cfProps.getPropertySet(CFPropDefs.KW_TRIGGER_CLASS, cfm.getTriggerClass()));
 
         if (!cfProps.compactionStrategyOptions.isEmpty())
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java b/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java
index e8b73ef..dd56387 100644
--- a/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java
+++ b/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java
@@ -202,8 +202,7 @@ public class CreateColumnFamilyStatement
                    .bloomFilterFpChance(getPropertyDouble(CFPropDefs.KW_BF_FP_CHANCE, null))
                    .memtableFlushPeriod(getPropertyInt(CFPropDefs.KW_MEMTABLE_FLUSH_PERIOD, 0))
                    .defaultTimeToLive(getPropertyInt(CFPropDefs.KW_DEFAULT_TIME_TO_LIVE, CFMetaData.DEFAULT_DEFAULT_TIME_TO_LIVE))
-                   .populateIoCacheOnFlush(getPropertyBoolean(CFPropDefs.KW_POPULATE_IO_CACHE_ON_FLUSH, CFMetaData.DEFAULT_POPULATE_IO_CACHE_ON_FLUSH))
-                   .triggerClass(getPropertySet(CFPropDefs.KW_TRIGGER_CLASS, null));
+                   .populateIoCacheOnFlush(getPropertyBoolean(CFPropDefs.KW_POPULATE_IO_CACHE_ON_FLUSH, CFMetaData.DEFAULT_POPULATE_IO_CACHE_ON_FLUSH));
 
             // CQL2 can have null keyAliases
             if (keyAlias != null)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/src/java/org/apache/cassandra/cql3/CFPropDefs.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/CFPropDefs.java b/src/java/org/apache/cassandra/cql3/CFPropDefs.java
index 2c0ad0d..3167c9e 100644
--- a/src/java/org/apache/cassandra/cql3/CFPropDefs.java
+++ b/src/java/org/apache/cassandra/cql3/CFPropDefs.java
@@ -152,8 +152,6 @@ public class CFPropDefs extends PropertyDefinitions
         cfm.speculativeRetry(CFMetaData.SpeculativeRetry.fromString(getString(KW_SPECULATIVE_RETRY, cfm.getSpeculativeRetry().toString())));
         cfm.memtableFlushPeriod(getInt(KW_MEMTABLE_FLUSH_PERIOD, cfm.getMemtableFlushPeriod()));
         cfm.populateIoCacheOnFlush(getBoolean(KW_POPULATE_IO_CACHE_ON_FLUSH, cfm.populateIoCacheOnFlush()));
-        if (hasProperty(KW_TRIGGER_CLASS))
-            cfm.triggerClass(getSet(KW_TRIGGER_CLASS, cfm.getTriggerClass()));
 
         if (compactionStrategyClass != null)
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/src/java/org/apache/cassandra/cql3/Cql.g
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Cql.g b/src/java/org/apache/cassandra/cql3/Cql.g
index 913f6ea..71c6ae3 100644
--- a/src/java/org/apache/cassandra/cql3/Cql.g
+++ b/src/java/org/apache/cassandra/cql3/Cql.g
@@ -193,6 +193,8 @@ cqlStatement returns [ParsedStatement stmt]
     | st20=alterUserStatement          { $stmt = st20; }
     | st21=dropUserStatement           { $stmt = st21; }
     | st22=listUsersStatement          { $stmt = st22; }
+    | st23=createTriggerStatement      { $stmt = st23; }
+    | st24=dropTriggerStatement      { $stmt = st24; }
     ;
 
 /*
@@ -488,6 +490,22 @@ createIndexStatement returns [CreateIndexStatement expr]
     ;
 
 /**
+ * CREATE TRIGGER [triggerName] ON columnFamily (columnName) EXECUTE (class, class);
+ */
+createTriggerStatement returns [CreateTriggerStatement expr]
+    : K_CREATE K_TRIGGER (tn=IDENT) K_ON cf=columnFamilyName K_USING tc1=STRING_LITERAL
+      { $expr = new CreateTriggerStatement(cf, $tn.text, $tc1.text); }
+    ;
+
+/**
+ * DROP TRIGGER [triggerName] ON columnFamily (columnName);
+ */
+dropTriggerStatement returns [DropTriggerStatement expr]
+    : K_DROP K_TRIGGER (tn=IDENT) K_ON cf=columnFamilyName
+      { $expr = new DropTriggerStatement(cf, $tn.text); }
+    ;
+
+/**
  * ALTER KEYSPACE <KS> WITH <property> = <value>;
  */
 alterKeyspaceStatement returns [AlterKeyspaceStatement expr]
@@ -911,6 +929,7 @@ unreserved_function_keyword returns [String str]
         | K_PASSWORD
         | K_EXISTS
         | K_CUSTOM
+        | K_TRIGGER
         ) { $str = $k.text; }
     | t=native_type { $str = t.toString(); }
     ;
@@ -1010,6 +1029,8 @@ K_EXISTS:      E X I S T S;
 K_MAP:         M A P;
 K_LIST:        L I S T;
 
+K_TRIGGER:     T R I G G E R;
+
 // Case-insensitive alpha characters
 fragment A: ('a'|'A');
 fragment B: ('b'|'B');

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8bf6e155/src/java/org/apache/cassandra/cql3/PropertyDefinitions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/PropertyDefinitions.java b/src/java/org/apache/cassandra/cql3/PropertyDefinitions.java
index 82a1b82..ba83e45 100644
--- a/src/java/org/apache/cassandra/cql3/PropertyDefinitions.java
+++ b/src/java/org/apache/cassandra/cql3/PropertyDefinitions.java
@@ -76,16 +76,6 @@ public class PropertyDefinitions
         return (Map<String, String>)val;
     }
 
-    protected Set<String> getSet(String name, Set<String> defaultValue) throws SyntaxException
-    {
-        Object val = properties.get(name);
-        if (val == null)
-            return defaultValue;
-        if (!(val instanceof Set))
-            throw new SyntaxException(String.format("Invalid value for property '%s'", name));
-        return (Set<String>) val;
-    }
-
     public Boolean hasProperty(String name)
     {
         return properties.containsKey(name);