(cqlsh) tab completion for triggers

patch by Mikhail Stepura; reviewed by Tyler Hobbs for CASSANDRA-7824


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

Branch: refs/heads/trunk
Commit: 1456ec83186f4e91a80129f6487416b81d7a92b2
Parents: bbbdec6
Author: Mikhail Stepura <mish...@apache.org>
Authored: Thu Aug 28 16:10:36 2014 -0700
Committer: Mikhail Stepura <mish...@apache.org>
Committed: Tue Sep 9 15:03:57 2014 -0700

----------------------------------------------------------------------
 CHANGES.txt                    |  1 +
 bin/cqlsh                      |  8 ++++++++
 doc/cql3/CQL.textile           | 33 +++++++++++++++++++++++++++++++++
 pylib/cqlshlib/cql3handling.py | 24 ++++++++++++++++++++++++
 4 files changed, 66 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/1456ec83/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index c4698d6..1706faf 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.1
+ * (cqlsh) tab-completion for triggers (CASSANDRA-7824)
  * (cqlsh): Support for query paging (CASSANDRA-7514)
  * (cqlsh): Show progress of COPY operations (CASSANDRA-7789)
  * Add syntax to remove multiple elements from a map (CASSANDRA-6599)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1456ec83/bin/cqlsh
----------------------------------------------------------------------
diff --git a/bin/cqlsh b/bin/cqlsh
index d61a008..fa5de05 100755
--- a/bin/cqlsh
+++ b/bin/cqlsh
@@ -711,6 +711,14 @@ class Shell(cmd.Cmd):
 
         return cql3handling.UserTypesMeta.from_layout(data)
 
+    def get_trigger_names(self, ksname=None):
+        if ksname is None:
+            ksname = self.current_keyspace
+
+        return [trigger.name
+                for table in self.get_keyspace_meta(ksname).tables.values()
+                for trigger in table.triggers.values()]
+
     def reset_statement(self):
         self.reset_prompt()
         self.statement.truncate(0)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1456ec83/doc/cql3/CQL.textile
----------------------------------------------------------------------
diff --git a/doc/cql3/CQL.textile b/doc/cql3/CQL.textile
index 611bbb8..3b322d5 100644
--- a/doc/cql3/CQL.textile
+++ b/doc/cql3/CQL.textile
@@ -540,6 +540,39 @@ The @DROP TYPE@ statement results in the immediate, 
irreversible removal of a ty
 
 If the type does not exist, an error will be returned unless @IF EXISTS@ is 
used, in which case the operation is a no-op.
 
+h3(#createTriggerStmt). CREATE TRIGGER
+
+__Syntax:__
+
+bc(syntax).. 
+<create-trigger-stmt> ::= CREATE TRIGGER ( IF NOT EXISTS )? ( <triggername> )?
+                            ON <tablename> 
+                            USING <string>
+
+p. 
+__Sample:__
+
+bc(sample). 
+CREATE TRIGGER myTrigger ON myTable USING 
'org.apache.cassandra.triggers.InvertedIndex';
+
+The actual logic that makes up the trigger can be written in any Java (JVM) 
language and exists outside the database. You place the trigger code in a 
@lib/triggers@ subdirectory of the Cassandra installation directory, it loads 
during cluster startup, and exists on every node that participates in a 
cluster. The trigger defined on a table fires before a requested DML statement 
occurs, which ensures the atomicity of the transaction.
+
+h3(#dropTriggerStmt). DROP TRIGGER
+
+__Syntax:__
+
+bc(syntax).. 
+<drop-trigger-stmt> ::= DROP TRIGGER ( IF EXISTS )? ( <triggername> )?
+                            ON <tablename>
+
+p. 
+__Sample:__
+
+bc(sample). 
+DROP TRIGGER myTrigger ON myTable;
+
+@DROP TRIGGER@ statement removes the registration of a trigger created using 
@CREATE TRIGGER@.
+
 h2(#dataManipulation). Data Manipulation
 
 h3(#insertStmt). INSERT

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1456ec83/pylib/cqlshlib/cql3handling.py
----------------------------------------------------------------------
diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py
index e58f41d..43882de 100644
--- a/pylib/cqlshlib/cql3handling.py
+++ b/pylib/cqlshlib/cql3handling.py
@@ -228,10 +228,12 @@ JUNK ::= /([ 
\t\r\f\v]+|(--|[/][/])[^\n\r]*([\n\r]|$)|[/][*].*?[*][/])/ ;
                           | <createColumnFamilyStatement>
                           | <createIndexStatement>
                           | <createUserTypeStatement>
+                          | <createTriggerStatement>
                           | <dropKeyspaceStatement>
                           | <dropColumnFamilyStatement>
                           | <dropIndexStatement>
                           | <dropUserTypeStatement>
+                          | <dropTriggerStatement>
                           | <alterTableStatement>
                           | <alterKeyspaceStatement>
                           | <alterUserTypeStatement>
@@ -1153,6 +1155,28 @@ def username_name_completer(ctxt, cass):
     session = cass.session
     return [maybe_quote(row.values()[0].replace("'", "''")) for row in 
session.execute("LIST USERS")]
 
+syntax_rules += r'''
+<createTriggerStatement> ::= "CREATE" "TRIGGER" ( "IF" "NOT" "EXISTS" )? 
<cident>
+                               "ON" cf=<columnFamilyName> "USING" 
class=<stringLiteral>
+                           ;
+
+<dropTriggerStatement> ::= "DROP" "TRIGGER" ( "IF" "EXISTS" )? 
triggername=<cident>
+                             "ON" cf=<columnFamilyName>
+                         ;
+'''
+explain_completion('createTriggerStatement', 'class', '\'fully qualified class 
name\'')
+
+def get_trigger_names(ctxt, cass):
+    ks = ctxt.get_binding('ksname', None)
+    if ks is not None:
+        ks = dequote_name(ks)
+    return cass.get_trigger_names(ks)
+
+@completer_for('dropTriggerStatement', 'triggername')
+def alter_type_field_completer(ctxt, cass):
+    names = get_trigger_names(ctxt, cass)
+    return map(maybe_escape_name, names)
+
 # END SYNTAX/COMPLETION RULE DEFINITIONS
 
 CqlRuleSet.append_rules(syntax_rules)

Reply via email to