You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by fe...@apache.org on 2016/01/24 19:05:00 UTC

[6/6] incubator-zeppelin git commit: [ZEPPELIN-559] Cassandra interpreter v2

[ZEPPELIN-559] Cassandra interpreter v2

### What is this PR for?
* Update the **Cassandra** interpreter to V2 to support new **schema commands** to describe **Cassandra** 3.x features:
    * User Defined Functions
    * User Defined Aggregates
    * Materialized Views
* Add support for single line comment using **double slashes** (//)
* Add **DESCRIBE TYPES**
* The Java driver version is bumped to **3.0.0-rc1**
* The contextual **HELP menu** is also updated and a _ChangeLog_ section is added.

### What type of PR is it?
[Improvement]

### Todos
* [x] - Add new PR to update official Cassandra interpreter with new features
* [x] - Test steps executed and confirmed working by the community
* [x] - Code review by the community (warning, **Scala** inside)

### Is there a relevant Jira issue?
**[ZEPPELIN-559]**
**[ZEPPELIN-575]** for doc

### How should this be tested?
1. Download and install locally **[Cassandra 3.1.1]**
2. Start **Cassandra**
3. Clone this pull request locally with:
    1. _git fetch origin pull/600/head:CassandraInterpreterV2_
    2. _git checkout CassandraInterpreterV2_
4. Build this version of Zeppelin with _mvn clean package -DskipTests_
5. Start **Zeppelin** and update the property _cassandra.hosts_ of the **Cassandra** interpreter (set it to _localhost_ or _127.0.0.1_ depending on your configuration)
6. In a paragraph, execute all the **CQL** statements given in this **[CassandraInterpreterV2TestData.cql]** by copy-pasting them
7. Start a new _%cassandra_ paragraph and execute **DESCRIBE FUNCTION test.maxOf;**. You should be able to see:
![image](https://cloud.githubusercontent.com/assets/1532977/12138932/edaf45d4-b45c-11e5-8724-104085d6e30d.png)
8. Start a new _%cassandra_ paragraph and execute **DESCRIBE AGGREGATE test.group_by;**. You should be able to see:
![image](https://cloud.githubusercontent.com/assets/1532977/12138970/2ecd784c-b45d-11e5-9076-a7b674439fa5.png)
9. Start a new _%cassandra_ paragraph and execute **DESCRIBE MATERIALIZED VIEW test.user_by_country;**. You should be able to see:
![image](https://cloud.githubusercontent.com/assets/1532977/12139025/a223a104-b45d-11e5-8331-b97323016fa3.png)
10. Start a new _%cassandra_ paragraph and execute **SELECT id,val1,val2,maxOf(val1,val2) FROM test.test_max;**. You should be able to see:
![image](https://cloud.githubusercontent.com/assets/1532977/12139046/c43febf8-b45d-11e5-9b96-290aff23730e.png)
11. Start a new _%cassandra_ paragraph and execute **SELECT group_by(category,sales_count) FROM test.items;**. You should be able to see:
![image](https://cloud.githubusercontent.com/assets/1532977/12139071/fb06b1e4-b45d-11e5-9077-6ec3275c1319.png)
12. Start a new _%cassandra_ paragraph and execute **SELECT * FROM test.user_by_country WHERE country='FR';**. You should be able to see:
![image](https://cloud.githubusercontent.com/assets/1532977/12139085/1671f3d0-b45e-11e5-9dc2-4bf6bd87e84e.png)

### Questions:
* Does the licenses files need update? --> **No**
* Is there breaking changes for older versions? --> **No**
* Does this needs documentation? --> **Yes**

[ZEPPELIN-559]: https://issues.apache.org/jira/browse/ZEPPELIN-559
[ZEPPELIN-575]: https://issues.apache.org/jira/browse/ZEPPELIN-575
[Cassandra 3.1.1]: http://cassandra.apache.org/download/
[CassandraInterpreterV2TestData.cql]: https://gist.githubusercontent.com/doanduyhai/5d88aaf3820be28474d2/raw/e5b5d9c325a17a58c2f27bff454db999fd3a3a66/CassandraInterpreterV2TestData.cql

Author: DuyHai DOAN <do...@gmail.com>

Closes #600 from doanduyhai/CassandraInterpreter-V2 and squashes the following commits:

36e3bdb [DuyHai DOAN] Fix random test failure
a2d831b [DuyHai DOAN] Refactor after code review
41b8667 [DuyHai DOAN] Tune regular expression for FUNCTION creation pattern
138804c [DuyHai DOAN] Fix CSS style for UDF & MV in menu display
6509da5 [DuyHai DOAN] Fix failing tests
7a5ac39 [DuyHai DOAN] Update RegExp for UDF creation to fix multiple statements match
6ea9e55 [DuyHai DOAN] Update help menu and changelog
6b46076 [DuyHai DOAN] Add Support for UDF, UDA and Materialized Views
058161d [DuyHai DOAN] Upgrade Java driver version to 3.0.0-rc1


Project: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/commit/11a45e2e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/tree/11a45e2e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/diff/11a45e2e

Branch: refs/heads/master
Commit: 11a45e2e225b404e5ca5f2f2137217202895d2d8
Parents: 9308ee1
Author: DuyHai DOAN <do...@gmail.com>
Authored: Sun Jan 10 15:44:53 2016 +0100
Committer: Felix Cheung <fe...@apache.org>
Committed: Sun Jan 24 10:04:46 2016 -0800

----------------------------------------------------------------------
 cassandra/pom.xml                               |  30 +-
 .../main/resources/scalate/aggregateDetails.ssp |  81 ++
 .../main/resources/scalate/allAggregates.ssp    |  68 ++
 .../src/main/resources/scalate/allFunctions.ssp |  68 ++
 .../resources/scalate/allMaterializedViews.ssp  |  68 ++
 .../src/main/resources/scalate/allTables.ssp    |   8 -
 .../src/main/resources/scalate/allUDTs.ssp      |  61 ++
 .../scalate/dropDownMenuForKeyspace.ssp         |  37 +-
 .../main/resources/scalate/functionDetails.ssp  |  77 ++
 .../src/main/resources/scalate/helpMenu.ssp     | 135 ++-
 .../main/resources/scalate/keyspaceContent.ssp  |  90 ++
 .../main/resources/scalate/keyspaceDetails.ssp  |   2 +-
 .../scalate/materializedViewDetails.ssp         | 109 +++
 cassandra/src/main/resources/scalate/menu.ssp   |  22 +-
 .../src/main/resources/scalate/tableDetails.ssp |  83 +-
 .../src/main/resources/scalate/udtDetails.ssp   |   2 +-
 .../driver/core/TableMetadataWrapper.scala      |  23 +
 .../zeppelin/cassandra/DisplaySystem.scala      | 417 +++++++--
 .../zeppelin/cassandra/EnhancedSession.scala    | 108 ++-
 .../zeppelin/cassandra/InterpreterLogic.scala   |  25 +-
 .../zeppelin/cassandra/MetaDataHierarchy.scala  |  31 +-
 .../zeppelin/cassandra/ParagraphParser.scala    | 188 +++-
 .../zeppelin/cassandra/TextBlockHierarchy.scala |  54 +-
 .../cassandra/CassandraInterpreterTest.java     | 114 ++-
 .../cassandra/InterpreterLogicTest.java         |   4 +-
 .../test/resources/scalate/DescribeCluster.html |  99 +--
 .../scalate/DescribeKeyspace_live_data.html     | 820 +----------------
 .../resources/scalate/DescribeKeyspaces.html    | 401 +--------
 .../DescribeTable_live_data_complex_table.html  | 327 +------
 .../scalate/DescribeType_live_data_address.html | 138 +--
 ...ve_data_address_within_current_keyspace.html | 138 +--
 cassandra/src/test/resources/scalate/Help.html  | 871 +------------------
 .../cassandra/ParagraphParserTest.scala         | 544 ++++++++++--
 33 files changed, 2122 insertions(+), 3121 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/cassandra/pom.xml b/cassandra/pom.xml
index 57b501a..1b825b4 100644
--- a/cassandra/pom.xml
+++ b/cassandra/pom.xml
@@ -35,18 +35,19 @@
     <url>http://zeppelin.incubator.apache.org</url>
 
     <properties>
-        <cassandra.driver.version>2.1.7.1</cassandra.driver.version>
+        <cassandra.driver.version>3.0.0-rc1</cassandra.driver.version>
         <snappy.version>1.0.5.4</snappy.version>
-        <lz4.version>1.2.0</lz4.version>
-        <scala.version>2.11.7</scala.version>
-        <scala.binary.version>2.11</scala.binary.version>
-        <commons-lang.version>3.4</commons-lang.version>
+        <lz4.version>1.3.0</lz4.version>
+        <scala.version>2.10.4</scala.version>
+        <scala.binary.version>2.10</scala.binary.version>
+        <commons-lang.version>3.3.2</commons-lang.version>
         <scalate.version>1.7.1</scalate.version>
+        <cassandra.guava.version>16.0.1</cassandra.guava.version>
 
         <!--TEST-->
         <scalatest.version>2.2.4</scalatest.version>
         <junit.version>4.12</junit.version>
-        <achilles.version>3.2.2</achilles.version>
+        <achilles.version>3.2.4-Zeppelin</achilles.version>
         <assertj.version>1.7.0</assertj.version>
         <mockito.version>1.9.5</mockito.version>
     </properties>
@@ -65,6 +66,12 @@
             <version>${cassandra.driver.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>${cassandra.guava.version}</version>
+        </dependency>
+
         <!-- Compression libraries for the cassandra-driver protocol. -->
         <!-- Include both compression options to make to simplify deployment. -->
 
@@ -130,7 +137,7 @@
 
         <dependency>
             <groupId>info.archinnov</groupId>
-            <artifactId>achilles-junit</artifactId>
+            <artifactId>achilles-embedded</artifactId>
             <version>${achilles.version}</version>
             <scope>test</scope>
             <exclusions>
@@ -146,13 +153,6 @@
         </dependency>
 
         <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>16.0</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
             <version>${mockito.version}</version>
@@ -167,7 +167,6 @@
         </dependency>
     </dependencies>
 
-
     <build>
         <plugins>
             <!-- Plugin to compile Scala code -->
@@ -293,7 +292,6 @@
                     </execution>
                 </executions>
             </plugin>
-
         </plugins>
     </build>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/aggregateDetails.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/aggregateDetails.ssp b/cassandra/src/main/resources/scalate/aggregateDetails.ssp
new file mode 100644
index 0000000..02800a2
--- /dev/null
+++ b/cassandra/src/main/resources/scalate/aggregateDetails.ssp
@@ -0,0 +1,81 @@
+<%--
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*    http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+--%>
+#import(org.apache.zeppelin.cassandra.MetaDataHierarchy._)
+<%@ val sameNameAggregateDetails: SameNameAggregateDetails %>
+<%@ val withCaption: Boolean%>
+<div class="row">
+    <div class="col-md-2"/>
+    <div class="col-md-8 col-offset-md-2">
+        #for (aggregate <- sameNameAggregateDetails.aggregates)    
+        <div class="panel panel-default table-responsive table-bordered">
+            <table class="table">
+                #if(withCaption)
+                <caption><h4 class="text-success"><i class="glyphicon glyphicon-retweet"/>&nbsp;${aggregate.name}</h4></caption>
+                #end
+                <tbody>
+                    <tr>
+                        <td class="col-md-6"><strong>Keyspace</strong></td>
+                        <td class="col-md-6 text-danger">${aggregate.keyspace}</td>
+                    </tr>
+                    <tr>
+                        <td class="col-md-6"><strong>Arguments</strong></td>
+                        <td class="col-md-6">${aggregate.arguments.toList.mkString(", ")}</td>
+                    </tr>
+                    <tr>
+                        <td class="col-md-6"><strong>State Function</strong></td>                        
+                        <td class="col-md-6">${aggregate.sFunc}</td>
+                    </tr>
+                    <tr>
+                        <td class="col-md-6"><strong>State Type</strong></td>                        
+                        <td class="col-md-6">${aggregate.sType}</td>
+                    </tr>
+                    #if(aggregate.finalFunc.isDefined)                                     
+                    <tr>
+                        <td class="col-md-6"><strong>Final Function</strong></td>                        
+                        <td class="col-md-6">${aggregate.finalFunc.get}</td>
+                    </tr>                       
+                    #end
+                    #if(aggregate.initCond.isDefined)
+                    <tr>
+                        <td class="col-md-6"><strong>Initial State</strong></td>                        
+                        <td class="col-md-6">${aggregate.initCond.get}</td>
+                    </tr>
+                    #end
+                    <tr>
+                        <td class="col-md-6"><strong>Return type</strong></td>
+                        <td class="col-md-6">${aggregate.returnType}</td>
+                    </tr>                                     
+                </tbody>
+            </table>
+            <div class="panel-footer">
+                <a data-toggle="collapse" data-target="#${aggregate.uniqueId}_asCQL">
+                    <strong>As CQL statement</strong>
+                    <span class="caret"></span>
+                </a>
+                <br/><br/>
+                <div class="text-success collapse" id="${aggregate.uniqueId}_asCQL">
+                    <pre class="well">${aggregate.asCQL}</pre>
+                </div>
+            </div>
+        </div>
+        <hr/>
+        #end
+    </div>
+    <div class="col-md-2"></div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/allAggregates.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/allAggregates.ssp b/cassandra/src/main/resources/scalate/allAggregates.ssp
new file mode 100644
index 0000000..f093c50
--- /dev/null
+++ b/cassandra/src/main/resources/scalate/allAggregates.ssp
@@ -0,0 +1,68 @@
+<%--
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*    http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+--%>
+
+#import(org.apache.zeppelin.cassandra.MetaDataHierarchy._)
+#import(java.util.UUID)
+<%@ val allAggregates: Map[(UUID, String), List[AggregateSummary]] %>
+
+<div class="container">
+
+    <div class="row">
+        <div class="panel-group" role="tablist" aria-multiselectable="true">
+            #for (((ksId,ksName), aggregates) <- allAggregates)
+            <div class="panel panel-default">
+                <div class="panel-heading" role="tab">
+                    <h4 class="panel-title">
+                        <a role="button" data-toggle="collapse" data-target="#${ksId}" aria-expanded="false">
+                            <span class="text-danger"><i class="glyphicon glyphicon-folder-open"/>&nbsp;&nbsp;${ksName}</span>
+                        </a>
+                    </h4>
+                </div>
+                <div id="${ksId}" class="panel-collapse collapse" role="tabpanel">
+                    <div class="panel-body">
+                        <div class="row">
+                            <div class="col-md-2"/>
+                            <div class="col-md-8 col-offset-md-2 table-responsive table-bordered">
+                                <table class="table">
+                                    <thead>
+                                        <tr>
+                                            <th>Aggregate</th>
+                                            <th>Return Type</th>
+                                        </tr>
+                                    </thead>
+                                    <tbody>
+                                        #for (aggregate <- aggregates)
+                                        <tr class="text-success">
+                                            <td>${aggregate.name + aggregate.arguments.mkString("(", ", ", ")")}</td>
+                                            <td>${aggregate.returnType}</td>
+                                        </tr>
+                                        #end
+
+                                    </tbody>
+                                </table>
+                            </div>
+                            <div class="col-md-2"/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            #end
+        </div>
+    </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/allFunctions.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/allFunctions.ssp b/cassandra/src/main/resources/scalate/allFunctions.ssp
new file mode 100644
index 0000000..fc756a4
--- /dev/null
+++ b/cassandra/src/main/resources/scalate/allFunctions.ssp
@@ -0,0 +1,68 @@
+<%--
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*    http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+--%>
+
+#import(org.apache.zeppelin.cassandra.MetaDataHierarchy._)
+#import(java.util.UUID)
+<%@ val allFunctions: Map[(UUID, String), List[FunctionSummary]] %>
+
+<div class="container">
+
+    <div class="row">
+        <div class="panel-group" role="tablist" aria-multiselectable="true">
+            #for (((ksId,ksName), functions) <- allFunctions)
+            <div class="panel panel-default">
+                <div class="panel-heading" role="tab">
+                    <h4 class="panel-title">
+                        <a role="button" data-toggle="collapse" data-target="#${ksId}" aria-expanded="false">
+                            <span class="text-danger"><i class="glyphicon glyphicon-folder-open"/>&nbsp;&nbsp;${ksName}</span>
+                        </a>
+                    </h4>
+                </div>
+                <div id="${ksId}" class="panel-collapse collapse" role="tabpanel">
+                    <div class="panel-body">
+                        <div class="row">
+                            <div class="col-md-2"/>
+                            <div class="col-md-8 col-offset-md-2 table-responsive table-bordered">
+                                <table class="table">
+                                    <thead>
+                                        <tr>
+                                            <th>Function</th>
+                                            <th>Return Type</th>
+                                        </tr>
+                                    </thead>
+                                    <tbody>
+                                        #for (function <- functions)
+                                        <tr class="text-success">
+                                            <td>${function.name + function.arguments.mkString("(",", ", ")")}</td>
+                                            <td>${function.returnType}</td>
+                                        </tr>
+                                        #end
+
+                                    </tbody>
+                                </table>
+                            </div>
+                            <div class="col-md-2"/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            #end
+        </div>
+    </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/allMaterializedViews.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/allMaterializedViews.ssp b/cassandra/src/main/resources/scalate/allMaterializedViews.ssp
new file mode 100644
index 0000000..8ffee57
--- /dev/null
+++ b/cassandra/src/main/resources/scalate/allMaterializedViews.ssp
@@ -0,0 +1,68 @@
+<%--
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*    http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+--%>
+#import(org.apache.zeppelin.cassandra.MetaDataHierarchy._)
+#import(java.util.UUID)
+<%@ val allMVs: Map[(UUID,String),List[MaterializedViewSummary]] %>
+<div class="container">
+
+    <div class="row">
+        <div class="panel-group" role="tablist" aria-multiselectable="true">
+            #for (((ksId,ksName), mvs) <- allMVs)
+            <div class="panel panel-default">
+                <div class="panel-heading" role="tab">
+                    <h4 class="panel-title">
+                        <a role="button" data-toggle="collapse" data-target="#${ksId}" aria-expanded="false">
+                            <span class="text-danger"><i class="glyphicon glyphicon-folder-open"/>&nbsp;&nbsp;${ksName}</span>
+                        </a>
+                    </h4>
+                </div>
+                <div id="${ksId}" class="panel-collapse collapse" role="tabpanel">
+                    <div class="panel-body">
+                        <div class="row">
+                            <div class="col-md-2"/>
+                            <div class="col-md-8 col-offset-md-2 table-responsive table-bordered">
+                                <table class="table">
+                                    <thead>
+                                        <tr><th>Materialized View</th></tr>
+                                    </thead>
+                                    <tbody>
+                                        #for (mv <- mvs)
+
+                                        <tr class="text-primary">
+                                            <td>
+                                                ${mv.name}
+                                                &nbsp;<i class="glyphicon glyphicon-arrow-right"/>
+                                                &nbsp;<i class="glyphicon glyphicon-th-list"/>
+                                                &nbsp;${mv.baseTable}
+                                            </td>
+                                        </tr>
+                                        #end
+
+                                    </tbody>
+                                </table>
+                            </div>
+                            <div class="col-md-2"/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            #end
+        </div>
+    </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/allTables.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/allTables.ssp b/cassandra/src/main/resources/scalate/allTables.ssp
index b363bee..810881b 100644
--- a/cassandra/src/main/resources/scalate/allTables.ssp
+++ b/cassandra/src/main/resources/scalate/allTables.ssp
@@ -24,7 +24,6 @@
     <div class="row">
         <div class="panel-group" role="tablist" aria-multiselectable="true">
             #for (((ksId,ksName), tables) <- allTables)
-
             <div class="panel panel-default">
                 <div class="panel-heading" role="tab">
                     <h4 class="panel-title">
@@ -38,8 +37,6 @@
                         <div class="row">
                             <div class="col-md-2"/>
                             <div class="col-md-8 col-offset-md-2 table-responsive table-bordered">
-                                #if (tables.nonEmpty)
-
                                 <table class="table">
                                     <thead>
                                         <tr><th>Tables</th></tr>
@@ -52,10 +49,6 @@
 
                                     </tbody>
                                 </table>
-                                #else
-                                <span><h4>No Table</h4></span>
-
-                                #end
                             </div>
                             <div class="col-md-2"/>
                         </div>
@@ -63,7 +56,6 @@
                 </div>
             </div>
             #end
-
         </div>
     </div>
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/allUDTs.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/allUDTs.ssp b/cassandra/src/main/resources/scalate/allUDTs.ssp
new file mode 100644
index 0000000..559ef41
--- /dev/null
+++ b/cassandra/src/main/resources/scalate/allUDTs.ssp
@@ -0,0 +1,61 @@
+<%--
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*    http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+--%>
+#import(org.apache.zeppelin.cassandra.MetaDataHierarchy._)
+#import(java.util.UUID)
+<%@ val allUDTs: Map[(UUID,String),List[String]] %>
+<div class="container">
+
+    <div class="row">
+        <div class="panel-group" role="tablist" aria-multiselectable="true">
+            #for (((ksId,ksName), udts) <- allUDTs)
+            <div class="panel panel-default">
+                <div class="panel-heading" role="tab">
+                    <h4 class="panel-title">
+                        <a role="button" data-toggle="collapse" data-target="#${ksId}" aria-expanded="false">
+                            <span class="text-danger"><i class="glyphicon glyphicon-folder-open"/>&nbsp;&nbsp;${ksName}</span>
+                        </a>
+                    </h4>
+                </div>
+                <div id="${ksId}" class="panel-collapse collapse" role="tabpanel">
+                    <div class="panel-body">
+                        <div class="row">
+                            <div class="col-md-2"/>
+                            <div class="col-md-8 col-offset-md-2 table-responsive table-bordered">
+                                <table class="table">
+                                    <thead>
+                                        <tr><th>UDT</th></tr>
+                                    </thead>
+                                    <tbody>
+                                        #for (udt <- udts)
+
+                                        <tr class="text-warning"><td>${udt}</td></tr>
+                                        #end
+
+                                    </tbody>
+                                </table>
+                            </div>
+                            <div class="col-md-2"/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            #end
+        </div>
+    </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/dropDownMenuForKeyspace.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/dropDownMenuForKeyspace.ssp b/cassandra/src/main/resources/scalate/dropDownMenuForKeyspace.ssp
index 74f6fbc..6c2aad1 100644
--- a/cassandra/src/main/resources/scalate/dropDownMenuForKeyspace.ssp
+++ b/cassandra/src/main/resources/scalate/dropDownMenuForKeyspace.ssp
@@ -35,8 +35,19 @@
                 #end
             #end
 
-            #if(ksContent.udts.nonEmpty)
+            #if(ksContent.views.nonEmpty)
+                <li role="separator" class="divider text-muted"></li>
+                <li class="dropdown-header"><span class="text-primary">Materialized Views</span></li>
+                #for((id,name,_) <- ksContent.views)
+                    <li>
+                    <a role="button" data-toggle="collapse" data-target="#${id}">
+                    <span class="text-primary"><i class="glyphicon glyphicon-eye-open"/>&nbsp;${name}</span>
+                    </a>
+                    </li>
+                #end
+            #end
 
+            #if(ksContent.udts.nonEmpty)
             <li role="separator" class="divider text-muted"></li>
             <li class="dropdown-header"><span class="text-warning">User Defined Types</span></li>
                 #for((id,name,_) <- ksContent.udts)
@@ -47,6 +58,30 @@
             </li>
                 #end
             #end
+
+            #if(ksContent.functions.nonEmpty)
+                <li role="separator" class="divider text-muted"></li>
+                <li class="dropdown-header"><span class="text-success">Functions</span></li>
+                #for((id,name,_) <- ksContent.functions)
+                    <li>
+                    <a role="button" data-toggle="collapse" data-target="#${id}">
+                    <span class="text-success"><i class="glyphicon glyphicon-random"/>&nbsp;${name}</span>
+                    </a>
+                    </li>
+                #end
+            #end
+
+            #if(ksContent.aggregates.nonEmpty)
+                <li role="separator" class="divider text-muted"></li>
+                <li class="dropdown-header"><span class="text-success">Aggregates</span></li>
+                #for((id,name,_) <- ksContent.aggregates)
+                    <li>
+                    <a role="button" data-toggle="collapse" data-target="#${id}">
+                    <span class="text-success"><i class="glyphicon glyphicon-retweet"/>&nbsp;${name}</span>
+                    </a>
+                    </li>
+                #end
+            #end
         </ul>
     </a>
 </li>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/functionDetails.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/functionDetails.ssp b/cassandra/src/main/resources/scalate/functionDetails.ssp
new file mode 100644
index 0000000..7d61400
--- /dev/null
+++ b/cassandra/src/main/resources/scalate/functionDetails.ssp
@@ -0,0 +1,77 @@
+<%--
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*    http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+--%>
+#import(org.apache.zeppelin.cassandra.MetaDataHierarchy._)
+<%@ val sameNameFunctionDetails: SameNameFunctionDetails %>
+<%@ val withCaption: Boolean%>
+<div class="row">
+    <div class="col-md-2"/>
+    <div class="col-md-8 col-offset-md-2">
+        #for (function <- sameNameFunctionDetails.functions)    
+        <div class="panel panel-default table-responsive table-bordered">
+            <table class="table">
+                #if(withCaption)
+                <caption><h4 class="text-success"><i class="glyphicon glyphicon-random"/>&nbsp;${function.name}</h4></caption>
+                #end
+                <tbody>
+                    <tr>
+                        <td class="col-md-6"><strong>Keyspace</strong></td>
+                        <td class="col-md-6 text-danger">${function.keyspace}</td>
+                    </tr>
+                    <tr>
+                        <td class="col-md-6"><strong>Arguments</strong></td>
+                        <td class="col-md-6">${function.arguments.toList.mkString(", ")}</td>
+                    </tr>
+                    <tr>
+                        <td class="col-md-6"><strong>Null Input</strong></td>
+                        #if(function.calledOnNullInput)
+                        <td class="col-md-6">CALLED ON NULL INPUT</td>
+                        #else
+                        <td class="col-md-6">RETURN NULL ON NULL INPUT</td>
+                        #end
+                    </tr>                    
+                    <tr>
+                        <td class="col-md-6"><strong>Return type</strong></td>
+                        <td class="col-md-6">${function.returnType}</td>
+                    </tr>                    
+                    <tr>
+                        <td class="col-md-6"><strong>Language</strong></td>
+                        <td class="col-md-6">${function.language}</td>
+                    </tr>                    
+                    <tr>
+                        <td class="col-md-6"><strong>Body</strong></td>
+                        <td class="col-md-6">${escape(function.body)}</td>
+                    </tr>                    
+                </tbody>
+            </table>
+            <div class="panel-footer">
+                <a data-toggle="collapse" data-target="#${function.uniqueId}_asCQL">
+                    <strong>As CQL statement</strong>
+                    <span class="caret"></span>
+                </a>
+                <br/><br/>
+                <div class="text-success collapse" id="${function.uniqueId}_asCQL">
+                    <pre class="well">${function.asCQL}</pre>
+                </div>
+            </div>
+        </div>
+        <hr/>
+        #end
+    </div>
+    <div class="col-md-2"></div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/helpMenu.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/helpMenu.ssp b/cassandra/src/main/resources/scalate/helpMenu.ssp
index 1c793ec..26ff117 100644
--- a/cassandra/src/main/resources/scalate/helpMenu.ssp
+++ b/cassandra/src/main/resources/scalate/helpMenu.ssp
@@ -27,7 +27,9 @@
 <%@ val preparedStatementsId: UUID = UUIDs.random() %>
 <%@ val dynamicFormsId: UUID = UUIDs.random() %>
 <%@ val configurationId: UUID = UUIDs.random() %>
-<%@ val miscId: UUID = UUIDs.random() %>
+<%@ val sharedStatesId: UUID = UUIDs.random() %>
+<%@ val changelogId: UUID = UUIDs.random() %>
+<%@ val contactsId: UUID = UUIDs.random() %>
 
 <br/>
 <br/>
@@ -70,10 +72,20 @@
                         </a>
                     </li>                    
                     <li>
-                        <a role="button" data-toggle="collapse" data-target="#${miscId}">
-                            <span class="text-info"><i class="glyphicon glyphicon-bookmark"/>&nbsp;&nbsp;Misc</span>
+                        <a role="button" data-toggle="collapse" data-target="#${sharedStatesId}">
+                            <span class="text-info"><i class="glyphicon glyphicon-bookmark"/>&nbsp;&nbsp;Shared States</span>
                         </a>
                     </li>                    
+                    <li>
+                        <a role="button" data-toggle="collapse" data-target="#${changelogId}">
+                            <span class="text-info"><i class="glyphicon glyphicon-bookmark"/>&nbsp;&nbsp;Change Log</span>
+                        </a>
+                    </li>                     
+                    <li>
+                        <a role="button" data-toggle="collapse" data-target="#${contactsId}">
+                            <span class="text-info"><i class="glyphicon glyphicon-bookmark"/>&nbsp;&nbsp;Contacts &amp; Bugs</span>
+                        </a>
+                    </li>                      
                 </ul>
             </a>
         </li>
@@ -91,12 +103,12 @@
             <ul class="dropdown-menu">
                 <li>
                     <a role="button">
-                        <span class="text-info">Version <strong>1.0</strong></span>
+                        <span class="text-info">Version <strong>2.0</strong></span>
                     </a>
                 </li>
                 <li>
                     <a role="button">
-                        <span class="text-info">Java Driver Version <strong>2.1.7.1</strong></span>
+                        <span class="text-info">Java Driver Version <strong>3.0.0-rc1</strong></span>
                     </a>
                 </li>
                 <li>
@@ -237,7 +249,7 @@
                     <h3>II Comments</h3>
                     <p>
                         It is possible to add comments between statements. Single line comments start with the
-                        <strong>hash</strong> sign (#). Multi-line comments are enclosed between
+                        <strong>hash</strong> sign (#) or <strong>double slashes</strong> (//). Multi-line comments are enclosed between
                         <strong>&sol;&ast;&ast;</strong> and <strong>&ast;&ast;&sol;</strong>. Ex:
 
                         <br/>
@@ -246,9 +258,12 @@
                             <div class="col-md-8 col-md-offset-2">
                                 <pre>
 
-    #First comment
+    #Single line comment style 1
     INSERT INTO users(login,name) VALUES('jdoe','John DOE');
 
+    //Single line comment style 2
+
+
     /**
      Multi line
      comments
@@ -314,6 +329,22 @@
                                     <td>List all existing keyspaces in the cluster and for each, all the tables name</td>
                                 </tr>
                                 <tr>
+                                    <td><strong>DESCRIBE TYPES;</strong></td>
+                                    <td>List all existing keyspaces in the cluster and for each, all the types name</td>
+                                </tr>
+                                <tr>
+                                    <td><strong>DESCRIBE FUNCTIONS;</strong></td>
+                                    <td>List all existing keyspaces in the cluster and for each, all the functions name and arguments</td>
+                                </tr>
+                                <tr>
+                                    <td><strong>DESCRIBE AGGREGATES;</strong></td>
+                                    <td>List all existing keyspaces in the cluster and for each, all the aggregates name and arguments</td>
+                                </tr>
+                                <tr>
+                                    <td><strong>DESCRIBE MATERIALIZED VIEWS;</strong></td>
+                                    <td>List all existing keyspaces in the cluster and for each, all the materialized view name</td>
+                                </tr>
+                                <tr>
                                     <td><strong>DESCRIBE KEYSPACE &lt;keyspace name&gt;;</strong></td>
                                     <td>Describe the given keyspace configuration and all its table details (name, columns, ...)</td>
                                 </tr>
@@ -333,6 +364,30 @@
                                         the default <em>system</em> keyspace is used. If no type is found, an error message is raised
                                     </td>
                                 </tr>
+                                <tr>
+                                    <td><strong>DESCRIBE FUNCTION <em>(&lt;keyspace name&gt;).</em>&lt;function name&gt;;</strong></td>
+                                    <td>
+                                        Describe the given function. If the keyspace is not provided, the current
+                                        <strong>logged in</strong> keyspace is used. If there is no logged in keyspace,
+                                        the default <em>system</em> keyspace is used. If no function is found, an error message is raised
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td><strong>DESCRIBE AGGREGATE <em>(&lt;keyspace name&gt;).</em>&lt;aggregate name&gt;;</strong></td>
+                                    <td>
+                                        Describe the given aggregate. If the keyspace is not provided, the current
+                                        <strong>logged in</strong> keyspace is used. If there is no logged in keyspace,
+                                        the default <em>system</em> keyspace is used. If no aggregate is found, an error message is raised
+                                    </td>
+                                </tr>        
+                                <tr>
+                                    <td><strong>DESCRIBE MATERIALIZED VIEW <em>(&lt;keyspace name&gt;).</em>&lt;view name&gt;;</strong></td>
+                                    <td>
+                                        Describe the given materialized view. If the keyspace is not provided, the current
+                                        <strong>logged in</strong> keyspace is used. If there is no logged in keyspace,
+                                        the default <em>system</em> keyspace is used. If no materialized view is found, an error message is raised
+                                    </td>
+                                </tr>                                                                                          
                             </tbody>
                         </table>
                         <br/>
@@ -342,9 +397,7 @@
                     </p>
                     <h3>II Schema Display</h3>
                     <p>
-                        The schema objects (cluster, keyspace, table &amp; type) are displayed in a tabular format.
-                        There is a <strong>drop-down</strong> menu on the top left corner to expand objects details.
-                        On the top right menu is shown the Icon legend.
+                        The schema objects (cluster, keyspace, table, type, view, function &amp; aggregate) are displayed in a tabular format. There is a <strong>drop-down</strong> menu on the top left corner to expand objects details. On the top right menu is shown the Icon legend.
 
                     </p>
                   </div>
@@ -886,16 +939,68 @@
     <div class="panel panel-default">
         <div class="panel-heading" role="tab">
             <h4 class="panel-title">
-                <a role="button" data-toggle="collapse" data-target="#${miscId}" aria-expanded="false">
-                    <span class="text-info"><strong>Miscellaneous</strong></span>
+                <a role="button" data-toggle="collapse" data-target="#${sharedStatesId}" aria-expanded="false">
+                    <span class="text-info"><strong>Shared states</strong></span>
                 </a>
             </h4>
         </div>
-        <div id="${miscId}" class="panel-collapse collapse" role="tabpanel">
+        <div id="${sharedStatesId}" class="panel-collapse collapse" role="tabpanel">
             <div class="panel-body">
-               <h3>Execution parallelism</h3>
-               It is possible to execute many paragraphs in parallel. However, at the back-end side, we’re still using <strong>synchronous</strong> queries. Asynchronous execution is only possible when it is possible to return a Future value in the <strong>InterpreterResult</strong>. It may be an interesting proposal for the Zeppelin project.
+               It is possible to execute many paragraphs in parallel. However, at the back-end side, we’re still using synchronous queries. <em>Asynchronous execution</em> is only possible when it is possible to return a <strong>Future</strong> value in the <strong>InterpreterResult</strong>. It may be an interesting proposal for the <strong>Zeppelin</strong> project.
+               <br/> 
+               Another caveat is that the same <strong>com.datastax.driver.core.Session</strong> object is used for <strong>all</strong> notebooks and paragraphs. Consequently, if you use the <em>USE keyspace name;</em> statement to log into a keyspace, it will change the keyspace for <strong>all current users</strong> of the Cassandra interpreter because we only create 1 <strong>com.datastax.driver.core.Session</strong> object per instance of <strong>Cassandra</strong> interpreter.
+               <br/> 
+               The same remark does apply to the <strong>prepared statement hash map</strong>, it is shared by <strong>all users</strong> using the same instance of <strong>Cassandra</strong> interpreter.
+               <br/>
+               Until <strong>Zeppelin</strong> offers a real multi-users separation, there is a work-around to segregate user environment and states: <em>create different Cassandra interpreter instances</em>
+               <br/> 
+               <ol>
+                    <li>First go to the <strong>Interpreter</strong> menu and click on the <strong>Create</strong> button</li>
+                    <li>In the interpreter creation form, put <strong>cass-instance2</strong> as <strong>Name</strong> and select the <strong>cassandra</strong> in the interpreter drop-down list</li>
+                    <li>Click on <strong>Save</strong> to create the new interpreter instance. Now you should be able to see it in the interpreter list</li>
+                    <li>Go back to your notebook and click on the <strong>Gear</strong> icon to configure interpreter bindings. You should be able to see and select the <strong>cass-instance2</strong> interpreter instance in the available interpreter list instead of the standard <strong>cassandra</strong> instance</li>
+               </ol>
             </div>
         </div>
+    </div>
+        
+    <div class="panel panel-default">
+        <div class="panel-heading" role="tab">
+            <h4 class="panel-title">
+                <a role="button" data-toggle="collapse" data-target="#${changelogId}" aria-expanded="false">
+                    <span class="text-info"><strong>Change Log</strong></span>
+                </a>
+            </h4>
+        </div>        
+        <div id="${changelogId}" class="panel-collapse collapse" role="tabpanel">
+            <div class="panel-body">
+                <strong>2.0</strong>&nbsp;: 
+                <br/>
+                <ul>
+                    <li>Update help menu and add changelog</li>
+                    <li>Add Support for User Defined Functions, User Defined Aggregates and Materialized Views</li>
+                    <li>Upgrade Java driver version to <strong>3.0.0-rc1</strong></li>
+                </ul>
+                <strong>1.0</strong>&nbsp;: 
+                <br/>
+                <ul>
+                    <li>Initial version</li>
+                </ul>                
+            </div>
+        </div>    
+    </div>
+    <div class="panel panel-default">
+        <div class="panel-heading" role="tab">
+            <h4 class="panel-title">
+                <a role="button" data-toggle="collapse" data-target="#${contactsId}" aria-expanded="false">
+                    <span class="text-info"><strong>Contact &amp; Bugs</strong></span>
+                </a>
+            </h4>
+        </div>        
+        <div id="${contactsId}" class="panel-collapse collapse" role="tabpanel">
+            <div class="panel-body">
+                If you encounter a bug for this interpreter, please create a <a href="https://issues.apache.org/jira/browse/ZEPPELIN-382?jql=project%20%3D%20ZEPPELIN" target="_blank"><strong>JIRA</strong></a> ticket and ping me on Twitter at <a href="https://twitter.com/doanduyhai" target="_blank"><strong>@doanduyhai</strong></a>
+            </div>
+        </div>            
     </div>    
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/keyspaceContent.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/keyspaceContent.ssp b/cassandra/src/main/resources/scalate/keyspaceContent.ssp
index 5139069..152c657 100644
--- a/cassandra/src/main/resources/scalate/keyspaceContent.ssp
+++ b/cassandra/src/main/resources/scalate/keyspaceContent.ssp
@@ -57,6 +57,36 @@
     </div>
     #end
 
+    #if (ksContent.views.nonEmpty)
+    <!-- Materialized Views -->
+    <table width="100%">
+        <td><hr /></td>
+        <td style="width:1px; padding: 0 10px; white-space: nowrap;"><strong class="text-primary">Materialized Views</strong></td>
+        <td><hr /></td>
+    </table>
+    <div class="row">
+        <div class="panel-group" role="tablist" aria-multiselectable="true">
+            #for((id,name,viewHTML) <- ksContent.views)
+
+                <div class="panel panel-default">
+                <div class="panel-heading" role="tab">
+                <h4 class="panel-title">
+                    <a role="button" data-toggle="collapse" data-target="#${id}" aria-expanded="false">
+                        <span class="text-primary"><i class="glyphicon glyphicon-eye-open"/>&nbsp;${name}</span>
+                        </a>
+                    </h4>
+                </div>
+                <div id="${id}" class="panel-collapse collapse" role="tabpanel">
+                    <div class="panel-body">
+                        ${unescape(viewHTML)}
+                    </div>
+                </div>
+                </div>
+            #end
+        </div>
+    </div>
+    #end
+
     #if (ksContent.udts.nonEmpty)
     <!-- UDTs -->
     <table width="100%">
@@ -88,4 +118,64 @@
     </div>
     #end
 
+    #if (ksContent.functions.nonEmpty)
+    <!-- Functions -->
+    <table width="100%">
+        <td><hr /></td>
+        <td style="width:1px; padding: 0 10px; white-space: nowrap;"><strong class="text-success">Functions</strong></td>
+        <td><hr /></td>
+    </table>
+    <div class="row">
+        <div class="panel-group" role="tablist" aria-multiselectable="true">
+            #for((id,name,functionHTML) <- ksContent.functions)
+
+            <div class="panel panel-default">
+                <div class="panel-heading" role="tab">
+                    <h4 class="panel-title">
+                        <a role="button" data-toggle="collapse" data-target="#${id}" aria-expanded="false">
+                            <span class="text-success"><i class="glyphicon glyphicon-random"/>&nbsp;${name}</span>
+                        </a>
+                    </h4>
+                </div>
+                <div id="${id}" class="panel-collapse collapse" role="tabpanel">
+                    <div class="panel-body">
+                        ${unescape(functionHTML)}
+                    </div>
+                </div>
+            </div>
+            #end
+        </div>
+    </div>
+    #end
+
+    #if (ksContent.aggregates.nonEmpty)
+    <!-- Aggregates -->
+    <table width="100%">
+        <td><hr /></td>
+        <td style="width:1px; padding: 0 10px; white-space: nowrap;"><strong class="text-success">Aggregates</strong></td>
+        <td><hr /></td>
+    </table>
+    <div class="row">
+        <div class="panel-group" role="tablist" aria-multiselectable="true">
+            #for((id,name,aggregateHTML) <- ksContent.aggregates)
+
+            <div class="panel panel-default">
+                <div class="panel-heading" role="tab">
+                    <h4 class="panel-title">
+                        <a role="button" data-toggle="collapse" data-target="#${id}" aria-expanded="false">
+                            <span class="text-success"><i class="glyphicon glyphicon-retweet"/>&nbsp;${name}</span>
+                        </a>
+                    </h4>
+                </div>
+                <div id="${id}" class="panel-collapse collapse" role="tabpanel">
+                    <div class="panel-body">
+                        ${unescape(aggregateHTML)}
+                    </div>
+                </div>
+            </div>
+            #end
+        </div>
+    </div>
+    #end
+
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/keyspaceDetails.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/keyspaceDetails.ssp b/cassandra/src/main/resources/scalate/keyspaceDetails.ssp
index beaf182..c0b9f8f 100644
--- a/cassandra/src/main/resources/scalate/keyspaceDetails.ssp
+++ b/cassandra/src/main/resources/scalate/keyspaceDetails.ssp
@@ -46,7 +46,7 @@
                 <tbody>
             </table>
             <div class="panel-footer">
-                <a data-toggle="collapse" data-target="#${ksDetails.uniqueId}_asCQL">
+                <a data-toggle="collapse" data-target="#${ksDetails.uniqueId}_asCQL" class="text-danger">
                     <strong>As CQL statement</strong>
                     <span class="caret"></span>
                 </a>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/materializedViewDetails.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/materializedViewDetails.ssp b/cassandra/src/main/resources/scalate/materializedViewDetails.ssp
new file mode 100644
index 0000000..459b5bc
--- /dev/null
+++ b/cassandra/src/main/resources/scalate/materializedViewDetails.ssp
@@ -0,0 +1,109 @@
+<%--
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*    http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+--%>
+#import(org.apache.zeppelin.cassandra.MetaDataHierarchy._)
+<%@ val mvDetails: MaterializedViewDetails %>
+<%@ val withCaption: Boolean%>
+<div class="row">
+    <div class="col-md-2"/>
+    <div class="col-md-8 col-offset-md-2">
+        <div class="panel panel-default table-responsive table-bordered">
+            <table class="table">
+                #if(withCaption)
+                <caption>
+                    <h4 class="text-primary">
+                        <i class="glyphicon glyphicon-eye-open"/>
+                        &nbsp;${mvDetails.name}
+                        &nbsp;<i class="glyphicon glyphicon-arrow-right"/>
+                        &nbsp;<i class="glyphicon glyphicon-th-list"/>
+                        &nbsp;${mvDetails.baseTable}&nbsp;
+                    </h4>
+                </caption>
+                #end
+                <thead>
+                    <tr>
+                        <th class="col-md-4">Column Type</th>
+                        <th class="col-md-4">Column Name</th>
+                        <th class="col-md-4">Data Type</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    #for (column <- mvDetails.columns)
+                        #match (column.columnType)
+                        #case(PartitionKey)
+
+                    <tr class="info">
+                        <td class="col-md-4">
+                            <i class="glyphicon glyphicon-fullscreen" title="Partition Key"/>
+                        </td>
+                        <td class="col-md-4">${column.name}</td>
+                        <td class="col-md-4">${column.dataType}</td>
+                    </tr>
+                        #case(StaticColumn)
+                    <tr class="warning">
+                        <td class="col-md-4">
+                            <i class="glyphicon glyphicon-pushpin" title="Static Column"/>
+                        </td>
+                        <td class="col-md-4">${column.name}</td>
+                        <td class="col-md-4">${column.dataType}</td>
+                    </tr>
+                        #case(ClusteringColumn(ASC))
+                    <tr class="success">
+                        <td class="col-md-4">
+                            <i class="glyphicon glyphicon-sort" title="Clustering Column"/>
+                            &nbsp;
+                            <i class="glyphicon glyphicon-sort-by-attributes" title="Sort ASC"/>
+                        </td>
+                        <td class="col-md-4">${column.name}</td>
+                        <td class="col-md-4">${column.dataType}</td>
+                    </tr>
+                        #case(ClusteringColumn(DESC))
+                    <tr class="success">
+                        <td class="col-md-4">
+                            <i class="glyphicon glyphicon-sort" title="Clustering Column"/>
+                            &nbsp;
+                            <i class="glyphicon glyphicon-sort-by-attributes-alt" title="Sort DESC"/>
+                        </td>
+                        <td class="col-md-4">${column.name}</td>
+                        <td class="col-md-4">${column.dataType}</td>
+                    </tr>
+                        #otherwise
+                    <tr>
+                        <td class="col-md-4"></td>
+                        <td class="col-md-4">${column.name}</td>
+                        <td class="col-md-4">${column.dataType}</td>
+                    </tr>
+                        #end
+                    #end
+
+                </tbody>
+            </table>
+            <div class="panel-footer">
+                <a data-toggle="collapse" data-target="#${mvDetails.uniqueId}_asCQL" class="text-primary">
+                    <strong>As CQL statement</strong>
+                    <span class="caret"></span>
+                </a>
+                <br/><br/>
+                <div class="collapse" id="${mvDetails.uniqueId}_asCQL">
+                    <pre class="well">${mvDetails.asCQL}</pre>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="col-md-2"></div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/menu.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/menu.ssp b/cassandra/src/main/resources/scalate/menu.ssp
index 91afc8b..0d5a36e 100644
--- a/cassandra/src/main/resources/scalate/menu.ssp
+++ b/cassandra/src/main/resources/scalate/menu.ssp
@@ -54,6 +54,23 @@
                         <i class="glyphicon glyphicon-th-list text-primary" />&nbsp;&nbsp;Table
                     </a>
                 </li>
+                <li>
+                    <a role="button">
+                        <i class="glyphicon glyphicon-eye-open text-primary" />&nbsp;&nbsp;Materialized View
+                    </a>
+                </li>
+                <li>
+                    <a role="button">
+                        <i class="glyphicon glyphicon-random text-success" />&nbsp;&nbsp;Function
+                    </a>
+                </li>
+                <li>
+                    <a role="button">
+                        <i class="glyphicon glyphicon-retweet text-success" />&nbsp;&nbsp;Aggregate
+                    </a>
+                </li>
+                <li role="separator" class="divider text-muted"></li>
+                <li class="dropdown-header"><span class="text-primary">Table icons</span></li>
                 <li class="bg-info">
                     <a role="button">
                         <i class="glyphicon glyphicon-fullscreen" />&nbsp;&nbsp;Partition Key
@@ -79,11 +96,6 @@
                         <i class="glyphicon glyphicon-sort-by-attributes-alt" />&nbsp;&nbsp;Clustering Order DESC
                     </a>
                 </li>
-                <li>
-                    <a role="button">
-                        <i class="glyphicon glyphicon-info-sign" />&nbsp;&nbsp;Indexed Column
-                    </a>
-                </li>
             </ul>
         </li>
         <li>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/tableDetails.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/tableDetails.ssp b/cassandra/src/main/resources/scalate/tableDetails.ssp
index 6cfbc49..41e4517 100644
--- a/cassandra/src/main/resources/scalate/tableDetails.ssp
+++ b/cassandra/src/main/resources/scalate/tableDetails.ssp
@@ -42,15 +42,6 @@
                     <tr class="info">
                         <td class="col-md-4">
                             <i class="glyphicon glyphicon-fullscreen" title="Partition Key"/>
-                            #match (column.index)
-                            #case (Some(index))
-
-                            &nbsp;<i class="glyphicon glyphicon-info-sign" title="Indexed Column"/>
-                            <em>${index.name}</em> <strong>${index.info}</strong>
-                            #case (None)
-                            <span></span>
-                            #end
-
                         </td>
                         <td class="col-md-4">${column.name}</td>
                         <td class="col-md-4">${column.dataType}</td>
@@ -59,15 +50,6 @@
                     <tr class="warning">
                         <td class="col-md-4">
                             <i class="glyphicon glyphicon-pushpin" title="Static Column"/>
-                            #match (column.index)
-                            #case (Some(index))
-
-                            &nbsp;<i class="glyphicon glyphicon-info-sign" title="Indexed Column"/>
-                            <em>${index.name}</em> <strong>${index.info}</strong>
-                            #case (None)
-                            <span></span>
-                            #end
-
                         </td>
                         <td class="col-md-4">${column.name}</td>
                         <td class="col-md-4">${column.dataType}</td>
@@ -78,15 +60,6 @@
                             <i class="glyphicon glyphicon-sort" title="Clustering Column"/>
                             &nbsp;
                             <i class="glyphicon glyphicon-sort-by-attributes" title="Sort ASC"/>
-                            #match (column.index)
-                            #case (Some(index))
-
-                            &nbsp;<i class="glyphicon glyphicon-info-sign" title="Indexed Column"/>
-                            <em>${index.name}</em> <strong>${index.info}</strong>
-                            #case (None)
-                            <span></span>
-                            #end
-
                         </td>
                         <td class="col-md-4">${column.name}</td>
                         <td class="col-md-4">${column.dataType}</td>
@@ -97,32 +70,13 @@
                             <i class="glyphicon glyphicon-sort" title="Clustering Column"/>
                             &nbsp;
                             <i class="glyphicon glyphicon-sort-by-attributes-alt" title="Sort DESC"/>
-                            #match (column.index)
-                            #case (Some(index))
-
-                            &nbsp;<i class="glyphicon glyphicon-info-sign" title="Indexed Column"/>
-                            <em>${index.name}</em> <strong>${index.info}</strong>
-                            #case (None)
-                            <span></span>
-                            #end
-
                         </td>
                         <td class="col-md-4">${column.name}</td>
                         <td class="col-md-4">${column.dataType}</td>
                     </tr>
                         #otherwise
                     <tr>
-                        <td class="col-md-4">
-                            #match (column.index)
-                            #case (Some(index))
-
-                            <i class="glyphicon glyphicon-info-sign" title="Indexed Column"/>
-                            <em>${index.name}</em> <strong>${index.info}</strong>
-                            #case (None)
-                            <span></span>
-                            #end
-
-                        </td>
+                        <td class="col-md-4"></td>
                         <td class="col-md-4">${column.name}</td>
                         <td class="col-md-4">${column.dataType}</td>
                     </tr>
@@ -132,7 +86,7 @@
                 </tbody>
             </table>
             <div class="panel-footer">
-                <a data-toggle="collapse" data-target="#${tableDetails.uniqueId}_asCQL">
+                <a data-toggle="collapse" data-target="#${tableDetails.uniqueId}_asCQL" class="text-primary">
                     <strong>As CQL statement</strong>
                     <span class="caret"></span>
                 </a>
@@ -142,6 +96,39 @@
                 </div>
             </div>
         </div>
+        #if(tableDetails.indices.size > 0)
+        <hr/>           
+        <div class="panel panel-default table-responsive table-bordered">
+            <table class="table">
+                <caption><h4 class="text-danger"><i class="glyphicon glyphicon-info-sign"/>&nbsp;${tableDetails.tableName}'s indices</h4>
+                </caption>
+                <thead>
+                    <tr>
+                        <th class="col-md-6">Name</th>
+                        <th class="col-md-6">Target</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    #for (index <- tableDetails.indices)
+                    <tr>
+                        <td class="col-md-6">${index.name}</td>
+                        <td class="col-md-6">${index.target}</td>
+                    </tr>
+                    #end
+                </tbody>    
+            </table>        
+            <div class="panel-footer">
+                <a data-toggle="collapse" data-target="#${tableDetails.uniqueId}_indices_asCQL" class="text-danger">
+                    <strong>As CQL statement</strong>
+                    <span class="caret"></span>
+                </a>
+                <br/><br/>
+                <div class="collapse" id="${tableDetails.uniqueId}_indices_asCQL">
+                    <pre class="well">${tableDetails.indicesAsCQL}</pre>
+                </div>
+            </div>
+        </div>
+        #end
     </div>
     <div class="col-md-2"></div>
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/resources/scalate/udtDetails.ssp
----------------------------------------------------------------------
diff --git a/cassandra/src/main/resources/scalate/udtDetails.ssp b/cassandra/src/main/resources/scalate/udtDetails.ssp
index 80380a4..28858f2 100644
--- a/cassandra/src/main/resources/scalate/udtDetails.ssp
+++ b/cassandra/src/main/resources/scalate/udtDetails.ssp
@@ -46,7 +46,7 @@
                 <tbody>
             </table>
             <div class="panel-footer">
-                <a data-toggle="collapse" data-target="#${udtDetails.uniqueId}_asCQL">
+                <a data-toggle="collapse" data-target="#${udtDetails.uniqueId}_asCQL" class="text-warning">
                     <strong>As CQL statement</strong>
                     <span class="caret"></span>
                 </a>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/11a45e2e/cassandra/src/main/scala/com/datastax/driver/core/TableMetadataWrapper.scala
----------------------------------------------------------------------
diff --git a/cassandra/src/main/scala/com/datastax/driver/core/TableMetadataWrapper.scala b/cassandra/src/main/scala/com/datastax/driver/core/TableMetadataWrapper.scala
new file mode 100644
index 0000000..feddbe1
--- /dev/null
+++ b/cassandra/src/main/scala/com/datastax/driver/core/TableMetadataWrapper.scala
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.datastax.driver.core
+
+case class TableMetadataWrapper(val meta: TableMetadata) {
+    def exportTableOnlyAsString(): String = {
+      meta.asCQLQuery(true)
+    }
+}