You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by bl...@apache.org on 2015/09/18 11:40:39 UTC
[1/2] cassandra git commit: Add DESCRIBE MATERIALIZED VIEW to cqlsh
Repository: cassandra
Updated Branches:
refs/heads/trunk 21b134c2e -> b653411f0
Add DESCRIBE MATERIALIZED VIEW to cqlsh
patch by Stefania Alborghetti; reviewed by Benjamin Lerer for CASSANDRA-9961
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/aeee9f74
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/aeee9f74
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/aeee9f74
Branch: refs/heads/trunk
Commit: aeee9f74d9095a802a23f1a47be021ede6fb65bc
Parents: e6f23e6
Author: Stefania Alborghetti <st...@datastax.com>
Authored: Fri Sep 18 11:33:54 2015 +0200
Committer: blerer <be...@datastax.com>
Committed: Fri Sep 18 11:33:54 2015 +0200
----------------------------------------------------------------------
bin/cqlsh.py | 79 +++++++++++++++++--
...iver-internal-only-3.0.0a2.post0-03085e6.zip | Bin 0 -> 230830 bytes
...iver-internal-only-3.0.0a2.post0-9f91a6d.zip | Bin 230797 -> 0 bytes
pylib/cqlshlib/cql3handling.py | 24 +++++-
.../cassandra/service/MigrationListener.java | 1 +
5 files changed, 96 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/aeee9f74/bin/cqlsh.py
----------------------------------------------------------------------
diff --git a/bin/cqlsh.py b/bin/cqlsh.py
index 529b1c8..41fa4fd 100644
--- a/bin/cqlsh.py
+++ b/bin/cqlsh.py
@@ -289,12 +289,13 @@ cqlsh_extra_syntax_rules = r'''
| "KEYSPACE" ksname=<keyspaceName>?
| ( "COLUMNFAMILY" | "TABLE" ) cf=<columnFamilyName>
| "INDEX" idx=<indexName>
+ | "MATERIALIZED" "VIEW" mv=<materializedViewName>
| ( "COLUMNFAMILIES" | "TABLES" )
| "FULL"? "SCHEMA"
| "CLUSTER"
| "TYPES"
| "TYPE" ut=<userTypeName>
- | (ksname=<keyspaceName> | cf=<columnFamilyName> | idx=<indexName>))
+ | (ksname=<keyspaceName> | cf=<columnFamilyName> | idx=<indexName> | mv=<materializedViewName>))
;
<consistencyCommand> ::= "CONSISTENCY" ( level=<consistencyLevel> )?
@@ -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 <viewname>
+
+ 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 <objname>
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
http://git-wip-us.apache.org/repos/asf/cassandra/blob/aeee9f74/lib/cassandra-driver-internal-only-3.0.0a2.post0-03085e6.zip
----------------------------------------------------------------------
diff --git a/lib/cassandra-driver-internal-only-3.0.0a2.post0-03085e6.zip b/lib/cassandra-driver-internal-only-3.0.0a2.post0-03085e6.zip
new file mode 100644
index 0000000..e672bd9
Binary files /dev/null and b/lib/cassandra-driver-internal-only-3.0.0a2.post0-03085e6.zip differ
http://git-wip-us.apache.org/repos/asf/cassandra/blob/aeee9f74/lib/cassandra-driver-internal-only-3.0.0a2.post0-9f91a6d.zip
----------------------------------------------------------------------
diff --git a/lib/cassandra-driver-internal-only-3.0.0a2.post0-9f91a6d.zip b/lib/cassandra-driver-internal-only-3.0.0a2.post0-9f91a6d.zip
deleted file mode 100644
index ff4d150..0000000
Binary files a/lib/cassandra-driver-internal-only-3.0.0a2.post0-9f91a6d.zip and /dev/null differ
http://git-wip-us.apache.org/repos/asf/cassandra/blob/aeee9f74/pylib/cqlshlib/cql3handling.py
----------------------------------------------------------------------
diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py
index e4b2bfa..94b132f 100644
--- a/pylib/cqlshlib/cql3handling.py
+++ b/pylib/cqlshlib/cql3handling.py
@@ -283,6 +283,8 @@ JUNK ::= /([ \t\r\f\v]+|(--|[/][/])[^\n\r]*([\n\r]|$)|[/][*].*?[*][/])/ ;
<columnFamilyName> ::= ( ksname=<cfOrKsName> dot="." )? cfname=<cfOrKsName> ;
+<materializedViewName> ::= ( ksname=<cfOrKsName> dot="." )? mvname=<cfOrKsName> ;
+
<userTypeName> ::= ( ksname=<cfOrKsName> dot="." )? utname=<cfOrKsName> ;
<keyspaceName> ::= ksname=<cfOrKsName> ;
@@ -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'''
<useStatement> ::= "USE" <keyspaceName>
;
<selectStatement> ::= "SELECT" ( "JSON" )? <selectClause>
- "FROM" cf=<columnFamilyName>
+ "FROM" (cf=<columnFamilyName> | mv=<materializedViewName>)
( "WHERE" <whereClause> )?
( "ORDER" "BY" <orderByClause> ( "," <orderByClause> )* )?
( "LIMIT" limit=<wholenumber> )?
@@ -1133,7 +1151,7 @@ syntax_rules += r'''
( "USING" <stringLiteral> ( "WITH" "OPTIONS" "=" <mapLiteral> )? )?
;
-<createMaterializedViewStatement> ::= "CREATE" "MATERIALIZED" "VIEW" ("IF" "NOT" "EXISTS")? <columnFamilyName>?
+<createMaterializedViewStatement> ::= "CREATE" "MATERIALIZED" "VIEW" ("IF" "NOT" "EXISTS")? <materializedViewName>?
"AS" <selectStatement>
"PRIMARY" "KEY" <pkDef>
;
@@ -1195,7 +1213,7 @@ syntax_rules += r'''
<dropIndexStatement> ::= "DROP" "INDEX" ("IF" "EXISTS")? idx=<indexName>
;
-<dropMaterializedViewStatement> ::= "DROP" "MATERIALIZED" "VIEW" ("IF" "EXISTS")? mv=<columnFamilyName>
+<dropMaterializedViewStatement> ::= "DROP" "MATERIALIZED" "VIEW" ("IF" "EXISTS")? mv=<materializedViewName>
;
<dropUserTypeStatement> ::= "DROP" "TYPE" ut=<userTypeName>
http://git-wip-us.apache.org/repos/asf/cassandra/blob/aeee9f74/src/java/org/apache/cassandra/service/MigrationListener.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/MigrationListener.java b/src/java/org/apache/cassandra/service/MigrationListener.java
index f4b3e7c..9e240ea 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)
[2/2] cassandra git commit: Merge branch cassandra-3.0 into trunk
Posted by bl...@apache.org.
Merge branch cassandra-3.0 into trunk
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/b653411f
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/b653411f
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/b653411f
Branch: refs/heads/trunk
Commit: b653411f01fd11e031699ebf97d899e4968ec4ad
Parents: 21b134c aeee9f7
Author: blerer <be...@datastax.com>
Authored: Fri Sep 18 11:38:06 2015 +0200
Committer: blerer <be...@datastax.com>
Committed: Fri Sep 18 11:38:34 2015 +0200
----------------------------------------------------------------------
bin/cqlsh.py | 79 +++++++++++++++++--
...iver-internal-only-3.0.0a2.post0-03085e6.zip | Bin 0 -> 230830 bytes
...iver-internal-only-3.0.0a2.post0-9f91a6d.zip | Bin 230797 -> 0 bytes
pylib/cqlshlib/cql3handling.py | 24 +++++-
.../cassandra/service/MigrationListener.java | 1 +
5 files changed, 96 insertions(+), 8 deletions(-)
----------------------------------------------------------------------