From aeee9f74d9095a802a23f1a47be021ede6fb65bc Mon Sep 17 00:00:00 2001 From: Stefania Alborghetti Date: Fri, 18 Sep 2015 11:33:54 +0200 Subject: [PATCH] Add DESCRIBE MATERIALIZED VIEW to cqlsh patch by Stefania Alborghetti; reviewed by Benjamin Lerer for CASSANDRA-9961 --- bin/cqlsh.py | 79 ++++++++++++++++-- ...r-internal-only-3.0.0a2.post0-03085e6.zip} | Bin 230797 -> 230830 bytes pylib/cqlshlib/cql3handling.py | 24 +++++- .../cassandra/service/MigrationListener.java | 1 + 4 files changed, 96 insertions(+), 8 deletions(-) rename lib/{cassandra-driver-internal-only-3.0.0a2.post0-9f91a6d.zip => cassandra-driver-internal-only-3.0.0a2.post0-03085e6.zip} (81%) diff --git a/bin/cqlsh.py b/bin/cqlsh.py index 529b1c8e64..41fa4fdece 100644 --- a/bin/cqlsh.py +++ b/bin/cqlsh.py @@ -289,12 +289,13 @@ cqlsh_extra_syntax_rules = r''' | "KEYSPACE" ksname=? | ( "COLUMNFAMILY" | "TABLE" ) cf= | "INDEX" idx= + | "MATERIALIZED" "VIEW" mv= | ( "COLUMNFAMILIES" | "TABLES" ) | "FULL"? "SCHEMA" | "CLUSTER" | "TYPES" | "TYPE" ut= - | (ksname= | cf= | idx=)) + | (ksname= | cf= | idx= | mv=)) ; ::= "CONSISTENCY" ( level= )? @@ -459,6 +460,10 @@ class IndexNotFound(Exception): pass +class MaterializedViewNotFound(Exception): + pass + + class ObjectNotFound(Exception): pass @@ -792,6 +797,12 @@ class Shell(cmd.Cmd): return map(str, self.get_keyspace_meta(ksname).tables.keys()) + def get_materialized_view_names(self, ksname=None): + if ksname is None: + ksname = self.current_keyspace + + return map(str, self.get_keyspace_meta(ksname).views.keys()) + def get_index_names(self, ksname=None): if ksname is None: ksname = self.current_keyspace @@ -898,6 +909,15 @@ class Shell(cmd.Cmd): return ksmeta.indexes[idxname] + def get_view_meta(self, ksname, viewname): + if ksname is None: + ksname = self.current_keyspace + ksmeta = self.get_keyspace_meta(ksname) + + if viewname not in ksmeta.views: + raise MaterializedViewNotFound("Materialized view %r not found" % viewname) + return ksmeta.views[viewname] + def get_object_meta(self, ks, name): if name is None: if ks and ks in self.conn.metadata.keyspaces: @@ -917,6 +937,8 @@ class Shell(cmd.Cmd): return ksmeta.tables[name] elif name in ksmeta.indexes: return ksmeta.indexes[name] + elif name in ksmeta.views: + return ksmeta.views[name] raise ObjectNotFound("%r not found in keyspace %r" % (name, ks)) @@ -1151,7 +1173,22 @@ class Shell(cmd.Cmd): return result - def parse_for_table_meta(self, query_string): + def parse_for_select_meta(self, query_string): + try: + parsed = cqlruleset.cql_parse(query_string)[1] + except IndexError: + return None + ks = self.cql_unprotect_name(parsed.get_binding('ksname', None)) + name = self.cql_unprotect_name(parsed.get_binding('cfname', None)) + try: + return self.get_table_meta(ks, name) + except ColumnFamilyNotFound: + try: + return self.get_view_meta(ks, name) + except MaterializedViewNotFound: + raise ObjectNotFound("%r not found in keyspace %r" % (name, ks)) + + def parse_for_update_meta(self, query_string): try: parsed = cqlruleset.cql_parse(query_string)[1] except IndexError: @@ -1182,7 +1219,7 @@ class Shell(cmd.Cmd): return False, None if statement.query_string[:6].lower() == 'select': - self.print_result(rows, self.parse_for_table_meta(statement.query_string)) + self.print_result(rows, self.parse_for_select_meta(statement.query_string)) elif statement.query_string.lower().startswith("list users") or statement.query_string.lower().startswith("list roles"): self.print_result(rows, self.get_table_meta('system_auth', 'roles')) elif statement.query_string.lower().startswith("list"): @@ -1190,7 +1227,7 @@ class Shell(cmd.Cmd): elif rows: # CAS INSERT/UPDATE self.writeresult("") - self.print_static_result(rows, self.parse_for_table_meta(statement.query_string)) + self.print_static_result(rows, self.parse_for_update_meta(statement.query_string)) self.flush_output() return True, future @@ -1369,6 +1406,16 @@ class Shell(cmd.Cmd): out.write(self.get_index_meta(ksname, idxname).export_as_string()) out.write("\n") + def print_recreate_materialized_view(self, ksname, viewname, out): + """ + Output CQL commands which should be pasteable back into a CQL session + to recreate the given materialized view. + + Writes output to the given out stream. + """ + out.write(self.get_view_meta(ksname, viewname).export_as_string()) + out.write("\n") + def print_recreate_object(self, ks, name, out): """ Output CQL commands which should be pasteable back into a CQL session @@ -1403,6 +1450,15 @@ class Shell(cmd.Cmd): self.print_recreate_index(ksname, idxname, sys.stdout) print + def describe_materialized_view(self, ksname, viewname): + if ksname is None: + ksname = self.current_keyspace + if ksname is None: + raise NoKeyspaceError("No keyspace specified and no current keyspace") + print + self.print_recreate_materialized_view(ksname, viewname, sys.stdout) + print + def describe_object(self, ks, name): print self.print_recreate_object(ks, name, sys.stdout) @@ -1564,6 +1620,12 @@ class Shell(cmd.Cmd): In some cases, there may be index metadata which is not representable and which will not be shown. + DESCRIBE MATERIALIZED VIEW + + Output CQL commands that could be used to recreate the given materialized view. + In some cases, there may be materialized view metadata which is not representable + and which will not be shown. + DESCRIBE CLUSTER Output information about the connected Cassandra cluster, such as the @@ -1596,7 +1658,8 @@ class Shell(cmd.Cmd): DESCRIBE Output CQL commands that could be used to recreate the entire object schema, - where object can be either a keyspace or a table or an index (in this order). + where object can be either a keyspace or a table or an index or a materialized + view (in this order). """ what = parsed.matched[1][1].lower() if what == 'functions': @@ -1631,6 +1694,10 @@ class Shell(cmd.Cmd): ks = self.cql_unprotect_name(parsed.get_binding('ksname', None)) idx = self.cql_unprotect_name(parsed.get_binding('idxname', None)) self.describe_index(ks, idx) + elif what == 'materialized' and parsed.matched[2][1].lower() == 'view': + ks = self.cql_unprotect_name(parsed.get_binding('ksname', None)) + mv = self.cql_unprotect_name(parsed.get_binding('mvname')) + self.describe_materialized_view(ks, mv) elif what in ('columnfamilies', 'tables'): self.describe_columnfamilies(self.current_keyspace) elif what == 'types': @@ -1650,6 +1717,8 @@ class Shell(cmd.Cmd): name = self.cql_unprotect_name(parsed.get_binding('cfname')) if not name: name = self.cql_unprotect_name(parsed.get_binding('idxname', None)) + if not name: + name = self.cql_unprotect_name(parsed.get_binding('mvname', None)) self.describe_object(ks, name) do_desc = do_describe diff --git a/lib/cassandra-driver-internal-only-3.0.0a2.post0-9f91a6d.zip b/lib/cassandra-driver-internal-only-3.0.0a2.post0-03085e6.zip similarity index 81% rename from lib/cassandra-driver-internal-only-3.0.0a2.post0-9f91a6d.zip rename to lib/cassandra-driver-internal-only-3.0.0a2.post0-03085e6.zip index ff4d150a359751badfb8f42fade2a626151edd92..e672bd9daa655b42f5bc9040257e5b76595aff31 100644 GIT binary patch delta 21728 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 delta 21668 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 ::= ( ksname= dot="." )? cfname= ; + ::= ( ksname= dot="." )? mvname= ; + ::= ( ksname= dot="." )? utname= ; ::= ksname= ; @@ -559,6 +561,7 @@ def cf_ks_name_completer(ctxt, cass): return [maybe_escape_name(ks) + '.' for ks in cass.get_keyspace_names()] completer_for('columnFamilyName', 'ksname')(cf_ks_name_completer) +completer_for('materializedViewName', 'ksname')(cf_ks_name_completer) def cf_ks_dot_completer(ctxt, cass): @@ -568,6 +571,7 @@ def cf_ks_dot_completer(ctxt, cass): return [] completer_for('columnFamilyName', 'dot')(cf_ks_dot_completer) +completer_for('materializedViewName', 'dot')(cf_ks_dot_completer) @completer_for('columnFamilyName', 'cfname') @@ -583,6 +587,20 @@ def cf_name_completer(ctxt, cass): raise return map(maybe_escape_name, cfnames) + +@completer_for('materializedViewName', 'mvname') +def mv_name_completer(ctxt, cass): + ks = ctxt.get_binding('ksname', None) + if ks is not None: + ks = dequote_name(ks) + try: + mvnames = cass.get_materialized_view_names(ks) + except Exception: + if ks is None: + return () + raise + return map(maybe_escape_name, mvnames) + completer_for('userTypeName', 'ksname')(cf_ks_name_completer) completer_for('userTypeName', 'dot')(cf_ks_dot_completer) @@ -639,7 +657,7 @@ syntax_rules += r''' ::= "USE" ; ::= "SELECT" ( "JSON" )? - "FROM" cf= + "FROM" (cf= | mv=) ( "WHERE" )? ( "ORDER" "BY" ( "," )* )? ( "LIMIT" limit= )? @@ -1133,7 +1151,7 @@ syntax_rules += r''' ( "USING" ( "WITH" "OPTIONS" "=" )? )? ; - ::= "CREATE" "MATERIALIZED" "VIEW" ("IF" "NOT" "EXISTS")? ? + ::= "CREATE" "MATERIALIZED" "VIEW" ("IF" "NOT" "EXISTS")? ? "AS" "PRIMARY" "KEY" ; @@ -1195,7 +1213,7 @@ syntax_rules += r''' ::= "DROP" "INDEX" ("IF" "EXISTS")? idx= ; - ::= "DROP" "MATERIALIZED" "VIEW" ("IF" "EXISTS")? mv= + ::= "DROP" "MATERIALIZED" "VIEW" ("IF" "EXISTS")? mv= ; ::= "DROP" "TYPE" ut= diff --git a/src/java/org/apache/cassandra/service/MigrationListener.java b/src/java/org/apache/cassandra/service/MigrationListener.java index f4b3e7cdad..9e240ead29 100644 --- a/src/java/org/apache/cassandra/service/MigrationListener.java +++ b/src/java/org/apache/cassandra/service/MigrationListener.java @@ -83,6 +83,7 @@ public abstract class MigrationListener public void onDropView(String ksName, String viewName) { + onDropColumnFamily(ksName, viewName); } public void onDropUserType(String ksName, String typeName)