You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by mr...@apache.org on 2016/08/17 21:48:08 UTC

[01/38] usergrid git commit: Initial commit introducing Datastax cassandra driver.

Repository: usergrid
Updated Branches:
  refs/heads/master f91960371 -> 5095891dd


Initial commit introducing Datastax cassandra driver.


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

Branch: refs/heads/master
Commit: a6319750e65d0b04aaa211e83ac220875120d9a5
Parents: a958b05
Author: Michael Russo <mi...@gmail.com>
Authored: Mon Feb 8 18:04:36 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Mon Feb 8 18:04:36 2016 -0800

----------------------------------------------------------------------
 stack/core/pom.xml                              | 810 ++++++++++---------
 .../UniqueValueSerializationStrategyImpl.java   |   2 +-
 stack/corepersistence/common/pom.xml            |  40 +
 .../core/astyanax/CassandraConfig.java          |   2 +-
 .../core/astyanax/CassandraConfigImpl.java      |  10 +-
 .../persistence/core/astyanax/CassandraFig.java |  56 +-
 .../core/datastax/DataStaxCluster.java          |  33 +
 .../core/datastax/DatastaxSessionProvider.java  |  23 +
 .../core/datastax/impl/DatastaxClusterImpl.java | 169 ++++
 .../persistence/core/guice/CommonModule.java    |   4 +
 .../core/datastax/DatastaxClusterTest.java      |  24 +
 stack/corepersistence/pom.xml                   |   1 +
 stack/pom.xml                                   |   6 +
 stack/test-utils/pom.xml                        |   4 +
 14 files changed, 765 insertions(+), 419 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/core/pom.xml
----------------------------------------------------------------------
diff --git a/stack/core/pom.xml b/stack/core/pom.xml
index 76ff694..7083687 100644
--- a/stack/core/pom.xml
+++ b/stack/core/pom.xml
@@ -17,30 +17,30 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.usergrid</groupId>
-    <artifactId>usergrid</artifactId>
-    <version>2.1.1-SNAPSHOT</version>
-    <relativePath>../</relativePath>
-  </parent>
-
-  <artifactId>usergrid-core</artifactId>
-  <name>Usergrid Core</name>
-  <description>Core services for Usergrid system.</description>
-  <packaging>jar</packaging>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-javadoc-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-
-
-  <build>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.usergrid</groupId>
+        <artifactId>usergrid</artifactId>
+        <version>2.1.1-SNAPSHOT</version>
+        <relativePath>../</relativePath>
+    </parent>
+
+    <artifactId>usergrid-core</artifactId>
+    <name>Usergrid Core</name>
+    <description>Core services for Usergrid system.</description>
+    <packaging>jar</packaging>
+
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </reporting>
+
+
+    <build>
 
         <resources>
             <resource>
@@ -55,384 +55,388 @@
                 </includes>
             </resource>
         </resources>
-    <testResources>
-      <testResource>
-        <directory>src/test/resources</directory>
-        <filtering>true</filtering>
-        <includes>
-          <include>**/*.yaml</include>
-          <include>**/*.properties</include>
-          <include>**/*.xml</include>
-        </includes>
-      </testResource>
-      <testResource>
-        <directory>src/test/resources</directory>
-        <filtering>true</filtering>
-        <includes>
-          <include>largeentity.json</include>
-        </includes>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <!--
-      Do not need to configure surefire plugin here, parent POM configuration is sufficient.
-      -->
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>test-jar-execution</id>
-            <phase>package</phase>
-            <goals>
-              <goal>test-jar</goal>
-            </goals>
-            <configuration>
-              <includes>
-                <include>**/org/apache/usergrid/**</include>
-              </includes>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-
-  <dependencies>
-
-
-      <!-- dependent on wiring guice and spring -->
-      <dependency>
-          <groupId>com.google.inject.extensions</groupId>
-          <artifactId>guice-spring</artifactId>
-          <version>4.0-beta5</version>
-      </dependency>
-
-    <!-- Apache Dependencies -->
-
-    <dependency>
-      <groupId>org.apache.cassandra</groupId>
-      <artifactId>cassandra-all</artifactId>
-      <!-- Exclude the old and problematic Snappy -->
-      <exclusions>
-        <exclusion>
-          <artifactId>snappy-java</artifactId>
-          <groupId>org.xerial.snappy</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>antlr</artifactId>
-          <groupId>org.antlr</groupId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.cassandra</groupId>
-      <artifactId>cassandra-thrift</artifactId>
-    </dependency>
-
-    <!-- Include the slighly newer and less problematic snappy -->
-    <dependency>
-      <artifactId>snappy-java</artifactId>
-      <groupId>org.xerial.snappy</groupId>
-      <version>1.0.5</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-collections</groupId>
-      <artifactId>commons-collections</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-cli</groupId>
-      <artifactId>commons-cli</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-beanutils</groupId>
-      <artifactId>commons-beanutils</artifactId>
-    </dependency>
-
-    <!-- SUN, Javax Package, and Other Commercial Dependencies -->
-
-    <dependency>
-      <groupId>com.beust</groupId>
-      <artifactId>jcommander</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>com.sun.mail</groupId>
-      <artifactId>javax.mail</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.activation</groupId>
-      <artifactId>activation</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.persistence</groupId>
-      <artifactId>persistence-api</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>com.fasterxml.uuid</groupId>
-      <artifactId>java-uuid-generator</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>com.hazelcast</groupId>
-      <artifactId>hazelcast-all</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>com.netflix.curator</groupId>
-      <artifactId>curator-recipes</artifactId>
-    </dependency>
-
-      <dependency>
-          <groupId>com.netflix.astyanax</groupId>
-          <artifactId>astyanax-recipes</artifactId>
-      </dependency>
-
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-    </dependency>
-
-    <!-- Codehaus, Spring and Other Org Dependencies -->
-
-    <dependency>
-      <groupId>org.hectorclient</groupId>
-      <artifactId>hector-core</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-core</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-expression</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-beans</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-aop</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>aopalliance</groupId>
-      <artifactId>aopalliance</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-context</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-context-support</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-web</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.yaml</groupId>
-      <artifactId>snakeyaml</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.jsoup</groupId>
-      <artifactId>jsoup</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.perf4j</groupId>
-      <artifactId>perf4j</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.aspectj</groupId>
-      <artifactId>aspectjweaver</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.aspectj</groupId>
-      <artifactId>aspectjrt</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>cglib</groupId>
-      <artifactId>cglib-nodep</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>jline</groupId>
-      <artifactId>jline</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.jboss.netty</groupId>
-      <artifactId>netty</artifactId>
-    </dependency>
-
-    <!-- Test and Logging Dependencies -->
-
-    <dependency>
-      <groupId>org.apache.usergrid</groupId>
-      <artifactId>usergrid-config</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-      <classifier>tests</classifier>
-    </dependency>
-
-    <dependency>
-      <groupId>org.hectorclient</groupId>
-      <artifactId>hector-test</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <version>${mockito.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.jvnet.mock-javamail</groupId>
-      <artifactId>mock-javamail</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.usergrid</groupId>
-      <artifactId>usergrid-test-utils</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-test</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-
-       <dependency>
-        <groupId>org.apache.usergrid</groupId>
-        <artifactId>common</artifactId>
-        <version>2.1.1-SNAPSHOT</version>
-        <type>test-jar</type>
-           <scope>test</scope>
-       </dependency>
-
-
-    <!-- Core Persistence deps -->
-    <dependency>
-	    <groupId>org.apache.usergrid</groupId>
-	    <artifactId>collection</artifactId>
-	    <version>2.1.1-SNAPSHOT</version>
-	    <type>jar</type>
-      <exclusions>
-        <exclusion>
-          <artifactId>antlr</artifactId>
-          <groupId>org.antlr</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>antlr</artifactId>
-          <groupId>antlr</groupId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-
-    <dependency>
-	    <groupId>org.apache.usergrid</groupId>
-	    <artifactId>queryindex</artifactId>
-	    <version>2.1.1-SNAPSHOT</version>
-	    <type>jar</type>
-    </dependency>
-
-    <dependency>
-	    <groupId>org.apache.usergrid</groupId>
-	    <artifactId>graph</artifactId>
-	    <version>2.1.1-SNAPSHOT</version>
-	    <type>jar</type>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.usergrid</groupId>
-      <artifactId>map</artifactId>
-      <version>2.1.1-SNAPSHOT</version>
-      <type>jar</type>
-    </dependency>
-
-      <dependency>
-          <groupId>org.apache.usergrid</groupId>
-          <artifactId>cache</artifactId>
-          <version>2.1.1-SNAPSHOT</version>
-      </dependency>
-
-      <dependency>
-      <groupId>org.apache.usergrid</groupId>
-      <artifactId>queue</artifactId>
-      <version>2.1.1-SNAPSHOT</version>
-      <type>jar</type>
-    </dependency>
-
-    <dependency>
-      <groupId>com.codahale.metrics</groupId>
-      <artifactId>metrics-core</artifactId>
-      <version>${metrics.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.codahale.metrics</groupId>
-      <artifactId>metrics-graphite</artifactId>
-      <version>${metrics.version}</version>
-    </dependency>
-
-  </dependencies>
-
-  <!--
-  Do not need jacoco profile here because we do not override the surefire plugin in this POM
-  -->
+        <testResources>
+            <testResource>
+                <directory>src/test/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.yaml</include>
+                    <include>**/*.properties</include>
+                    <include>**/*.xml</include>
+                </includes>
+            </testResource>
+            <testResource>
+                <directory>src/test/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>largeentity.json</include>
+                </includes>
+            </testResource>
+        </testResources>
+
+        <plugins>
+
+            <!--
+            Do not need to configure surefire plugin here, parent POM configuration is sufficient.
+            -->
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>test-jar-execution</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>test-jar</goal>
+                        </goals>
+                        <configuration>
+                            <includes>
+                                <include>**/org/apache/usergrid/**</include>
+                            </includes>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+        </plugins>
+    </build>
+
+    <dependencies>
+
+
+        <!-- dependent on wiring guice and spring -->
+        <dependency>
+            <groupId>com.google.inject.extensions</groupId>
+            <artifactId>guice-spring</artifactId>
+            <version>4.0-beta5</version>
+        </dependency>
+
+        <!-- Apache Dependencies -->
+
+        <dependency>
+            <groupId>org.apache.cassandra</groupId>
+            <artifactId>cassandra-all</artifactId>
+            <!-- Exclude the old and problematic Snappy -->
+            <exclusions>
+                <exclusion>
+                    <artifactId>snappy-java</artifactId>
+                    <groupId>org.xerial.snappy</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>antlr</artifactId>
+                    <groupId>org.antlr</groupId>
+                </exclusion>
+                <exclusion>
+                    <groupId>net.jpountz.lz4</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.cassandra</groupId>
+            <artifactId>cassandra-thrift</artifactId>
+        </dependency>
+
+        <!-- Include the slighly newer and less problematic snappy -->
+        <dependency>
+            <artifactId>snappy-java</artifactId>
+            <groupId>org.xerial.snappy</groupId>
+            <version>1.0.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-cli</groupId>
+            <artifactId>commons-cli</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+        </dependency>
+
+        <!-- SUN, Javax Package, and Other Commercial Dependencies -->
+
+        <dependency>
+            <groupId>com.beust</groupId>
+            <artifactId>jcommander</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sun.mail</groupId>
+            <artifactId>javax.mail</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.activation</groupId>
+            <artifactId>activation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.persistence</groupId>
+            <artifactId>persistence-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.uuid</groupId>
+            <artifactId>java-uuid-generator</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.hazelcast</groupId>
+            <artifactId>hazelcast-all</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.netflix.curator</groupId>
+            <artifactId>curator-recipes</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.netflix.astyanax</groupId>
+            <artifactId>astyanax-recipes</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+
+        <!-- Codehaus, Spring and Other Org Dependencies -->
+
+        <dependency>
+            <groupId>org.hectorclient</groupId>
+            <artifactId>hector-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-expression</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-aop</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>aopalliance</groupId>
+            <artifactId>aopalliance</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context-support</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.yaml</groupId>
+            <artifactId>snakeyaml</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.perf4j</groupId>
+            <artifactId>perf4j</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjrt</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cglib</groupId>
+            <artifactId>cglib-nodep</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>jline</groupId>
+            <artifactId>jline</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jboss.netty</groupId>
+            <artifactId>netty</artifactId>
+        </dependency>
+
+        <!-- Test and Logging Dependencies -->
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>usergrid-config</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+            <classifier>tests</classifier>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hectorclient</groupId>
+            <artifactId>hector-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>${mockito.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jvnet.mock-javamail</groupId>
+            <artifactId>mock-javamail</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>usergrid-test-utils</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>common</artifactId>
+            <version>2.1.1-SNAPSHOT</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
+
+        <!-- Core Persistence deps -->
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>collection</artifactId>
+            <version>2.1.1-SNAPSHOT</version>
+            <type>jar</type>
+            <exclusions>
+                <exclusion>
+                    <artifactId>antlr</artifactId>
+                    <groupId>org.antlr</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>antlr</artifactId>
+                    <groupId>antlr</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>queryindex</artifactId>
+            <version>2.1.1-SNAPSHOT</version>
+            <type>jar</type>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>graph</artifactId>
+            <version>2.1.1-SNAPSHOT</version>
+            <type>jar</type>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>map</artifactId>
+            <version>2.1.1-SNAPSHOT</version>
+            <type>jar</type>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>cache</artifactId>
+            <version>2.1.1-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>queue</artifactId>
+            <version>2.1.1-SNAPSHOT</version>
+            <type>jar</type>
+        </dependency>
+
+        <dependency>
+            <groupId>com.codahale.metrics</groupId>
+            <artifactId>metrics-core</artifactId>
+            <version>${metrics.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.codahale.metrics</groupId>
+            <artifactId>metrics-graphite</artifactId>
+            <version>${metrics.version}</version>
+        </dependency>
+
+    </dependencies>
+
+    <!--
+    Do not need jacoco profile here because we do not override the surefire plugin in this POM
+    -->
 
 </project>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
index 622ebef..1795511 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
@@ -240,7 +240,7 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     @Override
     public UniqueValueSet load( final ApplicationScope colScope, final String type, final Collection<Field> fields )
         throws ConnectionException {
-        return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getReadCL() ), type, fields );
+        return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getAstyanaxReadCL() ), type, fields );
     }
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/pom.xml b/stack/corepersistence/common/pom.xml
index b47706c..6b617cf 100644
--- a/stack/corepersistence/common/pom.xml
+++ b/stack/corepersistence/common/pom.xml
@@ -55,6 +55,12 @@
             <groupId>org.apache.cassandra</groupId>
             <artifactId>cassandra-all</artifactId>
             <version>${cassandra.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>net.jpountz.lz4</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>
@@ -176,6 +182,40 @@
             <artifactId>metrics-graphite</artifactId>
             <version>${metrics.version}</version>
         </dependency>
+
+        <!-- Use the shaded jar dependency so we don't conflict on other Netty versions in the application -->
+        <dependency>
+            <groupId>com.datastax.cassandra</groupId>
+            <artifactId>cassandra-driver-core</artifactId>
+            <version>${datastax.version}</version>
+            <classifier>shaded</classifier>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.netty</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.datastax.cassandra</groupId>
+            <artifactId>cassandra-driver-mapping</artifactId>
+            <version>${datastax.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.datastax.cassandra</groupId>
+                    <artifactId>cassandra-driver-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- LZ4 compression used for Datastax Java Driver:
+             https://datastax.github.io/java-driver/2.1.7/features/compression/ -->
+        <dependency>
+            <groupId>net.jpountz.lz4</groupId>
+            <artifactId>lz4</artifactId>
+            <version>1.2.0</version>
+        </dependency>
+
     </dependencies>
 
     <profiles>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java
index dba3646..c506d2d 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java
@@ -37,7 +37,7 @@ public interface CassandraConfig {
     ConsistencyLevel getReadCL();
 
     /**
-     * Get the currently configured ReadCL that is more consitent than getReadCL
+     * Get the currently configured ReadCL that is more consitent than getAstyanaxReadCL
      * @return
      */
     ConsistencyLevel getConsistentReadCL();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
index 7373322..a9b37fd 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
@@ -45,13 +45,13 @@ public class CassandraConfigImpl implements CassandraConfig {
     @Inject
     public CassandraConfigImpl( final CassandraFig cassandraFig ) {
 
-        this.readCl = ConsistencyLevel.valueOf( cassandraFig.getReadCL() );
+        this.readCl = ConsistencyLevel.valueOf( cassandraFig.getAstyanaxReadCL() );
 
-        this.writeCl = ConsistencyLevel.valueOf( cassandraFig.getWriteCL() );
+        this.writeCl = ConsistencyLevel.valueOf( cassandraFig.getAstyanaxWriteCL() );
 
         this.shardSettings = parseShardSettings( cassandraFig.getShardValues() );
 
-        this.consistentCl = ConsistencyLevel.valueOf(cassandraFig.getConsistentReadCL());
+        this.consistentCl = ConsistencyLevel.valueOf(cassandraFig.getAstyanaxConsistentReadCL());
 
         //add the listeners to update the values
         cassandraFig.addPropertyChangeListener( new PropertyChangeListener() {
@@ -59,11 +59,11 @@ public class CassandraConfigImpl implements CassandraConfig {
             public void propertyChange( final PropertyChangeEvent evt ) {
                 final String propName = evt.getPropertyName();
 
-                if ( CassandraFig.READ_CL.equals( propName ) ) {
+                if ( CassandraFig.ASTYANAX_READ_CL.equals( propName ) ) {
                     readCl = ConsistencyLevel.valueOf( evt.getNewValue().toString() );
                 }
 
-                else if ( CassandraFig.WRITE_CL.equals( propName ) ) {
+                else if ( CassandraFig.ASTYANAX_WRITE_CL.equals( propName ) ) {
                     writeCl = ConsistencyLevel.valueOf( evt.getNewValue().toString() );
                 }
                 else if (CassandraFig.SHARD_VALUES.equals(propName)){

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java
index e30ba9c..78c4fbc 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java
@@ -25,17 +25,22 @@ import org.safehaus.guicyfig.GuicyFig;
 import org.safehaus.guicyfig.Key;
 
 
-
 /**
  * Cassandra configuration interface.
  */
 @FigSingleton
 public interface CassandraFig extends GuicyFig {
 
+    // cassndra properties used by datastax driver
+    String READ_CL = "cassandra.readcl";
+    String WRITE_CL = "cassandra.writecl";
+    String STRATEGY = "cassandra.strategy";
+    String STRATEGY_OPTIONS = "cassandra.strategy.options";
+
     // main application cassandra properties
-    String READ_CONSISTENT_CL = "usergrid.consistent.read.cl";
-    String READ_CL = "usergrid.read.cl";
-    String WRITE_CL = "usergrid.write.cl";
+    String ASTYANAX_READ_CONSISTENT_CL = "usergrid.consistent.read.cl";
+    String ASTYANAX_READ_CL = "usergrid.read.cl";
+    String ASTYANAX_WRITE_CL = "usergrid.write.cl";
     String SHARD_VALUES = "cassandra.shardvalues";
     String THRIFT_TRANSPORT_SIZE = "cassandra.thrift.transport.frame";
 
@@ -54,6 +59,9 @@ public interface CassandraFig extends GuicyFig {
     // re-usable default values
     String DEFAULT_CONNECTION_POOLSIZE = "15";
     String DEFAULT_LOCKS_EXPIRATION = "3600000";  // 1 hour
+    String DEFAULT_LOCAL_DC = "";
+    String DEFAULT_USERNAME = "";
+    String DEFAULT_PASSWORD = "";
 
 
     @Key( "cassandra.hosts" )
@@ -75,7 +83,16 @@ public interface CassandraFig extends GuicyFig {
     @Default( "9160" )
     int getThriftPort();
 
+    @Key( "cassandra.username" )
+    @Default( DEFAULT_USERNAME )
+    String getUsername();
+
+    @Key( "cassandra.password" )
+    @Default( DEFAULT_PASSWORD )
+    String getPassword();
+
     @Key( "cassandra.datacenter.local" )
+    @Default( DEFAULT_LOCAL_DC )
     String getLocalDataCenter();
 
     @Key( "cassandra.connections" )
@@ -86,22 +103,43 @@ public interface CassandraFig extends GuicyFig {
     @Default( "10000" )
     int getTimeout();
 
+    @Key( "cassandra.timeout.pool" )
+    @Default( "5000" )
+    int getPoolTimeout();
+
     @Key("cassandra.discovery")
     @Default( "RING_DESCRIBE" )
     String getDiscoveryType();
 
 
     @Default("CL_LOCAL_QUORUM")
-    @Key(READ_CL)
-    String getReadCL();
+    @Key(ASTYANAX_READ_CL)
+    String getAstyanaxReadCL();
 
     @Default("CL_QUORUM")
-    @Key(READ_CONSISTENT_CL)
-    String getConsistentReadCL();
+    @Key(ASTYANAX_READ_CONSISTENT_CL)
+    String getAstyanaxConsistentReadCL();
 
     @Default("CL_LOCAL_QUORUM")
+    @Key(ASTYANAX_WRITE_CL)
+    String getAstyanaxWriteCL();
+
+
+    @Default("LOCAL_QUORUM")
+    @Key(READ_CL)
+    String getReadCl();
+
+    @Default("LOCAL_QUORUM")
     @Key(WRITE_CL)
-    String getWriteCL();
+    String getWriteCl();
+
+    @Default("SimpleStrategy")
+    @Key( STRATEGY )
+    String getStrategy();
+
+    @Default("replication_factor:1")
+    @Key( STRATEGY_OPTIONS )
+    String getStrategyOptions();
 
     /**
      * Return the history of all shard values which are immutable.  For instance, if shard values

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
new file mode 100644
index 0000000..7515bf5
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
@@ -0,0 +1,33 @@
+/*
+ * 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 org.apache.usergrid.persistence.core.datastax;
+
+
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.Session;
+
+public interface DataStaxCluster {
+
+    Cluster getCluster();
+
+    Session getClusterSession();
+
+    Session getApplicationSession();
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
new file mode 100644
index 0000000..eeca763
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
@@ -0,0 +1,23 @@
+package org.apache.usergrid.persistence.core.datastax;
+
+
+import com.datastax.driver.core.Session;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+public class DatastaxSessionProvider implements Provider<Session> {
+
+    private final DataStaxCluster dataStaxCluster;
+
+    @Inject
+    public DatastaxSessionProvider( final DataStaxCluster dataStaxCluster){
+
+        this.dataStaxCluster = dataStaxCluster;
+    }
+
+    @Override
+    public Session get(){
+
+        return dataStaxCluster.getApplicationSession();
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
new file mode 100644
index 0000000..0582c4e
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
@@ -0,0 +1,169 @@
+/*
+ * 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 org.apache.usergrid.persistence.core.datastax.impl;
+
+import com.datastax.driver.core.*;
+import com.datastax.driver.core.policies.DCAwareRoundRobinPolicy;
+import com.datastax.driver.core.policies.LoadBalancingPolicy;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Singleton
+public class DatastaxClusterImpl implements DataStaxCluster {
+
+    private static final Logger logger = LoggerFactory.getLogger( DatastaxClusterImpl.class );
+
+
+    private final CassandraFig cassandraFig;
+    private final Cluster cluster;
+    private Session applicationSession;
+    private Session clusterSession;
+
+    @Inject
+    public DatastaxClusterImpl( final CassandraFig cassandraFig ) throws Exception {
+        this.cassandraFig = cassandraFig;
+
+        ConsistencyLevel defaultConsistencyLevel;
+        try {
+            defaultConsistencyLevel = ConsistencyLevel.valueOf(cassandraFig.getReadCl());
+        } catch (IllegalArgumentException e){
+
+            logger.error("Unable to parse provided consistency level in property: {}, defaulting to: {}",
+                CassandraFig.READ_CL,
+                ConsistencyLevel.LOCAL_QUORUM);
+
+            defaultConsistencyLevel = ConsistencyLevel.LOCAL_QUORUM;
+        }
+
+
+        LoadBalancingPolicy loadBalancingPolicy;
+        if( !cassandraFig.getLocalDataCenter().isEmpty() ){
+
+            loadBalancingPolicy = new DCAwareRoundRobinPolicy.Builder()
+                .withLocalDc( cassandraFig.getLocalDataCenter() ).build();
+        }else{
+            loadBalancingPolicy = new DCAwareRoundRobinPolicy.Builder().build();
+        }
+
+        final PoolingOptions poolingOptions = new PoolingOptions()
+            .setCoreConnectionsPerHost(HostDistance.LOCAL, cassandraFig.getConnections() / 2)
+            .setMaxConnectionsPerHost(HostDistance.LOCAL, cassandraFig.getConnections())
+            .setIdleTimeoutSeconds(cassandraFig.getTimeout() / 1000)
+            .setPoolTimeoutMillis(cassandraFig.getPoolTimeout());
+
+        final QueryOptions queryOptions = new QueryOptions()
+            .setConsistencyLevel(defaultConsistencyLevel);
+
+        final Cluster.Builder datastaxCluster = Cluster.builder()
+            .withClusterName(cassandraFig.getClusterName())
+            .addContactPoints(cassandraFig.getHosts().split(","))
+            .withCompression(ProtocolOptions.Compression.LZ4)
+            .withLoadBalancingPolicy(loadBalancingPolicy)
+            .withPoolingOptions(poolingOptions)
+            .withQueryOptions(queryOptions)
+            .withProtocolVersion(ProtocolVersion.NEWEST_SUPPORTED);
+
+        // only add auth credentials if they were provided
+        if ( !cassandraFig.getUsername().isEmpty() && !cassandraFig.getPassword().isEmpty() ){
+            datastaxCluster.withCredentials(
+                cassandraFig.getUsername(),
+                cassandraFig.getPassword()
+            );
+        }
+
+        this.cluster = datastaxCluster.build();
+        this.clusterSession = cluster.connect();
+        logger.info("Initialized datastax client cluster. Hosts={}, Idle Timeout={}s,  Request Timeout={}s",
+            cluster.getMetadata().getAllHosts().toString(),
+            cluster.getConfiguration().getPoolingOptions().getIdleTimeoutSeconds(),
+            cluster.getConfiguration().getPoolingOptions().getPoolTimeoutMillis() / 1000);
+
+        logger.info("Creating keyspaces if they do not already exist.");
+        createKeyspaces();
+        this.applicationSession = cluster.connect( "\""+cassandraFig.getApplicationKeyspace()+"\"" );
+
+
+
+
+    }
+
+    public Cluster getCluster(){
+        return cluster;
+    }
+
+    public Session getClusterSession(){
+        return clusterSession;
+    }
+
+    public Session getApplicationSession(){
+        return applicationSession;
+    }
+
+    private void createKeyspaces() throws Exception{
+
+        final String createApplicationKeyspace = String.format(
+            "CREATE KEYSPACE IF NOT EXISTS \"%s\" WITH replication = %s",
+            cassandraFig.getApplicationKeyspace(),
+            getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
+
+        );
+
+        final String createLocksKeyspace = String.format(
+            "CREATE KEYSPACE IF NOT EXISTS \"%s\" WITH replication = %s",
+            cassandraFig.getLocksKeyspace(),
+            getFormattedReplication(
+                cassandraFig.getLocksKeyspaceStrategy(),
+                cassandraFig.getLocksKeyspaceReplication()
+            )
+        );
+
+        logger.info("Creating application keyspace with the following CQL: {}", createApplicationKeyspace);
+        clusterSession.execute(createApplicationKeyspace);
+
+        logger.info("Creating locks keyspace with the following CQL: {}", createLocksKeyspace);
+        clusterSession.execute(createLocksKeyspace);
+
+
+    }
+
+    private String getFormattedReplication(String strategy, String strategyOptions) throws JsonProcessingException{
+
+        Map<String, String> replicationSettings = new HashMap<>();
+        replicationSettings.put("class", strategy);
+        String[] strategyOptionsSplit = strategyOptions.split(",");
+        for ( String option : strategyOptionsSplit){
+            String[] splitOptions = option.split(":");
+            replicationSettings.put(splitOptions[0], splitOptions[1]);
+        }
+            ObjectMapper mapper = new ObjectMapper();
+            return mapper.writeValueAsString(replicationSettings).replace("\"", "'");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
index f7a9926..a06a6e7 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
@@ -21,6 +21,7 @@ package org.apache.usergrid.persistence.core.guice;
 
 import com.netflix.astyanax.Keyspace;
 import org.apache.usergrid.persistence.core.astyanax.*;
+import org.apache.usergrid.persistence.core.datastax.impl.DatastaxClusterImpl;
 import org.safehaus.guicyfig.GuicyFigModule;
 
 import org.apache.usergrid.persistence.core.consistency.TimeService;
@@ -61,6 +62,9 @@ public class CommonModule extends AbstractModule {
         // bind our Cassandra cluster to the Astyanax Implementation
         bind(CassandraCluster.class).to(CassandraClusterImpl.class).asEagerSingleton();
 
+        // bind our Datastax cluster
+        bind(DatastaxClusterImpl.class).asEagerSingleton();
+
         // bind our keyspace to the AstyanaxKeyspaceProvider
         bind(Keyspace.class).toProvider(AstyanaxKeyspaceProvider.class).asEagerSingleton();
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
new file mode 100644
index 0000000..477a205
--- /dev/null
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
@@ -0,0 +1,24 @@
+package org.apache.usergrid.persistence.core.datastax;
+
+/*
+ * 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.
+ */
+public class DatastaxClusterTest {
+
+    //TODO
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/pom.xml b/stack/corepersistence/pom.xml
index 0d8609b..869cbd4 100644
--- a/stack/corepersistence/pom.xml
+++ b/stack/corepersistence/pom.xml
@@ -80,6 +80,7 @@ limitations under the License.
         <commons.collections.version>3.2.1</commons.collections.version>
         <commons.io.version>2.4</commons.io.version>
         <commons.lang.version>3.1</commons.lang.version>
+        <datastax.version>2.1.9</datastax.version>
         <elasticsearch.version>1.4.4</elasticsearch.version>
         <fasterxml-uuid.version>3.1.3</fasterxml-uuid.version>
         <guava.version>18.0</guava.version>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/pom.xml
----------------------------------------------------------------------
diff --git a/stack/pom.xml b/stack/pom.xml
index f052bf9..2dd1034 100644
--- a/stack/pom.xml
+++ b/stack/pom.xml
@@ -467,6 +467,12 @@
                         <artifactId>snappy-java</artifactId>
                         <groupId>org.xerial.snappy</groupId>
                     </exclusion>
+
+                    <exclusion>
+                        <groupId>net.jpountz.lz4</groupId>
+                        <artifactId>*</artifactId>
+
+                    </exclusion>
                 </exclusions>
             </dependency>
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/test-utils/pom.xml
----------------------------------------------------------------------
diff --git a/stack/test-utils/pom.xml b/stack/test-utils/pom.xml
index c104f0a..e07abf6 100644
--- a/stack/test-utils/pom.xml
+++ b/stack/test-utils/pom.xml
@@ -101,6 +101,10 @@
                     <artifactId>snappy-java</artifactId>
                     <groupId>org.xerial.snappy</groupId>
                 </exclusion>
+                <exclusion>
+                    <groupId>net.jpountz.lz4</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
             </exclusions>
         </dependency>
 


[19/38] usergrid git commit: Merge branch 'master' into datastax--cass-driver

Posted by mr...@apache.org.
Merge branch 'master' into datastax--cass-driver


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/70ff8fdb
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/70ff8fdb
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/70ff8fdb

Branch: refs/heads/master
Commit: 70ff8fdb44daeb81e24b1f7218aba791e2d59cc5
Parents: 3c6fcdc 279c020
Author: Michael Russo <mr...@apigee.com>
Authored: Thu Apr 28 18:57:45 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Thu Apr 28 18:57:45 2016 +0800

----------------------------------------------------------------------
 content/docs/README.html                        |   8 +-
 .../file-storage-configuration.html             |   8 +-
 content/docs/assets-and-files/folders.html      |   8 +-
 .../assets-and-files/legacy-asset-support.html  |   8 +-
 .../assets-and-files/retrieving-assets.html     |   8 +-
 .../docs/assets-and-files/uploading-assets.html |   8 +-
 .../creating-and-incrementing-counters.html     |   8 +-
 .../events-and-counters.html                    |   8 +-
 .../retrieving-counters.html                    |   8 +-
 .../docs/data-queries/advanced-query-usage.html |   8 +-
 .../docs/data-queries/operators-and-types.html  |   8 +-
 content/docs/data-queries/query-parameters.html |   8 +-
 .../docs/data-queries/querying-your-data.html   |   8 +-
 content/docs/data-storage/collections.html      |   8 +-
 content/docs/data-storage/data-store-dbms.html  |   8 +-
 content/docs/data-storage/entities.html         |   8 +-
 .../docs/data-storage/optimizing-access.html    |   8 +-
 .../entity-connections/connecting-entities.html |   8 +-
 .../disconnecting-entities.html                 |   8 +-
 .../entity-connections/retrieving-entities.html |   8 +-
 content/docs/genindex.html                      |   8 +-
 content/docs/geolocation/geolocation.html       |   8 +-
 content/docs/index.html                         |   8 +-
 content/docs/installation/deployment-guide.html |   8 +-
 .../docs/installation/ug1-deploy-to-tomcat.html |   8 +-
 .../installation/ug1-launcher-quick-start.html  |   8 +-
 .../docs/installation/ug2-deploy-to-tomcat.html |   8 +-
 content/docs/introduction/async-vs-sync.html    |   8 +-
 content/docs/introduction/data-model.html       |   8 +-
 content/docs/introduction/overview.html         |   8 +-
 .../docs/introduction/usergrid-features.html    |   8 +-
 content/docs/jersey2skeleton/README.html        |   8 +-
 content/docs/objects.inv                        | Bin 686 -> 686 bytes
 content/docs/orgs-and-apps/admin-user.html      |   8 +-
 content/docs/orgs-and-apps/application.html     |   8 +-
 content/docs/orgs-and-apps/managing.html        |   8 +-
 content/docs/orgs-and-apps/organization.html    |   8 +-
 .../push-notifications/adding-push-support.html |   8 +-
 .../creating-and-managing-notifications.html    |   8 +-
 .../push-notifications/creating-notifiers.html  |   8 +-
 .../push-notifications/getting-started.html     |   8 +-
 .../managing-users-and-devices.html             |   8 +-
 content/docs/push-notifications/overview.html   |   8 +-
 .../docs/push-notifications/registering.html    |   8 +-
 content/docs/push-notifications/tbd.html        |   8 +-
 .../push-notifications/troubleshooting.html     |   8 +-
 content/docs/push-notifications/tutorial.html   |   8 +-
 .../docs/push-notifications/users-devices.html  |   8 +-
 content/docs/reference/contribute-code.html     |   8 +-
 content/docs/reference/presos-and-videos.html   |   8 +-
 content/docs/rest-endpoints/api-docs.html       |   8 +-
 content/docs/sdks/ios-new.html                  |   8 +-
 content/docs/sdks/sdk-outline.html              |   8 +-
 content/docs/sdks/tbd.html                      |   8 +-
 content/docs/search.html                        |   8 +-
 .../docs/security-and-auth/app-security.html    |   8 +-
 .../authenticating-api-requests.html            |   8 +-
 ...nticating-users-and-application-clients.html |   8 +-
 .../changing-token-time-live-ttl.html           |   8 +-
 .../docs/security-and-auth/facebook-sign.html   |   8 +-
 .../revoking-tokens-logout.html                 |   8 +-
 .../security-and-auth/securing-your-app.html    |   8 +-
 .../user-authentication-types.html              |   8 +-
 .../security-and-auth/using-permissions.html    |   8 +-
 content/docs/security-and-auth/using-roles.html |   8 +-
 content/docs/user-management/activity.html      |   8 +-
 content/docs/user-management/group.html         |   8 +-
 content/docs/user-management/groups.html        |   8 +-
 .../docs/user-management/messagee-example.html  |   8 +-
 .../docs/user-management/user-connections.html  |   8 +-
 .../docs/user-management/user-management.html   |   8 +-
 .../docs/user-management/working-user-data.html |   8 +-
 .../creating-a-new-application.html             |   8 +-
 .../docs/using-usergrid/creating-account.html   |   8 +-
 .../using-usergrid/using-a-sandbox-app.html     |   8 +-
 content/docs/using-usergrid/using-the-api.html  |   8 +-
 docs/conf.py                                    |   4 +-
 .../main/resources/usergrid-default.properties  |  24 +
 stack/core/pom.xml                              |   5 +
 .../apache/usergrid/batch/job/OnlyOnceJob.java  |  22 +-
 .../corepersistence/ApplicationIdCache.java     |   6 +-
 .../corepersistence/ApplicationIdCacheImpl.java |  64 +-
 .../usergrid/corepersistence/CoreModule.java    |   6 +
 .../corepersistence/CpEntityManager.java        | 231 +++++-
 .../corepersistence/CpEntityManagerFactory.java |  49 +-
 .../corepersistence/CpManagerCache.java         |   2 +-
 .../corepersistence/CpRelationManager.java      | 149 +++-
 .../usergrid/corepersistence/CpSetup.java       | 103 +--
 .../corepersistence/EntityManagerFig.java       |   4 +
 .../usergrid/corepersistence/ManagerCache.java  |   2 +-
 .../asyncevents/AsyncEventService.java          |   7 +
 .../asyncevents/AsyncEventServiceImpl.java      | 153 +++-
 .../asyncevents/EventBuilder.java               |  12 +-
 .../asyncevents/EventBuilderImpl.java           |  37 +-
 .../asyncevents/model/AsyncEvent.java           |   7 +-
 .../model/DeIndexOldVersionsEvent.java          |  50 ++
 .../asyncevents/model/EdgeDeleteEvent.java      |   4 +-
 .../asyncevents/model/EdgeIndexEvent.java       |  70 ++
 .../model/ElasticsearchIndexEvent.java          |   2 +-
 .../asyncevents/model/EntityDeleteEvent.java    |   3 +
 .../asyncevents/model/EntityIndexEvent.java     |  54 ++
 .../model/InitializeApplicationIndexEvent.java  |   2 +-
 .../index/IndexProcessorFig.java                |  13 +-
 .../corepersistence/index/IndexSchemaCache.java |  50 ++
 .../index/IndexSchemaCacheFactory.java          |  44 ++
 .../index/IndexSchemaCacheFig.java              |  39 +
 .../index/IndexSchemaCacheImpl.java             | 119 +++
 .../corepersistence/index/IndexServiceImpl.java |  98 ++-
 .../index/ReIndexRequestBuilder.java            |   7 +
 .../index/ReIndexRequestBuilderImpl.java        |  32 +
 .../index/ReIndexServiceImpl.java               |  49 +-
 .../pipeline/builder/IdBuilder.java             |   6 +
 .../pipeline/read/FilterFactory.java            |   8 +-
 .../read/traverse/AbstractReadGraphFilter.java  |  18 +-
 .../pipeline/read/traverse/IdFilter.java        |  52 ++
 .../results/IdQueryExecutor.java                |  66 ++
 .../service/ApplicationServiceImpl.java         |  37 +-
 .../service/CollectionSearch.java               |   9 +
 .../service/CollectionService.java              |   5 +
 .../service/CollectionServiceImpl.java          |  23 +
 .../service/ServiceSchedulerFig.java            |   2 +-
 .../usergrid/persistence/EntityManager.java     |   7 +
 .../persistence/EntityManagerFactory.java       |   6 +-
 .../persistence/MultiQueryIterator.java         |   2 +-
 .../persistence/NotificationGraphIterator.java  | 163 +++++
 .../persistence/PagingResultsIterator.java      |  25 +-
 .../apache/usergrid/persistence/PathQuery.java  |  67 +-
 .../org/apache/usergrid/persistence/Query.java  |   2 +
 .../apache/usergrid/persistence/Results.java    |  20 +
 .../persistence/cassandra/ApplicationCF.java    |   2 +-
 .../persistence/cassandra/CassandraService.java |   2 -
 .../usergrid/persistence/cassandra/Setup.java   |  28 +-
 .../persistence/entities/Notification.java      | 106 ++-
 .../corepersistence/StaleIndexCleanupTest.java  | 184 +----
 .../index/AsyncEventServiceImplTest.java        |  23 +-
 .../usergrid/corepersistence/index/RxTest.java  | 129 ++++
 .../usergrid/persistence/CoreSchemaManager.java |  14 +-
 .../cassandra/EntityManagerFactoryImplIT.java   |   8 +-
 .../impl/ScopedCacheSerializationImpl.java      |   9 +-
 .../impl/EntityCollectionManagerImpl.java       |   2 +-
 .../mvcc/stage/write/WriteUniqueVerify.java     |   9 +-
 .../serialization/SerializationFig.java         |   3 +
 .../core/astyanax/CassandraClusterImpl.java     |   4 +-
 .../persistence/core/astyanax/ColumnSearch.java |   7 +-
 .../core/astyanax/MultiRowColumnIterator.java   |  37 +-
 .../astyanax/MultiRowShardColumnIterator.java   | 462 ++++++++++++
 .../core/consistency/TimeServiceImpl.java       |   5 +-
 .../core/executor/TaskExecutorFactory.java      |  10 +-
 .../persistence/core/shard/SmartShard.java      |  61 ++
 .../astyanax/MultiRowColumnIteratorTest.java    |  12 +-
 .../usergrid/persistence/graph/GraphFig.java    |  17 +
 .../graph/impl/GraphManagerImpl.java            |   2 +-
 .../impl/EdgeMetadataSerializationV2Impl.java   |   4 +-
 .../impl/shard/NodeShardCache.java              |   7 +-
 .../graph/serialization/impl/shard/Shard.java   |  33 +-
 .../impl/shard/impl/EdgeSearcher.java           | 113 ++-
 .../shard/impl/EdgeShardSerializationImpl.java  |  56 +-
 .../shard/impl/NodeShardAllocationImpl.java     |  38 +-
 .../impl/shard/impl/NodeShardCacheImpl.java     |  29 +-
 .../shard/impl/ShardEntryGroupIterator.java     |  12 +
 .../shard/impl/ShardGroupCompactionImpl.java    | 179 +++--
 .../impl/ShardedEdgeSerializationImpl.java      |  51 +-
 .../impl/shard/impl/ShardsColumnIterator.java   |  64 +-
 .../shard/impl/serialize/ShardSerializer.java   |  86 +++
 .../graph/GraphManagerShardConsistencyIT.java   | 215 +++---
 .../impl/shard/EdgeShardSerializationTest.java  |  12 +-
 .../impl/shard/NodeShardAllocationTest.java     |  44 +-
 .../impl/shard/ShardGroupCompactionTest.java    |   4 +-
 .../graph/src/test/resources/log4j.properties   |   6 +
 .../persistence/map/impl/MapManagerImpl.java    |   6 +
 .../persistence/index/EntityIndexBatch.java     |  13 +-
 .../usergrid/persistence/index/IndexFig.java    |   2 +-
 .../index/impl/EntityToMapConverter.java        |  93 ++-
 .../index/impl/EsEntityIndexBatchImpl.java      |  21 +-
 .../index/impl/EsEntityIndexImpl.java           |  25 +-
 .../index/impl/FailureMonitorImpl.java          |   2 +-
 .../persistence/index/impl/IndexOperation.java  |   9 +-
 .../index/impl/IndexOperationMessage.java       |   2 +-
 .../persistence/index/impl/EntityIndexTest.java |   2 +-
 .../usergrid/persistence/queue/QueueFig.java    |   4 +
 .../apache/usergrid/mongo/BasicMongoTest.java   |   8 +-
 .../apache/usergrid/mongo/MongoQueryTest.java   |  18 +-
 stack/pom.xml                                   |   2 +-
 .../org/apache/usergrid/rest/ApiResponse.java   |   7 +-
 .../rest/applications/ApplicationResource.java  |   2 +-
 .../rest/applications/CollectionResource.java   | 233 ++++++
 .../rest/applications/ServiceResource.java      | 140 +++-
 .../notifiers/NotifierResource.java             |   3 +-
 .../notifiers/NotifiersResource.java            |   3 +-
 .../rest/applications/users/UserResource.java   |  26 +-
 .../rest/applications/users/UsersResource.java  |   3 +-
 .../IllegalArgumentExceptionMapper.java         |   4 +-
 .../ServiceResourceNotFoundExceptionMapper.java |   9 +-
 .../organizations/OrganizationResource.java     |   8 +-
 .../security/SecuredResourceFilterFactory.java  |  29 +-
 .../OAuth2AccessTokenSecurityFilter.java        |   3 +-
 .../usergrid/rest/system/DatabaseResource.java  |   4 +-
 .../usergrid/rest/system/IndexResource.java     |   6 +
 .../rest/applications/ApplicationCreateIT.java  |   3 +-
 .../applications/ApplicationResourceIT.java     |   2 +-
 .../collection/CollectionsResourceIT.java       | 716 ++++++++++++++++++-
 .../collection/paging/PagingResourceIT.java     |  70 +-
 .../collection/users/PermissionsResourceIT.java |   6 +-
 .../rest/test/resource/AbstractRestIT.java      |   1 +
 .../rest/test/resource/ClientSetup.java         |  10 +
 .../test/resource/endpoints/NamedResource.java  |  22 +
 .../resources/usergrid-custom-test.properties   |   4 +
 .../cassandra/ManagementServiceImpl.java        |  91 ++-
 .../usergrid/security/shiro/ShiroCache.java     |  41 +-
 .../security/shiro/ShiroCacheManager.java       |  15 +-
 .../shiro/credentials/AdminUserAccessToken.java |   3 +
 .../ApplicationClientCredentials.java           |   5 +
 .../shiro/principals/AdminUserPrincipal.java    |   3 +
 .../principals/ApplicationGuestPrincipal.java   |   4 +-
 .../shiro/principals/ApplicationPrincipal.java  |   4 +-
 .../principals/ApplicationUserPrincipal.java    |   3 +
 .../shiro/principals/OrganizationPrincipal.java |   4 +-
 .../security/shiro/utils/LocalShiroCache.java   |  80 +++
 .../usergrid/security/tokens/TokenService.java  |   3 +
 .../tokens/cassandra/TokenServiceImpl.java      |  40 +-
 .../services/AbstractCollectionService.java     |  56 ++
 .../services/AbstractConnectionsService.java    |  13 +
 .../usergrid/services/AbstractService.java      |  14 +-
 .../org/apache/usergrid/services/Service.java   |   3 +
 .../usergrid/services/ServiceManager.java       |   1 -
 .../usergrid/services/ServiceRequest.java       |   5 +
 .../applications/ApplicationsService.java       |  14 +
 .../usergrid/services/groups/GroupsService.java |   4 +
 .../notifications/NotificationDeviceFilter.java |  45 ++
 .../notifications/NotificationsService.java     |  32 +-
 .../services/notifications/QueueListener.java   |  41 +-
 .../services/notifications/TaskManager.java     |  25 +-
 .../services/notifications/gcm/GCMAdapter.java  |   7 +-
 .../impl/ApplicationQueueManagerImpl.java       | 283 ++++++--
 .../usergrid/services/queues/QueueListener.java |   2 +-
 .../usergrid/services/roles/RolesService.java   |   2 +
 .../usergrid/services/users/UsersService.java   |   2 +
 .../services/users/roles/RolesService.java      |   4 +
 .../resources/usergrid-services-context.xml     |  11 +-
 .../migration/AppInfoMigrationPluginTest.java   |   8 +-
 .../apns/NotificationsServiceIT.java            |  32 +-
 .../gcm/NotificationsServiceIT.java             |  58 +-
 .../resources/usergrid-custom-test.properties   |   1 +
 .../usergrid/cassandra/SchemaManager.java       |   3 -
 .../usergrid/cassandra/FakeSchemaManager.java   |   8 +-
 .../test/notifications/notifications.js         |   5 -
 tests/performance/runLoadNestedEntities.sh      |  98 +++
 .../datagenerators/EntityDataGenerator.scala    |  40 ++
 .../org/apache/usergrid/enums/EntityType.scala  |   3 +-
 249 files changed, 5902 insertions(+), 1465 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/config/src/main/resources/usergrid-default.properties
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/core/pom.xml
----------------------------------------------------------------------
diff --cc stack/core/pom.xml
index 7083687,ce5b67d..75d6007
--- a/stack/core/pom.xml
+++ b/stack/core/pom.xml
@@@ -55,388 -55,384 +55,393 @@@
                  </includes>
              </resource>
          </resources>
 -    <testResources>
 -      <testResource>
 -        <directory>src/test/resources</directory>
 -        <filtering>true</filtering>
 -        <includes>
 -          <include>**/*.yaml</include>
 -          <include>**/*.properties</include>
 -          <include>**/*.xml</include>
 -        </includes>
 -      </testResource>
 -      <testResource>
 -        <directory>src/test/resources</directory>
 -        <filtering>true</filtering>
 -        <includes>
 -          <include>largeentity.json</include>
 -        </includes>
 -      </testResource>
 -    </testResources>
 -
 -    <plugins>
 -
 -      <!--
 -      Do not need to configure surefire plugin here, parent POM configuration is sufficient.
 -      -->
 -
 -      <plugin>
 -        <groupId>org.apache.maven.plugins</groupId>
 -        <artifactId>maven-jar-plugin</artifactId>
 -        <executions>
 -          <execution>
 -            <id>test-jar-execution</id>
 -            <phase>package</phase>
 -            <goals>
 -              <goal>test-jar</goal>
 -            </goals>
 -            <configuration>
 -              <includes>
 -                <include>**/org/apache/usergrid/**</include>
 -              </includes>
 -            </configuration>
 -          </execution>
 -        </executions>
 -      </plugin>
 -
 -    </plugins>
 -  </build>
 -
 -  <dependencies>
 -
 -
 -      <!-- dependent on wiring guice and spring -->
 -      <dependency>
 -          <groupId>com.google.inject.extensions</groupId>
 -          <artifactId>guice-spring</artifactId>
 -          <version>4.0-beta5</version>
 -      </dependency>
 -
 -    <!-- Apache Dependencies -->
 -
 -    <dependency>
 -      <groupId>org.apache.cassandra</groupId>
 -      <artifactId>cassandra-all</artifactId>
 -      <!-- Exclude the old and problematic Snappy -->
 -      <exclusions>
 -        <exclusion>
 -          <artifactId>snappy-java</artifactId>
 -          <groupId>org.xerial.snappy</groupId>
 -        </exclusion>
 -        <exclusion>
 -          <artifactId>antlr</artifactId>
 -          <groupId>org.antlr</groupId>
 -        </exclusion>
 -      </exclusions>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.apache.cassandra</groupId>
 -      <artifactId>cassandra-thrift</artifactId>
 -    </dependency>
 -
 -    <!-- Include the slighly newer and less problematic snappy -->
 -    <dependency>
 -      <artifactId>snappy-java</artifactId>
 -      <groupId>org.xerial.snappy</groupId>
 -      <version>1.0.5</version>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.apache.httpcomponents</groupId>
 -      <artifactId>httpclient</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>commons-collections</groupId>
 -      <artifactId>commons-collections</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>commons-io</groupId>
 -      <artifactId>commons-io</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>commons-codec</groupId>
 -      <artifactId>commons-codec</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>commons-lang</groupId>
 -      <artifactId>commons-lang</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>commons-cli</groupId>
 -      <artifactId>commons-cli</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>commons-beanutils</groupId>
 -      <artifactId>commons-beanutils</artifactId>
 -    </dependency>
 -
 -    <!-- SUN, Javax Package, and Other Commercial Dependencies -->
 -
 -    <dependency>
 -      <groupId>com.beust</groupId>
 -      <artifactId>jcommander</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>com.sun.mail</groupId>
 -      <artifactId>javax.mail</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>javax.activation</groupId>
 -      <artifactId>activation</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>javax.persistence</groupId>
 -      <artifactId>persistence-api</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>com.fasterxml.uuid</groupId>
 -      <artifactId>java-uuid-generator</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>com.hazelcast</groupId>
 -      <artifactId>hazelcast-all</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>com.netflix.curator</groupId>
 -      <artifactId>curator-recipes</artifactId>
 -    </dependency>
 -
 -      <dependency>
 -          <groupId>com.netflix.astyanax</groupId>
 -          <artifactId>astyanax-recipes</artifactId>
 -      </dependency>
 -
 -    <dependency>
 -      <groupId>com.google.guava</groupId>
 -      <artifactId>guava</artifactId>
 -    </dependency>
 -
 -    <!-- Codehaus, Spring and Other Org Dependencies -->
 -
 -    <dependency>
 -      <groupId>org.hectorclient</groupId>
 -      <artifactId>hector-core</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.springframework</groupId>
 -      <artifactId>spring-core</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.springframework</groupId>
 -      <artifactId>spring-expression</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.springframework</groupId>
 -      <artifactId>spring-beans</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.springframework</groupId>
 -      <artifactId>spring-aop</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>aopalliance</groupId>
 -      <artifactId>aopalliance</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.springframework</groupId>
 -      <artifactId>spring-context</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.springframework</groupId>
 -      <artifactId>spring-context-support</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.springframework</groupId>
 -      <artifactId>spring-web</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.yaml</groupId>
 -      <artifactId>snakeyaml</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.jsoup</groupId>
 -      <artifactId>jsoup</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.perf4j</groupId>
 -      <artifactId>perf4j</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.aspectj</groupId>
 -      <artifactId>aspectjweaver</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.aspectj</groupId>
 -      <artifactId>aspectjrt</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>cglib</groupId>
 -      <artifactId>cglib-nodep</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>jline</groupId>
 -      <artifactId>jline</artifactId>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.jboss.netty</groupId>
 -      <artifactId>netty</artifactId>
 -    </dependency>
 -
 -    <!-- Test and Logging Dependencies -->
 -
 -    <dependency>
 -      <groupId>org.apache.usergrid</groupId>
 -      <artifactId>usergrid-config</artifactId>
 -      <version>${project.version}</version>
 -      <scope>test</scope>
 -      <classifier>tests</classifier>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.hectorclient</groupId>
 -      <artifactId>hector-test</artifactId>
 -      <scope>test</scope>
 -    </dependency>
 -
 -
 -    <dependency>
 -      <groupId>org.mockito</groupId>
 -      <artifactId>mockito-core</artifactId>
 -      <version>${mockito.version}</version>
 -      <scope>test</scope>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.jvnet.mock-javamail</groupId>
 -      <artifactId>mock-javamail</artifactId>
 -      <scope>test</scope>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.apache.usergrid</groupId>
 -      <artifactId>usergrid-test-utils</artifactId>
 -      <version>${project.version}</version>
 -      <scope>test</scope>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.springframework</groupId>
 -      <artifactId>spring-test</artifactId>
 -      <scope>test</scope>
 -    </dependency>
 -
 -
 -       <dependency>
 -        <groupId>org.apache.usergrid</groupId>
 -        <artifactId>common</artifactId>
 -        <version>2.2.0-SNAPSHOT</version>
 -        <type>test-jar</type>
 -           <scope>test</scope>
 -       </dependency>
 -
 -
 -    <!-- Core Persistence deps -->
 -    <dependency>
 -	    <groupId>org.apache.usergrid</groupId>
 -	    <artifactId>collection</artifactId>
 -	    <version>2.2.0-SNAPSHOT</version>
 -	    <type>jar</type>
 -      <exclusions>
 -        <exclusion>
 -          <artifactId>antlr</artifactId>
 -          <groupId>org.antlr</groupId>
 -        </exclusion>
 -        <exclusion>
 -          <artifactId>antlr</artifactId>
 -          <groupId>antlr</groupId>
 -        </exclusion>
 -      </exclusions>
 -    </dependency>
 -
 -
 -    <dependency>
 -	    <groupId>org.apache.usergrid</groupId>
 -	    <artifactId>queryindex</artifactId>
 -	    <version>2.2.0-SNAPSHOT</version>
 -	    <type>jar</type>
 -    </dependency>
 -
 -    <dependency>
 -	    <groupId>org.apache.usergrid</groupId>
 -	    <artifactId>graph</artifactId>
 -	    <version>2.2.0-SNAPSHOT</version>
 -	    <type>jar</type>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>org.apache.usergrid</groupId>
 -      <artifactId>map</artifactId>
 -      <version>2.2.0-SNAPSHOT</version>
 -      <type>jar</type>
 -    </dependency>
 -
 -      <dependency>
 -          <groupId>org.apache.usergrid</groupId>
 -          <artifactId>cache</artifactId>
 -          <version>2.2.0-SNAPSHOT</version>
 -      </dependency>
 -
 -      <dependency>
 -      <groupId>org.apache.usergrid</groupId>
 -      <artifactId>queue</artifactId>
 -      <version>2.2.0-SNAPSHOT</version>
 -      <type>jar</type>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>com.codahale.metrics</groupId>
 -      <artifactId>metrics-core</artifactId>
 -      <version>${metrics.version}</version>
 -    </dependency>
 -
 -    <dependency>
 -      <groupId>com.codahale.metrics</groupId>
 -      <artifactId>metrics-graphite</artifactId>
 -      <version>${metrics.version}</version>
 -    </dependency>
 -
 -  </dependencies>
 -
 -  <!--
 -  Do not need jacoco profile here because we do not override the surefire plugin in this POM
 -  -->
 +        <testResources>
 +            <testResource>
 +                <directory>src/test/resources</directory>
 +                <filtering>true</filtering>
 +                <includes>
 +                    <include>**/*.yaml</include>
 +                    <include>**/*.properties</include>
 +                    <include>**/*.xml</include>
 +                </includes>
 +            </testResource>
 +            <testResource>
 +                <directory>src/test/resources</directory>
 +                <filtering>true</filtering>
 +                <includes>
 +                    <include>largeentity.json</include>
 +                </includes>
 +            </testResource>
 +        </testResources>
 +
 +        <plugins>
 +
 +            <!--
 +            Do not need to configure surefire plugin here, parent POM configuration is sufficient.
 +            -->
 +
 +            <plugin>
 +                <groupId>org.apache.maven.plugins</groupId>
 +                <artifactId>maven-jar-plugin</artifactId>
 +                <executions>
 +                    <execution>
 +                        <id>test-jar-execution</id>
 +                        <phase>package</phase>
 +                        <goals>
 +                            <goal>test-jar</goal>
 +                        </goals>
 +                        <configuration>
 +                            <includes>
 +                                <include>**/org/apache/usergrid/**</include>
 +                            </includes>
 +                        </configuration>
 +                    </execution>
 +                </executions>
 +            </plugin>
 +
 +        </plugins>
 +    </build>
 +
 +    <dependencies>
 +
 +
 +        <!-- dependent on wiring guice and spring -->
 +        <dependency>
 +            <groupId>com.google.inject.extensions</groupId>
 +            <artifactId>guice-spring</artifactId>
 +            <version>4.0-beta5</version>
 +        </dependency>
 +
 +        <!-- Apache Dependencies -->
 +
 +        <dependency>
 +            <groupId>org.apache.cassandra</groupId>
 +            <artifactId>cassandra-all</artifactId>
 +            <!-- Exclude the old and problematic Snappy -->
 +            <exclusions>
 +                <exclusion>
 +                    <artifactId>snappy-java</artifactId>
 +                    <groupId>org.xerial.snappy</groupId>
 +                </exclusion>
 +                <exclusion>
 +                    <artifactId>antlr</artifactId>
 +                    <groupId>org.antlr</groupId>
 +                </exclusion>
 +                <exclusion>
 +                    <groupId>net.jpountz.lz4</groupId>
 +                    <artifactId>*</artifactId>
 +                </exclusion>
 +            </exclusions>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.apache.cassandra</groupId>
 +            <artifactId>cassandra-thrift</artifactId>
 +        </dependency>
 +
 +        <!-- Include the slighly newer and less problematic snappy -->
 +        <dependency>
 +            <artifactId>snappy-java</artifactId>
 +            <groupId>org.xerial.snappy</groupId>
 +            <version>1.0.5</version>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.apache.httpcomponents</groupId>
 +            <artifactId>httpclient</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>commons-collections</groupId>
 +            <artifactId>commons-collections</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>commons-io</groupId>
 +            <artifactId>commons-io</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>commons-codec</groupId>
 +            <artifactId>commons-codec</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>commons-lang</groupId>
 +            <artifactId>commons-lang</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>commons-cli</groupId>
 +            <artifactId>commons-cli</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>commons-beanutils</groupId>
 +            <artifactId>commons-beanutils</artifactId>
 +        </dependency>
 +
 +        <!-- SUN, Javax Package, and Other Commercial Dependencies -->
 +
 +        <dependency>
 +            <groupId>com.beust</groupId>
 +            <artifactId>jcommander</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>com.sun.mail</groupId>
 +            <artifactId>javax.mail</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>javax.activation</groupId>
 +            <artifactId>activation</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>javax.persistence</groupId>
 +            <artifactId>persistence-api</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>com.fasterxml.uuid</groupId>
 +            <artifactId>java-uuid-generator</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>com.hazelcast</groupId>
 +            <artifactId>hazelcast-all</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>com.netflix.curator</groupId>
 +            <artifactId>curator-recipes</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>com.netflix.astyanax</groupId>
 +            <artifactId>astyanax-recipes</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>com.google.guava</groupId>
 +            <artifactId>guava</artifactId>
 +        </dependency>
 +
 +        <!-- Codehaus, Spring and Other Org Dependencies -->
 +
 +        <dependency>
 +            <groupId>org.hectorclient</groupId>
 +            <artifactId>hector-core</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.springframework</groupId>
 +            <artifactId>spring-core</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.springframework</groupId>
 +            <artifactId>spring-expression</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.springframework</groupId>
 +            <artifactId>spring-beans</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.springframework</groupId>
 +            <artifactId>spring-aop</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>aopalliance</groupId>
 +            <artifactId>aopalliance</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.springframework</groupId>
 +            <artifactId>spring-context</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.springframework</groupId>
 +            <artifactId>spring-context-support</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.springframework</groupId>
 +            <artifactId>spring-web</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.yaml</groupId>
 +            <artifactId>snakeyaml</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.jsoup</groupId>
 +            <artifactId>jsoup</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.perf4j</groupId>
 +            <artifactId>perf4j</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.aspectj</groupId>
 +            <artifactId>aspectjweaver</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.aspectj</groupId>
 +            <artifactId>aspectjrt</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>cglib</groupId>
 +            <artifactId>cglib-nodep</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>jline</groupId>
 +            <artifactId>jline</artifactId>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.jboss.netty</groupId>
 +            <artifactId>netty</artifactId>
 +        </dependency>
 +
 +        <!-- Test and Logging Dependencies -->
 +
 +        <dependency>
 +            <groupId>org.apache.usergrid</groupId>
 +            <artifactId>usergrid-config</artifactId>
 +            <version>${project.version}</version>
 +            <scope>test</scope>
 +            <classifier>tests</classifier>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.hectorclient</groupId>
 +            <artifactId>hector-test</artifactId>
 +            <scope>test</scope>
 +        </dependency>
 +
 +
 +        <dependency>
 +            <groupId>org.mockito</groupId>
 +            <artifactId>mockito-core</artifactId>
 +            <version>${mockito.version}</version>
 +            <scope>test</scope>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.jvnet.mock-javamail</groupId>
 +            <artifactId>mock-javamail</artifactId>
 +            <scope>test</scope>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.apache.usergrid</groupId>
 +            <artifactId>usergrid-test-utils</artifactId>
 +            <version>${project.version}</version>
 +            <scope>test</scope>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.springframework</groupId>
 +            <artifactId>spring-test</artifactId>
 +            <scope>test</scope>
 +        </dependency>
 +
 +
 +        <dependency>
 +            <groupId>org.apache.usergrid</groupId>
 +            <artifactId>common</artifactId>
 +            <version>2.1.1-SNAPSHOT</version>
 +            <type>test-jar</type>
 +            <scope>test</scope>
 +        </dependency>
 +
 +
 +        <!-- Core Persistence deps -->
 +        <dependency>
 +            <groupId>org.apache.usergrid</groupId>
 +            <artifactId>collection</artifactId>
 +            <version>2.1.1-SNAPSHOT</version>
 +            <type>jar</type>
 +            <exclusions>
 +                <exclusion>
 +                    <artifactId>antlr</artifactId>
 +                    <groupId>org.antlr</groupId>
 +                </exclusion>
 +                <exclusion>
 +                    <artifactId>antlr</artifactId>
 +                    <groupId>antlr</groupId>
 +                </exclusion>
 +            </exclusions>
 +        </dependency>
 +
 +
 +        <dependency>
 +            <groupId>org.apache.usergrid</groupId>
 +            <artifactId>queryindex</artifactId>
 +            <version>2.1.1-SNAPSHOT</version>
 +            <type>jar</type>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.apache.usergrid</groupId>
 +            <artifactId>graph</artifactId>
 +            <version>2.1.1-SNAPSHOT</version>
 +            <type>jar</type>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.apache.usergrid</groupId>
 +            <artifactId>map</artifactId>
 +            <version>2.1.1-SNAPSHOT</version>
 +            <type>jar</type>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.apache.usergrid</groupId>
 +            <artifactId>cache</artifactId>
 +            <version>2.1.1-SNAPSHOT</version>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>org.apache.usergrid</groupId>
 +            <artifactId>queue</artifactId>
 +            <version>2.1.1-SNAPSHOT</version>
 +            <type>jar</type>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>com.codahale.metrics</groupId>
 +            <artifactId>metrics-core</artifactId>
 +            <version>${metrics.version}</version>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>com.codahale.metrics</groupId>
 +            <artifactId>metrics-graphite</artifactId>
 +            <version>${metrics.version}</version>
 +        </dependency>
++        <dependency>
++            <groupId>org.apache.usergrid</groupId>
++            <artifactId>common</artifactId>
++            <version>2.2.0-SNAPSHOT</version>
++        </dependency>
 +
 +    </dependencies>
 +
 +    <!--
 +    Do not need jacoco profile here because we do not override the surefire plugin in this POM
 +    -->
  
  </project>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java
----------------------------------------------------------------------
diff --cc stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java
index d2c38e4,623400d..28b1ccc
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java
@@@ -130,15 -106,16 +106,15 @@@ public class CpSetup implements Setup 
  
  
      @Override
-     public void setupSystemKeyspace() throws Exception {
+     public void runDataMigration() throws Exception {
  
-         logger.info( "Initialize system tables" );
+         injector.getInstance( DataMigrationManager.class ).migrate();
  
-         cass.createColumnFamily( getApplicationKeyspace(),
-             createColumnFamilyDefinition( getApplicationKeyspace(), APPLICATIONS_CF, ComparatorType.BYTESTYPE ) );
+     }
  
-         cass.createColumnFamily( getApplicationKeyspace(),
-             createColumnFamilyDefinition( getApplicationKeyspace(), PROPERTIES_CF, ComparatorType.BYTESTYPE ) );
 -
+     private void setupLegacySchema() throws Exception {
+ 
+         logger.info( "Initialize keyspace and legacy column families" );
  
          cass.createColumnFamily( getApplicationKeyspace(),
              createColumnFamilyDefinition( getApplicationKeyspace(), TOKENS_CF, ComparatorType.BYTESTYPE ) );
@@@ -187,8 -133,23 +132,20 @@@
      }
  
  
-     @Override
-     public boolean keyspacesExist() {
-         return true;
+     /**
+      * Initialize schema from the new 2.x Migration classes which contain schema individually
+      *
+      */
+ 
+     private void setupSchema() throws Exception {
+ 
+         MigrationManager m = injector.getInstance( MigrationManager.class );
+         try {
+             m.migrate();
+         }
+         catch ( MigrationException ex ) {
+             throw new RuntimeException( "Error migrating Core Persistence", ex );
+         }
      }
+ 
 -
 -
 -
  }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/CassandraService.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraClusterImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/rest/src/test/resources/usergrid-custom-test.properties
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/70ff8fdb/stack/services/src/test/resources/usergrid-custom-test.properties
----------------------------------------------------------------------


[35/38] usergrid git commit: Merge branch 'master' into datastax-cass-driver Fix issue with UniqueValueSerialization backwards compatibility via CQL and legacy Usergrid data.

Posted by mr...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
index 5320152,8c1f2d2..0753281
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
@@@ -18,34 -18,40 +18,38 @@@
  package org.apache.usergrid.persistence.collection.serialization.impl;
  
  
++
 +import java.nio.ByteBuffer;
  import java.util.*;
  
 -import com.netflix.astyanax.util.RangeBuilder;
 +import com.datastax.driver.core.*;
 +import com.datastax.driver.core.Row;
 +import com.datastax.driver.core.querybuilder.Clause;
 +import com.datastax.driver.core.querybuilder.QueryBuilder;
 +import com.datastax.driver.core.querybuilder.Using;
 +import org.apache.usergrid.persistence.core.CassandraConfig;
++import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 +import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 +import org.apache.usergrid.persistence.model.entity.SimpleId;
 +import org.apache.usergrid.persistence.model.field.*;
++
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
 -import org.apache.cassandra.db.marshal.BytesType;
--
  import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
  import org.apache.usergrid.persistence.collection.serialization.UniqueValue;
  import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
  import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
 -import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
 -import org.apache.usergrid.persistence.core.astyanax.ColumnNameIterator;
 -import org.apache.usergrid.persistence.core.astyanax.ColumnParser;
 -import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;
 -import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 -import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 -import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 +import org.apache.usergrid.persistence.core.CassandraFig;
- import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
  import org.apache.usergrid.persistence.core.scope.ApplicationScope;
  import org.apache.usergrid.persistence.core.util.ValidationUtils;
  import org.apache.usergrid.persistence.model.entity.Id;
 -import org.apache.usergrid.persistence.model.field.Field;
  
  import com.google.common.base.Preconditions;
 +
+ import com.netflix.astyanax.ColumnListMutation;
 -import com.netflix.astyanax.Keyspace;
 -import com.netflix.astyanax.MutationBatch;
 -import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
 -import com.netflix.astyanax.model.Column;
 -import com.netflix.astyanax.model.ConsistencyLevel;
 -import com.netflix.astyanax.model.Row;
 -import com.netflix.astyanax.query.RowQuery;
++
+ 
  
  /**
   * Reads and writes to UniqueValues column family.
@@@ -53,27 -59,25 +57,29 @@@
  public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
      implements UniqueValueSerializationStrategy {
  
-     private static final Logger log = LoggerFactory.getLogger( UniqueValueSerializationStrategyImpl.class );
+     private static final Logger logger = LoggerFactory.getLogger( UniqueValueSerializationStrategyImpl.class );
  
 +    public static final String UUID_TYPE_REVERSED = "UUIDType(reversed=true)";
  
 -    private final MultiTenantColumnFamily<ScopedRowKey<FieldKey>, EntityVersion>
 -        CF_UNIQUE_VALUES;
  
 +    private final String TABLE_UNIQUE_VALUES;
 +    private final String TABLE_UNIQUE_VALUES_LOG;
 +
 +    private final Map COLUMNS_UNIQUE_VALUES;
 +    private final Map COLUMNS_UNIQUE_VALUES_LOG;
  
 -    private final MultiTenantColumnFamily<ScopedRowKey<EntityKey>, UniqueFieldEntry>
 -        CF_ENTITY_UNIQUE_VALUE_LOG ;
  
      public static final int COL_VALUE = 0x0;
  
+     private final Comparator<UniqueValue> uniqueValueComparator = new UniqueValueComparator();
+ 
  
      private final SerializationFig serializationFig;
 -    protected final Keyspace keyspace;
      private final CassandraFig cassandraFig;
  
 +    private final Session session;
 +    private final CassandraConfig cassandraConfig;
 +
  
      /**
       * Construct serialization strategy for keyspace.
@@@ -186,134 -182,251 +192,285 @@@
          final EntityVersion ev = new EntityVersion( entityId, entityVersion );
          final UniqueFieldEntry uniqueFieldEntry = new UniqueFieldEntry( entityVersion, field );
  
 -        return doWrite( scope, value, new RowOp() {
  
 -            @Override
 -            public void doLookup( final ColumnListMutation<EntityVersion> colMutation ) {
 -                colMutation.deleteColumn( ev );
 -            }
 +        ByteBuffer partitionKey = getPartitionKey( scope.getApplication(), value.getEntityId().getType(),
 +            value.getField().getTypeName().toString(), value.getField().getName(), value.getField().getValue());
  
 +        ByteBuffer columnValue = serializeUniqueValueColumn(ev);
  
 -            @Override
 -            public void doLog( final ColumnListMutation<UniqueFieldEntry> colMutation ) {
 -                colMutation.deleteColumn( uniqueFieldEntry );
 -            }
 -        } );
 -    }
 -
 -
 -    /**
 -     * Do the column update or delete for the given column and row key
 -     *
 -     * @param applicationScope We need to use this when getting the keyspace
 -     * @param uniqueValue The unique value to write
 -     * @param op The operation to write
 -     */
 -    private MutationBatch doWrite( ApplicationScope applicationScope, UniqueValue uniqueValue, RowOp op ) {
 -        final MutationBatch batch = keyspace.prepareMutationBatch();
 +        final Clause uniqueEqKey = QueryBuilder.eq("key", partitionKey );
 +        final Clause uniqueEqColumn = QueryBuilder.eq("column1", columnValue );
 +        Statement uniqueDelete = QueryBuilder.delete().from(TABLE_UNIQUE_VALUES).where(uniqueEqKey).and(uniqueEqColumn);
 +        batch.add(uniqueDelete);
  
 -        final Id applicationId = applicationScope.getApplication();
  
 -        final FieldKey fieldKey = createUniqueValueKey( applicationId, uniqueValue.getEntityId().getType(), uniqueValue.getField() );
  
 +        ByteBuffer logPartitionKey = getLogPartitionKey(scope.getApplication(), entityId);
 +        ByteBuffer logColumnValue = serializeUniqueValueLogColumn(uniqueFieldEntry);
  
 -        op.doLookup( batch.withRow( CF_UNIQUE_VALUES, ScopedRowKey.fromKey( applicationId, fieldKey ) ) );
  
 +        final Clause uniqueLogEqKey = QueryBuilder.eq("key", logPartitionKey );
 +        final Clause uniqueLogEqColumn = QueryBuilder.eq("column1", logColumnValue );
  
 -        final EntityKey entityKey = createEntityUniqueLogKey( applicationId, uniqueValue.getEntityId() );
 +        Statement uniqueLogDelete = QueryBuilder.delete()
 +            .from(TABLE_UNIQUE_VALUES_LOG).where(uniqueLogEqKey).and( uniqueLogEqColumn);
  
 -        op.doLog( batch.withRow( CF_ENTITY_UNIQUE_VALUE_LOG,
 -            ScopedRowKey.fromKey( applicationId, entityKey ) ) );
 +        batch.add(uniqueLogDelete);
  
  
+         if ( logger.isTraceEnabled() ) {
+             logger.trace( "Building batch statement for unique value entity={} version={} name={} value={} ",
 -                uniqueValue.getEntityId().getUuid(), uniqueValue.getEntityVersion(),
 -                uniqueValue.getField().getName(), uniqueValue.getField().getValue() );
++                value.getEntityId().getUuid(), value.getEntityVersion(),
++                value.getField().getName(), value.getField().getValue() );
+         }
+ 
+ 
 +
          return batch;
      }
  
  
      @Override
--    public UniqueValueSet load( final ApplicationScope colScope, final String type, final Collection<Field> fields )
-          {
-         return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getReadCl() ), type, fields );
 -        throws ConnectionException {
 -        return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getReadCL() ), type, fields, false);
++    public UniqueValueSet load( final ApplicationScope colScope, final String type, final Collection<Field> fields ) {
++
++        return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getReadCl() ), type, fields, false );
++
      }
  
+     @Override
+     public UniqueValueSet load( final ApplicationScope colScope, final String type, final Collection<Field> fields,
 -                                boolean useReadRepair)
 -        throws ConnectionException {
 -        return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getReadCL() ), type, fields, useReadRepair);
++                                boolean useReadRepair) {
++
++        return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getReadCl() ), type, fields, useReadRepair);
++
+     }
+ 
+ 
  
      @Override
 -    public UniqueValueSet load(final ApplicationScope appScope, final ConsistencyLevel consistencyLevel,
 -                               final String type, final Collection<Field> fields, boolean useReadRepair) throws ConnectionException {
 +    public UniqueValueSet load( final ApplicationScope appScope,
 +                                final ConsistencyLevel consistencyLevel,
-                                 final String type, final Collection<Field> fields ) {
++                                final String type, final Collection<Field> fields, boolean useReadRepair ) {
++
  
          Preconditions.checkNotNull( fields, "fields are required" );
          Preconditions.checkArgument( fields.size() > 0, "More than 1 field must be specified" );
  
-         return loadCQL(appScope, consistencyLevel, type, fields);
++        return loadCQL(appScope, consistencyLevel, type, fields, useReadRepair);
 +
 +    }
 +
 +
 +    private UniqueValueSet loadCQL( final ApplicationScope appScope,
 +                                    final ConsistencyLevel consistencyLevel,
-                                     final String type, final Collection<Field> fields ) {
++                                    final String type, final Collection<Field> fields, boolean useReadRepair ) {
 +
 +        Preconditions.checkNotNull( fields, "fields are required" );
 +        Preconditions.checkArgument( fields.size() > 0, "More than 1 field must be specified" );
  
 -        final List<ScopedRowKey<FieldKey>> keys = new ArrayList<>( fields.size() );
  
          final Id applicationId = appScope.getApplication();
  
 -        for ( Field field : fields ) {
 +        // row key = app UUID + app type + entityType + field type + field name + field value
  
-         List<ByteBuffer> partitionKeys = new ArrayList<>( fields.size() );
 -            final FieldKey key = createUniqueValueKey( applicationId, type,  field );
+ 
+ 
 -            final ScopedRowKey<FieldKey> rowKey =
 -                ScopedRowKey.fromKey( applicationId, key );
+ 
 -            keys.add( rowKey );
 -        }
++        //List<ByteBuffer> partitionKeys = new ArrayList<>( fields.size() );
+ 
+         final UniqueValueSetImpl uniqueValueSet = new UniqueValueSetImpl( fields.size() );
+ 
 -        Iterator<Row<ScopedRowKey<FieldKey>, EntityVersion>> results =
 -            keyspace.prepareQuery( CF_UNIQUE_VALUES ).setConsistencyLevel( consistencyLevel ).getKeySlice( keys )
 -                .withColumnRange(new RangeBuilder().setLimit(serializationFig.getMaxLoadSize()).build())
 -                .execute().getResult().iterator();
+ 
 -        if( !results.hasNext()){
 -            if(logger.isTraceEnabled()){
 -                logger.trace("No partitions returned for unique value lookup");
 -            }
 -        }
 +        for ( Field field : fields ) {
 +
 +            //log.info(Bytes.toHexString(getPartitionKey(applicationId, type, field.getTypeName().toString(), field.getName(), field.getValue())));
  
-             partitionKeys.add(getPartitionKey(applicationId, type, field.getTypeName().toString(), field.getName(), field.getValue()));
++            //partitionKeys.add(getPartitionKey(applicationId, type, field.getTypeName().toString(), field.getName(), field.getValue()));
  
-         }
 -        while ( results.hasNext() )
++            final Clause inKey = QueryBuilder.in("key", getPartitionKey(applicationId, type,
++                field.getTypeName().toString(), field.getName(), field.getValue()) );
  
-         final UniqueValueSetImpl uniqueValueSet = new UniqueValueSetImpl( fields.size() );
 -        {
++            final Statement statement = QueryBuilder.select().all().from(TABLE_UNIQUE_VALUES)
++                .where(inKey)
++                .setConsistencyLevel(consistencyLevel);
  
-         final Clause inKey = QueryBuilder.in("key", partitionKeys );
 -            final Row<ScopedRowKey<FieldKey>, EntityVersion> unique = results.next();
++            final ResultSet resultSet = session.execute(statement);
  
-         final Statement statement = QueryBuilder.select().all().from(TABLE_UNIQUE_VALUES)
-             .where(inKey)
-             .setConsistencyLevel(consistencyLevel);
 -            final Field field = parseRowKey( unique.getKey() );
  
-         final ResultSet resultSet = session.execute(statement);
 -            final Iterator<Column<EntityVersion>> columnList = unique.getColumns().iterator();
++            Iterator<com.datastax.driver.core.Row> results = resultSet.iterator();
  
 -            //sanity check, nothing to do, skip it
 -            if ( !columnList.hasNext() ) {
++            if( !results.hasNext()){
+                 if(logger.isTraceEnabled()){
 -                    logger.trace("No cells exist in partition for unique value [{}={}]",
 -                        field.getName(), field.getValue().toString());
++                    logger.trace("No rows returned for unique value lookup of field: {}", field);
+                 }
 -                continue;
+             }
  
-         Iterator<com.datastax.driver.core.Row> results = resultSet.iterator();
  
+             List<UniqueValue> candidates = new ArrayList<>();
  
-         while( results.hasNext() ){
 -            /**
 -             *  While iterating the columns, a rule is being enforced to only EVER return the oldest UUID.  This means
 -             *  the UUID with the oldest timestamp ( it was the original entity written for the unique value ).
 -             *
 -             *  We do this to prevent cycling of unique value -> entity UUID mappings as this data is ordered by the
 -             *  entity's version and not the entity's timestamp itself.
 -             *
 -             *  If newer entity UUIDs are encountered, they are removed from the unique value tables, however their
 -             *  backing serialized entity data is left in tact in case a cleanup / audit is later needed.
 -             */
 -            while (columnList.hasNext()) {
++            while( results.hasNext() ){
 +
-             final com.datastax.driver.core.Row unique = results.next();
-             ByteBuffer partitionKey = unique.getBytes("key");
-             ByteBuffer column = unique.getBytesUnsafe("column1");
++                final com.datastax.driver.core.Row unique = results.next();
++                ByteBuffer partitionKey = unique.getBytes("key");
++                ByteBuffer column = unique.getBytesUnsafe("column1");
 +
-             List<Object> keyContents = deserializePartitionKey(partitionKey);
-             List<Object> columnContents = deserializeUniqueValueColumn(column);
++                List<Object> keyContents = deserializePartitionKey(partitionKey);
++                List<Object> columnContents = deserializeUniqueValueColumn(column);
 +
-             FieldTypeName fieldType;
-             String name;
-             String value;
-             if(this instanceof UniqueValueSerializationStrategyV2Impl) {
++                FieldTypeName fieldType;
++                String name;
++                String value;
++                if(this instanceof UniqueValueSerializationStrategyV2Impl) {
 +
-                  fieldType = FieldTypeName.valueOf((String) keyContents.get(3));
-                  name = (String) keyContents.get(4);
-                  value = (String) keyContents.get(5);
 +
-             }else{
++                    fieldType = FieldTypeName.valueOf((String) keyContents.get(3));
++                    name = (String) keyContents.get(4);
++                    value = (String) keyContents.get(5);
 +
-                 fieldType = FieldTypeName.valueOf((String) keyContents.get(5));
-                 name = (String) keyContents.get(6);
-                 value = (String) keyContents.get(7);
++                }else{
 +
-             }
 +
-             Field field = getField(name, value, fieldType);
++                    fieldType = FieldTypeName.valueOf((String) keyContents.get(5));
++                    name = (String) keyContents.get(6);
++                    value = (String) keyContents.get(7);
++
++
++                }
++
++                Field returnedField = getField(name, value, fieldType);
++
++
++                final EntityVersion entityVersion = new EntityVersion(
++                    new SimpleId((UUID)columnContents.get(1), (String)columnContents.get(2)), (UUID)columnContents.get(0));
++//            //sanity check, nothing to do, skip it
++//            if ( !columnList.hasNext() ) {
++//                if(logger.isTraceEnabled()){
++//                    logger.trace("No cells exist in partition for unique value [{}={}]",
++//                        field.getName(), field.getValue().toString());
++//                }
++//                continue;
++//            }
++
++
++
++
++                /**
++                 *  While iterating the rows, a rule is enforced to only EVER return the oldest UUID for the field.
++                 *  This means the UUID with the oldest timestamp ( it was the original entity written for
++                 *  the unique value ).
++                 *
++                 *  We do this to prevent cycling of unique value -> entity UUID mappings as this data is ordered by the
++                 *  entity's version and not the entity's timestamp itself.
++                 *
++                 *  If newer entity UUIDs are encountered, they are removed from the unique value tables, however their
++                 *  backing serialized entity data is left in tact in case a cleanup / audit is later needed.
++                 */
+ 
 -                final EntityVersion entityVersion = columnList.next().getName();
+ 
+                 final UniqueValue uniqueValue =
 -                    new UniqueValueImpl(field, entityVersion.getEntityId(), entityVersion.getEntityVersion());
++                    new UniqueValueImpl(returnedField, entityVersion.getEntityId(), entityVersion.getEntityVersion());
+ 
+                 // set the initial candidate and move on
+                 if (candidates.size() == 0) {
+                     candidates.add(uniqueValue);
  
+                     if (logger.isTraceEnabled()) {
+                         logger.trace("First entry for unique value [{}={}] found for application [{}], adding " +
+                                 "entry with entity id [{}] and entity version [{}] to the candidate list and continuing",
 -                            field.getName(), field.getValue().toString(), applicationId.getType(),
++                            returnedField.getName(), returnedField.getValue().toString(), applicationId.getType(),
+                             uniqueValue.getEntityId().getUuid(), uniqueValue.getEntityVersion());
+                     }
  
-             final EntityVersion entityVersion = new EntityVersion(
-                 new SimpleId((UUID)columnContents.get(1), (String)columnContents.get(2)), (UUID)columnContents.get(0));
+                     continue;
+                 }
  
+                 if(!useReadRepair){
  
-             final UniqueValueImpl uniqueValue =
-               new UniqueValueImpl( field, entityVersion.getEntityId(), entityVersion.getEntityVersion() );
+                     // take only the first
+                     if (logger.isTraceEnabled()) {
+                         logger.trace("Read repair not enabled for this request of unique value [{}={}], breaking out" +
 -                            " of cell loop", field.getName(), field.getValue().toString());
++                            " of cell loop", returnedField.getName(), returnedField.getValue().toString());
+                     }
+                     break;
+ 
+                 } else {
+ 
+ 
+                     final int result = uniqueValueComparator.compare(uniqueValue, candidates.get(candidates.size() - 1));
+ 
+                     if (result == 0) {
+ 
+                         // do nothing, only versions can be newer and we're not worried about newer versions of same entity
+                         if (logger.isTraceEnabled()) {
+                             logger.trace("Current unique value [{}={}] entry has UUID [{}] equal to candidate UUID [{}]",
 -                                field.getName(), field.getValue().toString(), uniqueValue.getEntityId().getUuid(),
++                                returnedField.getName(), returnedField.getValue().toString(), uniqueValue.getEntityId().getUuid(),
+                                 candidates.get(candidates.size() -1));
+                         }
+ 
+                         // update candidate w/ latest version
+                         candidates.add(uniqueValue);
+ 
+                     } else if (result < 0) {
+ 
+                         // delete the duplicate from the unique value index
+                         candidates.forEach(candidate -> {
+ 
 -                            try {
 -
 -                                logger.warn("Duplicate unique value [{}={}] found for application [{}], removing newer " +
 -                                        "entry with entity id [{}] and entity version [{}]", field.getName(),
 -                                    field.getValue().toString(), applicationId.getUuid(),
 -                                    candidate.getEntityId().getUuid(), candidate.getEntityVersion());
 -
 -                                delete(appScope, candidate).execute();
++                            logger.warn("Duplicate unique value [{}={}] found for application [{}], removing newer " +
++                                    "entry with entity id [{}] and entity version [{}]", returnedField.getName(),
++                                returnedField.getValue().toString(), applicationId.getUuid(),
++                                candidate.getEntityId().getUuid(), candidate.getEntityVersion());
+ 
 -                            } catch (ConnectionException e) {
 -                               logger.error( "Unable to connect to cassandra during duplicate repair of [{}={}]",
 -                                   field.getName(), field.getValue().toString() );
 -                            }
++                            session.execute(deleteCQL(appScope, candidate));
+ 
+                         });
+ 
+                         // clear the transient candidates list
+                         candidates.clear();
+ 
+                         if (logger.isTraceEnabled()) {
+                             logger.trace("Updating candidate unique value [{}={}] to entity id [{}] and " +
 -                                "entity version [{}]", field.getName(), field.getValue().toString(),
++                                    "entity version [{}]", returnedField.getName(), returnedField.getValue().toString(),
+                                 uniqueValue.getEntityId().getUuid(), uniqueValue.getEntityVersion());
+ 
+                         }
+ 
+                         // add our new candidate to the list
+                         candidates.add(uniqueValue);
+ 
+ 
+                     } else {
+ 
+                         logger.warn("Duplicate unique value [{}={}] found for application [{}], removing newer entry " +
 -                                "with entity id [{}] and entity version [{}].", field.getName(), field.getValue().toString(),
++                                "with entity id [{}] and entity version [{}].", returnedField.getName(), returnedField.getValue().toString(),
+                             applicationId.getUuid(), uniqueValue.getEntityId().getUuid(), uniqueValue.getEntityVersion());
+ 
+                         // delete the duplicate from the unique value index
 -                        delete(appScope, uniqueValue).execute();
++                        session.execute(deleteCQL(appScope, uniqueValue));
+ 
+ 
+                     }
+ 
+                 }
 -            }
+ 
 -            // take the last candidate ( should be the latest version) and add to the result set
++            }
+ 
 -            final UniqueValue returnValue = candidates.get(candidates.size() -1);
 -            if(logger.isTraceEnabled()){
 -                logger.trace("Adding unique value [{}={}] with entity id [{}] and entity version [{}] to response set",
 -                    returnValue.getField().getName(), returnValue.getField().getValue().toString(),
 -                    returnValue.getEntityId().getUuid(), returnValue.getEntityVersion());
++            if ( candidates.size() > 0 ) {
++                // take the last candidate ( should be the latest version) and add to the result set
++                final UniqueValue returnValue = candidates.get(candidates.size() - 1);
++                if (logger.isTraceEnabled()) {
++                    logger.trace("Adding unique value [{}={}] with entity id [{}] and entity version [{}] to response set",
++                        returnValue.getField().getName(), returnValue.getField().getValue().toString(),
++                        returnValue.getEntityId().getUuid(), returnValue.getEntityVersion());
++                }
++                uniqueValueSet.addValue(returnValue);
+             }
 -            uniqueValueSet.addValue(returnValue);
 +
-             uniqueValueSet.addValue(uniqueValue);
  
          }
  
++
          return uniqueValueSet;
 +
      }
  
  
@@@ -366,103 -471,101 +523,127 @@@
  
  
      /**
 -     * Converts raw columns to the expected output
 +     * Get the CQL table definition for the unique values log table
       */
 -    private static final class UniqueEntryParser implements ColumnParser<UniqueFieldEntry, UniqueValue> {
 +    protected abstract TableDefinition getEntityUniqueLogTable();
 +
  
 +    public class AllUniqueFieldsIterator implements Iterable<UniqueValue>, Iterator<UniqueValue> {
 +
 +        private final Session session;
 +        private final Statement query;
          private final Id entityId;
  
 +        private Iterator<Row> sourceIterator;
  
 -        private UniqueEntryParser( final Id entityId ) {this.entityId = entityId;}
  
  
 -        @Override
 -        public UniqueValue parseColumn( final Column<UniqueFieldEntry> column ) {
 -            final UniqueFieldEntry entry = column.getName();
 +        public AllUniqueFieldsIterator( final Session session, final Statement query, final Id entityId){
 +
 +            this.session = session;
 +            this.query = query;
 +            this.entityId = entityId;
  
 -            return new UniqueValueImpl( entry.getField(), entityId, entry.getVersion() );
          }
 -    }
  
  
 -    @Override
 -    public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
 +        @Override
 +        public Iterator<UniqueValue> iterator() {
 +            return this;
 +        }
  
 -        final MultiTenantColumnFamilyDefinition uniqueLookupCF =
 -            new MultiTenantColumnFamilyDefinition( CF_UNIQUE_VALUES, BytesType.class.getSimpleName(),
 -                ColumnTypes.DYNAMIC_COMPOSITE_TYPE, BytesType.class.getSimpleName(),
 -                MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
 +        @Override
 +        public boolean hasNext() {
  
 -        final MultiTenantColumnFamilyDefinition uniqueLogCF =
 -            new MultiTenantColumnFamilyDefinition( CF_ENTITY_UNIQUE_VALUE_LOG, BytesType.class.getSimpleName(),
 -                ColumnTypes.DYNAMIC_COMPOSITE_TYPE, BytesType.class.getSimpleName(),
 -                MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
 +            if ( sourceIterator == null ) {
  
 -        return Arrays.asList( uniqueLookupCF, uniqueLogCF );
 -    }
 +                advanceIterator();
  
 +                return sourceIterator.hasNext();
 +            }
  
 -    /**
 -     * Get the column family for the unique fields
 -     */
 -    protected abstract MultiTenantColumnFamily<ScopedRowKey<FieldKey>, EntityVersion> getUniqueValuesCF();
 +            return sourceIterator.hasNext();
 +        }
  
 +        @Override
 +        public UniqueValue next() {
  
 -    /**
 -     * Generate a key that is compatible with the column family
 -     *
 -     * @param applicationId The applicationId
 -     * @param type The type in the field
 -     * @param field The field we're creating the key for
 -     */
 -    protected abstract FieldKey createUniqueValueKey(final Id applicationId, final String type, final Field field );
 +            com.datastax.driver.core.Row next = sourceIterator.next();
  
 -    /**
 -     * Parse the row key into the field
 -     * @param rowKey
 -     * @return
 -     */
 -    protected abstract Field parseRowKey(final ScopedRowKey<FieldKey> rowKey);
 +            ByteBuffer column = next.getBytesUnsafe("column1");
  
 +            List<Object> columnContents = deserializeUniqueValueLogColumn(column);
  
 -    /**
 -     * Get the column family for the unique field CF
 -     */
 -    protected abstract MultiTenantColumnFamily<ScopedRowKey<EntityKey>, UniqueFieldEntry> getEntityUniqueLogCF();
 +            UUID version = (UUID) columnContents.get(0);
 +            String name = (String) columnContents.get(1);
 +            String value = (String) columnContents.get(2);
 +            FieldTypeName fieldType = FieldTypeName.valueOf((String) columnContents.get(3));
  
 -    /**
 -     * Generate a key that is compatible with the column family
 -     *
 -     * @param applicationId The applicationId
 -     * @param uniqueValueId The uniqueValue
 -     */
 -    protected abstract EntityKey createEntityUniqueLogKey(final Id applicationId,  final Id uniqueValueId );
  
 +            return new UniqueValueImpl(getField(name, value, fieldType), entityId, version);
 +
 +        }
 +
 +        private void advanceIterator() {
 +
 +            sourceIterator = session.execute(query).iterator();
 +        }
 +    }
 +
 +    private Field getField( String name, String value, FieldTypeName fieldType){
 +
 +        Field field = null;
 +
 +        switch ( fieldType ) {
 +            case BOOLEAN:
 +                field = new BooleanField( name, Boolean.parseBoolean( value ) );
 +                break;
 +            case DOUBLE:
 +                field = new DoubleField( name, Double.parseDouble( value ) );
 +                break;
 +            case FLOAT:
 +                field = new FloatField( name, Float.parseFloat( value ) );
 +                break;
 +            case INTEGER:
 +                field =  new IntegerField( name, Integer.parseInt( value ) );
 +                break;
 +            case LONG:
 +                field = new LongField( name, Long.parseLong( value ) );
 +                break;
 +            case STRING:
 +                field = new StringField( name, value );
 +                break;
 +            case UUID:
 +                field = new UUIDField( name, UUID.fromString( value ) );
 +                break;
 +        }
 +
 +        return field;
 +
 +    }
  
+ 
+     private class UniqueValueComparator implements Comparator<UniqueValue> {
+ 
+         @Override
+         public int compare(UniqueValue o1, UniqueValue o2) {
+ 
+             if( o1.getEntityId().getUuid().equals(o2.getEntityId().getUuid())){
+ 
+                 return 0;
+ 
+             }else if( o1.getEntityId().getUuid().timestamp() < o2.getEntityId().getUuid().timestamp()){
+ 
+                 return -1;
+ 
+             }
+ 
+             // if the UUIDs are not equal and o1's timestamp is not less than o2's timestamp,
+             // then o1 must be greater than o2
+             return 1;
+ 
+ 
+         }
+     }
+ 
  }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
index 4b5653f,f971b23..61f0f80
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
@@@ -91,10 -113,23 +91,24 @@@ public class UniqueValueSerializationSt
          return migration.to.load( applicationScope, type, fields );
      }
  
+     @Override
+     public UniqueValueSet load( final ApplicationScope applicationScope, final String type,
 -                                final Collection<Field> fields, boolean useReadRepair ) throws ConnectionException {
++                                final Collection<Field> fields, boolean useReadRepair ) {
+ 
+         final MigrationRelationship<UniqueValueSerializationStrategy> migration = getMigrationRelationShip();
+ 
+         if ( migration.needsMigration() ) {
+             return migration.from.load( applicationScope, type, fields, useReadRepair );
+         }
+ 
+         return migration.to.load( applicationScope, type, fields, useReadRepair );
+     }
+ 
  
      @Override
 -    public UniqueValueSet load(final ApplicationScope applicationScope, final ConsistencyLevel consistencyLevel,
 -                               final String type, final Collection<Field> fields, boolean useReadRepair) throws ConnectionException {
 +    public UniqueValueSet load( final ApplicationScope applicationScope, final ConsistencyLevel consistencyLevel,
-                                 final String type, final Collection<Field> fields ) {
++                                final String type, final Collection<Field> fields, boolean useReadRepair ) {
++
  
          final MigrationRelationship<UniqueValueSerializationStrategy> migration = getMigrationRelationShip();
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
index d305044,6a1cb58..55ba011
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
@@@ -133,280 -114,40 +133,286 @@@ public class UniqueValueSerializationSt
  
  
      @Override
 -    protected CollectionPrefixedKey<Field> createUniqueValueKey( final Id applicationId,
 -                                                                 final String type, final Field field) {
 +    protected List<Object> deserializePartitionKey(ByteBuffer bb){
 +
 +
 +        /**
 +         *  List<Object> keys = new ArrayList<>(8);
 +            keys.add(0, appUUID);
 +            keys.add(1, applicationType);
 +            keys.add(2, appUUID);
 +            keys.add(3, applicationType);
 +            keys.add(4, entityType);
 +            keys.add(5, fieldType);
 +            keys.add(6, fieldName);
 +            keys.add(7, fieldValueString);
 +
 +         */
 +
 +        int count = 0;
 +        List<Object> stuff = new ArrayList<>();
 +        while(bb.hasRemaining()){
 +            ByteBuffer data = CQLUtils.getWithShortLength(bb);
 +            if(count == 0 || count == 2){
 +                stuff.add(DataType.uuid().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
 +            }else{
 +                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
 +            }
 +            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
 +            count++;
 +        }
 +
 +        return stuff;
 +
 +    }
 +
 +    @Override
 +    protected ByteBuffer serializeUniqueValueLogColumn(UniqueFieldEntry fieldEntry){
 +
 +        /**
 +         *  final UUID version = value.getVersion();
 +            final Field<?> field = value.getField();
 +
 +             final FieldTypeName fieldType = field.getTypeName();
 +             final String fieldValue = field.getValue().toString().toLowerCase();
 +
 +
 +             DynamicComposite composite = new DynamicComposite(  );
 +
 +             //we want to sort ascending to descending by version
 +             composite.addComponent( version,  UUID_SERIALIZER, ColumnTypes.UUID_TYPE_REVERSED);
 +             composite.addComponent( field.getName(), STRING_SERIALIZER );
 +             composite.addComponent( fieldValue, STRING_SERIALIZER );
 +             composite.addComponent( fieldType.name() , STRING_SERIALIZER);
 +         */
 +
 +        // values are serialized as strings, not sure why, and always lower cased
 +        String fieldValueString = fieldEntry.getField().getValue().toString().toLowerCase();
 +
 +
 +        List<Object> keys = new ArrayList<>(4);
 +        keys.add(fieldEntry.getVersion());
 +        keys.add(fieldEntry.getField().getName());
 +        keys.add(fieldValueString);
 +        keys.add(fieldEntry.getField().getTypeName().name());
 +
 +        String comparator = UUID_TYPE_REVERSED;
 +
 +        int size = 16+fieldEntry.getField().getName().length()+fieldEntry.getField().getValue().toString().length()+
 +            fieldEntry.getField().getTypeName().name().length();
 +
 +        // we always need to add length for the 2 byte comparator short,  2 byte length short and 1 byte equality
 +        size += keys.size()*5;
 +
 +        // uuid type comparator is longest, ensure we allocate buffer using the max size to avoid overflow
 +        size += keys.size()*comparator.length();
 +
 +        ByteBuffer stuff = ByteBuffer.allocate(size);
 +
 +
 +        for (Object key : keys) {
  
 +            if(key.equals(fieldEntry.getVersion())) {
 +                int p = comparator.indexOf("(reversed=true)");
 +                boolean desc = false;
 +                if (p >= 0) {
 +                    comparator = comparator.substring(0, p);
 +                    desc = true;
 +                }
  
 -        final String collectionName = LegacyScopeUtils.getCollectionScopeNameFromEntityType( type );
 +                byte a = (byte) 85; // this is the byte value for UUIDType in astyanax used in legacy data
 +                if (desc) {
 +                    a = (byte) Character.toUpperCase((char) a);
 +                }
  
 +                stuff.putShort((short) ('\u8000' | a));
 +            }else{
 +                comparator = "UTF8Type"; // only strings are being serialized other than UUIDs here
 +                stuff.putShort((short)comparator.length());
 +                stuff.put(DataType.serializeValue(comparator, ProtocolVersion.NEWEST_SUPPORTED));
 +            }
  
 -        final CollectionPrefixedKey<Field> uniquePrefixedKey =
 -            new CollectionPrefixedKey<>( collectionName, applicationId, field );
 +            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
 +            if (kb == null) {
 +                kb = ByteBuffer.allocate(0);
 +            }
 +
 +            // put a short that indicates how big the buffer is for this item
 +            stuff.putShort((short) kb.remaining());
 +
 +            // put the actual item
 +            stuff.put(kb.slice());
 +
 +            // put an equality byte ( again not used by part of legacy thrift Astyanax schema)
 +            stuff.put((byte) 0);
 +
 +
 +        }
 +
 +        stuff.flip();
 +        return stuff.duplicate();
  
 -        return uniquePrefixedKey;
      }
  
 +    @Override
 +    protected ByteBuffer getPartitionKey(Id applicationId, String entityType, String fieldType, String fieldName, Object fieldValue ){
 +
 +        return serializeKey(applicationId.getUuid(), applicationId.getType(),
 +            entityType, fieldType, fieldName, fieldValue);
 +
 +    }
 +
 +    @Override
 +    protected ByteBuffer getLogPartitionKey(final Id applicationId, final Id uniqueValueId){
 +
 +        return serializeLogKey(applicationId.getUuid(), applicationId.getType(),
 +            uniqueValueId.getUuid(), uniqueValueId.getType());
 +
 +    }
  
      @Override
 -    protected Field parseRowKey( final ScopedRowKey<CollectionPrefixedKey<Field>> rowKey ) {
 -        return rowKey.getKey().getSubKey();
 +    protected ByteBuffer serializeUniqueValueColumn(EntityVersion entityVersion){
 +
 +        /**
 +         *  final Id entityId = ev.getEntityId();
 +            final UUID entityUuid = entityId.getUuid();
 +            final String entityType = entityId.getType();
 +
 +            CompositeBuilder builder = Composites.newDynamicCompositeBuilder();
 +
 +            builder.addUUID( entityVersion );
 +            builder.addUUID( entityUuid );
 +            builder.addString(entityType );
 +         */
 +
 +        String comparator = "UTF8Type";
 +
 +        List<Object> keys = new ArrayList<>(3);
 +        keys.add(entityVersion.getEntityVersion());
 +        keys.add(entityVersion.getEntityId().getUuid());
 +        keys.add(entityVersion.getEntityId().getType());
 +
 +        // UUIDs are 16 bytes
 +        int size = 16+16+entityVersion.getEntityId().getType().length();
 +
 +        // we always need to add length for the 2 byte comparator short,  2 byte length short and 1 byte equality
 +        size += keys.size()*5;
 +
 +        // we always add comparator to the buffer as well
 +        size += keys.size()*comparator.length();
 +
 +        ByteBuffer stuff = ByteBuffer.allocate(size);
 +
 +        for (Object key : keys) {
 +
 +            if(key instanceof UUID){
 +                comparator = "UUIDType";
 +            }else{
 +                comparator = "UTF8Type"; // if it's not a UUID, the only other thing we're serializing is text
 +            }
 +
 +            stuff.putShort((short)comparator.length());
 +            stuff.put(DataType.serializeValue(comparator, ProtocolVersion.NEWEST_SUPPORTED));
 +
 +            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
 +            if (kb == null) {
 +                kb = ByteBuffer.allocate(0);
 +            }
 +
 +            // put a short that indicates how big the buffer is for this item
 +            stuff.putShort((short) kb.remaining());
 +
 +            // put the actual item
 +            stuff.put(kb.slice());
 +
 +            // put an equality byte ( again not used by part of legacy thrift Astyanax schema)
 +            stuff.put((byte) 0);
 +
 +
 +        }
 +
 +        stuff.flip();
 +        return stuff.duplicate();
 +
      }
  
 +    @Override
 +    protected List<Object> deserializeUniqueValueColumn(ByteBuffer bb){
 +
 +        List<Object> stuff = new ArrayList<>();
 +        int count = 0;
 +        while(bb.hasRemaining()){
 +
-             // custom columns have a short at beginning for comparator (which we don't use here )
-             ByteBuffer comparator = CQLUtils.getWithShortLength(bb);
++            // pull of custom comparator (per Astyanax deserialize)
++            int e = CQLUtils.getShortLength(bb);
++            if((e & '\u8000') == 0) {
++                CQLUtils.getBytes(bb, e);
++            } else {
++                // do nothing
++            }
 +
 +            ByteBuffer data = CQLUtils.getWithShortLength(bb);
 +
 +
 +            // first two composites are UUIDs, rest are strings
 +            if(count == 0) {
 +                stuff.add(new UUID(data.getLong(), data.getLong()));
 +            }else if(count ==1){
 +                stuff.add(new UUID(data.getLong(), data.getLong()));
 +            }else{
 +                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
 +            }
 +
 +            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
 +
 +            count++;
 +        }
 +
 +        return stuff;
 +
 +    }
  
      @Override
 -    protected CollectionPrefixedKey<Id> createEntityUniqueLogKey( final Id applicationId,
 -                                                                  final Id uniqueValueId ) {
 +    protected List<Object> deserializeUniqueValueLogColumn(ByteBuffer bb){
 +
 +
 +        /**
 +         *  List<Object> keys = new ArrayList<>(4);
 +            keys.add(fieldEntry.getVersion());
 +            keys.add(fieldEntry.getField().getName());
 +            keys.add(fieldValueString);
 +            keys.add(fieldEntry.getField().getTypeName().name());
 +         */
  
 +        List<Object> stuff = new ArrayList<>();
 +        int count = 0;
 +        while(bb.hasRemaining()){
  
-             // the comparator info is different for the UUID reversed type vs. UTF8 type
-             if(count ==0){
-                 bb.getShort(); // take the reversed comparator byte off
-             }else {
-                 ByteBuffer comparator = CQLUtils.getWithShortLength(bb);
 -        final String collectionName = LegacyScopeUtils.getCollectionScopeNameFromEntityType( uniqueValueId.getType() );
++            // pull of custom comparator (per Astyanax deserialize)
++            int e = CQLUtils.getShortLength(bb);
++            if((e & '\u8000') == 0) {
++                CQLUtils.getBytes(bb, e);
++            } else {
++                // do nothing
 +            }
  
 +            ByteBuffer data = CQLUtils.getWithShortLength(bb);
  
 -        final CollectionPrefixedKey<Id> collectionPrefixedEntityKey =
 -            new CollectionPrefixedKey<>( collectionName, applicationId, uniqueValueId );
  
 +            // first composite is a UUID, rest are strings
 +            if(count == 0) {
 +                stuff.add(new UUID(data.getLong(), data.getLong()));
 +            }else{
 +                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
 +            }
  
 +            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
 +
 +            count++;
 +        }
 +
 +        return stuff;
  
 -        return collectionPrefixedEntityKey;
      }
  
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
index 6ea5c1e,40622a4..92c0a5b
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
@@@ -20,20 -20,21 +20,21 @@@
  package org.apache.usergrid.persistence.collection.serialization.impl;
  
  
 -import java.util.Arrays;
 -import java.util.Collection;
 +import java.nio.ByteBuffer;
 +import java.util.*;
  
 -import org.apache.cassandra.db.marshal.BytesType;
 +import com.datastax.driver.core.DataType;
 +import com.datastax.driver.core.ProtocolVersion;
 +import com.datastax.driver.core.Session;
  
++import org.apache.cassandra.utils.ByteBufferUtil;
  import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
 -import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
 -import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;
 -import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
 -import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 +import org.apache.usergrid.persistence.core.CassandraConfig;
 +import org.apache.usergrid.persistence.core.CassandraFig;
  import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 -import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 -import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
 +import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 +import org.apache.usergrid.persistence.core.datastax.TableDefinition;
  import org.apache.usergrid.persistence.model.entity.Id;
 -import org.apache.usergrid.persistence.model.field.Field;
  
  import com.google.inject.Inject;
  import com.google.inject.Singleton;
@@@ -124,277 -114,20 +125,284 @@@ public class UniqueValueSerializationSt
  
  
      @Override
 -    protected TypeField createUniqueValueKey( final Id applicationId,  final String type, final Field field) {
 -        return new TypeField(type,field);
 +    protected List<Object> deserializePartitionKey(ByteBuffer bb){
 +
 +
 +        /**
 +         *   List<Object> keys = new ArrayList<>(6);
 +             keys.add(0, appUUID); // UUID
 +             keys.add(1, applicationType); // String
 +             keys.add(2, entityType); // String
 +             keys.add(3, fieldType); // String
 +             keys.add(4, fieldName); // String
 +             keys.add(5, fieldValueString); // String
 +
 +         */
 +
 +        List<Object> stuff = new ArrayList<>();
 +        while(bb.hasRemaining()){
 +            ByteBuffer data = CQLUtils.getWithShortLength(bb);
 +            if(stuff.size() == 0){
 +                stuff.add(DataType.uuid().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
 +            }else{
 +                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
 +            }
 +            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
 +
 +        }
 +
 +        return stuff;
 +
      }
  
 +    @Override
 +    protected ByteBuffer serializeUniqueValueLogColumn(UniqueFieldEntry fieldEntry){
 +
 +        /**
 +         *   final UUID version = value.getVersion();
 +             final Field<?> field = value.getField();
 +
 +             final FieldTypeName fieldType = field.getTypeName();
 +             final String fieldValue = field.getValue().toString().toLowerCase();
 +
 +
 +             DynamicComposite composite = new DynamicComposite(  );
 +
 +             //we want to sort ascending to descending by version
 +             composite.addComponent( version,  UUID_SERIALIZER, ColumnTypes.UUID_TYPE_REVERSED);
 +             composite.addComponent( field.getName(), STRING_SERIALIZER );
 +             composite.addComponent( fieldValue, STRING_SERIALIZER );
 +             composite.addComponent( fieldType.name() , STRING_SERIALIZER);
 +         */
 +
 +        // values are serialized as strings, not sure why, and always lower cased
 +        String fieldValueString = fieldEntry.getField().getValue().toString().toLowerCase();
 +
 +
 +        List<Object> keys = new ArrayList<>(4);
 +        keys.add(fieldEntry.getVersion());
 +        keys.add(fieldEntry.getField().getName());
 +        keys.add(fieldValueString);
 +        keys.add(fieldEntry.getField().getTypeName().name());
 +
 +        String comparator = UUID_TYPE_REVERSED;
 +
 +        int size = 16+fieldEntry.getField().getName().length()+fieldEntry.getField().getValue().toString().length()+
 +            fieldEntry.getField().getTypeName().name().length();
 +
 +        // we always need to add length for the 2 byte comparator short,  2 byte length short and 1 byte equality
 +        size += keys.size()*5;
 +
 +        // uuid type comparator is longest, ensure we allocate buffer using the max size to avoid overflow
 +        size += keys.size()*comparator.length();
 +
 +        ByteBuffer stuff = ByteBuffer.allocate(size);
 +
 +
 +        for (Object key : keys) {
 +
 +            if(key.equals(fieldEntry.getVersion())) {
 +                int p = comparator.indexOf("(reversed=true)");
 +                boolean desc = false;
 +                if (p >= 0) {
 +                    comparator = comparator.substring(0, p);
 +                    desc = true;
 +                }
 +
 +                byte a = (byte) 85; // this is the byte value for UUIDType in astyanax used in legacy data
 +                if (desc) {
 +                    a = (byte) Character.toUpperCase((char) a);
 +                }
 +
 +                stuff.putShort((short) ('\u8000' | a));
 +            }else{
 +                comparator = "UTF8Type"; // only strings are being serialized other than UUIDs here
 +                stuff.putShort((short)comparator.length());
 +                stuff.put(DataType.serializeValue(comparator, ProtocolVersion.NEWEST_SUPPORTED));
 +            }
 +
 +            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
 +            if (kb == null) {
 +                kb = ByteBuffer.allocate(0);
 +            }
 +
 +            // put a short that indicates how big the buffer is for this item
 +            stuff.putShort((short) kb.remaining());
 +
 +            // put the actual item
 +            stuff.put(kb.slice());
 +
 +            // put an equality byte ( again not used by part of legacy thrift Astyanax schema)
 +            stuff.put((byte) 0);
 +
 +
 +        }
 +
 +        stuff.flip();
 +        return stuff.duplicate();
 +
 +    }
  
      @Override
 -    protected Field parseRowKey( final ScopedRowKey<TypeField> rowKey ) {
 -        return rowKey.getKey().getField();
 +    protected ByteBuffer getPartitionKey(Id applicationId, String entityType, String fieldType, String fieldName, Object fieldValue ){
 +
 +        return serializeKey(applicationId.getUuid(), applicationId.getType(),
 +            entityType, fieldType, fieldName, fieldValue);
 +
 +    }
 +
 +    @Override
 +    protected ByteBuffer getLogPartitionKey(final Id applicationId, final Id uniqueValueId){
 +
 +        return serializeLogKey(applicationId.getUuid(), applicationId.getType(),
 +            uniqueValueId.getUuid(), uniqueValueId.getType());
 +
 +    }
 +
 +    @Override
 +    protected ByteBuffer serializeUniqueValueColumn(EntityVersion entityVersion){
 +
 +        /**
 +         *   final Id entityId = ev.getEntityId();
 +             final UUID entityUuid = entityId.getUuid();
 +             final String entityType = entityId.getType();
 +
 +             CompositeBuilder builder = Composites.newDynamicCompositeBuilder();
 +
 +             builder.addUUID( entityVersion );
 +             builder.addUUID( entityUuid );
 +             builder.addString(entityType );
 +         */
 +
 +        String comparator = "UTF8Type";
 +
 +        List<Object> keys = new ArrayList<>(3);
 +        keys.add(entityVersion.getEntityVersion());
 +        keys.add(entityVersion.getEntityId().getUuid());
 +        keys.add(entityVersion.getEntityId().getType());
 +
 +        // UUIDs are 16 bytes
 +        int size = 16+16+entityVersion.getEntityId().getType().length();
 +
 +        // we always need to add length for the 2 byte comparator short,  2 byte length short and 1 byte equality
 +        size += keys.size()*5;
 +
 +        // we always add comparator to the buffer as well
 +        size += keys.size()*comparator.length();
 +
 +        ByteBuffer stuff = ByteBuffer.allocate(size);
 +
 +        for (Object key : keys) {
 +
++            // custom comparator mappings in  CQLUtils.COMPOSITE_TYPE ( more leftover from Asytanax )
 +            if(key instanceof UUID){
 +                comparator = "UUIDType";
 +            }else{
 +                comparator = "UTF8Type"; // if it's not a UUID, the only other thing we're serializing is text
 +            }
 +
 +            stuff.putShort((short)comparator.length());
 +            stuff.put(DataType.serializeValue(comparator, ProtocolVersion.NEWEST_SUPPORTED));
 +
 +            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
 +            if (kb == null) {
 +                kb = ByteBuffer.allocate(0);
 +            }
 +
 +            // put a short that indicates how big the buffer is for this item
 +            stuff.putShort((short) kb.remaining());
 +
 +            // put the actual item
 +            stuff.put(kb.slice());
 +
 +            // put an equality byte ( again not used by part of legacy thrift Astyanax schema)
 +            stuff.put((byte) 0);
 +
 +
 +        }
 +
 +        stuff.flip();
 +        return stuff.duplicate();
 +
      }
  
 +    @Override
 +    protected List<Object> deserializeUniqueValueColumn(ByteBuffer bb){
 +
 +        List<Object> stuff = new ArrayList<>();
 +        int count = 0;
 +        while(bb.hasRemaining()){
 +
-             // custom columns have a short at beginning for comparator (which we don't use here )
-             ByteBuffer comparator = CQLUtils.getWithShortLength(bb);
++            // pull of custom comparator (per Astyanax deserialize)
++            int e = CQLUtils.getShortLength(bb);
++            if((e & '\u8000') == 0) {
++                CQLUtils.getBytes(bb, e);
++            } else {
++                // do nothing
++            }
++
 +
 +            ByteBuffer data = CQLUtils.getWithShortLength(bb);
 +
 +
 +            // first two composites are UUIDs, rest are strings
 +            if(count == 0) {
 +                stuff.add(new UUID(data.getLong(), data.getLong()));
 +            }else if(count ==1){
 +                stuff.add(new UUID(data.getLong(), data.getLong()));
 +            }else{
 +                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
 +            }
 +
 +            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
 +
 +            count++;
 +        }
 +
 +        return stuff;
 +
 +    }
  
      @Override
 -    protected Id createEntityUniqueLogKey( final Id applicationId, final Id uniqueValueId ) {
 -       return uniqueValueId;
 +    protected List<Object> deserializeUniqueValueLogColumn(ByteBuffer bb){
 +
 +
 +        /**
 +         *   List<Object> keys = new ArrayList<>(4);
 +             keys.add(fieldEntry.getVersion());
 +             keys.add(fieldEntry.getField().getName());
 +             keys.add(fieldValueString);
 +             keys.add(fieldEntry.getField().getTypeName().name());
 +         */
 +
 +        List<Object> stuff = new ArrayList<>();
 +        int count = 0;
 +        while(bb.hasRemaining()){
 +
-             // the comparator info is different for the UUID reversed type vs. UTF8 type
-             if(count ==0){
-                 bb.getShort(); // take the reversed comparator byte off
-             }else {
-                 ByteBuffer comparator = CQLUtils.getWithShortLength(bb);
++            int e = CQLUtils.getShortLength(bb);
++            if((e & '\u8000') == 0) {
++                CQLUtils.getBytes(bb, e);
++            } else {
++                // do nothing
 +            }
 +
 +            ByteBuffer data = CQLUtils.getWithShortLength(bb);
 +
 +
 +            // first composite is a UUID, rest are strings
 +            if(count == 0) {
 +                stuff.add(new UUID(data.getLong(), data.getLong()));
 +            }else{
 +                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
 +            }
 +
 +            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
 +
 +            count++;
 +        }
 +
 +        return stuff;
 +
      }
  
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValuesTableImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValuesTableImpl.java
index 0000000,2cad32c..ed88ba6
mode 000000,100644..100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValuesTableImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/uniquevalues/UniqueValuesTableImpl.java
@@@ -1,0 -1,94 +1,101 @@@
+ /*
+  * 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 org.apache.usergrid.persistence.collection.uniquevalues;
+ 
++import com.datastax.driver.core.BatchStatement;
++import com.datastax.driver.core.Session;
++import com.datastax.driver.core.querybuilder.Batch;
+ import com.google.inject.Inject;
+ import com.google.inject.Singleton;
+ import com.netflix.astyanax.MutationBatch;
+ import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+ import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+ import org.apache.usergrid.persistence.collection.serialization.UniqueValue;
+ import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
+ import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
+ import org.apache.usergrid.persistence.collection.serialization.impl.UniqueValueImpl;
+ import org.apache.usergrid.persistence.core.scope.ApplicationScope;
+ import org.apache.usergrid.persistence.model.entity.Id;
+ import org.apache.usergrid.persistence.model.field.Field;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
+ 
+ import java.util.Collection;
+ import java.util.Collections;
+ import java.util.Iterator;
+ import java.util.UUID;
+ 
+ 
+ @Singleton
+ public class UniqueValuesTableImpl implements UniqueValuesTable {
+     private static final Logger logger = LoggerFactory.getLogger( UniqueValuesTableImpl.class );
+ 
 -    final UniqueValueSerializationStrategy strat;
 -    final UniqueValuesFig uniqueValuesFig;
++    private final UniqueValueSerializationStrategy strat;
++    private final UniqueValuesFig uniqueValuesFig;
++    private final Session session;
+ 
+     @Inject
 -    public UniqueValuesTableImpl( final UniqueValueSerializationStrategy strat, UniqueValuesFig uniqueValuesFig) {
++    public UniqueValuesTableImpl( final UniqueValueSerializationStrategy strat,
++                                  final UniqueValuesFig uniqueValuesFig,
++                                  final Session session ) {
+         this.strat = strat;
+         this.uniqueValuesFig = uniqueValuesFig;
++        this.session = session;
+     }
+ 
+ 
+     @Override
+     public Id lookupOwner( ApplicationScope scope, String type, Field field) throws ConnectionException {
+ 
+         UniqueValueSet set = strat.load( scope, type, Collections.singletonList( field ) );
+         UniqueValue uv  = set.getValue( field.getName() );
+         return uv == null ? null : uv.getEntityId();
+     }
+ 
+     @Override
+     public void reserve( ApplicationScope scope, Id owner, UUID version, Field field ) throws ConnectionException {
+ 
+         UniqueValue uv = new UniqueValueImpl( field, owner, version);
 -        final MutationBatch write = strat.write( scope, uv, uniqueValuesFig.getUniqueValueReservationTtl() );
 -        write.execute();
++        final BatchStatement statement = strat.writeCQL( scope, uv, uniqueValuesFig.getUniqueValueReservationTtl() );
++        session.execute(statement);
+     }
+ 
+     @Override
+     public void confirm( ApplicationScope scope, Id owner, UUID version, Field field) throws ConnectionException {
+ 
+         UniqueValue uv = new UniqueValueImpl( field, owner, version);
 -        final MutationBatch write = strat.write( scope, uv );
 -        write.execute();
++        final BatchStatement statement = strat.writeCQL( scope, uv, -1 );
++        session.execute(statement);
+ 
+     }
+ 
+     @Override
+     public void cancel( ApplicationScope scope, Id owner, UUID version, Field field) throws ConnectionException {
+ 
+         UniqueValue uv = new UniqueValueImpl( field, owner, version );
 -        final MutationBatch write = strat.delete( scope, uv );
 -        write.execute();
++        final BatchStatement statement = strat.deleteCQL( scope, uv );
++        session.execute(statement);
+     }
+ 
+     @Override
+     public Iterator<UniqueValue> getUniqueValues(ApplicationScope scope, Id entityId) {
+         return strat.getAllUniqueFields( scope, entityId );
+     }
+ 
+ }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommitTest.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommitTest.java
index b18b095,89169ac..f98a3ea
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommitTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommitTest.java
@@@ -82,13 -71,12 +82,14 @@@ public class MarkCommitTest extends Abs
  
  
          //run the stage
-         WriteCommit newStage = new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy, session );
 -        WriteCommit newStage = new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy, null, null, null);
++        WriteCommit newStage
++            = new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy, null, null, null, session);
 +
  
-         //verify the observable is correct
-         Entity result  = newStage.call( new CollectionIoEvent<MvccEntity>( context, mvccEntityInput ) ).getEvent().getEntity().get();
- 
  
+         //verify the observable is correct
+         Entity result  = newStage.call(
+             new CollectionIoEvent<MvccEntity>( context, mvccEntityInput ) ).getEvent().getEntity().get();
  
  
          //verify the log entry is correct

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommitTest.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommitTest.java
index 60281d4,dcc473c..df0fc9e
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommitTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommitTest.java
@@@ -92,10 -84,12 +92,13 @@@ public class WriteCommitTest extends Ab
  
  
          //run the stage
-         WriteCommit newStage = new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy, session );
+         WriteCommit newStage =
 -            new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy, null, null, null );
++            new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy, null, null, null, session );
 +
  
-         Entity result = newStage.call( new CollectionIoEvent<MvccEntity>( context, mvccEntityInput ) ).getEvent().getEntity().get();
+ 
+         Entity result = newStage.call(
+             new CollectionIoEvent<MvccEntity>( context, mvccEntityInput ) ).getEvent().getEntity().get();
  
  
          //verify the log entry is correct
@@@ -142,7 -133,7 +145,8 @@@
          when( mvccEntityStrategy.write( any( ApplicationScope.class ), any( MvccEntity.class ) ) )
                  .thenReturn( entityMutation );
  
-         new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy, session ).call( event );
 -        new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy, null, null, null ).call( event );
++        new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy, null, null, null, session ).call( event );
++
      }
  }
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyIT.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyIT.java
index 9d0cd20,401d23e..87226be
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyIT.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyIT.java
@@@ -18,12 -18,9 +18,10 @@@
  package org.apache.usergrid.persistence.collection.mvcc.stage.write;
  
  
- import org.junit.Rule;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- 
- import org.apache.usergrid.persistence.collection.EntityCollectionManager;
- import org.apache.usergrid.persistence.collection.EntityCollectionManagerFactory;
++import com.datastax.driver.core.Session;
+ import com.google.inject.Inject;
+ import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
+ import org.apache.usergrid.persistence.collection.*;
  import org.apache.usergrid.persistence.collection.exception.WriteUniqueVerifyException;
  import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
  import org.apache.usergrid.persistence.collection.mvcc.stage.TestEntityGenerator;
@@@ -60,8 -70,25 +71,28 @@@ public class WriteUniqueVerifyIT extend
      public MigrationManagerRule migrationManagerRule;
  
      @Inject
+     public UniqueValueSerializationStrategy uniqueValueSerializationStrategy;
+ 
+     @Inject
      public EntityCollectionManagerFactory cmf;
  
+     @Inject
+     ActorSystemManager actorSystemManager;
+ 
+     @Inject
+     UniqueValuesService uniqueValuesService;
+ 
++    @Inject
++    Session session;
++
+ 
+     @Before
+     public void initAkka() {
+         // each test class needs unique port number
+         initAkka( 2553, actorSystemManager, uniqueValuesService );
+     }
+ 
+ 
      @Test
      public void testConflict() {
  
@@@ -137,9 -162,69 +166,69 @@@
          entity.setField(new StringField("name", "Alfa Romeo 8C Competizione", true));
          entity.setField(new StringField("identifier", "ar8c", true));
          entity.setField(new IntegerField("top_speed_mph", 182));
-         entityManager.write( entity ).toBlocking().last();
+         entityManager.write( entity, null ).toBlocking().last();
  
          entity.setField( new StringField("foo", "bar"));
-         entityManager.write( entity ).toBlocking().last();
+         entityManager.write( entity, null ).toBlocking().last();
+     }
+ 
+     @Test
+     public void testConflictReadRepair() throws Exception {
+ 
+         final Id appId = new SimpleId("testNoConflict");
+ 
+ 
+ 
+         final ApplicationScope scope = new ApplicationScopeImpl( appId);
+ 
+         final EntityCollectionManager entityManager = cmf.createCollectionManager( scope );
+ 
+         final Entity entity = TestEntityGenerator.generateEntity();
+         entity.setField(new StringField("name", "Porsche 911 GT3", true));
+         entity.setField(new StringField("identifier", "911gt3", true));
+         entity.setField(new IntegerField("top_speed_mph", 194));
+         entityManager.write( entity, null ).toBlocking().last();
+ 
+ 
+         FieldSet fieldSet =
+             entityManager.getEntitiesFromFields("test", Collections.singletonList(entity.getField("name")), true)
+             .toBlocking().last();
+ 
+         MvccEntity entityFetched = fieldSet.getEntity( entity.getField("name") );
+ 
+ 
+         final Entity entityDuplicate = TestEntityGenerator.generateEntity();
+         UniqueValue uniqueValue = new UniqueValueImpl(new StringField("name", "Porsche 911 GT3", true),
+             entityDuplicate.getId(), UUIDGenerator.newTimeUUID());
+ 
+         // manually insert a record to simulate a 'duplicate' trying to be inserted
 -        uniqueValueSerializationStrategy.
 -            write(scope, uniqueValue).execute();
++        session.execute(uniqueValueSerializationStrategy.
++            writeCQL(scope, uniqueValue, -1));
+ 
+ 
+ 
+         FieldSet fieldSetAgain =
+             entityManager.getEntitiesFromFields("test", Collections.singletonList(entity.getField("name")), true)
+                 .toBlocking().last();
+ 
+         MvccEntity entityFetchedAgain = fieldSetAgain.getEntity( entity.getField("name") );
+ 
+         assertEquals(entityFetched, entityFetchedAgain);
+ 
+ 
+         // now test writing the original entity again ( simulates a PUT )
+         // this should read repair and work
+         entityManager.write( entity, null ).toBlocking().last();
+ 
+         FieldSet fieldSetAgainAgain =
+             entityManager.getEntitiesFromFields("test", Collections.singletonList(entity.getField("name")), true)
+                 .toBlocking().last();
+ 
+         MvccEntity entityFetchedAgainAgain = fieldSetAgainAgain.getEntity( entity.getField("name") );
+ 
+         assertEquals(entityFetched, entityFetchedAgainAgain);
+ 
+ 
+ 
      }
  }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java
index 3ddc14d,7afba05..1290a5c
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java
@@@ -18,17 -18,20 +18,27 @@@
  package org.apache.usergrid.persistence.collection.mvcc.stage.write;
  
  
++
 +import com.datastax.driver.core.Session;
- import org.junit.Rule;
- import org.junit.Test;
- import org.junit.runner.RunWith;
++
+ import com.google.inject.Inject;
+ import com.netflix.astyanax.Keyspace;
+ import com.netflix.astyanax.MutationBatch;
+ import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+ import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
+ import org.apache.usergrid.persistence.collection.AbstractUniqueValueTest;
+ import org.apache.usergrid.persistence.collection.EntityCollectionManagerFactory;
 +
  import org.apache.usergrid.persistence.collection.MvccEntity;
  import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
  import org.apache.usergrid.persistence.collection.mvcc.stage.CollectionIoEvent;
  import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
  import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
++
 +import org.apache.usergrid.persistence.core.CassandraConfig;
++
+ import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValuesService;
 -import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
++
  import org.apache.usergrid.persistence.core.guice.MigrationManagerRule;
  import org.apache.usergrid.persistence.core.scope.ApplicationScope;
  import org.apache.usergrid.persistence.core.test.ITRunner;
@@@ -84,12 -96,11 +106,12 @@@ public class WriteUniqueVerifyTest exte
          final MvccEntity mvccEntity = fromEntity( entity );
  
          // run the stage
-         WriteUniqueVerify newStage = new WriteUniqueVerify( uvstrat, fig, keyspace,cassandraConfig, session );
 -        WriteUniqueVerify newStage = new WriteUniqueVerify( uvstrat, fig, keyspace, cassandraConfig, null, null, null );
++        WriteUniqueVerify newStage = new WriteUniqueVerify( uvstrat, fig, keyspace, cassandraConfig, null, null, null, session );
++
  
-        newStage.call(
-             new CollectionIoEvent<>( collectionScope, mvccEntity ) ) ;
+        newStage.call( new CollectionIoEvent<>( collectionScope, mvccEntity ) ) ;
  
-        //if we get here, it's a success.  We want to test no exceptions are thrown
+        // if we get here, it's a success.  We want to test no exceptions are thrown
  
          verify(batch, never()).execute();
      }


[07/38] usergrid git commit: Standardizing test properties.

Posted by mr...@apache.org.
Standardizing test properties.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/3066ab4a
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/3066ab4a
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/3066ab4a

Branch: refs/heads/master
Commit: 3066ab4a59f5fff25f516e6869ea846a48000081
Parents: 3f8e7cb
Author: Michael Russo <mi...@gmail.com>
Authored: Thu Feb 11 18:04:35 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Thu Feb 11 18:04:35 2016 -0800

----------------------------------------------------------------------
 stack/core/src/test/resources/usergrid-custom-test.properties     | 1 -
 .../collection/src/test/resources/dynamic-test.properties         | 3 +--
 .../collection/src/test/resources/usergrid-CHOP.properties        | 3 +--
 .../collection/src/test/resources/usergrid-UNIT.properties        | 1 -
 .../persistence/core/datastax/impl/DatastaxClusterImpl.java       | 2 +-
 .../graph/src/test/resources/usergrid-AWS.properties              | 3 +--
 .../graph/src/test/resources/usergrid-CHOP.properties             | 3 +--
 .../graph/src/test/resources/usergrid-UNIT.properties             | 3 +--
 .../queryindex/src/test/resources/dynamic-test.properties         | 3 +--
 .../queryindex/src/test/resources/usergrid-CHOP.properties        | 3 +--
 .../queryindex/src/test/resources/usergrid-UNIT.properties        | 3 +--
 stack/rest/src/test/resources/usergrid-custom-test.properties     | 3 +--
 stack/services/src/test/resources/usergrid-custom-test.properties | 3 +--
 13 files changed, 11 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/core/src/test/resources/usergrid-custom-test.properties
----------------------------------------------------------------------
diff --git a/stack/core/src/test/resources/usergrid-custom-test.properties b/stack/core/src/test/resources/usergrid-custom-test.properties
index c8b4d48..a9be7ed 100644
--- a/stack/core/src/test/resources/usergrid-custom-test.properties
+++ b/stack/core/src/test/resources/usergrid-custom-test.properties
@@ -14,7 +14,6 @@
 
 # these settings allow tests to run and consistently pass on 16GB MacBook Pro
 # with ug.heapmax=5000m and ug.heapmin=3000m (set in Maven settings.xml)
-cassandra.timeout=2000
 cassandra.connections=50
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/corepersistence/collection/src/test/resources/dynamic-test.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/resources/dynamic-test.properties b/stack/corepersistence/collection/src/test/resources/dynamic-test.properties
index 6b6f551..b847f50 100644
--- a/stack/corepersistence/collection/src/test/resources/dynamic-test.properties
+++ b/stack/corepersistence/collection/src/test/resources/dynamic-test.properties
@@ -1,12 +1,11 @@
 # The properties are not the actual configuration properties but
 # safe dynamic property defaults for our testing via IDE or Maven
-cassandra.connections=10
+cassandra.connections=50
 cassandra.port=9160
 cassandra.version=1.2
 cassandra.hosts=localhost
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections
-cassandra.timeout=5000
 collection.stage.transient.timeout=5
 
 # This property is required to be set and cannot be defaulted anywhere

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties b/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties
index 78e3400..d276934 100644
--- a/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties
+++ b/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties
@@ -1,6 +1,6 @@
 # These are for CHOP environment settings
 
-cassandra.connections=20
+cassandra.connections=50
 cassandra.port=9160
 cassandra.version=1.2
 
@@ -9,7 +9,6 @@ cassandra.version=1.2
 cassandra.hosts=${chop.cassandra.hosts}
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections
-cassandra.timeout=5000
 
 # This property is required to be set and cannot be defaulted anywhere
 usergrid.cluster_name=usergrid

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/corepersistence/collection/src/test/resources/usergrid-UNIT.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/resources/usergrid-UNIT.properties b/stack/corepersistence/collection/src/test/resources/usergrid-UNIT.properties
index 44dc399..bec1c88 100644
--- a/stack/corepersistence/collection/src/test/resources/usergrid-UNIT.properties
+++ b/stack/corepersistence/collection/src/test/resources/usergrid-UNIT.properties
@@ -5,7 +5,6 @@ cassandra.version=1.2
 cassandra.hosts=localhost
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections
-cassandra.timeout=5000
 cassandra.embedded=true
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
index a0d65e0..5fc804b 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
@@ -94,7 +94,7 @@ public class DataStaxClusterImpl implements DataStaxCluster {
         }
 
         this.cluster = datastaxCluster.build();
-        logger.info("Initialized datastax cluster client. Hosts={}, Idle Timeout={}s,  Request Timeout={}s",
+        logger.info("Initialized datastax cluster client. Hosts={}, Idle Timeout={}s,  Pool Timeout={}s",
             cluster.getMetadata().getAllHosts().toString(),
             cluster.getConfiguration().getPoolingOptions().getIdleTimeoutSeconds(),
             cluster.getConfiguration().getPoolingOptions().getPoolTimeoutMillis() / 1000);

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/corepersistence/graph/src/test/resources/usergrid-AWS.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/test/resources/usergrid-AWS.properties b/stack/corepersistence/graph/src/test/resources/usergrid-AWS.properties
index e19f676..e630bb8 100644
--- a/stack/corepersistence/graph/src/test/resources/usergrid-AWS.properties
+++ b/stack/corepersistence/graph/src/test/resources/usergrid-AWS.properties
@@ -1,12 +1,11 @@
 # Keep nothing but overriding test defaults in here
-cassandra.connections=100
+cassandra.connections=50
 cassandra.port=9160
 cassandra.version=1.2
 cassandra.hosts=
 #cassandra.hosts=localhost
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections
-cassandra.timeout=5000
 
 
 collections.keyspace.strategy.options=us-east:3

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/corepersistence/graph/src/test/resources/usergrid-CHOP.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/test/resources/usergrid-CHOP.properties b/stack/corepersistence/graph/src/test/resources/usergrid-CHOP.properties
index 78e3400..d276934 100644
--- a/stack/corepersistence/graph/src/test/resources/usergrid-CHOP.properties
+++ b/stack/corepersistence/graph/src/test/resources/usergrid-CHOP.properties
@@ -1,6 +1,6 @@
 # These are for CHOP environment settings
 
-cassandra.connections=20
+cassandra.connections=50
 cassandra.port=9160
 cassandra.version=1.2
 
@@ -9,7 +9,6 @@ cassandra.version=1.2
 cassandra.hosts=${chop.cassandra.hosts}
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections
-cassandra.timeout=5000
 
 # This property is required to be set and cannot be defaulted anywhere
 usergrid.cluster_name=usergrid

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/corepersistence/graph/src/test/resources/usergrid-UNIT.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/test/resources/usergrid-UNIT.properties b/stack/corepersistence/graph/src/test/resources/usergrid-UNIT.properties
index eb06001..e1c4c81 100644
--- a/stack/corepersistence/graph/src/test/resources/usergrid-UNIT.properties
+++ b/stack/corepersistence/graph/src/test/resources/usergrid-UNIT.properties
@@ -1,11 +1,10 @@
 # Keep nothing but overriding test defaults in here
-cassandra.connections=40
+cassandra.connections=50
 cassandra.port=9160
 cassandra.version=1.2
 cassandra.hosts=localhost
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections
-cassandra.timeout=2000
 cassandra.embedded=true
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/corepersistence/queryindex/src/test/resources/dynamic-test.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/resources/dynamic-test.properties b/stack/corepersistence/queryindex/src/test/resources/dynamic-test.properties
index ed3209c..4ac97d8 100644
--- a/stack/corepersistence/queryindex/src/test/resources/dynamic-test.properties
+++ b/stack/corepersistence/queryindex/src/test/resources/dynamic-test.properties
@@ -1,12 +1,11 @@
 # The properties are not the actual configuration properties but
 # safe dynamic property defaults for our testing via IDE or Maven
-cassandra.connections=10
+cassandra.connections=50
 cassandra.port=9160
 cassandra.version=1.2
 cassandra.hosts=localhost
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections
-cassandra.timeout=5000
 
 index.query.limit.default=10
 elasticsearch.indexname=QueryIndexTests

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/corepersistence/queryindex/src/test/resources/usergrid-CHOP.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/resources/usergrid-CHOP.properties b/stack/corepersistence/queryindex/src/test/resources/usergrid-CHOP.properties
index e0e71c9..ce40600 100644
--- a/stack/corepersistence/queryindex/src/test/resources/usergrid-CHOP.properties
+++ b/stack/corepersistence/queryindex/src/test/resources/usergrid-CHOP.properties
@@ -1,5 +1,5 @@
 # These are for CHOP environment settings
-cassandra.connections=20
+cassandra.connections=50
 cassandra.port=9160
 cassandra.version=1.2
 
@@ -8,7 +8,6 @@ cassandra.version=1.2
 cassandra.hosts=${chop.cassandra.hosts}
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections
-cassandra.timeout=5000
 
 index.query.limit.default=10
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/corepersistence/queryindex/src/test/resources/usergrid-UNIT.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/resources/usergrid-UNIT.properties b/stack/corepersistence/queryindex/src/test/resources/usergrid-UNIT.properties
index ccff66a..5d80cac 100644
--- a/stack/corepersistence/queryindex/src/test/resources/usergrid-UNIT.properties
+++ b/stack/corepersistence/queryindex/src/test/resources/usergrid-UNIT.properties
@@ -5,8 +5,7 @@ cassandra.hosts=127.0.0.1
 cassandra.port=9160
 cassandra.version=1.2
 cassandra.cluster_name=Usergrid
-cassandra.connections=20
-cassandra.timeout=5000
+cassandra.connections=50
 
 collections.keyspace=Usergrid_Collections
 collections.keyspace.strategy.options=replication_factor:1

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/rest/src/test/resources/usergrid-custom-test.properties
----------------------------------------------------------------------
diff --git a/stack/rest/src/test/resources/usergrid-custom-test.properties b/stack/rest/src/test/resources/usergrid-custom-test.properties
index 2605c28..13e06a1 100644
--- a/stack/rest/src/test/resources/usergrid-custom-test.properties
+++ b/stack/rest/src/test/resources/usergrid-custom-test.properties
@@ -13,8 +13,7 @@
 # REST module test properties
 
 cassandra.startup=external
-cassandra.timeout=2000
-cassandra.connections=800
+cassandra.connections=50
 
 elasticsearch.startup=external
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3066ab4a/stack/services/src/test/resources/usergrid-custom-test.properties
----------------------------------------------------------------------
diff --git a/stack/services/src/test/resources/usergrid-custom-test.properties b/stack/services/src/test/resources/usergrid-custom-test.properties
index 1c3d190..9ccfc9c 100644
--- a/stack/services/src/test/resources/usergrid-custom-test.properties
+++ b/stack/services/src/test/resources/usergrid-custom-test.properties
@@ -16,8 +16,7 @@
 # with ug.heapmax=5000m and ug.heapmin=3000m (set in Maven settings.xml)
 cassandra.startup=external
 elasticsearch.startup=external
-cassandra.timeout=2000
-cassandra.connections=1000
+cassandra.connections=50
 
 #Poll interval to check for new jobs in millseconds. 10 milliseconds for testing
 usergrid.scheduler.job.interval=100


[10/38] usergrid git commit: Remove unused import.

Posted by mr...@apache.org.
Remove unused import.


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

Branch: refs/heads/master
Commit: df7d2ff856d71b1f1b999319c9865ea540d4412a
Parents: c0f8a4a
Author: Michael Russo <mi...@gmail.com>
Authored: Fri Feb 12 16:35:36 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Fri Feb 12 16:35:36 2016 -0800

----------------------------------------------------------------------
 .../java/org/apache/usergrid/persistence/map/MapManagerTest.java  | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/df7d2ff8/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java b/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
index bd109d1..1ce0a40 100644
--- a/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
+++ b/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
@@ -27,8 +27,7 @@ import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
 import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Rule;
+\import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 


[18/38] usergrid git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/usergrid into datastax--cass-driver

Posted by mr...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/usergrid into datastax--cass-driver

# Conflicts:
#	stack/core/pom.xml


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/3c6fcdc7
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/3c6fcdc7
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/3c6fcdc7

Branch: refs/heads/master
Commit: 3c6fcdc7452a1eead0c5e28e32bc12bedd142028
Parents: 75cc3a4 e0931be
Author: Michael Russo <mr...@apigee.com>
Authored: Sun Mar 27 10:47:24 2016 -0700
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun Mar 27 10:47:24 2016 -0700

----------------------------------------------------------------------
 README.md                                       |    8 +-
 content/docs/README.html                        |   20 +-
 content/docs/_sources/index.txt                 |   20 +-
 .../_sources/installation/deployment-guide.txt  |  144 +-
 content/docs/_sources/introduction/overview.txt |   32 +-
 .../_sources/introduction/usergrid-features.txt |    4 +-
 .../docs/_sources/reference/contribute-code.txt |   41 +-
 .../creating-a-new-application.txt              |   16 +
 .../using-usergrid/creating-account.txt         |   21 +
 .../using-usergrid/using-a-sandbox-app.txt      |   39 +
 .../_sources/using-usergrid/using-the-api.txt   |  150 +
 .../file-storage-configuration.html             |   20 +-
 content/docs/assets-and-files/folders.html      |   20 +-
 .../assets-and-files/legacy-asset-support.html  |   20 +-
 .../assets-and-files/retrieving-assets.html     |   20 +-
 .../docs/assets-and-files/uploading-assets.html |   20 +-
 .../creating-and-incrementing-counters.html     |   20 +-
 .../events-and-counters.html                    |   20 +-
 .../retrieving-counters.html                    |   20 +-
 .../docs/data-queries/advanced-query-usage.html |   20 +-
 .../docs/data-queries/operators-and-types.html  |   20 +-
 content/docs/data-queries/query-parameters.html |   20 +-
 .../docs/data-queries/querying-your-data.html   |   20 +-
 content/docs/data-storage/collections.html      |   20 +-
 content/docs/data-storage/data-store-dbms.html  |   24 +-
 content/docs/data-storage/entities.html         |   20 +-
 .../docs/data-storage/optimizing-access.html    |   20 +-
 .../entity-connections/connecting-entities.html |   20 +-
 .../disconnecting-entities.html                 |   20 +-
 .../entity-connections/retrieving-entities.html |   20 +-
 content/docs/genindex.html                      |   20 +-
 content/docs/geolocation/geolocation.html       |   20 +-
 content/docs/index.html                         |  112 +-
 content/docs/installation/deployment-guide.html |  202 +-
 .../docs/installation/ug1-deploy-to-tomcat.html |   48 +-
 .../installation/ug1-launcher-quick-start.html  |   47 +-
 .../docs/installation/ug2-deploy-to-tomcat.html |   20 +-
 content/docs/introduction/async-vs-sync.html    |   24 +-
 content/docs/introduction/data-model.html       |   20 +-
 content/docs/introduction/overview.html         |   84 +-
 .../docs/introduction/usergrid-features.html    |   34 +-
 content/docs/jersey2skeleton/README.html        |   20 +-
 content/docs/objects.inv                        |  Bin 692 -> 686 bytes
 content/docs/orgs-and-apps/admin-user.html      |   20 +-
 content/docs/orgs-and-apps/application.html     |   20 +-
 content/docs/orgs-and-apps/managing.html        |   20 +-
 content/docs/orgs-and-apps/organization.html    |   20 +-
 .../push-notifications/adding-push-support.html |   20 +-
 .../creating-and-managing-notifications.html    |   20 +-
 .../push-notifications/creating-notifiers.html  |   20 +-
 .../push-notifications/getting-started.html     |   20 +-
 .../managing-users-and-devices.html             |   20 +-
 content/docs/push-notifications/overview.html   |   20 +-
 .../docs/push-notifications/registering.html    |   20 +-
 content/docs/push-notifications/tbd.html        |   20 +-
 .../push-notifications/troubleshooting.html     |   20 +-
 content/docs/push-notifications/tutorial.html   |   20 +-
 .../docs/push-notifications/users-devices.html  |   20 +-
 content/docs/reference/contribute-code.html     |   88 +-
 content/docs/reference/presos-and-videos.html   |   24 +-
 content/docs/rest-endpoints/api-docs.html       |   20 +-
 content/docs/sdks/ios-new.html                  |   20 +-
 content/docs/sdks/sdk-outline.html              |   20 +-
 content/docs/sdks/tbd.html                      |   24 +-
 content/docs/search.html                        |   20 +-
 content/docs/searchindex.js                     |    2 +-
 .../docs/security-and-auth/app-security.html    |   20 +-
 .../authenticating-api-requests.html            |   20 +-
 ...nticating-users-and-application-clients.html |   20 +-
 .../changing-token-time-live-ttl.html           |   20 +-
 .../docs/security-and-auth/facebook-sign.html   |   20 +-
 .../revoking-tokens-logout.html                 |   20 +-
 .../security-and-auth/securing-your-app.html    |   20 +-
 .../user-authentication-types.html              |   20 +-
 .../security-and-auth/using-permissions.html    |   20 +-
 content/docs/security-and-auth/using-roles.html |   20 +-
 content/docs/user-management/activity.html      |   20 +-
 content/docs/user-management/group.html         |   20 +-
 content/docs/user-management/groups.html        |   20 +-
 .../docs/user-management/messagee-example.html  |   20 +-
 .../docs/user-management/user-connections.html  |   20 +-
 .../docs/user-management/user-management.html   |   20 +-
 .../docs/user-management/working-user-data.html |   20 +-
 .../creating-a-new-application.html             |  336 ++
 .../docs/using-usergrid/creating-account.html   |  347 ++
 .../using-usergrid/using-a-sandbox-app.html     |  372 ++
 content/docs/using-usergrid/using-the-api.html  |  506 +++
 content/releases/index.html                     |   11 +-
 deployment/pcf/README.md                        |    2 +
 .../creating-a-new-application.md               |   16 -
 docs/getting-started/creating-account.md        |   21 -
 docs/getting-started/using-a-sandbox-app.md     |   39 -
 docs/getting-started/using-the-api.md           |  150 -
 docs/index.rst                                  |   20 +-
 docs/installation/deployment-guide.md           |  134 +-
 docs/introduction/overview.md                   |   32 +-
 docs/introduction/usergrid-features.md          |    4 +-
 docs/reference/contribute-code.md               |   41 +-
 .../creating-a-new-application.md               |   16 +
 docs/using-usergrid/creating-account.md         |   21 +
 docs/using-usergrid/using-a-sandbox-app.md      |   39 +
 docs/using-usergrid/using-the-api.md            |  150 +
 release/binary-release.sh                       |   10 +-
 release/pom.xml                                 |    2 +-
 release/release-candidate.sh                    |   62 +-
 release/release.sh                              |   84 +-
 release/src/main/assembly/binary.xml            |   27 +-
 sdks/swift/.gitignore                           |   25 +
 sdks/swift/LICENSE.txt                          |   19 +
 sdks/swift/Package.swift                        |   30 +
 sdks/swift/README.md                            |  802 ++++
 .../ActivityFeed.xcodeproj/project.pbxproj      |  827 ++++
 .../contents.xcworkspacedata                    |    7 +
 .../contents.xcworkspacedata                    |    7 +
 .../xcshareddata/ActivityFeed.xcscmblueprint    |   30 +
 sdks/swift/Samples/ActivityFeed/Podfile         |    8 +
 sdks/swift/Samples/ActivityFeed/Readme.md       |   29 +
 .../ActivityFeed/Source/ActivityEntity.swift    |   60 +
 .../ActivityFeed/Source/AppDelegate.swift       |   65 +
 .../AppIcon.appiconset/Contents.json            |   38 +
 .../Source/Assets.xcassets/Contents.json        |    6 +
 .../UsergridGuy.imageset/Contents.json          |   21 +
 .../UsergridGuy.imageset/UsergridGuy.png        |  Bin 0 -> 6230 bytes
 .../Source/Base.lproj/LaunchScreen.storyboard   |   27 +
 .../Source/Base.lproj/Main.storyboard           |  371 ++
 .../Source/FollowViewController.swift           |   50 +
 .../ActivityFeed/Source/FormTextField.swift     |   71 +
 .../Samples/ActivityFeed/Source/Info.plist      |   43 +
 .../Source/LoginViewController.swift            |   77 +
 .../Source/MessageTableViewCell.swift           |  101 +
 .../ActivityFeed/Source/MessageTextView.swift   |   39 +
 .../Source/MessageViewController.swift          |  224 ++
 .../Source/RegisterViewController.swift         |   62 +
 .../ActivityFeed/Source/UsergridManager.swift   |   78 +
 .../Source/ViewControllerExtensions.swift       |   36 +
 .../Assets.xcassets/README__ignoredByTemplate__ |    1 +
 .../ExtensionDelegate.swift                     |   45 +
 .../WatchSample Extension/Info.plist            |   45 +
 .../InterfaceController.swift                   |   81 +
 .../AppIcon.appiconset/Contents.json            |   55 +
 .../WatchSample/Base.lproj/Interface.storyboard |   46 +
 .../Samples/ActivityFeed/WatchSample/Info.plist |   35 +
 .../Samples/Push/Push.xcodeproj/project.pbxproj |  473 +++
 .../contents.xcworkspacedata                    |    7 +
 .../Push.xcworkspace/contents.xcworkspacedata   |    7 +
 sdks/swift/Samples/Push/Readme.md               |   21 +
 .../swift/Samples/Push/Source/AppDelegate.swift |   53 +
 .../AppIcon.appiconset/Contents.json            |   38 +
 .../Push/Source/Assets.xcassets/Contents.json   |    6 +
 .../UsergridGuy.imageset/Contents.json          |   21 +
 .../UsergridGuy.imageset/UsergridGuy.png        |  Bin 0 -> 6230 bytes
 .../Source/Base.lproj/LaunchScreen.storyboard   |   27 +
 .../Push/Source/Base.lproj/Main.storyboard      |   75 +
 sdks/swift/Samples/Push/Source/Info.plist       |   38 +
 .../Samples/Push/Source/UsergridManager.swift   |   72 +
 .../Samples/Push/Source/ViewController.swift    |   39 +
 sdks/swift/Samples/Readme.md                    |   27 +
 sdks/swift/Source/Info.plist                    |   26 +
 sdks/swift/Source/Usergrid.swift                |  625 +++
 sdks/swift/Source/UsergridAsset.swift           |  198 +
 .../Source/UsergridAssetRequestWrapper.swift    |   48 +
 sdks/swift/Source/UsergridAuth.swift            |  276 ++
 sdks/swift/Source/UsergridClient.swift          |  904 +++++
 sdks/swift/Source/UsergridClientConfig.swift    |  149 +
 sdks/swift/Source/UsergridDevice.swift          |  178 +
 sdks/swift/Source/UsergridEntity.swift          |  611 +++
 sdks/swift/Source/UsergridEnums.swift           |  415 ++
 sdks/swift/Source/UsergridExtensions.swift      |   42 +
 sdks/swift/Source/UsergridFileMetaData.swift    |  114 +
 sdks/swift/Source/UsergridKeychainHelpers.swift |  196 +
 sdks/swift/Source/UsergridQuery.swift           |  590 +++
 sdks/swift/Source/UsergridRequest.swift         |  245 ++
 sdks/swift/Source/UsergridRequestManager.swift  |  156 +
 sdks/swift/Source/UsergridResponse.swift        |  203 +
 sdks/swift/Source/UsergridResponseError.swift   |   90 +
 sdks/swift/Source/UsergridSDK.h                 |   37 +
 sdks/swift/Source/UsergridSessionDelegate.swift |   90 +
 sdks/swift/Source/UsergridUser.swift            |  497 +++
 sdks/swift/Tests/ASSET_Tests.swift              |   82 +
 sdks/swift/Tests/AUTH_Tests.swift               |   66 +
 sdks/swift/Tests/CONNECTION_Tests.swift         |   87 +
 sdks/swift/Tests/ClientCreationTests.swift      |   92 +
 sdks/swift/Tests/Entity_Tests.swift             |  173 +
 sdks/swift/Tests/GET_Tests.swift                |  101 +
 sdks/swift/Tests/Info.plist                     |   24 +
 sdks/swift/Tests/PUT_Tests.swift                |  146 +
 sdks/swift/Tests/TestAssets/logo_apigee.png     |  Bin 0 -> 10696 bytes
 sdks/swift/Tests/TestAssets/test.png            |  Bin 0 -> 1417937 bytes
 sdks/swift/Tests/User_Tests.swift               |  121 +
 sdks/swift/UsergridSDK.podspec                  |   18 +
 .../swift/UsergridSDK.xcodeproj/project.pbxproj | 1179 ++++++
 .../contents.xcworkspacedata                    |    7 +
 .../xcshareddata/WorkspaceSettings.xcsettings   |    8 +
 .../xcschemes/UsergridSDK OSX.xcscheme          |  100 +
 .../xcschemes/UsergridSDK iOS.xcscheme          |  100 +
 .../xcschemes/UsergridSDK tvOS.xcscheme         |  114 +
 .../xcschemes/UsergridSDK watchOS.xcscheme      |   80 +
 .../xcschemes/UsergridSDK_OSX_Tests.xcscheme    |   56 +
 .../xcschemes/UsergridSDK_TVOS_Tests.xcscheme   |   56 +
 .../xcschemes/UsergridSDK_iOS_Tests.xcscheme    |   57 +
 sdks/swift/docs/Classes.html                    |  694 ++++
 sdks/swift/docs/Classes/Usergrid.html           | 3704 +++++++++++++++++
 sdks/swift/docs/Classes/UsergridAppAuth.html    |  402 ++
 sdks/swift/docs/Classes/UsergridAsset.html      |  694 ++++
 .../Classes/UsergridAssetUploadRequest.html     |  348 ++
 sdks/swift/docs/Classes/UsergridAuth.html       |  550 +++
 sdks/swift/docs/Classes/UsergridClient.html     | 3800 ++++++++++++++++++
 .../docs/Classes/UsergridClientConfig.html      |  736 ++++
 sdks/swift/docs/Classes/UsergridDevice.html     |  644 +++
 sdks/swift/docs/Classes/UsergridEntity.html     | 2612 ++++++++++++
 .../docs/Classes/UsergridFileMetaData.html      |  524 +++
 sdks/swift/docs/Classes/UsergridQuery.html      | 2270 +++++++++++
 .../UsergridQuery/UsergridQueryOperator.html    |  272 ++
 .../UsergridQuery/UsergridQuerySortOrder.html   |  203 +
 sdks/swift/docs/Classes/UsergridRequest.html    |  611 +++
 sdks/swift/docs/Classes/UsergridResponse.html   |  961 +++++
 .../docs/Classes/UsergridResponseError.html     |  465 +++
 sdks/swift/docs/Classes/UsergridUser.html       | 2319 +++++++++++
 .../UsergridUser/UsergridUserProperties.html    |  346 ++
 sdks/swift/docs/Classes/UsergridUserAuth.html   |  402 ++
 sdks/swift/docs/Enums.html                      |  427 ++
 sdks/swift/docs/Enums/UsergridAuthFallback.html |  248 ++
 .../docs/Enums/UsergridDeviceProperties.html    |  361 ++
 sdks/swift/docs/Enums/UsergridDirection.html    |  278 ++
 .../docs/Enums/UsergridEntityProperties.html    |  506 +++
 sdks/swift/docs/Enums/UsergridHttpMethod.html   |  333 ++
 .../docs/Enums/UsergridImageContentType.html    |  278 ++
 .../swift/docs/Enums/UsergridQueryOperator.html |  423 ++
 .../docs/Enums/UsergridQuerySortOrder.html      |  330 ++
 .../docs/Enums/UsergridUserProperties.html      |  516 +++
 sdks/swift/docs/Extensions.html                 |  175 +
 sdks/swift/docs/Extensions/UsergridAsset.html   |  184 +
 sdks/swift/docs/Extensions/UsergridAuth.html    |  260 ++
 sdks/swift/docs/Extensions/UsergridClient.html  | 1962 +++++++++
 sdks/swift/docs/Global Variables.html           |  202 +
 sdks/swift/docs/Protocols.html                  |  146 +
 sdks/swift/docs/Protocols/UsergridAuth.html     |  260 ++
 sdks/swift/docs/Typealiases.html                |  403 ++
 sdks/swift/docs/css/highlight.css               |  200 +
 sdks/swift/docs/css/jazzy.css                   |  331 ++
 .../docs/docsets/.docset/Contents/Info.plist    |   20 +
 .../Contents/Resources/Documents/Classes.html   |  573 +++
 .../Resources/Documents/Classes/Usergrid.html   | 3270 +++++++++++++++
 .../Documents/Classes/UsergridAppAuth.html      |  319 ++
 .../Documents/Classes/UsergridAsset.html        |  557 +++
 .../Documents/Classes/UsergridAuth.html         |  380 ++
 .../Documents/Classes/UsergridClient.html       | 3199 +++++++++++++++
 .../Documents/Classes/UsergridClientConfig.html |  559 +++
 .../Documents/Classes/UsergridDevice.html       |  382 ++
 .../Documents/Classes/UsergridEntity.html       | 2388 +++++++++++
 .../Documents/Classes/UsergridFileMetaData.html |  387 ++
 .../Documents/Classes/UsergridQuery.html        | 2010 +++++++++
 .../UsergridQuery/UsergridQueryOperator.html    |  272 ++
 .../UsergridQuery/UsergridQuerySortOrder.html   |  203 +
 .../Documents/Classes/UsergridResponse.html     |  880 ++++
 .../Documents/Classes/UsergridUser.html         |  994 +++++
 .../UsergridUser/UsergridUserProperties.html    |  346 ++
 .../Documents/Classes/UsergridUserAuth.html     |  319 ++
 .../Contents/Resources/Documents/Enums.html     |  372 ++
 .../Documents/Enums/UsergridAuthFallback.html   |  221 +
 .../Enums/UsergridDeviceProperties.html         |  334 ++
 .../Documents/Enums/UsergridDirection.html      |  251 ++
 .../Enums/UsergridEntityProperties.html         |  479 +++
 .../Enums/UsergridImageContentType.html         |  251 ++
 .../Documents/Enums/UsergridQueryOperator.html  |  396 ++
 .../Documents/Enums/UsergridQuerySortOrder.html |  303 ++
 .../Documents/Enums/UsergridUserProperties.html |  489 +++
 .../Resources/Documents/Extensions.html         |  175 +
 .../Documents/Extensions/UsergridAsset.html     |  184 +
 .../Documents/Extensions/UsergridAuth.html      |  260 ++
 .../Documents/Extensions/UsergridClient.html    | 1962 +++++++++
 .../Contents/Resources/Documents/Protocols.html |  146 +
 .../Documents/Protocols/UsergridAuth.html       |  260 ++
 .../Resources/Documents/Typealiases.html        |  318 ++
 .../Resources/Documents/css/highlight.css       |  202 +
 .../Contents/Resources/Documents/css/jazzy.css  |  302 ++
 .../Contents/Resources/Documents/img/carat.png  |  Bin 0 -> 274 bytes
 .../Contents/Resources/Documents/img/dash.png   |  Bin 0 -> 1338 bytes
 .../Contents/Resources/Documents/img/gh.png     |  Bin 0 -> 1571 bytes
 .../Contents/Resources/Documents/index.html     |  234 ++
 .../Contents/Resources/Documents/js/jazzy.js    |   31 +
 .../Resources/Documents/js/jquery.min.js        |    4 +
 .../Resources/Documents/undocumented.txt        |   11 +
 .../.docset/Contents/Resources/docSet.dsidx     |  Bin 0 -> 114688 bytes
 sdks/swift/docs/docsets/.tgz                    |  Bin 0 -> 111866 bytes
 .../UsergridSDK.docset/Contents/Info.plist      |   20 +
 .../Contents/Resources/Documents/Classes.html   |  694 ++++
 .../Resources/Documents/Classes/Usergrid.html   | 3704 +++++++++++++++++
 .../Documents/Classes/UsergridAppAuth.html      |  402 ++
 .../Documents/Classes/UsergridAsset.html        |  694 ++++
 .../Classes/UsergridAssetUploadRequest.html     |  348 ++
 .../Documents/Classes/UsergridAuth.html         |  550 +++
 .../Documents/Classes/UsergridClient.html       | 3800 ++++++++++++++++++
 .../Documents/Classes/UsergridClientConfig.html |  736 ++++
 .../Documents/Classes/UsergridDevice.html       |  644 +++
 .../Documents/Classes/UsergridEntity.html       | 2612 ++++++++++++
 .../Documents/Classes/UsergridFileMetaData.html |  524 +++
 .../Documents/Classes/UsergridQuery.html        | 2270 +++++++++++
 .../UsergridQuery/UsergridQueryOperator.html    |  272 ++
 .../UsergridQuery/UsergridQuerySortOrder.html   |  203 +
 .../Documents/Classes/UsergridRequest.html      |  611 +++
 .../Documents/Classes/UsergridResponse.html     |  961 +++++
 .../Classes/UsergridResponseError.html          |  465 +++
 .../Documents/Classes/UsergridUser.html         | 2319 +++++++++++
 .../UsergridUser/UsergridUserProperties.html    |  346 ++
 .../Documents/Classes/UsergridUserAuth.html     |  402 ++
 .../Contents/Resources/Documents/Enums.html     |  427 ++
 .../Documents/Enums/UsergridAuthFallback.html   |  248 ++
 .../Enums/UsergridDeviceProperties.html         |  361 ++
 .../Documents/Enums/UsergridDirection.html      |  278 ++
 .../Enums/UsergridEntityProperties.html         |  506 +++
 .../Documents/Enums/UsergridHttpMethod.html     |  333 ++
 .../Enums/UsergridImageContentType.html         |  278 ++
 .../Documents/Enums/UsergridQueryOperator.html  |  423 ++
 .../Documents/Enums/UsergridQuerySortOrder.html |  330 ++
 .../Documents/Enums/UsergridUserProperties.html |  516 +++
 .../Resources/Documents/Extensions.html         |  175 +
 .../Documents/Extensions/UsergridAsset.html     |  184 +
 .../Documents/Extensions/UsergridAuth.html      |  260 ++
 .../Documents/Extensions/UsergridClient.html    | 1962 +++++++++
 .../Resources/Documents/Global Variables.html   |  202 +
 .../Contents/Resources/Documents/Protocols.html |  146 +
 .../Documents/Protocols/UsergridAuth.html       |  260 ++
 .../Resources/Documents/Typealiases.html        |  403 ++
 .../Resources/Documents/css/highlight.css       |  200 +
 .../Contents/Resources/Documents/css/jazzy.css  |  331 ++
 .../Contents/Resources/Documents/img/carat.png  |  Bin 0 -> 274 bytes
 .../Contents/Resources/Documents/img/dash.png   |  Bin 0 -> 1338 bytes
 .../Contents/Resources/Documents/img/gh.png     |  Bin 0 -> 1571 bytes
 .../Contents/Resources/Documents/index.html     |  919 +++++
 .../Contents/Resources/Documents/js/jazzy.js    |   40 +
 .../Resources/Documents/js/jquery.min.js        |    4 +
 .../Resources/Documents/undocumented.txt        |    0
 .../Contents/Resources/docSet.dsidx             |  Bin 0 -> 151552 bytes
 sdks/swift/docs/docsets/UsergridSDK.tgz         |  Bin 0 -> 145485 bytes
 sdks/swift/docs/img/carat.png                   |  Bin 0 -> 274 bytes
 sdks/swift/docs/img/dash.png                    |  Bin 0 -> 1338 bytes
 sdks/swift/docs/img/gh.png                      |  Bin 0 -> 1571 bytes
 sdks/swift/docs/index.html                      |  919 +++++
 sdks/swift/docs/js/jazzy.js                     |   40 +
 sdks/swift/docs/js/jquery.min.js                |    4 +
 sdks/swift/docs/undocumented.txt                |    0
 stack/README.md                                 |   35 +-
 stack/build-tools/pom.xml                       |    2 +-
 stack/config/pom.xml                            |    2 +-
 .../main/resources/usergrid-default.properties  |    3 -
 .../usergrid/corepersistence/CoreModule.java    |    2 -
 .../corepersistence/CpEntityManager.java        |   47 +-
 .../usergrid/corepersistence/GuiceFactory.java  |    1 +
 .../asyncevents/AmazonAsyncEventService.java    |  844 ----
 .../asyncevents/AsyncEventService.java          |   12 +-
 .../asyncevents/AsyncEventServiceImpl.java      |  835 ++++
 .../asyncevents/AsyncIndexProvider.java         |    4 +-
 .../asyncevents/EventBuilder.java               |   12 +-
 .../asyncevents/EventBuilderImpl.java           |   15 +-
 .../asyncevents/IndexDocNotFoundException.java  |   37 +
 .../asyncevents/model/AsyncEvent.java           |    2 -
 .../asyncevents/model/EdgeIndexEvent.java       |   70 -
 .../asyncevents/model/EntityIndexEvent.java     |   54 -
 .../index/IndexProcessorFig.java                |    8 -
 .../corepersistence/index/IndexServiceImpl.java |    4 +-
 .../migration/MigrationModuleVersionPlugin.java |  137 -
 .../read/search/CandidateEntityFilter.java      |   10 +-
 .../usergrid/persistence/EntityManager.java     |    2 +
 .../main/resources/usergrid-core-context.xml    |    5 +-
 .../index/AmazonAsyncEventServiceTest.java      |  103 -
 .../index/AsyncEventServiceImplTest.java        |  103 +
 .../index/AsyncIndexServiceTest.java            |    3 +-
 .../MigrationModuleVersionPluginTest.java       |  259 --
 stack/corepersistence/cache/pom.xml             |    2 +-
 stack/corepersistence/collection/pom.xml        |    2 +-
 .../impl/EntityCollectionManagerImpl.java       |    8 +-
 stack/corepersistence/common/pom.xml            |    2 +-
 .../usergrid/persistence/core/CassandraFig.java |    8 +
 .../core/astyanax/CassandraClusterImpl.java     |   34 +-
 stack/corepersistence/graph/pom.xml             |    2 +-
 stack/corepersistence/map/pom.xml               |    2 +-
 stack/corepersistence/model/pom.xml             |    2 +-
 .../model/entity/MapToEntityConverter.java      |   18 +-
 stack/corepersistence/pom.xml                   |    2 +-
 stack/corepersistence/queryindex/pom.xml        |    2 +-
 .../usergrid/persistence/index/IndexFig.java    |    3 +
 .../index/impl/EsIndexProducerImpl.java         |    5 +-
 .../persistence/index/impl/EsProvider.java      |   20 +-
 stack/corepersistence/queue/pom.xml             |    2 +-
 .../persistence/queue/LocalQueueManager.java    |    6 +-
 .../usergrid/persistence/queue/QueueFig.java    |   17 +
 .../persistence/queue/QueueManager.java         |    6 +-
 .../persistence/queue/QueueMessage.java         |   10 +
 .../queue/impl/SNSQueueManagerImpl.java         |   48 +-
 .../persistence/queue/QueueManagerTest.java     |   10 +-
 stack/pom.xml                                   |    2 +-
 stack/rest/pom.xml                              |    2 +-
 .../org/apache/usergrid/rest/RootResource.java  |   31 +-
 .../rest/management/ManagementResource.java     |  308 --
 .../applications/ApplicationResource.java       |   34 +-
 .../rest/management/users/UserResource.java     |    2 +-
 .../security/SecuredResourceFilterFactory.java  |    2 +-
 .../resources/usergrid-rest-deploy-context.xml  |    7 +
 .../rest/applications/ApplicationDeleteIT.java  |   17 +-
 .../collection/CollectionsResourceIT.java       |   56 +
 .../usergrid/rest/management/AdminUsersIT.java  |  102 +-
 .../rest/management/ManagementResourceIT.java   |   58 +-
 stack/services/pom.xml                          |   19 +-
 .../usergrid/management/ManagementService.java  |    7 +-
 .../cassandra/ManagementServiceImpl.java        |   22 +-
 .../credentials/ApplicationAccessToken.java     |    3 +
 .../credentials/OrganizationAccessToken.java    |    3 +
 .../tokens/cassandra/TokenServiceImpl.java      |  332 +-
 .../services/AbstractCollectionService.java     |   36 +-
 .../usergrid/services/ServiceManager.java       |    5 +-
 .../services/notifications/QueueListener.java   |    2 +-
 .../services/notifications/TaskManager.java     |    8 +-
 .../impl/ApplicationQueueManagerImpl.java       |    2 +-
 .../services/queues/ImportQueueManager.java     |    4 +-
 .../usergrid/services/queues/QueueListener.java |    2 +-
 .../usergrid/services/CollectionServiceIT.java  |   16 +
 stack/test-utils/pom.xml                        |    2 +-
 stack/tools/pom.xml                             |    4 +-
 tests/integration/test/main.js                  |   18 +-
 .../test/notifications/notifications.js         |   78 +-
 .../test/queries/integerComparison.js           |   31 +-
 tests/integration/test/setup.js                 |    4 +-
 website/content/releases/index.html             |   11 +-
 424 files changed, 104881 insertions(+), 3672 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/3c6fcdc7/stack/config/src/main/resources/usergrid-default.properties
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3c6fcdc7/stack/corepersistence/common/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3c6fcdc7/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
index 7a2a9d1,0000000..184eeee
mode 100644,000000..100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
@@@ -1,218 -1,0 +1,226 @@@
 +/*
 + * 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 org.apache.usergrid.persistence.core;
 +
 +
 +import org.safehaus.guicyfig.Default;
 +import org.safehaus.guicyfig.FigSingleton;
 +import org.safehaus.guicyfig.GuicyFig;
 +import org.safehaus.guicyfig.Key;
 +
 +
 +/**
 + * Cassandra configuration interface.
 + */
 +@FigSingleton
 +public interface CassandraFig extends GuicyFig {
 +
 +    // cassndra properties used by datastax driver
 +    String READ_CL = "cassandra.readcl";
 +    String WRITE_CL = "cassandra.writecl";
 +    String STRATEGY = "cassandra.strategy";
 +    String STRATEGY_OPTIONS = "cassandra.strategy.options";
 +
 +    // main application cassandra properties
 +    String ASTYANAX_READ_CONSISTENT_CL = "usergrid.consistent.read.cl";
 +    String ASTYANAX_READ_CL = "usergrid.read.cl";
 +    String ASTYANAX_WRITE_CL = "usergrid.write.cl";
 +    String SHARD_VALUES = "cassandra.shardvalues";
 +    String THRIFT_TRANSPORT_SIZE = "cassandra.thrift.transport.frame";
++    String USERNAME = "cassandra.username";
++    String PASSWORD = "cassandra.password";
 +
 +    // locks cassandra properties
 +    String LOCKS_KEYSPACE_NAME = "cassandra.lock.keyspace";
 +    String LOCKS_KEYSPACE_REPLICATION = "cassandra.lock.keyspace.replication";
 +    String LOCKS_KEYSPACE_STRATEGY = "cassandra.lock.keyspace.strategy";
 +    String LOCKS_CL = "cassandra.lock.cl";
 +    String LOCKS_SHARED_POOL_FLAG = "cassandra.lock.use_shared_pool";
 +    String LOCKS_CONNECTIONS = "cassandra.lock.connections";
 +    String LOCKS_EXPIRATION = "cassandra.lock.expiration.milliseconds";
 +
 +
 +
 +
 +    // re-usable default values
 +    String DEFAULT_CONNECTION_POOLSIZE = "15";
 +    String DEFAULT_LOCKS_EXPIRATION = "3600000";  // 1 hour
 +    String DEFAULT_LOCAL_DC = "";
 +    String DEFAULT_USERNAME = "";
 +    String DEFAULT_PASSWORD = "";
 +
 +
 +    @Key( "cassandra.hosts" )
 +    String getHosts();
 +
 +    /**
 +     * Valid options are 1.2, 2.0, 2.1
 +     *
 +     * @return
 +     */
 +    @Key( "cassandra.version" )
 +    @Default( "2.1" )
 +    String getVersion();
 +
 +    @Key( "cassandra.cluster_name" )
 +    @Default( "Usergrid" )
 +    String getClusterName();
 +
 +    @Key( "cassandra.keyspace.application" )
 +    @Default( "Usergrid_Applications" )
 +    String getApplicationKeyspace();
 +
 +    @Key( "cassandra.port" )
 +    @Default( "9160" )
 +    int getThriftPort();
 +
 +    @Key( "cassandra.username" )
 +    @Default( DEFAULT_USERNAME )
 +    String getUsername();
 +
 +    @Key( "cassandra.password" )
 +    @Default( DEFAULT_PASSWORD )
 +    String getPassword();
 +
 +    @Key( "cassandra.datacenter.local" )
 +    @Default( DEFAULT_LOCAL_DC )
 +    String getLocalDataCenter();
 +
++    @Key( USERNAME )
++    String getUsername();
++
++    @Key( PASSWORD )
++    String getPassword();
++
 +    @Key( "cassandra.connections" )
 +    @Default( DEFAULT_CONNECTION_POOLSIZE )
 +    int getConnections();
 +
 +    @Key( "cassandra.timeout" )
 +    @Default( "10000" )
 +    int getTimeout();
 +
 +    @Key( "cassandra.timeout.pool" )
 +    @Default( "5000" )
 +    int getPoolTimeout();
 +
 +    @Key("cassandra.discovery")
 +    @Default( "RING_DESCRIBE" )
 +    String getDiscoveryType();
 +
 +
 +    @Default("CL_LOCAL_QUORUM")
 +    @Key(ASTYANAX_READ_CL)
 +    String getAstyanaxReadCL();
 +
 +    @Default("CL_QUORUM")
 +    @Key(ASTYANAX_READ_CONSISTENT_CL)
 +    String getAstyanaxConsistentReadCL();
 +
 +    @Default("CL_LOCAL_QUORUM")
 +    @Key(ASTYANAX_WRITE_CL)
 +    String getAstyanaxWriteCL();
 +
 +
 +    @Default("LOCAL_QUORUM")
 +    @Key(READ_CL)
 +    String getReadCl();
 +
 +    @Default("LOCAL_QUORUM")
 +    @Key(WRITE_CL)
 +    String getWriteCl();
 +
 +    @Default("SimpleStrategy")
 +    @Key( STRATEGY )
 +    String getStrategy();
 +
 +    @Default("replication_factor:1")
 +    @Key( STRATEGY_OPTIONS )
 +    String getStrategyOptions();
 +
 +    /**
 +     * Return the history of all shard values which are immutable.  For instance, if shard values
 +     * are initially set to 20 (the default) then increased to 40, the property should contain the string of
 +     * "20, 40" so that we can read historic data.
 +     *
 +     * @return
 +     */
 +    @Default("20")
 +    @Key(SHARD_VALUES)
 +    String getShardValues();
 +
 +    /**
 +     * Get the thrift transport size.  Should be set to what is on the cassandra servers.  As we move to CQL, this will become obsolete
 +     * @return
 +     */
 +    @Key( THRIFT_TRANSPORT_SIZE)
 +    @Default( "15728640" )
 +    int getThriftBufferSize();
 +
 +
 +    /**
 +     * Returns the name of the keyspace that should be used for Locking
 +     */
 +    @Key( LOCKS_KEYSPACE_NAME )
 +    @Default("Locks")
 +    String getLocksKeyspace();
 +
 +    /**
 +     * Returns the Astyanax consistency level for writing a Lock
 +     */
 +    @Key(LOCKS_CL)
 +    @Default("CL_LOCAL_QUORUM")
 +    String getLocksCl();
 +
 +    /**
 +     * Returns a flag on whether or not to share the connection pool with other keyspaces
 +     */
 +    @Key( LOCKS_SHARED_POOL_FLAG )
 +    @Default("true")
 +    boolean useSharedPoolForLocks();
 +
 +    /**
 +     * Returns a flag on whether or not to share the connection pool with other keyspaces
 +     */
 +    @Key( LOCKS_CONNECTIONS )
 +    @Default( DEFAULT_CONNECTION_POOLSIZE )
 +    int getConnectionsLocks();
 +
 +    /**
 +     * Returns a flag on whether or not to share the connection pool with other keyspaces
 +     */
 +    @Key( LOCKS_KEYSPACE_REPLICATION )
 +    @Default("replication_factor:1")
 +    String getLocksKeyspaceReplication();
 +
 +    /**
 +     * Returns a flag on whether or not to share the connection pool with other keyspaces
 +     */
 +    @Key( LOCKS_KEYSPACE_STRATEGY )
 +    @Default( "org.apache.cassandra.locator.SimpleStrategy" )
 +    String getLocksKeyspaceStrategy();
 +
 +    /**
 +     * Return the expiration that should be used for expiring a lock if it's not released
 +     */
 +    @Key( LOCKS_EXPIRATION )
 +    @Default(DEFAULT_LOCKS_EXPIRATION)
 +    int getLocksExpiration();
 +
 +}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3c6fcdc7/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraClusterImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3c6fcdc7/stack/corepersistence/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3c6fcdc7/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/SNSQueueManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3c6fcdc7/stack/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3c6fcdc7/stack/test-utils/pom.xml
----------------------------------------------------------------------


[04/38] usergrid git commit: Add null checks and tests confirming NPEs are thrown.

Posted by mr...@apache.org.
Add null checks and tests confirming NPEs are thrown.


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

Branch: refs/heads/master
Commit: ad4a33713e8280a4d3637bf1395937bd32aa5fca
Parents: a62fb0a
Author: Michael Russo <mi...@gmail.com>
Authored: Tue Feb 9 17:36:49 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Tue Feb 9 17:36:49 2016 -0800

----------------------------------------------------------------------
 .../core/datastax/TableDefinition.java          |  8 ++
 .../core/datastax/TableDefinitionTest.java      | 81 ++++++++++++++++++++
 2 files changed, 89 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/ad4a3371/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
index 58d43a5..801eaa7 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
@@ -22,6 +22,8 @@
 package org.apache.usergrid.persistence.core.datastax;
 
 
+import com.google.common.base.Preconditions;
+
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
@@ -65,6 +67,12 @@ public class TableDefinition {
                             final Map<String, String> columns, final CacheOption cacheOption,
                             final Map<String, String> clusteringOrder){
 
+        Preconditions.checkNotNull(tableName, "Table name cannot be null");
+        Preconditions.checkNotNull(primaryKeys, "Primary Key(s) cannot be null");
+        Preconditions.checkNotNull(columns, "Columns cannot be null");
+        Preconditions.checkNotNull(cacheOption, "CacheOption cannot be null");
+
+
         this.tableName = tableName;
         this.primaryKeys = primaryKeys;
         this.columns = columns;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ad4a3371/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
new file mode 100644
index 0000000..792864b
--- /dev/null
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
@@ -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.
+ */
+package org.apache.usergrid.persistence.core.datastax;
+
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import static org.junit.Assert.assertEquals;
+
+public class TableDefinitionTest {
+
+    @Test
+    public void testNullTableName(){
+
+        try{
+            TableDefinition table1 = new TableDefinition(null, null, null, null, null);
+        } catch (NullPointerException npe){
+            assertEquals("Table name cannot be null", npe.getMessage());
+        }
+
+
+    }
+
+    @Test
+    public void testNullPrimaryKeys(){
+
+        try{
+            TableDefinition table1 = new TableDefinition("table1", null, null, null, null);
+        } catch (NullPointerException npe){
+            assertEquals("Primary Key(s) cannot be null", npe.getMessage());
+        }
+
+
+    }
+
+    @Test
+    public void testNullColumns(){
+
+        try{
+            TableDefinition table1 = new TableDefinition("table1",
+                new ArrayList<>(), null, null, null);
+        } catch (NullPointerException npe){
+            assertEquals("Columns cannot be null", npe.getMessage());
+        }
+
+
+    }
+
+    @Test
+    public void testNullCacheOption(){
+
+        try{
+            TableDefinition table1 = new TableDefinition("table1",
+                new ArrayList<>(),
+                new HashMap<>(), null, null);
+        } catch (NullPointerException npe){
+            assertEquals("CacheOption cannot be null", npe.getMessage());
+        }
+
+
+    }
+}


[25/38] usergrid git commit: Move CassandraConfig out of astyanax package.

Posted by mr...@apache.org.
Move CassandraConfig out of astyanax package.


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

Branch: refs/heads/master
Commit: f28abda041378884999e665e1af073e24557f953
Parents: 190e519
Author: Michael Russo <mr...@apigee.com>
Authored: Sun May 1 17:43:20 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun May 1 17:43:20 2016 +0800

----------------------------------------------------------------------
 .../impl/ScopedCacheSerializationImpl.java      |   1 +
 .../mvcc/stage/write/WriteUniqueVerify.java     |   2 +-
 .../mvcc/stage/write/WriteUniqueVerifyTest.java |   2 +-
 .../persistence/core/CassandraConfig.java       |  77 +++++++++++
 .../persistence/core/CassandraConfigImpl.java   | 136 ++++++++++++++++++
 .../core/astyanax/CassandraClusterImpl.java     |   1 +
 .../core/astyanax/CassandraConfig.java          |  77 -----------
 .../core/astyanax/CassandraConfigImpl.java      | 137 -------------------
 .../persistence/core/guice/CommonModule.java    |   2 +
 .../core/astyanax/ColumnNameIteratorTest.java   |   1 +
 .../MultiKeyColumnNameIteratorTest.java         |   1 +
 .../astyanax/MultiRowColumnIteratorTest.java    |   1 +
 .../impl/EdgeMetadataSerializationV1Impl.java   |   2 +-
 .../impl/EdgeMetadataSerializationV2Impl.java   |   2 +-
 .../impl/EdgeSerializationImpl.java             |   2 +-
 .../impl/NodeSerializationImpl.java             |   2 +-
 .../shard/impl/EdgeShardSerializationImpl.java  |   4 +-
 .../impl/ShardedEdgeSerializationImpl.java      |   2 +-
 .../map/impl/MapSerializationImpl.java          |   2 +-
 19 files changed, 229 insertions(+), 225 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
index f8dcccc..1334650 100644
--- a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
+++ b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
@@ -29,6 +29,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.hash.Funnel;
 import com.google.inject.Inject;
 import org.apache.usergrid.persistence.cache.CacheScope;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.astyanax.*;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
index d05f838..585c26e 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
@@ -35,7 +35,7 @@ import org.apache.usergrid.persistence.collection.serialization.UniqueValue;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
 import org.apache.usergrid.persistence.collection.serialization.impl.UniqueValueImpl;
-import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.model.entity.Entity;
 import org.apache.usergrid.persistence.model.entity.Id;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java
index b9a1565..09876fb 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java
@@ -27,7 +27,7 @@ import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
 import org.apache.usergrid.persistence.collection.mvcc.stage.CollectionIoEvent;
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
-import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.guice.MigrationManagerRule;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.test.ITRunner;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfig.java
new file mode 100644
index 0000000..595b65f
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfig.java
@@ -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.
+ */
+package org.apache.usergrid.persistence.core;
+
+
+import com.netflix.astyanax.model.ConsistencyLevel;
+
+
+/**
+ *
+ * Wraps our fig configuration since it doesn't support enums yet.  Once enums are supported, remove this wrapper and
+ * replace with the fig configuration itself
+ *
+ */
+public interface CassandraConfig {
+
+    /**
+     * Get the currently configured ReadCL
+     * @return
+     */
+    ConsistencyLevel getReadCL();
+
+    /**
+     * Get the currently configured ReadCL that is more consitent than getAstyanaxReadCL
+     * @return
+     */
+    ConsistencyLevel getConsistentReadCL();
+
+    /**
+     * Get the currently configured write CL
+     * @return
+     */
+    ConsistencyLevel getWriteCL();
+
+
+    /**
+     * Get the currently configured read CL for DataStax driver
+     * @return
+     */
+    com.datastax.driver.core.ConsistencyLevel getDataStaxReadCl();
+
+    /**
+     * Get the currently configured write CL for DataStax driver
+     * @return
+     */
+    com.datastax.driver.core.ConsistencyLevel getDataStaxWriteCl();
+
+    /**
+     * Get the currently configured consistent read CL for DataStax driver
+     * @return
+     */
+    com.datastax.driver.core.ConsistencyLevel getDataStaxReadConsistentCl();
+
+    /**
+     * Return the number of shards that has been set in the property file
+     * @return
+     */
+    int[] getShardSettings();
+
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java
new file mode 100644
index 0000000..5dbf162
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java
@@ -0,0 +1,136 @@
+/*
+ * 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 org.apache.usergrid.persistence.core;
+
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.netflix.astyanax.model.ConsistencyLevel;
+
+
+/**
+ *  Simple configuration to wrap GuicyFig until it supports enums.  Need to be removed once it does
+ *
+ */
+@Singleton
+public class CassandraConfigImpl implements CassandraConfig {
+
+
+    private ConsistencyLevel readCl;
+    private ConsistencyLevel writeCl;
+    private int[] shardSettings;
+    private ConsistencyLevel consistentCl;
+
+    // DataStax driver's CL
+    private com.datastax.driver.core.ConsistencyLevel dataStaxReadCl;
+    private com.datastax.driver.core.ConsistencyLevel dataStaxWriteCl;
+    private com.datastax.driver.core.ConsistencyLevel dataStaxReadConsistentCl;
+
+
+
+    @Inject
+    public CassandraConfigImpl( final CassandraFig cassandraFig ) {
+
+        this.readCl = ConsistencyLevel.valueOf( cassandraFig.getAstyanaxReadCL() );
+
+        this.writeCl = ConsistencyLevel.valueOf( cassandraFig.getAstyanaxWriteCL() );
+
+        this.shardSettings = parseShardSettings( cassandraFig.getShardValues() );
+
+        this.consistentCl = ConsistencyLevel.valueOf(cassandraFig.getAstyanaxConsistentReadCL());
+
+        this.dataStaxReadCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getReadCl());
+
+        this.dataStaxReadConsistentCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getReadCl());
+
+        this.dataStaxWriteCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getWriteCl() );
+
+        //add the listeners to update the values
+        cassandraFig.addPropertyChangeListener( new PropertyChangeListener() {
+            @Override
+            public void propertyChange( final PropertyChangeEvent evt ) {
+                final String propName = evt.getPropertyName();
+
+                if ( CassandraFig.ASTYANAX_READ_CL.equals( propName ) ) {
+                    readCl = ConsistencyLevel.valueOf( evt.getNewValue().toString() );
+                }
+
+                else if ( CassandraFig.ASTYANAX_WRITE_CL.equals( propName ) ) {
+                    writeCl = ConsistencyLevel.valueOf( evt.getNewValue().toString() );
+                }
+                else if (CassandraFig.SHARD_VALUES.equals(propName)){
+                    shardSettings = parseShardSettings( cassandraFig.getShardValues() );
+                }
+            }
+        } );
+    }
+
+
+    @Override
+    public ConsistencyLevel getReadCL() {
+        return readCl;
+    }
+
+    @Override
+    public ConsistencyLevel getConsistentReadCL() {
+        return consistentCl;
+    }
+
+    @Override
+    public ConsistencyLevel getWriteCL() {
+        return writeCl;
+    }
+
+    @Override
+    public com.datastax.driver.core.ConsistencyLevel getDataStaxReadCl() {
+        return dataStaxReadCl;
+    }
+
+    @Override
+    public com.datastax.driver.core.ConsistencyLevel getDataStaxWriteCl() {
+        return dataStaxWriteCl;
+    }
+
+    @Override
+    public com.datastax.driver.core.ConsistencyLevel getDataStaxReadConsistentCl() {
+        return dataStaxReadConsistentCl;
+    }
+
+
+    @Override
+    public int[] getShardSettings() {
+      return shardSettings;
+    }
+
+    private int[] parseShardSettings(final String value){
+        final String[] shardHistory = value.split( "," );
+
+        int[] settings = new int [shardHistory.length];
+
+        for(int i = 0; i < shardHistory.length; i ++){
+            settings[i] = Integer.parseInt( shardHistory[i] );
+        }
+
+      return settings;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraClusterImpl.java
index 06fadfc..9f5d4ac 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraClusterImpl.java
@@ -36,6 +36,7 @@ import com.netflix.astyanax.connectionpool.impl.SimpleAuthenticationCredentials;
 import com.netflix.astyanax.connectionpool.impl.Slf4jConnectionPoolMonitorImpl;
 import com.netflix.astyanax.impl.AstyanaxConfigurationImpl;
 import com.netflix.astyanax.thrift.ThriftFamilyFactory;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.CassandraFig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java
deleted file mode 100644
index 8cb96ac..0000000
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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 org.apache.usergrid.persistence.core.astyanax;
-
-
-import com.netflix.astyanax.model.ConsistencyLevel;
-
-
-/**
- *
- * Wraps our fig configuration since it doesn't support enums yet.  Once enums are supported, remove this wrapper and
- * replace with the fig configuration itself
- *
- */
-public interface CassandraConfig {
-
-    /**
-     * Get the currently configured ReadCL
-     * @return
-     */
-    ConsistencyLevel getReadCL();
-
-    /**
-     * Get the currently configured ReadCL that is more consitent than getAstyanaxReadCL
-     * @return
-     */
-    ConsistencyLevel getConsistentReadCL();
-
-    /**
-     * Get the currently configured write CL
-     * @return
-     */
-    ConsistencyLevel getWriteCL();
-
-
-    /**
-     * Get the currently configured read CL for DataStax driver
-     * @return
-     */
-    com.datastax.driver.core.ConsistencyLevel getDataStaxReadCl();
-
-    /**
-     * Get the currently configured write CL for DataStax driver
-     * @return
-     */
-    com.datastax.driver.core.ConsistencyLevel getDataStaxWriteCl();
-
-    /**
-     * Get the currently configured consistent read CL for DataStax driver
-     * @return
-     */
-    com.datastax.driver.core.ConsistencyLevel getDataStaxReadConsistentCl();
-
-    /**
-     * Return the number of shards that has been set in the property file
-     * @return
-     */
-    int[] getShardSettings();
-
-
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
deleted file mode 100644
index 0135c95..0000000
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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 org.apache.usergrid.persistence.core.astyanax;
-
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.netflix.astyanax.model.ConsistencyLevel;
-import org.apache.usergrid.persistence.core.CassandraFig;
-
-
-/**
- *  Simple configuration to wrap GuicyFig until it supports enums.  Need to be removed once it does
- *
- */
-@Singleton
-public class CassandraConfigImpl implements CassandraConfig {
-
-
-    private ConsistencyLevel readCl;
-    private ConsistencyLevel writeCl;
-    private int[] shardSettings;
-    private ConsistencyLevel consistentCl;
-
-    // DataStax driver's CL
-    private com.datastax.driver.core.ConsistencyLevel dataStaxReadCl;
-    private com.datastax.driver.core.ConsistencyLevel dataStaxWriteCl;
-    private com.datastax.driver.core.ConsistencyLevel dataStaxReadConsistentCl;
-
-
-
-    @Inject
-    public CassandraConfigImpl( final CassandraFig cassandraFig ) {
-
-        this.readCl = ConsistencyLevel.valueOf( cassandraFig.getAstyanaxReadCL() );
-
-        this.writeCl = ConsistencyLevel.valueOf( cassandraFig.getAstyanaxWriteCL() );
-
-        this.shardSettings = parseShardSettings( cassandraFig.getShardValues() );
-
-        this.consistentCl = ConsistencyLevel.valueOf(cassandraFig.getAstyanaxConsistentReadCL());
-
-        this.dataStaxReadCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getReadCl());
-
-        this.dataStaxReadConsistentCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getReadCl());
-
-        this.dataStaxWriteCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getWriteCl() );
-
-        //add the listeners to update the values
-        cassandraFig.addPropertyChangeListener( new PropertyChangeListener() {
-            @Override
-            public void propertyChange( final PropertyChangeEvent evt ) {
-                final String propName = evt.getPropertyName();
-
-                if ( CassandraFig.ASTYANAX_READ_CL.equals( propName ) ) {
-                    readCl = ConsistencyLevel.valueOf( evt.getNewValue().toString() );
-                }
-
-                else if ( CassandraFig.ASTYANAX_WRITE_CL.equals( propName ) ) {
-                    writeCl = ConsistencyLevel.valueOf( evt.getNewValue().toString() );
-                }
-                else if (CassandraFig.SHARD_VALUES.equals(propName)){
-                    shardSettings = parseShardSettings( cassandraFig.getShardValues() );
-                }
-            }
-        } );
-    }
-
-
-    @Override
-    public ConsistencyLevel getReadCL() {
-        return readCl;
-    }
-
-    @Override
-    public ConsistencyLevel getConsistentReadCL() {
-        return consistentCl;
-    }
-
-    @Override
-    public ConsistencyLevel getWriteCL() {
-        return writeCl;
-    }
-
-    @Override
-    public com.datastax.driver.core.ConsistencyLevel getDataStaxReadCl() {
-        return dataStaxReadCl;
-    }
-
-    @Override
-    public com.datastax.driver.core.ConsistencyLevel getDataStaxWriteCl() {
-        return dataStaxWriteCl;
-    }
-
-    @Override
-    public com.datastax.driver.core.ConsistencyLevel getDataStaxReadConsistentCl() {
-        return dataStaxReadConsistentCl;
-    }
-
-
-    @Override
-    public int[] getShardSettings() {
-      return shardSettings;
-    }
-
-    private int[] parseShardSettings(final String value){
-        final String[] shardHistory = value.split( "," );
-
-        int[] settings = new int [shardHistory.length];
-
-        for(int i = 0; i < shardHistory.length; i ++){
-            settings[i] = Integer.parseInt( shardHistory[i] );
-        }
-
-      return settings;
-    }
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
index 94aac60..4681674 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
@@ -21,6 +21,8 @@ package org.apache.usergrid.persistence.core.guice;
 
 import com.datastax.driver.core.Session;
 import com.netflix.astyanax.Keyspace;
+import org.apache.usergrid.persistence.core.CassandraConfig;
+import org.apache.usergrid.persistence.core.CassandraConfigImpl;
 import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.*;
 import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
index 415eafa..caa6294 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
@@ -24,6 +24,7 @@ package org.apache.usergrid.persistence.core.astyanax;
 
 import java.util.HashMap;
 
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.CassandraFig;
 import org.junit.Before;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
index 55ed421..b31fa2f 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
@@ -26,6 +26,7 @@ import java.util.Arrays;
 import java.util.Comparator;
 import java.util.HashMap;
 
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.CassandraFig;
 import org.junit.Before;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
index 882febd..ea5359e 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
@@ -28,6 +28,7 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.concurrent.CountDownLatch;
 
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.CassandraFig;
 import org.junit.Before;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
index 870ba16..d7a5c80 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
@@ -28,7 +28,7 @@ import java.util.Iterator;
 import org.apache.cassandra.db.marshal.BytesType;
 import org.apache.cassandra.db.marshal.UTF8Type;
 
-import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.astyanax.ColumnNameIterator;
 import org.apache.usergrid.persistence.core.astyanax.CompositeFieldSerializer;
 import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
index c9faf5f..1f81864 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
@@ -29,7 +29,7 @@ import org.apache.cassandra.db.marshal.UTF8Type;
 
 import org.apache.usergrid.persistence.core.astyanax.BucketScopedRowKey;
 import org.apache.usergrid.persistence.core.astyanax.BucketScopedRowKeySerializer;
-import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.astyanax.ColumnSearch;
 import org.apache.usergrid.persistence.core.astyanax.CompositeFieldSerializer;
 import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeSerializationImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeSerializationImpl.java
index 0f4d722..984365f 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeSerializationImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeSerializationImpl.java
@@ -27,7 +27,7 @@ import java.util.UUID;
 import javax.inject.Inject;
 
 import com.google.common.base.Optional;
-import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.consistency.TimeService;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.util.ValidationUtils;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
index 8a2da54..2429d5a 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
@@ -32,7 +32,7 @@ import javax.inject.Inject;
 import org.apache.cassandra.db.marshal.BooleanType;
 import org.apache.cassandra.db.marshal.BytesType;
 
-import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
index 651bc64..098c152 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
@@ -24,10 +24,9 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 
-import com.google.common.util.concurrent.ExecutionError;
 import org.apache.cassandra.db.marshal.BytesType;
 
-import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.astyanax.ColumnNameIterator;
 import org.apache.usergrid.persistence.core.astyanax.ColumnParser;
 import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;
@@ -41,7 +40,6 @@ import org.apache.usergrid.persistence.core.util.ValidationUtils;
 import org.apache.usergrid.persistence.graph.GraphFig;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.DirectedEdgeMeta;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeShardSerialization;
-import org.apache.usergrid.persistence.graph.serialization.impl.shard.NodeShardCache;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.Shard;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.serialize.EdgeShardRowKeySerializer;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.serialize.ShardSerializer;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/ShardedEdgeSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/ShardedEdgeSerializationImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/ShardedEdgeSerializationImpl.java
index 65a6f40..8259df4 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/ShardedEdgeSerializationImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/ShardedEdgeSerializationImpl.java
@@ -30,7 +30,7 @@ import javax.annotation.Nullable;
 import javax.inject.Inject;
 
 import com.google.common.base.Optional;
-import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 import org.apache.usergrid.persistence.core.consistency.TimeService;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/f28abda0/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
index e2ea681..735f2b8 100644
--- a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
+++ b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
@@ -28,7 +28,7 @@ import com.datastax.driver.core.querybuilder.Clause;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.datastax.driver.core.querybuilder.Using;
 
-import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;


[02/38] usergrid git commit: Integrate datastax cluster into migration manager for creation of keyspaces using database/setup.

Posted by mr...@apache.org.
Integrate datastax cluster into migration manager for creation of keyspaces using database/setup.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/01c4970a
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/01c4970a
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/01c4970a

Branch: refs/heads/master
Commit: 01c4970a80fa080f7deccf3f004112d9112f624d
Parents: a631975
Author: Michael Russo <mi...@gmail.com>
Authored: Tue Feb 9 10:18:27 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Tue Feb 9 10:18:27 2016 -0800

----------------------------------------------------------------------
 .../usergrid/corepersistence/CpSetup.java       |  15 +--
 .../persistence/core/datastax/CQLUtils.java     |  49 ++++++++
 .../core/datastax/DatastaxSessionProvider.java  |  22 +++-
 .../core/datastax/impl/DatastaxClusterImpl.java |  68 +++--------
 .../persistence/core/guice/CommonModule.java    |  10 +-
 .../migration/schema/MigrationManagerImpl.java  | 113 +++++++------------
 6 files changed, 142 insertions(+), 135 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/01c4970a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java
index e97be3f..d2c38e4 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java
@@ -83,6 +83,9 @@ public class CpSetup implements Setup {
         //a no op, creating the injector creates the connections
         //init our index if required
         this.emf.initializeManagementIndex();
+
+        logger.info( "Initialize application keyspace" );
+        migrate();
         setupStaticKeyspace();
         setupSystemKeyspace();
 
@@ -129,9 +132,7 @@ public class CpSetup implements Setup {
     @Override
     public void setupSystemKeyspace() throws Exception {
 
-        logger.info( "Initialize system keyspace" );
-
-        migrate();
+        logger.info( "Initialize system tables" );
 
         cass.createColumnFamily( getApplicationKeyspace(),
             createColumnFamilyDefinition( getApplicationKeyspace(), APPLICATIONS_CF, ComparatorType.BYTESTYPE ) );
@@ -145,7 +146,7 @@ public class CpSetup implements Setup {
         cass.createColumnFamily( getApplicationKeyspace(),
             createColumnFamilyDefinition( getApplicationKeyspace(), PRINCIPAL_TOKEN_CF, ComparatorType.UUIDTYPE ) );
 
-        logger.info( "System keyspace initialized" );
+        logger.info( "System tables initialized" );
     }
 
 
@@ -167,11 +168,9 @@ public class CpSetup implements Setup {
     @Override
     public void setupStaticKeyspace() throws Exception {
 
-        migrate();
-
         // Need this legacy stuff for queues
 
-        logger.info( "Creating static application keyspace {}", getApplicationKeyspace() );
+        logger.info( "Initialize application tables" );
 
         cass.createColumnFamily( getApplicationKeyspace(),
             createColumnFamilyDefinition( getApplicationKeyspace(), APPLICATIONS_CF,
@@ -183,6 +182,8 @@ public class CpSetup implements Setup {
         cass.createColumnFamilies( getApplicationKeyspace(),
             getCfDefs( QueuesCF.class, getApplicationKeyspace() ) );
 
+        logger.info( "Application tables initialized" );
+
     }
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/01c4970a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
new file mode 100644
index 0000000..b663934
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
@@ -0,0 +1,49 @@
+/*
+ * 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 org.apache.usergrid.persistence.core.datastax;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class CQLUtils {
+
+    public static String getFormattedReplication(String strategy, String strategyOptions) throws JsonProcessingException {
+
+        Map<String, String> replicationSettings = new HashMap<>();
+        replicationSettings.put("class", strategy);
+        String[] strategyOptionsSplit = strategyOptions.split(",");
+        for ( String option : strategyOptionsSplit){
+            String[] splitOptions = option.split(":");
+            replicationSettings.put(splitOptions[0], splitOptions[1]);
+        }
+        ObjectMapper mapper = new ObjectMapper();
+        return mapper.writeValueAsString(replicationSettings).replace("\"", "'");
+    }
+
+
+    public static void createColumnFamily(){
+
+
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/01c4970a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
index eeca763..1b39cb8 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
@@ -1,3 +1,21 @@
+/*
+ * 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 org.apache.usergrid.persistence.core.datastax;
 
 
@@ -5,12 +23,12 @@ import com.datastax.driver.core.Session;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
-public class DatastaxSessionProvider implements Provider<Session> {
+public class DataStaxSessionProvider implements Provider<Session> {
 
     private final DataStaxCluster dataStaxCluster;
 
     @Inject
-    public DatastaxSessionProvider( final DataStaxCluster dataStaxCluster){
+    public DataStaxSessionProvider( final DataStaxCluster dataStaxCluster ){
 
         this.dataStaxCluster = dataStaxCluster;
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/01c4970a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
index 0582c4e..ffe61e6 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
@@ -21,8 +21,6 @@ package org.apache.usergrid.persistence.core.datastax.impl;
 import com.datastax.driver.core.*;
 import com.datastax.driver.core.policies.DCAwareRoundRobinPolicy;
 import com.datastax.driver.core.policies.LoadBalancingPolicy;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
@@ -30,15 +28,11 @@ import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 
 @Singleton
-public class DatastaxClusterImpl implements DataStaxCluster {
+public class DataStaxClusterImpl implements DataStaxCluster {
 
-    private static final Logger logger = LoggerFactory.getLogger( DatastaxClusterImpl.class );
+    private static final Logger logger = LoggerFactory.getLogger( DataStaxClusterImpl.class );
 
 
     private final CassandraFig cassandraFig;
@@ -47,7 +41,7 @@ public class DatastaxClusterImpl implements DataStaxCluster {
     private Session clusterSession;
 
     @Inject
-    public DatastaxClusterImpl( final CassandraFig cassandraFig ) throws Exception {
+    public DataStaxClusterImpl(final CassandraFig cassandraFig ) throws Exception {
         this.cassandraFig = cassandraFig;
 
         ConsistencyLevel defaultConsistencyLevel;
@@ -99,15 +93,12 @@ public class DatastaxClusterImpl implements DataStaxCluster {
         }
 
         this.cluster = datastaxCluster.build();
-        this.clusterSession = cluster.connect();
-        logger.info("Initialized datastax client cluster. Hosts={}, Idle Timeout={}s,  Request Timeout={}s",
+        logger.info("Initialized datastax cluster client. Hosts={}, Idle Timeout={}s,  Request Timeout={}s",
             cluster.getMetadata().getAllHosts().toString(),
             cluster.getConfiguration().getPoolingOptions().getIdleTimeoutSeconds(),
             cluster.getConfiguration().getPoolingOptions().getPoolTimeoutMillis() / 1000);
 
-        logger.info("Creating keyspaces if they do not already exist.");
-        createKeyspaces();
-        this.applicationSession = cluster.connect( "\""+cassandraFig.getApplicationKeyspace()+"\"" );
+
 
 
 
@@ -115,55 +106,26 @@ public class DatastaxClusterImpl implements DataStaxCluster {
     }
 
     public Cluster getCluster(){
+
         return cluster;
     }
 
     public Session getClusterSession(){
-        return clusterSession;
-    }
-
-    public Session getApplicationSession(){
-        return applicationSession;
-    }
-
-    private void createKeyspaces() throws Exception{
-
-        final String createApplicationKeyspace = String.format(
-            "CREATE KEYSPACE IF NOT EXISTS \"%s\" WITH replication = %s",
-            cassandraFig.getApplicationKeyspace(),
-            getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
-
-        );
-
-        final String createLocksKeyspace = String.format(
-            "CREATE KEYSPACE IF NOT EXISTS \"%s\" WITH replication = %s",
-            cassandraFig.getLocksKeyspace(),
-            getFormattedReplication(
-                cassandraFig.getLocksKeyspaceStrategy(),
-                cassandraFig.getLocksKeyspaceReplication()
-            )
-        );
-
-        logger.info("Creating application keyspace with the following CQL: {}", createApplicationKeyspace);
-        clusterSession.execute(createApplicationKeyspace);
-
-        logger.info("Creating locks keyspace with the following CQL: {}", createLocksKeyspace);
-        clusterSession.execute(createLocksKeyspace);
 
+        if ( clusterSession == null || clusterSession.isClosed() ){
+            clusterSession = cluster.connect();
+        }
 
+        return clusterSession;
     }
 
-    private String getFormattedReplication(String strategy, String strategyOptions) throws JsonProcessingException{
+    public Session getApplicationSession(){
 
-        Map<String, String> replicationSettings = new HashMap<>();
-        replicationSettings.put("class", strategy);
-        String[] strategyOptionsSplit = strategyOptions.split(",");
-        for ( String option : strategyOptionsSplit){
-            String[] splitOptions = option.split(":");
-            replicationSettings.put(splitOptions[0], splitOptions[1]);
+        if ( applicationSession == null || applicationSession.isClosed() ){
+            applicationSession = cluster.connect( "\""+cassandraFig.getApplicationKeyspace()+"\"" );
         }
-            ObjectMapper mapper = new ObjectMapper();
-            return mapper.writeValueAsString(replicationSettings).replace("\"", "'");
+        return applicationSession;
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/01c4970a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
index a06a6e7..460efa5 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
@@ -19,9 +19,12 @@
 package org.apache.usergrid.persistence.core.guice;
 
 
+import com.datastax.driver.core.Session;
 import com.netflix.astyanax.Keyspace;
 import org.apache.usergrid.persistence.core.astyanax.*;
-import org.apache.usergrid.persistence.core.datastax.impl.DatastaxClusterImpl;
+import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
+import org.apache.usergrid.persistence.core.datastax.DataStaxSessionProvider;
+import org.apache.usergrid.persistence.core.datastax.impl.DataStaxClusterImpl;
 import org.safehaus.guicyfig.GuicyFigModule;
 
 import org.apache.usergrid.persistence.core.consistency.TimeService;
@@ -63,7 +66,10 @@ public class CommonModule extends AbstractModule {
         bind(CassandraCluster.class).to(CassandraClusterImpl.class).asEagerSingleton();
 
         // bind our Datastax cluster
-        bind(DatastaxClusterImpl.class).asEagerSingleton();
+        bind(DataStaxCluster.class).to(DataStaxClusterImpl.class).asEagerSingleton();
+
+        // bind our Session to the DataStaxSessionProvider
+        bind(Session.class).toProvider(DataStaxSessionProvider.class).asEagerSingleton();
 
         // bind our keyspace to the AstyanaxKeyspaceProvider
         bind(Keyspace.class).toProvider(AstyanaxKeyspaceProvider.class).asEagerSingleton();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/01c4970a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
index db694fe..e7e0cb5 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
@@ -20,22 +20,21 @@ package org.apache.usergrid.persistence.core.migration.schema;
 
 
 import java.util.Collection;
-import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
+import com.datastax.driver.core.Session;
+import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.datastax.CQLUtils;
+import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
-import org.apache.usergrid.persistence.core.migration.util.AstayanxUtils;
 
-import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.netflix.astyanax.Keyspace;
 import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.connectionpool.exceptions.NotFoundException;
 import com.netflix.astyanax.ddl.ColumnFamilyDefinition;
 import com.netflix.astyanax.ddl.KeyspaceDefinition;
 
@@ -51,18 +50,20 @@ public class MigrationManagerImpl implements MigrationManager {
 
     private static final Logger logger = LoggerFactory.getLogger( MigrationManagerImpl.class );
 
+    private final CassandraFig cassandraFig;
     private final Set<Migration> migrations;
     private final Keyspace keyspace;
-
-    private final MigrationManagerFig fig;
+    private final DataStaxCluster dataStaxCluster;
 
 
     @Inject
-    public MigrationManagerImpl( final Keyspace keyspace, final Set<Migration> migrations,
-                                 MigrationManagerFig fig ) {
+    public MigrationManagerImpl( final CassandraFig cassandraFig, final Keyspace keyspace,
+                                 final Set<Migration> migrations, final DataStaxCluster dataStaxCluster) {
+
+        this.cassandraFig = cassandraFig;
         this.keyspace = keyspace;
         this.migrations = migrations;
-        this.fig = fig;
+        this.dataStaxCluster = dataStaxCluster;
     }
 
 
@@ -72,7 +73,7 @@ public class MigrationManagerImpl implements MigrationManager {
 
         try {
 
-            testAndCreateKeyspace();
+            createOrUpdateKeyspace();
 
             for ( Migration migration : migrations ) {
 
@@ -116,86 +117,54 @@ public class MigrationManagerImpl implements MigrationManager {
 
         logger.info( "Created column family {}", columnFamily.getColumnFamily().getName() );
 
-        waitForMigration();
+        waitForSchemaAgreement();
     }
 
 
     /**
-     * Check if they keyspace exists.  If it doesn't create it
+     * Execute CQL to create the keyspace if it does not already exists.  Always update the keyspace with the
+     * configured strategy options to allow for real time replication updates.
+     *
+     * @throws Exception
      */
-    private void testAndCreateKeyspace() throws ConnectionException {
-
-
-        KeyspaceDefinition keyspaceDefinition = null;
-
-        try {
-            keyspaceDefinition = keyspace.describeKeyspace();
-
-        }catch( NotFoundException nfe){
-            //if we execute this immediately after a drop keyspace in 1.2.x, Cassandra is returning the NFE instead of a BadRequestException
-            //swallow and log, then continue to create the keyspaces.
-            logger.info( "Received a NotFoundException when attempting to describe keyspace.  It does not exist" );
-        }
-        catch(Exception e){
-            AstayanxUtils.isKeyspaceMissing("Unable to connect to cassandra", e);
-        }
-
-
-        if ( keyspaceDefinition != null ) {
-            return;
-        }
-
+    private void createOrUpdateKeyspace() throws Exception {
 
-        ImmutableMap.Builder<String, Object> strategyOptions = getKeySpaceProps();
+        Session clusterSession = dataStaxCluster.getClusterSession();
 
+        final String createApplicationKeyspace = String.format(
+            "CREATE KEYSPACE IF NOT EXISTS \"%s\" WITH replication = %s",
+            cassandraFig.getApplicationKeyspace(),
+            CQLUtils.getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
 
-        ImmutableMap<String, Object> options =
-                ImmutableMap.<String, Object>builder().put( "strategy_class", fig.getStrategyClass() )
-                            .put( "strategy_options", strategyOptions.build() ).build();
+        );
 
+        final String updateApplicationKeyspace = String.format(
+            "ALTER KEYSPACE \"%s\" WITH replication = %s",
+            cassandraFig.getApplicationKeyspace(),
+            CQLUtils.getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
+        );
 
-        keyspace.createKeyspace( options );
+        logger.info("Creating application keyspace with the following CQL: {}", createApplicationKeyspace);
+        clusterSession.execute(createApplicationKeyspace);
+        logger.info("Updating application keyspace with the following CQL: {}", updateApplicationKeyspace);
+        clusterSession.execute(updateApplicationKeyspace);
 
-        strategyOptions.toString();
+        // this session pool is only used when running database setup so close it when finished to clear resources
+        clusterSession.close();
 
-        logger.info( "Created keyspace {} with options {}", keyspace.getKeyspaceName(), options.toString() );
-
-        waitForMigration();
+        waitForSchemaAgreement();
     }
 
 
     /**
-     * Get keyspace properties
+     * Wait until all Cassandra nodes agree on the schema.  Sleeps 100ms between checks.
+     *
      */
-    private ImmutableMap.Builder<String, Object> getKeySpaceProps() {
-        ImmutableMap.Builder<String, Object> keyspaceProps = ImmutableMap.<String, Object>builder();
-
-        String optionString = fig.getStrategyOptions();
-
-        if(optionString == null){
-            return keyspaceProps;
-        }
-
-
-
-        for ( String key : optionString.split( "," ) ) {
-
-            final String[] options = key.split( ":" );
-
-            keyspaceProps.put( options[0], options[1] );
-        }
-
-        return keyspaceProps;
-    }
-
-
-    private void waitForMigration() throws ConnectionException {
+    private void waitForSchemaAgreement() {
 
         while ( true ) {
 
-            final Map<String, List<String>> versions = keyspace.describeSchemaVersions();
-
-            if ( versions != null && versions.size() == 1 ) {
+            if( dataStaxCluster.getCluster().getMetadata().checkSchemaAgreement() ){
                 return;
             }
 
@@ -208,4 +177,6 @@ public class MigrationManagerImpl implements MigrationManager {
             }
         }
     }
+
+
 }


[26/38] usergrid git commit: Add consistent read CL for datastax driver implementations.

Posted by mr...@apache.org.
Add consistent read CL for datastax driver implementations.


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

Branch: refs/heads/master
Commit: ff3f7e899d81d636eddaa203141ee31ef2da097c
Parents: f28abda
Author: Michael Russo <mr...@apigee.com>
Authored: Sun May 1 17:48:43 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun May 1 17:48:43 2016 +0800

----------------------------------------------------------------------
 .../apache/usergrid/persistence/core/CassandraConfigImpl.java   | 2 +-
 .../java/org/apache/usergrid/persistence/core/CassandraFig.java | 5 +++++
 2 files changed, 6 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/ff3f7e89/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java
index 5dbf162..e87ebb8 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraConfigImpl.java
@@ -61,7 +61,7 @@ public class CassandraConfigImpl implements CassandraConfig {
 
         this.dataStaxReadCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getReadCl());
 
-        this.dataStaxReadConsistentCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getReadCl());
+        this.dataStaxReadConsistentCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getReadClConsistent());
 
         this.dataStaxWriteCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getWriteCl() );
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ff3f7e89/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
index d8620be..3c58dfb 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
@@ -33,6 +33,7 @@ public interface CassandraFig extends GuicyFig {
 
     // cassndra properties used by datastax driver
     String READ_CL = "cassandra.readcl";
+    String READ_CL_CONSISTENT = "cassandra.readcl.consistent";
     String WRITE_CL = "cassandra.writecl";
     String STRATEGY = "cassandra.strategy";
     String STRATEGY_OPTIONS = "cassandra.strategy.options";
@@ -136,6 +137,10 @@ public interface CassandraFig extends GuicyFig {
     @Key(READ_CL)
     String getReadCl();
 
+    @Default("QUORUM")
+    @Key(READ_CL_CONSISTENT)
+    String getReadClConsistent();
+
     @Default("LOCAL_QUORUM")
     @Key(WRITE_CL)
     String getWriteCl();


[32/38] usergrid git commit: Remove remaining traces of Astyanax from Unique Value serialization.

Posted by mr...@apache.org.
Remove remaining traces of Astyanax from Unique Value serialization.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/6efb5bad
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/6efb5bad
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/6efb5bad

Branch: refs/heads/master
Commit: 6efb5bad0106cdbe8b0e48843ee68fcfd1aa56d3
Parents: eccb4d5
Author: Michael Russo <mr...@apigee.com>
Authored: Sun May 8 22:39:54 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun May 8 22:39:54 2016 +0800

----------------------------------------------------------------------
 .../impl/EntityCollectionManagerImpl.java       | 95 +++++++++-----------
 .../mvcc/stage/write/WriteUniqueVerify.java     | 15 ++--
 .../UniqueValueSerializationStrategy.java       | 16 ++--
 .../UniqueValueSerializationStrategyImpl.java   | 71 +++------------
 ...iqueValueSerializationStrategyProxyImpl.java | 14 +--
 .../UniqueValueSerializationStrategyV1Impl.java | 85 ++----------------
 .../UniqueValueSerializationStrategyV2Impl.java | 67 +-------------
 7 files changed, 80 insertions(+), 283 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/6efb5bad/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
index 6d42fa2..291e5df 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
@@ -296,15 +296,11 @@ public class EntityCollectionManagerImpl implements EntityCollectionManager {
     public Observable<Id> getIdField( final String type, final Field field ) {
         final List<Field> fields = Collections.singletonList( field );
         final Observable<Id> idObservable = Observable.from( fields ).map( field1 -> {
-            try {
-                final UniqueValueSet set = uniqueValueSerializationStrategy.load( applicationScope, type, fields );
-                final UniqueValue value = set.getValue( field1.getName() );
-                return value == null ? null : value.getEntityId();
-            }
-            catch ( ConnectionException e ) {
-                logger.error( "Failed to getIdField", e );
-                throw new RuntimeException( e );
-            }
+
+            final UniqueValueSet set = uniqueValueSerializationStrategy.load( applicationScope, type, fields );
+            final UniqueValue value = set.getValue( field1.getName() );
+            return value == null ? null : value.getEntityId();
+
         } );
 
         return ObservableTimer.time( idObservable, fieldIdTimer );
@@ -317,68 +313,63 @@ public class EntityCollectionManagerImpl implements EntityCollectionManager {
     @Override
     public Observable<FieldSet> getEntitiesFromFields( final String type, final Collection<Field> fields ) {
         final Observable<FieldSet> fieldSetObservable = Observable.just( fields ).map( fields1 -> {
-            try {
 
-                final UUID startTime = UUIDGenerator.newTimeUUID();
+            final UUID startTime = UUIDGenerator.newTimeUUID();
 
-                //Get back set of unique values that correspond to collection of fields
-                UniqueValueSet set = uniqueValueSerializationStrategy.load( applicationScope, type, fields1 );
-
-                //Short circuit if we don't have any uniqueValues from the given fields.
-                if ( !set.iterator().hasNext() ) {
-                    return new MutableFieldSet( 0 );
-                }
+            //Get back set of unique values that correspond to collection of fields
+            UniqueValueSet set = uniqueValueSerializationStrategy.load( applicationScope, type, fields1 );
 
+            //Short circuit if we don't have any uniqueValues from the given fields.
+            if ( !set.iterator().hasNext() ) {
+                return new MutableFieldSet( 0 );
+            }
 
-                //loop through each field, and construct an entity load
-                List<Id> entityIds = new ArrayList<>( fields1.size() );
-                List<UniqueValue> uniqueValues = new ArrayList<>( fields1.size() );
 
-                for ( final Field expectedField : fields1 ) {
+            //loop through each field, and construct an entity load
+            List<Id> entityIds = new ArrayList<>( fields1.size() );
+            List<UniqueValue> uniqueValues = new ArrayList<>( fields1.size() );
 
-                    UniqueValue value = set.getValue( expectedField.getName() );
+            for ( final Field expectedField : fields1 ) {
 
-                    if ( value == null ) {
-                        logger.debug( "Field does not correspond to a unique value" );
-                    }
+                UniqueValue value = set.getValue( expectedField.getName() );
 
-                    entityIds.add( value.getEntityId() );
-                    uniqueValues.add( value );
+                if ( value == null ) {
+                    logger.debug( "Field does not correspond to a unique value" );
                 }
 
-                //Load a entity for each entityId we retrieved.
-                final EntitySet entitySet = entitySerializationStrategy.load( applicationScope, entityIds, startTime );
-
-                final BatchStatement uniqueDeleteBatch = new BatchStatement();
-
-                final MutableFieldSet response = new MutableFieldSet( fields1.size() );
+                entityIds.add( value.getEntityId() );
+                uniqueValues.add( value );
+            }
 
-                for ( final UniqueValue expectedUnique : uniqueValues ) {
-                    final MvccEntity entity = entitySet.getEntity( expectedUnique.getEntityId() );
+            //Load a entity for each entityId we retrieved.
+            final EntitySet entitySet = entitySerializationStrategy.load( applicationScope, entityIds, startTime );
 
-                    //bad unique value, delete this, it's inconsistent
-                    if ( entity == null || !entity.getEntity().isPresent() ) {
-                        uniqueDeleteBatch.add(
-                            uniqueValueSerializationStrategy.deleteCQL( applicationScope, expectedUnique ));
-                        continue;
-                    }
+            final BatchStatement uniqueDeleteBatch = new BatchStatement();
 
-                    //TODO, we need to validate the property in the entity matches the property in the unique value
+            final MutableFieldSet response = new MutableFieldSet( fields1.size() );
 
+            for ( final UniqueValue expectedUnique : uniqueValues ) {
+                final MvccEntity entity = entitySet.getEntity( expectedUnique.getEntityId() );
 
-                    //else add it to our result set
-                    response.addEntity( expectedUnique.getField(), entity );
+                //bad unique value, delete this, it's inconsistent
+                if ( entity == null || !entity.getEntity().isPresent() ) {
+                    uniqueDeleteBatch.add(
+                        uniqueValueSerializationStrategy.deleteCQL( applicationScope, expectedUnique ));
+                    continue;
                 }
 
-                //TODO: explore making this an Async process
-                session.execute(uniqueDeleteBatch);
+                //TODO, we need to validate the property in the entity matches the property in the unique value
 
-                return response;
-            }
-            catch ( ConnectionException e ) {
-                logger.error( "Failed to getIdField", e );
-                throw new RuntimeException( e );
+
+                //else add it to our result set
+                response.addEntity( expectedUnique.getField(), entity );
             }
+
+            //TODO: explore making this an Async process
+            session.execute(uniqueDeleteBatch);
+
+            return response;
+
         } );
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/6efb5bad/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
index 501950a..5e99a05 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 
 import com.datastax.driver.core.BatchStatement;
+import com.datastax.driver.core.ConsistencyLevel;
 import com.datastax.driver.core.Session;
 import com.netflix.hystrix.HystrixCommandProperties;
 import org.slf4j.Logger;
@@ -49,9 +50,7 @@ import com.google.common.base.Preconditions;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.netflix.astyanax.Keyspace;
-import com.netflix.astyanax.MutationBatch;
 import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.model.ConsistencyLevel;
 import com.netflix.hystrix.HystrixCommand;
 import com.netflix.hystrix.HystrixCommandGroupKey;
 import com.netflix.hystrix.HystrixThreadPoolProperties;
@@ -180,25 +179,21 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
 
         @Override
         protected Map<String, Field> run() throws Exception {
-            return executeStrategy(fig.getReadCL());
+            return executeStrategy(fig.getDataStaxReadCl());
         }
 
         @Override
         protected Map<String, Field> getFallback() {
             // fallback with same CL as there are many reasons the 1st execution failed, not just due to consistency problems
-            return executeStrategy(fig.getReadCL());
+            return executeStrategy(fig.getDataStaxReadCl());
         }
 
         public Map<String, Field> executeStrategy(ConsistencyLevel consistencyLevel){
             //allocate our max size, worst case
             //now get the set of fields back
             final UniqueValueSet uniqueValues;
-            try {
-                uniqueValues = uniqueValueSerializationStrategy.load( scope, consistencyLevel, type,  uniqueFields );
-            }
-            catch ( ConnectionException e ) {
-                throw new RuntimeException( "Unable to read from cassandra", e );
-            }
+
+            uniqueValues = uniqueValueSerializationStrategy.load( scope, consistencyLevel, type,  uniqueFields );
 
             final Map<String, Field> uniquenessViolations = new HashMap<>( uniqueFields.size() );
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/6efb5bad/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
index bb6f5fe..eb43985 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
@@ -22,17 +22,13 @@ import java.util.Collection;
 import java.util.Iterator;
 
 import com.datastax.driver.core.BatchStatement;
-import org.apache.usergrid.persistence.collection.serialization.impl.UniqueValueSerializationStrategyImpl;
+import com.datastax.driver.core.ConsistencyLevel;
 import org.apache.usergrid.persistence.core.migration.data.VersionedData;
 import org.apache.usergrid.persistence.core.migration.schema.Migration;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.field.Field;
 
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.model.ConsistencyLevel;
-
 
 /**
  * Reads and writes to UniqueValues column family.
@@ -60,9 +56,8 @@ public interface UniqueValueSerializationStrategy extends Migration, VersionedDa
      *
      * @return UniqueValueSet containing fields from the collection that exist in cassandra
      *
-     * @throws ConnectionException on error connecting to Cassandra
      */
-    UniqueValueSet load( ApplicationScope applicationScope, String type, Collection<Field> fields ) throws ConnectionException;
+    UniqueValueSet load( ApplicationScope applicationScope, String type, Collection<Field> fields );
 
     /**
     * Load UniqueValue that matches field from collection or null if that value does not exist.
@@ -72,10 +67,9 @@ public interface UniqueValueSerializationStrategy extends Migration, VersionedDa
     * @param type The type the unique value exists within
     * @param fields Field name/value to search for
     * @return UniqueValueSet containing fields from the collection that exist in cassandra
-    * @throws ConnectionException on error connecting to Cassandra
     */
-    UniqueValueSet load( ApplicationScope applicationScope, ConsistencyLevel consistencyLevel, String type,
-                         Collection<Field> fields ) throws ConnectionException;
+    UniqueValueSet load(ApplicationScope applicationScope, ConsistencyLevel consistencyLevel, String type,
+                        Collection<Field> fields );
 
 
     /**
@@ -96,7 +90,7 @@ public interface UniqueValueSerializationStrategy extends Migration, VersionedDa
      * @param uniqueValue Object to be deleted.
      * @return BatchStatement that encapsulates the CQL statements, caller may or may not execute.
      */
-    BatchStatement deleteCQL( ApplicationScope applicationScope, UniqueValue uniqueValue);
+    BatchStatement deleteCQL( ApplicationScope applicationScope, UniqueValue uniqueValue );
 
 
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/6efb5bad/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
index fe4e06f..5320152 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
@@ -33,26 +33,18 @@ import org.apache.usergrid.persistence.model.field.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.db.marshal.BytesType;
 
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValue;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
 import org.apache.usergrid.persistence.core.CassandraFig;
-import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;
-import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
-import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.util.ValidationUtils;
 import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.common.base.Preconditions;
-import com.netflix.astyanax.ColumnListMutation;
-import com.netflix.astyanax.Keyspace;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
 
 
 /**
@@ -66,28 +58,17 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     public static final String UUID_TYPE_REVERSED = "UUIDType(reversed=true)";
 
 
-
-    private final MultiTenantColumnFamily<ScopedRowKey<FieldKey>, EntityVersion>
-        CF_UNIQUE_VALUES;
-
-
-    private final MultiTenantColumnFamily<ScopedRowKey<EntityKey>, UniqueFieldEntry>
-        CF_ENTITY_UNIQUE_VALUE_LOG ;
-
     private final String TABLE_UNIQUE_VALUES;
     private final String TABLE_UNIQUE_VALUES_LOG;
 
-
     private final Map COLUMNS_UNIQUE_VALUES;
     private final Map COLUMNS_UNIQUE_VALUES_LOG;
 
 
-
     public static final int COL_VALUE = 0x0;
 
 
     private final SerializationFig serializationFig;
-    protected final Keyspace keyspace;
     private final CassandraFig cassandraFig;
 
     private final Session session;
@@ -97,23 +78,19 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     /**
      * Construct serialization strategy for keyspace.
      *
-     * @param keyspace Keyspace in which to store Unique Values.
      * @param cassandraFig The cassandra configuration
      * @param serializationFig The serialization configuration
      */
-    public UniqueValueSerializationStrategyImpl( final Keyspace keyspace, final CassandraFig cassandraFig,
+    public UniqueValueSerializationStrategyImpl( final CassandraFig cassandraFig,
                                                  final SerializationFig serializationFig,
-                                                 final Session session, final CassandraConfig cassandraConfig) {
-        this.keyspace = keyspace;
+                                                 final Session session,
+                                                 final CassandraConfig cassandraConfig) {
         this.cassandraFig = cassandraFig;
         this.serializationFig = serializationFig;
 
         this.session = session;
         this.cassandraConfig = cassandraConfig;
 
-        CF_UNIQUE_VALUES = getUniqueValuesCF();
-        CF_ENTITY_UNIQUE_VALUE_LOG = getEntityUniqueLogCF();
-
         TABLE_UNIQUE_VALUES = getUniqueValuesTable().getTableName();
         TABLE_UNIQUE_VALUES_LOG = getEntityUniqueLogTable().getTableName();
 
@@ -242,27 +219,27 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
     @Override
     public UniqueValueSet load( final ApplicationScope colScope, final String type, final Collection<Field> fields )
-        throws ConnectionException {
-        return load( colScope, com.netflix.astyanax.model.ConsistencyLevel.valueOf( cassandraFig.getAstyanaxReadCL() ), type, fields );
+         {
+        return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getReadCl() ), type, fields );
     }
 
 
     @Override
-    public UniqueValueSet load( final ApplicationScope appScope, final com.netflix.astyanax.model.ConsistencyLevel consistencyLevel,
-                                final String type, final Collection<Field> fields ) throws ConnectionException {
+    public UniqueValueSet load( final ApplicationScope appScope,
+                                final ConsistencyLevel consistencyLevel,
+                                final String type, final Collection<Field> fields ) {
 
         Preconditions.checkNotNull( fields, "fields are required" );
         Preconditions.checkArgument( fields.size() > 0, "More than 1 field must be specified" );
 
-        return loadCQL(appScope, com.datastax.driver.core.ConsistencyLevel.LOCAL_QUORUM, type, fields);
-
-        //return loadLegacy( appScope, type, fields);
+        return loadCQL(appScope, consistencyLevel, type, fields);
 
     }
 
 
-    private UniqueValueSet loadCQL( final ApplicationScope appScope, final com.datastax.driver.core.ConsistencyLevel consistencyLevel,
-                                final String type, final Collection<Field> fields ) throws ConnectionException {
+    private UniqueValueSet loadCQL( final ApplicationScope appScope,
+                                    final ConsistencyLevel consistencyLevel,
+                                    final String type, final Collection<Field> fields ) {
 
         Preconditions.checkNotNull( fields, "fields are required" );
         Preconditions.checkArgument( fields.size() > 0, "More than 1 field must be specified" );
@@ -287,7 +264,7 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
         final Statement statement = QueryBuilder.select().all().from(TABLE_UNIQUE_VALUES)
             .where(inKey)
-            .setConsistencyLevel(com.datastax.driver.core.ConsistencyLevel.LOCAL_QUORUM);
+            .setConsistencyLevel(consistencyLevel);
 
         final ResultSet resultSet = session.execute(statement);
 
@@ -366,13 +343,6 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     @Override
     public abstract Collection<TableDefinition> getTables();
 
-
-    /**
-     * Get the column family for the unique fields
-     */
-    protected abstract MultiTenantColumnFamily<ScopedRowKey<FieldKey>, EntityVersion> getUniqueValuesCF();
-
-
     /**
      * Get the CQL table definition for the unique values log table
      */
@@ -395,26 +365,11 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
 
 
-
-
-        /**
-         * Get the column family for the unique field CF
-         */
-    protected abstract MultiTenantColumnFamily<ScopedRowKey<EntityKey>, UniqueFieldEntry> getEntityUniqueLogCF();
-
     /**
      * Get the CQL table definition for the unique values log table
      */
     protected abstract TableDefinition getEntityUniqueLogTable();
 
-    /**
-     * Generate a key that is compatible with the column family
-     *
-     * @param applicationId The applicationId
-     * @param uniqueValueId The uniqueValue
-     */
-    protected abstract EntityKey createEntityUniqueLogKey(final Id applicationId,  final Id uniqueValueId );
-
 
     public class AllUniqueFieldsIterator implements Iterable<UniqueValue>, Iterator<UniqueValue> {
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/6efb5bad/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
index dc5b48f..4b5653f 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
@@ -25,6 +25,7 @@ import java.util.Collections;
 import java.util.Iterator;
 
 import com.datastax.driver.core.BatchStatement;
+import com.datastax.driver.core.ConsistencyLevel;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValue;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
@@ -40,28 +41,21 @@ import org.apache.usergrid.persistence.model.field.Field;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-import com.netflix.astyanax.Keyspace;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.model.ConsistencyLevel;
 
 
 @Singleton
 public class UniqueValueSerializationStrategyProxyImpl implements UniqueValueSerializationStrategy {
 
 
-    protected final Keyspace keyspace;
     private final VersionedMigrationSet<UniqueValueSerializationStrategy> versions;
     private final MigrationInfoCache migrationInfoCache;
 
 
     @Inject
-    public UniqueValueSerializationStrategyProxyImpl( final Keyspace keyspace,
-                                                      final VersionedMigrationSet<UniqueValueSerializationStrategy>
+    public UniqueValueSerializationStrategyProxyImpl( final VersionedMigrationSet<UniqueValueSerializationStrategy>
                                                           allVersions,
                                                       final MigrationInfoCache migrationInfoCache ) {
 
-        this.keyspace = keyspace;
         this.migrationInfoCache = migrationInfoCache;
         this.versions = allVersions;
     }
@@ -86,7 +80,7 @@ public class UniqueValueSerializationStrategyProxyImpl implements UniqueValueSer
 
     @Override
     public UniqueValueSet load( final ApplicationScope applicationScope, final String type,
-                                final Collection<Field> fields ) throws ConnectionException {
+                                final Collection<Field> fields ) {
 
         final MigrationRelationship<UniqueValueSerializationStrategy> migration = getMigrationRelationShip();
 
@@ -100,7 +94,7 @@ public class UniqueValueSerializationStrategyProxyImpl implements UniqueValueSer
 
     @Override
     public UniqueValueSet load( final ApplicationScope applicationScope, final ConsistencyLevel consistencyLevel,
-                                final String type, final Collection<Field> fields ) throws ConnectionException {
+                                final String type, final Collection<Field> fields ) {
 
         final MigrationRelationship<UniqueValueSerializationStrategy> migration = getMigrationRelationShip();
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/6efb5bad/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
index 73df64a..6421869 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
@@ -26,17 +26,12 @@ import java.util.*;
 import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.ProtocolVersion;
 import com.datastax.driver.core.Session;
-import org.apache.cassandra.db.marshal.BytesType;
 
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
 import org.apache.usergrid.persistence.collection.serialization.impl.util.LegacyScopeUtils;
 import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.CassandraFig;
-import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;
-import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
-import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
-import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.Id;
@@ -44,7 +39,6 @@ import org.apache.usergrid.persistence.model.field.Field;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-import com.netflix.astyanax.Keyspace;
 
 
 /**
@@ -88,80 +82,40 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
             UNIQUE_VALUES_LOG_COLUMNS, TableDefinition.CacheOption.KEYS, UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
 
 
-    private static final CollectionScopedRowKeySerializer<Field> ROW_KEY_SER =
-        new CollectionScopedRowKeySerializer<>( UniqueFieldRowKeySerializer.get() );
-
-    private static final EntityVersionSerializer ENTITY_VERSION_SER = new EntityVersionSerializer();
-
-    private static final MultiTenantColumnFamily<ScopedRowKey<CollectionPrefixedKey<Field>>, EntityVersion>
-        CF_UNIQUE_VALUES = new MultiTenantColumnFamily<>( "Unique_Values", ROW_KEY_SER, ENTITY_VERSION_SER );
-
-
-    private static final IdRowCompositeSerializer ID_SER = IdRowCompositeSerializer.get();
-
-
-    private static final CollectionScopedRowKeySerializer<Id> ENTITY_ROW_KEY_SER =
-        new CollectionScopedRowKeySerializer<>( ID_SER );
-
-
-    private static final MultiTenantColumnFamily<ScopedRowKey<CollectionPrefixedKey<Id>>, UniqueFieldEntry>
-        CF_ENTITY_UNIQUE_VALUE_LOG =
-        new MultiTenantColumnFamily<>( "Entity_Unique_Values", ENTITY_ROW_KEY_SER, UniqueFieldEntrySerializer.get() );
-
 
     /**
      * Construct serialization strategy for keyspace.
      *
-     * @param keyspace Keyspace in which to store Unique Values.
      * @param cassandraFig The cassandra configuration
      * @param serializationFig The serialization configuration
      */
     @Inject
-    public UniqueValueSerializationStrategyV1Impl(final Keyspace keyspace, final CassandraFig cassandraFig,
-                                                  final SerializationFig serializationFig,
-                                                  final Session session,
-                                                  final CassandraConfig cassandraConfig) {
-        super( keyspace, cassandraFig, serializationFig, session, cassandraConfig );
+    public UniqueValueSerializationStrategyV1Impl( final CassandraFig cassandraFig,
+                                                   final SerializationFig serializationFig,
+                                                   final Session session,
+                                                   final CassandraConfig cassandraConfig) {
+        super( cassandraFig, serializationFig, session, cassandraConfig );
     }
 
 
     @Override
     public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
 
-        final MultiTenantColumnFamilyDefinition uniqueLookupCF =
-            new MultiTenantColumnFamilyDefinition( CF_UNIQUE_VALUES, BytesType.class.getSimpleName(),
-                ColumnTypes.DYNAMIC_COMPOSITE_TYPE, BytesType.class.getSimpleName(),
-                MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
-
-        final MultiTenantColumnFamilyDefinition uniqueLogCF =
-            new MultiTenantColumnFamilyDefinition( CF_ENTITY_UNIQUE_VALUE_LOG, BytesType.class.getSimpleName(),
-                ColumnTypes.DYNAMIC_COMPOSITE_TYPE, BytesType.class.getSimpleName(),
-                MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
-
-        //return Collections.emptyList();
+        return Collections.emptyList();
 
-        return Arrays.asList(uniqueLookupCF, uniqueLogCF);
     }
 
     @Override
     public Collection<TableDefinition> getTables() {
 
         final TableDefinition uniqueValues = getUniqueValuesTable();
-
         final TableDefinition uniqueValuesLog = getEntityUniqueLogTable();
 
-
-        //return Arrays.asList( uniqueValues, uniqueValuesLog );
-
-        return Collections.emptyList();
+        return Arrays.asList( uniqueValues, uniqueValuesLog );
 
     }
 
 
-    @Override
-    protected MultiTenantColumnFamily<ScopedRowKey<CollectionPrefixedKey<Field>>, EntityVersion> getUniqueValuesCF() {
-        return CF_UNIQUE_VALUES;
-    }
 
     @Override
     protected TableDefinition getUniqueValuesTable(){
@@ -171,13 +125,6 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
 
 
     @Override
-    protected MultiTenantColumnFamily<ScopedRowKey<CollectionPrefixedKey<Id>>, UniqueFieldEntry>
-    getEntityUniqueLogCF() {
-        return CF_ENTITY_UNIQUE_VALUE_LOG;
-    }
-
-
-    @Override
     protected TableDefinition getEntityUniqueLogTable(){
 
         return uniqueValuesLog;
@@ -463,24 +410,6 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
     }
 
 
-
-    @Override
-    protected CollectionPrefixedKey<Id> createEntityUniqueLogKey( final Id applicationId,
-                                                                  final Id uniqueValueId ) {
-
-
-        final String collectionName = LegacyScopeUtils.getCollectionScopeNameFromEntityType( uniqueValueId.getType() );
-
-
-        final CollectionPrefixedKey<Id> collectionPrefixedEntityKey =
-            new CollectionPrefixedKey<>( collectionName, applicationId, uniqueValueId );
-
-
-
-        return collectionPrefixedEntityKey;
-    }
-
-
     @Override
     public int getImplementationVersion() {
         return CollectionDataVersions.INITIAL.getVersion();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/6efb5bad/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
index 8e13f86..6ea5c1e 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
@@ -26,24 +26,17 @@ import java.util.*;
 import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.ProtocolVersion;
 import com.datastax.driver.core.Session;
-import org.apache.cassandra.db.marshal.BytesType;
 
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
 import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.CassandraFig;
-import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;
-import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
-import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
-import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
-import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-import com.netflix.astyanax.Keyspace;
 
 
 /**
@@ -84,78 +77,37 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
             UNIQUE_VALUES_LOG_COLUMNS, TableDefinition.CacheOption.KEYS, UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
 
 
-    private static final ScopedRowKeySerializer<TypeField>  ROW_KEY_SER = new ScopedRowKeySerializer<>( UniqueTypeFieldRowKeySerializer.get() );
-
-
-    private static final EntityVersionSerializer ENTITY_VERSION_SER = new EntityVersionSerializer();
-
-    private static final MultiTenantColumnFamily<ScopedRowKey<TypeField>, EntityVersion>
-        CF_UNIQUE_VALUES = new MultiTenantColumnFamily<>( "Unique_Values_V2", ROW_KEY_SER, ENTITY_VERSION_SER );
-
-
-    private static final IdRowCompositeSerializer ID_SER = IdRowCompositeSerializer.get();
-
-
-    private static final ScopedRowKeySerializer<Id> ENTITY_ROW_KEY_SER =
-        new ScopedRowKeySerializer<>( ID_SER );
-
-
-    private static final MultiTenantColumnFamily<ScopedRowKey<Id>, UniqueFieldEntry>
-        CF_ENTITY_UNIQUE_VALUE_LOG =
-        new MultiTenantColumnFamily<>( "Entity_Unique_Values_V2", ENTITY_ROW_KEY_SER, UniqueFieldEntrySerializer.get() );
-
-
     /**
      * Construct serialization strategy for keyspace.
      *
-     * @param keyspace Keyspace in which to store Unique Values.
      * @param cassandraFig The cassandra configuration
      * @param serializationFig The serialization configuration
+     *
      */
     @Inject
-    public UniqueValueSerializationStrategyV2Impl( final Keyspace keyspace, final CassandraFig cassandraFig,
+    public UniqueValueSerializationStrategyV2Impl( final CassandraFig cassandraFig,
                                                    final SerializationFig serializationFig,
                                                    final Session session,
                                                    final CassandraConfig cassandraConfig) {
-        super( keyspace, cassandraFig, serializationFig, session, cassandraConfig );
+        super( cassandraFig, serializationFig, session, cassandraConfig );
     }
 
 
     @Override
     public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
 
-        final MultiTenantColumnFamilyDefinition uniqueLookupCF =
-            new MultiTenantColumnFamilyDefinition( CF_UNIQUE_VALUES, BytesType.class.getSimpleName(),
-                ColumnTypes.DYNAMIC_COMPOSITE_TYPE, BytesType.class.getSimpleName(),
-                MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
-
-        final MultiTenantColumnFamilyDefinition uniqueLogCF =
-            new MultiTenantColumnFamilyDefinition( CF_ENTITY_UNIQUE_VALUE_LOG, BytesType.class.getSimpleName(),
-                ColumnTypes.DYNAMIC_COMPOSITE_TYPE, BytesType.class.getSimpleName(),
-                MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
-
         return Collections.emptyList();
 
-        //return Arrays.asList(uniqueLookupCF, uniqueLogCF);
     }
 
     @Override
     public Collection<TableDefinition> getTables() {
 
         final TableDefinition uniqueValues = getUniqueValuesTable();
-
         final TableDefinition uniqueValuesLog = getEntityUniqueLogTable();
 
-
         return Arrays.asList( uniqueValues, uniqueValuesLog );
 
-        //return Collections.emptyList();
-
-    }
-
-    @Override
-    protected MultiTenantColumnFamily<ScopedRowKey<TypeField>, EntityVersion> getUniqueValuesCF() {
-        return CF_UNIQUE_VALUES;
     }
 
 
@@ -166,13 +118,6 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
 
 
     @Override
-    protected MultiTenantColumnFamily<ScopedRowKey<Id>, UniqueFieldEntry>
-    getEntityUniqueLogCF() {
-        return CF_ENTITY_UNIQUE_VALUE_LOG;
-    }
-
-
-    @Override
     protected TableDefinition getEntityUniqueLogTable(){
         return uniqueValuesLog;
     }
@@ -454,12 +399,6 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
 
 
     @Override
-    protected Id createEntityUniqueLogKey( final Id applicationId, final Id uniqueValueId ) {
-       return uniqueValueId;
-    }
-
-
-    @Override
     public int getImplementationVersion() {
         return CollectionDataVersions.LOG_REMOVAL.getVersion();
     }


[36/38] usergrid git commit: Merge branch 'master' into datastax-cass-driver Fix issue with UniqueValueSerialization backwards compatibility via CQL and legacy Usergrid data.

Posted by mr...@apache.org.
Merge branch 'master' into datastax-cass-driver
Fix issue with UniqueValueSerialization backwards compatibility via CQL and legacy Usergrid data.


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

Branch: refs/heads/master
Commit: b23c20a28813522955f4c196e2fdd6e1638193ce
Parents: 324f94d 91abfd8
Author: Michael Russo <mr...@apigee.com>
Authored: Sun Jul 17 16:39:01 2016 -0700
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun Jul 17 16:39:01 2016 -0700

----------------------------------------------------------------------
 UsergridSDK.podspec                             |   18 +
 content/community/index.html                    |    3 +-
 content/index.html                              |    3 +-
 content/releases/index.html                     |    3 +-
 deployment/pcf/LICENSE                          |  201 ++
 deployment/pcf/README.md                        |   47 +-
 deployment/pcf/addBlobs.sh                      |   25 +
 deployment/pcf/apache-usergrid-tile-1.6.yml     |  510 ++++++
 deployment/pcf/config/blobs.yml                 |   19 +
 deployment/pcf/config/final.yml                 |   24 +
 deployment/pcf/content_migrations.yml           |   53 +
 deployment/pcf/createRelease.sh                 |   24 +
 deployment/pcf/createTile.sh                    |   32 +
 deployment/pcf/jobs/delete-all/monit            |   17 +
 deployment/pcf/jobs/delete-all/spec             |   44 +
 .../jobs/delete-all/templates/delete-all.sh.erb |  131 ++
 deployment/pcf/jobs/deploy-all/monit            |   18 +
 deployment/pcf/jobs/deploy-all/spec             |  145 ++
 .../jobs/deploy-all/templates/deploy-all.sh.erb |  384 ++++
 .../pcf/jobs/docker-bosh-cassandra_docker/monit |   23 +
 .../pcf/jobs/docker-bosh-cassandra_docker/spec  |   26 +
 .../docker-bosh-cassandra_docker.sh.erb         |   69 +
 .../jobs/docker-bosh-elasticsearch_docker/monit |   23 +
 .../jobs/docker-bosh-elasticsearch_docker/spec  |   26 +
 .../docker-bosh-elasticsearch_docker.sh.erb     |   69 +
 .../pcf/packages/cassandra_docker/packaging     |   26 +
 deployment/pcf/packages/cassandra_docker/spec   |   26 +
 deployment/pcf/packages/cf_cli/packaging        |   26 +
 deployment/pcf/packages/cf_cli/spec             |   25 +
 deployment/pcf/packages/common/packaging        |   23 +
 deployment/pcf/packages/common/spec             |   25 +
 .../pcf/packages/elasticsearch_docker/packaging |   26 +
 .../pcf/packages/elasticsearch_docker/spec      |   26 +
 deployment/pcf/packages/usergrid_app/packaging  |   27 +
 deployment/pcf/packages/usergrid_app/spec       |   27 +
 deployment/pcf/run.sh                           |   25 +
 deployment/pcf/src/common/utils.sh              |  107 ++
 deployment/pcf/src/templates/all_open.json      |    6 +
 deployment/pcf/src/usergrid_app/manifest.yml    |   22 +
 docs/data-storage/collections.md                |  144 ++
 docs/orgs-and-apps/application.md               |  104 ++
 sdks/java/README.md                             |  598 +++++-
 sdks/java/pom.xml                               |   73 +-
 .../org/apache/usergrid/java/client/Client.java | 1292 -------------
 .../apache/usergrid/java/client/Usergrid.java   |  285 +++
 .../usergrid/java/client/UsergridClient.java    |  427 +++++
 .../java/client/UsergridClientConfig.java       |   60 +
 .../usergrid/java/client/UsergridEnums.java     |  170 ++
 .../usergrid/java/client/UsergridRequest.java   |  205 +++
 .../java/client/UsergridRequestManager.java     |   86 +
 .../java/client/auth/UsergridAppAuth.java       |   55 +
 .../usergrid/java/client/auth/UsergridAuth.java |   75 +
 .../java/client/auth/UsergridUserAuth.java      |   56 +
 .../usergrid/java/client/entities/Activity.java |  625 -------
 .../usergrid/java/client/entities/Device.java   |   68 -
 .../usergrid/java/client/entities/Entity.java   |  191 --
 .../usergrid/java/client/entities/Group.java    |   79 -
 .../usergrid/java/client/entities/Message.java  |  148 --
 .../usergrid/java/client/entities/User.java     |  158 --
 .../java/client/exception/ClientException.java  |   41 -
 .../client/exception/UsergridException.java     |   50 +
 .../java/client/model/UsergridDevice.java       |   60 +
 .../java/client/model/UsergridEntity.java       |  487 +++++
 .../java/client/model/UsergridUser.java         |  198 ++
 .../java/client/query/UsergridQuery.java        |  434 +++++
 .../java/client/response/AggregateCounter.java  |   52 -
 .../client/response/AggregateCounterSet.java    |  111 --
 .../java/client/response/ApiResponse.java       |  421 -----
 .../client/response/ClientCredentialsInfo.java  |   58 -
 .../java/client/response/QueueInfo.java         |   44 -
 .../java/client/response/UsergridResponse.java  |  230 +++
 .../client/response/UsergridResponseError.java  |   98 +
 .../usergrid/java/client/utils/JsonUtils.java   |  262 ++-
 .../usergrid/java/client/utils/MapUtils.java    |   27 +-
 .../usergrid/java/client/utils/ObjectUtils.java |   28 +-
 .../usergrid/java/client/utils/UrlUtils.java    |  124 --
 .../utils/UsergridEntityDeserializer.java       |   41 +
 .../client/ClientAuthFallBackTestCase.java      |   72 +
 .../usergrid/client/ClientAuthTestCase.java     |   85 +
 .../client/ClientConnectionsTestCase.java       |  171 ++
 .../usergrid/client/ClientRestTestCase.java     |   90 +
 .../apache/usergrid/client/EntityTestCase.java  |  676 +++++++
 .../apache/usergrid/client/QueryTestCase.java   |  194 ++
 .../usergrid/client/SDKTestConfiguration.java   |   38 +
 .../apache/usergrid/client/SDKTestUtils.java    |  108 ++
 .../client/UsergridClientAuthTestCase.java      |   73 +
 .../usergrid/client/UsergridInitTestCase.java   |   48 +
 .../client/UsergridResponseErrorTestCase.java   |   62 +
 .../client/UsergridResponseTestCase.java        |   85 +
 .../usergrid/client/UsergridTestCase.java       |   30 +
 sdks/java/usergrid-java-client-2.1.0.jar        |  Bin 0 -> 1992232 bytes
 sdks/swift/README.md                            |    2 +-
 .../Source/Base.lproj/Main.storyboard           |   26 +-
 .../ActivityFeed/Source/FormTextField.swift     |    2 +-
 .../Source/MessageViewController.swift          |   26 +-
 .../Samples/Push/Source/UsergridManager.swift   |    2 +-
 sdks/swift/Source/Usergrid.swift                |   32 +-
 sdks/swift/Source/UsergridAsset.swift           |   18 +-
 sdks/swift/Source/UsergridAuth.swift            |    6 +-
 sdks/swift/Source/UsergridClient.swift          |   89 +-
 sdks/swift/Source/UsergridClientConfig.swift    |   14 +-
 sdks/swift/Source/UsergridDevice.swift          |   41 +-
 sdks/swift/Source/UsergridEntity.swift          |  104 +-
 sdks/swift/Source/UsergridEnums.swift           |   22 +-
 sdks/swift/Source/UsergridExtensions.swift      |   82 +-
 sdks/swift/Source/UsergridFileMetaData.swift    |    4 +-
 sdks/swift/Source/UsergridQuery.swift           |    3 +-
 sdks/swift/Source/UsergridRequest.swift         |    2 +-
 sdks/swift/Source/UsergridRequestManager.swift  |   72 +-
 sdks/swift/Source/UsergridResponse.swift        |    6 +-
 sdks/swift/Source/UsergridUser.swift            |   62 +-
 sdks/swift/Tests/ASSET_Tests.swift              |  218 ++-
 sdks/swift/Tests/AUTH_Tests.swift               |   92 +-
 sdks/swift/Tests/CONNECTION_Tests.swift         |   42 +-
 sdks/swift/Tests/ClientCreationTests.swift      |   44 +-
 sdks/swift/Tests/GET_Tests.swift                |   38 +-
 sdks/swift/Tests/PUT_Tests.swift                |   38 +-
 sdks/swift/Tests/TestAssets/UsergridGuy.jpg     |  Bin 0 -> 12981 bytes
 sdks/swift/Tests/User_Tests.swift               |  310 +++-
 sdks/swift/UsergridSDK.podspec                  |   18 -
 .../swift/UsergridSDK.xcodeproj/project.pbxproj |    4 +-
 sdks/swift/docs/Classes.html                    |   16 +-
 sdks/swift/docs/Classes/Usergrid.html           |  290 ++-
 sdks/swift/docs/Classes/UsergridAppAuth.html    |   30 +-
 sdks/swift/docs/Classes/UsergridAsset.html      |   44 +-
 .../Classes/UsergridAssetUploadRequest.html     |   20 +-
 sdks/swift/docs/Classes/UsergridAuth.html       |   34 +-
 sdks/swift/docs/Classes/UsergridClient.html     |  275 ++-
 .../docs/Classes/UsergridClientConfig.html      |   54 +-
 sdks/swift/docs/Classes/UsergridDevice.html     |  205 ++-
 sdks/swift/docs/Classes/UsergridEntity.html     |  215 ++-
 .../docs/Classes/UsergridFileMetaData.html      |   30 +-
 sdks/swift/docs/Classes/UsergridQuery.html      |  156 +-
 sdks/swift/docs/Classes/UsergridRequest.html    |   36 +-
 sdks/swift/docs/Classes/UsergridResponse.html   |   42 +-
 .../docs/Classes/UsergridResponseError.html     |   24 +-
 sdks/swift/docs/Classes/UsergridUser.html       |  231 ++-
 sdks/swift/docs/Classes/UsergridUserAuth.html   |   30 +-
 sdks/swift/docs/Enums.html                      |   28 +-
 sdks/swift/docs/Enums/UsergridAuthMode.html     |  283 +++
 .../docs/Enums/UsergridDeviceProperties.html    |   20 +-
 sdks/swift/docs/Enums/UsergridDirection.html    |   16 +-
 .../docs/Enums/UsergridEntityProperties.html    |   24 +-
 sdks/swift/docs/Enums/UsergridHttpMethod.html   |   16 +-
 .../docs/Enums/UsergridImageContentType.html    |   16 +-
 .../swift/docs/Enums/UsergridQueryOperator.html |   20 +-
 .../docs/Enums/UsergridQuerySortOrder.html      |   20 +-
 .../docs/Enums/UsergridUserProperties.html      |   20 +-
 sdks/swift/docs/Extensions.html                 |   72 +-
 sdks/swift/docs/Extensions/NSDate.html          |  448 +++++
 sdks/swift/docs/Global Variables.html           |   18 +-
 sdks/swift/docs/Typealiases.html                |   36 +-
 .../Contents/Resources/Documents/Classes.html   |  209 ++-
 .../Resources/Documents/Classes/Usergrid.html   | 1086 ++++++++---
 .../Documents/Classes/UsergridAppAuth.html      |  183 +-
 .../Documents/Classes/UsergridAsset.html        |  265 ++-
 .../Classes/UsergridAssetUploadRequest.html     |  356 ++++
 .../Documents/Classes/UsergridAuth.html         |  274 ++-
 .../Documents/Classes/UsergridClient.html       | 1310 +++++++++----
 .../Documents/Classes/UsergridClientConfig.html |  345 +++-
 .../Documents/Classes/UsergridDevice.html       |  519 +++++-
 .../Documents/Classes/UsergridEntity.html       |  809 +++++---
 .../Documents/Classes/UsergridFileMetaData.html |  217 ++-
 .../Documents/Classes/UsergridQuery.html        |  540 ++++--
 .../Documents/Classes/UsergridRequest.html      |  619 +++++++
 .../Documents/Classes/UsergridResponse.html     |  309 ++--
 .../Classes/UsergridResponseError.html          |  473 +++++
 .../Documents/Classes/UsergridUser.html         | 1734 ++++++++++++++++--
 .../Documents/Classes/UsergridUserAuth.html     |  169 +-
 .../Contents/Resources/Documents/Enums.html     |  115 +-
 .../Documents/Enums/UsergridAuthFallback.html   |   53 +-
 .../Documents/Enums/UsergridAuthMode.html       |  283 +++
 .../Enums/UsergridDeviceProperties.html         |   83 +-
 .../Documents/Enums/UsergridDirection.html      |   71 +-
 .../Enums/UsergridEntityProperties.html         |  101 +-
 .../Documents/Enums/UsergridHttpMethod.html     |  341 ++++
 .../Enums/UsergridImageContentType.html         |   73 +-
 .../Documents/Enums/UsergridQueryOperator.html  |   89 +-
 .../Documents/Enums/UsergridQuerySortOrder.html |   83 +-
 .../Documents/Enums/UsergridUserProperties.html |   95 +-
 .../Resources/Documents/Extensions.html         |   72 +-
 .../Resources/Documents/Extensions/NSDate.html  |  448 +++++
 .../Resources/Documents/Global Variables.html   |  210 +++
 .../Resources/Documents/Typealiases.html        |  159 +-
 .../Resources/Documents/css/highlight.css       |    6 +-
 .../Contents/Resources/Documents/css/jazzy.css  |   65 +-
 .../Contents/Resources/Documents/index.html     |  741 +++++++-
 .../Contents/Resources/Documents/js/jazzy.js    |   11 +-
 .../Resources/Documents/undocumented.txt        |   11 -
 .../.docset/Contents/Resources/docSet.dsidx     |  Bin 114688 -> 147456 bytes
 sdks/swift/docs/docsets/.tgz                    |  Bin 111866 -> 148251 bytes
 sdks/swift/docs/index.html                      |   24 +-
 .../main/resources/usergrid-default.properties  |   53 +-
 .../src/test/resources/usergrid-test.properties |   20 +-
 stack/core/pom.xml                              |   44 +-
 .../usergrid/corepersistence/CoreModule.java    |   67 +-
 .../corepersistence/CpEntityManager.java        |  407 ++--
 .../corepersistence/CpEntityManagerFactory.java |  295 ++-
 .../corepersistence/CpRelationManager.java      |  100 +-
 .../corepersistence/EntityManagerFig.java       |   11 +-
 .../asyncevents/AsyncEventService.java          |    6 +-
 .../asyncevents/AsyncEventServiceImpl.java      |   45 +-
 .../asyncevents/EventBuilder.java               |    6 +-
 .../asyncevents/EventBuilderImpl.java           |   53 +-
 .../model/DeIndexOldVersionsEvent.java          |   12 +-
 .../index/CollectionSettings.java               |   47 +
 .../index/CollectionSettingsCache.java          |   59 +
 .../index/CollectionSettingsCacheFig.java       |   39 +
 .../index/CollectionSettingsFactory.java        |   73 +
 .../index/CollectionSettingsImpl.java           |   92 +
 .../index/CollectionSettingsScope.java          |   27 +
 .../index/CollectionSettingsScopeImpl.java      |   73 +
 .../corepersistence/index/IndexSchemaCache.java |   50 -
 .../index/IndexSchemaCacheFactory.java          |   44 -
 .../index/IndexSchemaCacheFig.java              |   39 -
 .../index/IndexSchemaCacheImpl.java             |  120 --
 .../corepersistence/index/IndexService.java     |   23 +-
 .../corepersistence/index/IndexServiceImpl.java |  148 +-
 .../index/ReIndexServiceImpl.java               |   41 +-
 .../pipeline/cursor/CursorSerializerUtil.java   |    9 -
 .../pipeline/cursor/RequestCursor.java          |   29 +-
 .../read/search/CandidateEntityFilter.java      |   94 +-
 .../service/ApplicationServiceImpl.java         |   27 +-
 .../apache/usergrid/locking/LockManager.java    |    5 +
 .../locking/cassandra/AstyanaxLockImpl.java     |    2 +-
 .../cassandra/AstyanaxLockManagerImpl.java      |  113 +-
 .../locking/noop/NoOpLockManagerImpl.java       |    5 +
 .../usergrid/persistence/EntityManager.java     |   26 +-
 .../apache/usergrid/persistence/PathQuery.java  |    3 +-
 .../usergrid/persistence/RelationManager.java   |    2 +
 .../persistence/entities/Notification.java      |   38 +-
 .../index/AsyncIndexServiceTest.java            |    2 +-
 .../corepersistence/index/IndexServiceTest.java |   92 +-
 .../usergrid/corepersistence/index/RxTest.java  |   11 +
 .../usergrid/persistence/CoreSchemaManager.java |    8 +-
 .../apache/usergrid/persistence/IndexIT.java    |   98 +
 .../resources/usergrid-custom-test.properties   |   13 +
 .../test/resources/usergrid-test-context.xml    |    1 +
 stack/corepersistence/actorsystem/pom.xml       |  106 ++
 .../persistence/actorsystem/ActorSystemFig.java |   83 +
 .../actorsystem/ActorSystemManager.java         |   86 +
 .../actorsystem/ActorSystemManagerImpl.java     |  459 +++++
 .../actorsystem/ActorSystemModule.java          |   34 +
 .../persistence/actorsystem/ClientActor.java    |  205 +++
 .../actorsystem/GuiceActorProducer.java         |   46 +
 .../persistence/actorsystem/RouterProducer.java |   51 +
 .../src/main/resources/application.conf         |   50 +
 .../actorsystem/ActorServiceServiceTest.java    |   74 +
 .../usergrid/persistence/cache/CacheScope.java  |   24 +
 stack/corepersistence/collection/pom.xml        |  120 +-
 .../collection/EntityCollectionManager.java     |   21 +-
 .../EntityCollectionManagerFactory.java         |    4 +-
 .../persistence/collection/FieldSet.java        |   12 +
 .../exception/CollectionRuntimeException.java   |   11 +
 .../exception/WriteUniqueVerifyException.java   |    2 +-
 .../collection/guice/CollectionModule.java      |    9 +
 .../EntityCollectionManagerFactoryImpl.java     |  170 +-
 .../impl/EntityCollectionManagerImpl.java       |  205 ++-
 .../mvcc/stage/CollectionIoEvent.java           |   14 +-
 .../mvcc/stage/delete/MarkCommit.java           |   36 +-
 .../mvcc/stage/write/WriteCommit.java           |   87 +-
 .../mvcc/stage/write/WriteUniqueVerify.java     |  155 +-
 .../serialization/SerializationFig.java         |    1 +
 .../UniqueValueSerializationStrategy.java       |   24 +-
 .../serialization/impl/LogEntryIterator.java    |  128 ++
 .../serialization/impl/MutableFieldSet.java     |   12 +
 .../impl/UniqueFieldRowKeySerializer.java       |    3 +-
 .../UniqueValueSerializationStrategyImpl.java   |  267 ++-
 ...iqueValueSerializationStrategyProxyImpl.java |   20 +-
 .../UniqueValueSerializationStrategyV1Impl.java |   20 +-
 .../UniqueValueSerializationStrategyV2Impl.java |   22 +-
 .../uniquevalues/ReservationCache.java          |   87 +
 .../uniquevalues/ReservationCacheActor.java     |   87 +
 .../uniquevalues/UniqueValueActor.java          |  282 +++
 .../uniquevalues/UniqueValueException.java      |   33 +
 .../uniquevalues/UniqueValuesFig.java           |   67 +
 .../uniquevalues/UniqueValuesRouter.java        |   70 +
 .../uniquevalues/UniqueValuesService.java       |   74 +
 .../uniquevalues/UniqueValuesServiceImpl.java   |  372 ++++
 .../uniquevalues/UniqueValuesTable.java         |   42 +
 .../uniquevalues/UniqueValuesTableImpl.java     |  101 +
 .../collection/AbstractUniqueValueTest.java     |   50 +
 .../collection/EntityCollectionManagerIT.java   |  176 +-
 .../EntityCollectionManagerStressTest.java      |   21 +-
 .../collection/guice/TestCollectionModule.java  |   17 +
 .../mvcc/stage/delete/MarkCommitTest.java       |   12 +-
 .../mvcc/stage/write/WriteCommitTest.java       |   10 +-
 .../mvcc/stage/write/WriteUniqueVerifyIT.java   |  125 +-
 .../mvcc/stage/write/WriteUniqueVerifyTest.java |   58 +-
 ...niqueValueSerializationStrategyImplTest.java |  229 ++-
 .../UniqueValuesServiceDeleteTest.java          |  149 ++
 .../uniquevalues/UniqueValuesServiceTest.java   |  185 ++
 .../src/test/resources/usergrid-CHOP.properties |   18 +
 .../src/test/resources/usergrid-UNIT.properties |   19 +
 .../src/test/resources/usergrid.properties      |   32 +
 stack/corepersistence/common/pom.xml            |   21 +-
 .../usergrid/persistence/core/CassandraFig.java |   18 +-
 .../core/astyanax/CassandraCluster.java         |   24 +-
 .../core/guice/SettingsValidationCluster.java   |   18 +
 .../core/guice/MigrationManagerRule.java        |   18 +
 .../guice/SettingsValidationClusterTest.java    |   19 +
 .../src/test/resources/usergrid-UNIT.properties |   19 +
 .../src/test/resources/usergrid.properties      |   19 +
 .../graph/impl/GraphManagerImpl.java            |    4 +
 .../impl/shard/DirectedEdgeMeta.java            |    8 +-
 stack/corepersistence/model/pom.xml             |   16 +
 .../persistence/model/entity/EntityMap.java     |   18 +
 .../persistence/model/field/ArrayField.java     |    7 +
 .../persistence/model/field/ByteArrayField.java |    9 +
 .../persistence/model/field/DistanceField.java  |    9 +
 .../model/field/EntityObjectField.java          |    9 +
 .../persistence/model/field/FieldTypeName.java  |    3 -
 .../persistence/model/field/ListField.java      |    7 +
 .../persistence/model/field/LocationField.java  |    7 +
 .../persistence/model/field/NullField.java      |    7 +
 .../persistence/model/field/SetField.java       |    7 +
 .../model/field/value/EntityObject.java         |   15 +-
 .../persistence/model/util/EntityUtils.java     |   18 +
 .../persistence/model/util/UUIDGenerator.java   |   18 +
 .../persistence/model/field/EntityTest.java     |   18 +
 .../model/util/UUIDGeneratorTest.java           |   18 +
 stack/corepersistence/pom.xml                   |   72 +
 stack/corepersistence/queryindex/pom.xml        |   18 +-
 .../usergrid/persistence/index/EntityIndex.java |    5 +-
 .../usergrid/persistence/index/IndexFig.java    |    2 +-
 .../index/impl/EsEntityIndexFactoryImpl.java    |    2 +
 .../index/impl/EsEntityIndexImpl.java           |  117 +-
 .../persistence/index/impl/EntityIndexTest.java |   41 -
 stack/pom.xml                                   |   10 +-
 .../usergrid/rest/AbstractContextResource.java  |    1 +
 .../apache/usergrid/rest/ShutdownListener.java  |   11 +
 .../rest/applications/CollectionResource.java   |   97 +-
 .../rest/applications/ServiceResource.java      |    8 +-
 .../rest/applications/users/UserResource.java   |    9 +
 .../rest/applications/users/UsersResource.java  |    9 +
 ...ApplicationAlreadyExistsExceptionMapper.java |   32 +
 .../rest/management/ManagementResource.java     |    2 +-
 .../organizations/OrganizationsResource.java    |   18 +-
 .../rest/management/users/UserResource.java     |   25 +-
 .../rest/management/users/UsersResource.java    |   10 +-
 .../security/SecuredResourceFilterFactory.java  |   86 +-
 .../apache/usergrid/rest/NotificationsIT.java   |    6 +-
 .../org/apache/usergrid/rest/UniqueCatsIT.java  |  233 +++
 .../apache/usergrid/rest/UniqueValuesIT.java    |  224 +++
 .../rest/UniqueValuesPerformanceIT.java         |  165 ++
 .../rest/applications/ApplicationDeleteIT.java  |  115 +-
 .../applications/ApplicationResourceIT.java     |    7 +-
 .../usergrid/rest/applications/SecurityIT.java  |    1 -
 .../collection/CollectionsResourceIT.java       |  270 +--
 .../collection/devices/DevicesResourceIT.java   |    3 +-
 .../collection/users/PermissionsResourceIT.java |  129 +-
 .../queries/SelectMappingsQueryTest.java        |  168 ++
 .../usergrid/rest/management/AdminUsersIT.java  |   80 +
 .../rest/management/ManagementResourceIT.java   |    2 +-
 .../rest/management/OrganizationsIT.java        |    3 -
 .../resource/endpoints/CollectionEndpoint.java  |   24 +-
 .../test/resource/endpoints/NamedResource.java  |    8 +-
 .../resource/endpoints/mgmt/OrgResource.java    |    5 -
 .../resources/corepersistence-UNIT.properties   |    2 +
 .../resources/usergrid-custom-test.properties   |   19 +-
 .../resources/usergrid-rest-deploy-context.xml  |   33 +-
 .../test/resources/usergrid-test-context.xml    |    2 +-
 stack/services/pom.xml                          |    6 +
 .../cassandra/ManagementServiceImpl.java        |   33 +-
 .../usergrid/security/shiro/ShiroCache.java     |   70 +-
 .../principals/ApplicationUserPrincipal.java    |   13 +-
 .../security/shiro/utils/LocalShiroCache.java   |    2 +-
 .../services/AbstractCollectionService.java     |  118 +-
 .../services/AbstractConnectionsService.java    |   13 +-
 .../usergrid/services/AbstractService.java      |   53 +-
 .../usergrid/services/ServiceManager.java       |    8 +
 .../services/ServiceManagerFactory.java         |   12 +
 .../applications/ApplicationsService.java       |    4 +-
 .../services/devices/DevicesService.java        |    2 +
 .../ApplicationQueueManagerCache.java           |    2 +-
 .../impl/ApplicationQueueManagerImpl.java       |   52 +-
 .../resources/usergrid-services-context.xml     |    2 +-
 .../usergrid/services/ServiceInvocationIT.java  |   28 +-
 .../AbstractServiceNotificationIT.java          |   26 +-
 .../test/resources/usergrid-test-context.xml    |    1 +
 stack/tools/pom.xml                             |    1 +
 .../java/org/apache/usergrid/tools/Cli.java     |    2 +-
 .../org/apache/usergrid/tools/EntityUpdate.java |    3 +-
 .../org/apache/usergrid/tools/ExportApp.java    |    2 +-
 .../java/org/apache/usergrid/tools/Import.java  |   10 +-
 .../org/apache/usergrid/tools/ToolBase.java     |   79 +-
 .../usergrid/tools/UniqueValueScanner.java      |  298 +++
 .../main/resources/toolsApplicationContext.xml  |    7 +
 website/README.md                               |    2 +-
 website/layouts/footer.html                     |    3 +-
 390 files changed, 30666 insertions(+), 8553 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/config/src/main/resources/usergrid-default.properties
----------------------------------------------------------------------
diff --cc stack/config/src/main/resources/usergrid-default.properties
index 7c12783,95b3e9b..e356efc
--- a/stack/config/src/main/resources/usergrid-default.properties
+++ b/stack/config/src/main/resources/usergrid-default.properties
@@@ -59,7 -59,7 +59,7 @@@ usergrid.persistence=C
  
  # Set a property to tell Usergrid which version of cassandra is being used.
  #
- #cassandra.version=2.1
 -#cassandra.version=1.2
++cassandra.version=2.1
  
  
  # Set the Cassandra cluster name that this instance of Usergrid should use.

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/core/pom.xml
----------------------------------------------------------------------
diff --cc stack/core/pom.xml
index 4b2252e,6c70342..9f2dc88
--- a/stack/core/pom.xml
+++ b/stack/core/pom.xml
@@@ -128,9 -130,9 +130,13 @@@
                      <groupId>org.antlr</groupId>
                  </exclusion>
                  <exclusion>
 +                    <groupId>net.jpountz.lz4</groupId>
 +                    <artifactId>*</artifactId>
 +                </exclusion>
++                <exclusion>
+                     <artifactId>netty</artifactId>
+                     <groupId>io.netty</groupId>
+                 </exclusion>
              </exclusions>
          </dependency>
  
@@@ -362,9 -366,9 +370,7 @@@
          <dependency>
              <groupId>org.apache.usergrid</groupId>
              <artifactId>common</artifactId>
-             <version>2.2.0-SNAPSHOT</version>
-             <type>test-jar</type>
-             <scope>test</scope>
+             <version>${project.version}</version>
 -            <type>test-jar</type>
 -            <scope>test</scope>
          </dependency>
  
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/core/src/main/java/org/apache/usergrid/locking/cassandra/AstyanaxLockManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/RxTest.java
----------------------------------------------------------------------
diff --cc stack/core/src/test/java/org/apache/usergrid/corepersistence/index/RxTest.java
index f44c028,f44c028..f7d52d6
--- a/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/RxTest.java
+++ b/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/RxTest.java
@@@ -163,6 -163,6 +163,17 @@@ public class RxTest 
  
      }
  
++    @Test
++    public void someTest(){
++
++
++        final String uuidtype = "UUIDType";
++        final String utf8type = "UTF8Type";
++
++        assertEquals(uuidtype.length(), utf8type.length());
++
++    }
++
      private List<StreamResult> callStream (final List<Integer> input){
  
          Stream<StreamResult> results = input.stream().map(integer -> {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/core/src/test/resources/usergrid-custom-test.properties
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java
index 71e56f5,fcaa51d..9f74927
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java
@@@ -21,12 -19,16 +19,18 @@@
  package org.apache.usergrid.persistence.collection.impl;
  
  
- import java.util.concurrent.ExecutionException;
 +
 +import com.datastax.driver.core.Session;
+ import com.google.common.base.Preconditions;
+ import com.google.common.cache.CacheBuilder;
+ import com.google.common.cache.CacheLoader;
+ import com.google.common.cache.LoadingCache;
+ import com.google.inject.Inject;
+ import com.google.inject.Singleton;
+ import com.netflix.astyanax.Keyspace;
+ import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
  import org.apache.usergrid.persistence.collection.EntityCollectionManager;
  import org.apache.usergrid.persistence.collection.EntityCollectionManagerFactory;
- import org.apache.usergrid.persistence.collection.cache.EntityCacheFig;
  import org.apache.usergrid.persistence.collection.mvcc.stage.delete.MarkCommit;
  import org.apache.usergrid.persistence.collection.mvcc.stage.delete.MarkStart;
  import org.apache.usergrid.persistence.collection.mvcc.stage.delete.UniqueCleanup;
@@@ -41,6 -39,8 +41,8 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
  import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
  import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
+ import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValuesService;
 -import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
++import org.apache.usergrid.persistence.core.CassandraConfig;
  import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
  import org.apache.usergrid.persistence.core.rx.RxTaskScheduler;
  import org.apache.usergrid.persistence.core.scope.ApplicationScope;
@@@ -76,22 -69,42 +71,44 @@@ public class EntityCollectionManagerFac
      private final UniqueValueSerializationStrategy uniqueValueSerializationStrategy;
      private final MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy;
      private final Keyspace keyspace;
 +    private final Session session;
      private final MetricsFactory metricsFactory;
      private final RxTaskScheduler rxTaskScheduler;
+     private final ActorSystemManager actorSystemManager;
+     private final UniqueValuesService uniqueValuesService;
+ 
+     private final CassandraConfig cassandraConfig;
  
      private LoadingCache<ApplicationScope, EntityCollectionManager> ecmCache =
          CacheBuilder.newBuilder().maximumSize( 1000 )
                      .build( new CacheLoader<ApplicationScope, EntityCollectionManager>() {
                          public EntityCollectionManager load( ApplicationScope scope ) {
-                                   //create the target EM that will perform logic
+                             //create the target EM that will perform logic
                              final EntityCollectionManager target = new EntityCollectionManagerImpl(
-                                 writeStart, writeVerifyUnique,
-                                 writeOptimisticVerify, writeCommit, rollback, markStart, markCommit,  uniqueCleanup, versionCompact,
-                                 entitySerializationStrategy, uniqueValueSerializationStrategy,
-                                 mvccLogEntrySerializationStrategy, keyspace,
-                                 metricsFactory, serializationFig,
-                                 rxTaskScheduler, scope, session );
+ 
+                                 writeStart,
+                                 writeVerifyUnique,
+                                 writeOptimisticVerify,
+                                 writeCommit,
+                                 rollback,
+                                 markStart,
+                                 markCommit,
+                                 uniqueCleanup,
+                                 versionCompact,
+ 
+                                 entitySerializationStrategy,
+                                 uniqueValueSerializationStrategy,
+                                 mvccLogEntrySerializationStrategy,
+ 
+                                 keyspace,
+                                 metricsFactory,
+                                 serializationFig,
+                                 rxTaskScheduler,
+                                 actorSystemManager,
+                                 uniqueValuesService,
+                                 cassandraConfig,
 -                                scope );
++                                scope,
++                                session);
  
                              return target;
                          }
@@@ -99,38 -112,49 +116,52 @@@
  
  
      @Inject
-     public EntityCollectionManagerFactoryImpl( final WriteStart writeStart, final WriteUniqueVerify writeVerifyUnique,
-                                                final WriteOptimisticVerify writeOptimisticVerify,
-                                                final WriteCommit writeCommit, final RollbackAction rollback,
-                                                final MarkStart markStart, final MarkCommit markCommit,
-                                                final UniqueCleanup uniqueCleanup, final VersionCompact versionCompact,
-                                                final SerializationFig serializationFig, final
-                                                    MvccEntitySerializationStrategy entitySerializationStrategy,
-                                                final UniqueValueSerializationStrategy uniqueValueSerializationStrategy,
-                                                final MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy,
-                                                final Keyspace keyspace, final EntityCacheFig entityCacheFig,
-                                                final MetricsFactory metricsFactory,
-                                                @CollectionExecutorScheduler  final RxTaskScheduler rxTaskScheduler,
-                                                final Session session ) {
- 
-         this.writeStart = writeStart;
-         this.writeVerifyUnique = writeVerifyUnique;
-         this.writeOptimisticVerify = writeOptimisticVerify;
-         this.writeCommit = writeCommit;
-         this.rollback = rollback;
-         this.markStart = markStart;
-         this.markCommit = markCommit;
-         this.uniqueCleanup = uniqueCleanup;
-         this.versionCompact = versionCompact;
-         this.serializationFig = serializationFig;
-         this.entitySerializationStrategy = entitySerializationStrategy;
-         this.uniqueValueSerializationStrategy = uniqueValueSerializationStrategy;
+     public EntityCollectionManagerFactoryImpl(
+             final WriteStart            writeStart,
+             final WriteUniqueVerify     writeVerifyUnique,
+             final WriteOptimisticVerify writeOptimisticVerify,
+             final WriteCommit           writeCommit,
+             final RollbackAction        rollback,
+             final MarkStart             markStart,
+             final MarkCommit            markCommit,
+             final UniqueCleanup         uniqueCleanup,
+             final VersionCompact        versionCompact,
+             final SerializationFig      serializationFig,
+             final MvccEntitySerializationStrategy   entitySerializationStrategy,
+             final UniqueValueSerializationStrategy  uniqueValueSerializationStrategy,
+             final MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy,
+             final Keyspace              keyspace,
+             final MetricsFactory        metricsFactory,
+             @CollectionExecutorScheduler
+             final RxTaskScheduler       rxTaskScheduler,
+             final ActorSystemManager    actorSystemManager,
+             final UniqueValuesService   uniqueValuesService,
 -            final CassandraConfig       cassandraConfig ) {
++            final CassandraConfig       cassandraConfig,
++            final Session session ) {
+ 
+         this.writeStart =               writeStart;
+         this.writeVerifyUnique =        writeVerifyUnique;
+         this.writeOptimisticVerify =    writeOptimisticVerify;
+         this.writeCommit =              writeCommit;
+         this.rollback =                 rollback;
+         this.markStart =                markStart;
+         this.markCommit =               markCommit;
+         this.uniqueCleanup =            uniqueCleanup;
+         this.versionCompact =           versionCompact;
+         this.serializationFig =         serializationFig;
+         this.entitySerializationStrategy =       entitySerializationStrategy;
+         this.uniqueValueSerializationStrategy =  uniqueValueSerializationStrategy;
          this.mvccLogEntrySerializationStrategy = mvccLogEntrySerializationStrategy;
-         this.keyspace = keyspace;
-         this.metricsFactory = metricsFactory;
-         this.rxTaskScheduler = rxTaskScheduler;
+         this.keyspace =                 keyspace;
+         this.metricsFactory =           metricsFactory;
+         this.rxTaskScheduler =          rxTaskScheduler;
+         this.actorSystemManager =       actorSystemManager;
+         this.uniqueValuesService =      uniqueValuesService;
+         this.cassandraConfig =          cassandraConfig;
 +        this.session = session;
++
      }
+ 
      @Override
      public EntityCollectionManager createCollectionManager(ApplicationScope applicationScope) {
          Preconditions.checkNotNull(applicationScope);

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
index 291e5df,9dce7ef..a61e744
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
@@@ -19,43 -19,32 +19,35 @@@
  package org.apache.usergrid.persistence.collection.impl;
  
  
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.Iterator;
- import java.util.List;
- import java.util.UUID;
 +
 +import com.datastax.driver.core.BatchStatement;
 +import com.datastax.driver.core.Session;
+ import com.codahale.metrics.Timer;
+ import com.google.common.base.Preconditions;
+ import com.google.inject.Inject;
+ import com.google.inject.assistedinject.Assisted;
+ import com.netflix.astyanax.Keyspace;
+ import com.netflix.astyanax.MutationBatch;
+ import com.netflix.astyanax.connectionpool.OperationResult;
+ import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+ import com.netflix.astyanax.model.ColumnFamily;
  import com.netflix.astyanax.model.ConsistencyLevel;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- 
- import org.apache.usergrid.persistence.collection.EntityCollectionManager;
- import org.apache.usergrid.persistence.collection.EntitySet;
- import org.apache.usergrid.persistence.collection.FieldSet;
- import org.apache.usergrid.persistence.collection.MvccEntity;
- import org.apache.usergrid.persistence.collection.MvccLogEntry;
- import org.apache.usergrid.persistence.collection.VersionSet;
+ import com.netflix.astyanax.model.CqlResult;
+ import com.netflix.astyanax.serializers.StringSerializer;
+ import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
+ import org.apache.usergrid.persistence.collection.*;
  import org.apache.usergrid.persistence.collection.mvcc.stage.CollectionIoEvent;
  import org.apache.usergrid.persistence.collection.mvcc.stage.delete.MarkCommit;
  import org.apache.usergrid.persistence.collection.mvcc.stage.delete.MarkStart;
  import org.apache.usergrid.persistence.collection.mvcc.stage.delete.UniqueCleanup;
  import org.apache.usergrid.persistence.collection.mvcc.stage.delete.VersionCompact;
- import org.apache.usergrid.persistence.collection.mvcc.stage.write.RollbackAction;
- import org.apache.usergrid.persistence.collection.mvcc.stage.write.WriteCommit;
- import org.apache.usergrid.persistence.collection.mvcc.stage.write.WriteOptimisticVerify;
- import org.apache.usergrid.persistence.collection.mvcc.stage.write.WriteStart;
- import org.apache.usergrid.persistence.collection.mvcc.stage.write.WriteUniqueVerify;
- import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
- import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
- import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
- import org.apache.usergrid.persistence.collection.serialization.UniqueValue;
- import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
- import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
+ import org.apache.usergrid.persistence.collection.mvcc.stage.write.*;
+ import org.apache.usergrid.persistence.collection.serialization.*;
+ import org.apache.usergrid.persistence.collection.serialization.impl.LogEntryIterator;
  import org.apache.usergrid.persistence.collection.serialization.impl.MinMaxLogEntryIterator;
  import org.apache.usergrid.persistence.collection.serialization.impl.MutableFieldSet;
+ import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValuesService;
 -import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
++import org.apache.usergrid.persistence.core.CassandraConfig;
  import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
  import org.apache.usergrid.persistence.core.metrics.ObservableTimer;
  import org.apache.usergrid.persistence.core.rx.ObservableIterator;
@@@ -67,20 -56,12 +59,12 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.model.entity.Id;
  import org.apache.usergrid.persistence.model.field.Field;
  import org.apache.usergrid.persistence.model.util.UUIDGenerator;
- 
- import com.codahale.metrics.Timer;
- import com.google.common.base.Preconditions;
- import com.google.inject.Inject;
- import com.google.inject.assistedinject.Assisted;
- import com.netflix.astyanax.Keyspace;
- import com.netflix.astyanax.connectionpool.OperationResult;
- import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
- import com.netflix.astyanax.model.ColumnFamily;
- import com.netflix.astyanax.model.CqlResult;
- import com.netflix.astyanax.serializers.StringSerializer;
- 
 -import org.slf4j.Logger;
 -import org.slf4j.LoggerFactory;
  import rx.Observable;
  import rx.Subscriber;
++import org.slf4j.Logger;
++import org.slf4j.LoggerFactory;
+ 
+ import java.util.*;
  
  
  /**
@@@ -124,20 -105,35 +109,36 @@@ public class EntityCollectionManagerImp
      private final ApplicationScope applicationScope;
      private final RxTaskScheduler rxTaskScheduler;
  
+     private final UniqueValuesService uniqueValuesService;
+     private final ActorSystemManager actorSystemManager;
+ 
  
      @Inject
-     public EntityCollectionManagerImpl( final WriteStart writeStart, final WriteUniqueVerify writeVerifyUnique,
-                                         final WriteOptimisticVerify writeOptimisticVerify,
-                                         final WriteCommit writeCommit, final RollbackAction rollback,
-                                         final MarkStart markStart, final MarkCommit markCommit,
-                                         final UniqueCleanup uniqueCleanup, final VersionCompact versionCompact,
-                                         final MvccEntitySerializationStrategy entitySerializationStrategy,
-                                         final UniqueValueSerializationStrategy uniqueValueSerializationStrategy,
-                                         final MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy,
-                                         final Keyspace keyspace, final MetricsFactory metricsFactory,
-                                         final SerializationFig serializationFig, final RxTaskScheduler rxTaskScheduler,
-                                         @Assisted final ApplicationScope applicationScope,
-                                         final Session session) {
+     public EntityCollectionManagerImpl(
+         final WriteStart            writeStart,
+         final WriteUniqueVerify     writeVerifyUnique,
+         final WriteOptimisticVerify writeOptimisticVerify,
+         final WriteCommit           writeCommit,
+         final RollbackAction        rollback,
+         final MarkStart             markStart,
+         final MarkCommit            markCommit,
+         final UniqueCleanup         uniqueCleanup,
+         final VersionCompact        versionCompact,
+ 
+         final MvccEntitySerializationStrategy   entitySerializationStrategy,
+         final UniqueValueSerializationStrategy  uniqueValueSerializationStrategy,
+         final MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy,
+ 
+         final Keyspace              keyspace,
+         final MetricsFactory        metricsFactory,
+         final SerializationFig      serializationFig,
+         final RxTaskScheduler       rxTaskScheduler,
+         final ActorSystemManager    actorSystemManager,
+         final UniqueValuesService   uniqueValuesService,
+         final CassandraConfig       cassandraConfig,
 -        @Assisted final ApplicationScope applicationScope ) {
++        @Assisted final ApplicationScope applicationScope,
++        final Session session ) {
+ 
          this.uniqueValueSerializationStrategy = uniqueValueSerializationStrategy;
          this.entitySerializationStrategy = entitySerializationStrategy;
          this.uniqueCleanup = uniqueCleanup;
@@@ -311,65 -328,105 +330,106 @@@
       * Retrieves all entities that correspond to each field given in the Collection.
       */
      @Override
-     public Observable<FieldSet> getEntitiesFromFields( final String type, final Collection<Field> fields ) {
+     public Observable<FieldSet> getEntitiesFromFields(final String type, final Collection<Field> fields,
+                                                       boolean uniqueIndexRepair) {
          final Observable<FieldSet> fieldSetObservable = Observable.just( fields ).map( fields1 -> {
 -            try {
  
 -                final UUID startTime = UUIDGenerator.newTimeUUID();
 +            final UUID startTime = UUIDGenerator.newTimeUUID();
  
-             //Get back set of unique values that correspond to collection of fields
-             UniqueValueSet set = uniqueValueSerializationStrategy.load( applicationScope, type, fields1 );
+                 //Get back set of unique values that correspond to collection of fields
+                 //Purposely use string consistency as it's extremely important here, regardless of performance
+                 UniqueValueSet set =
+                     uniqueValueSerializationStrategy
 -                        .load( applicationScope, cassandraConfig.getConsistentReadCL(), type, fields1 , uniqueIndexRepair);
++                        .load( applicationScope, cassandraConfig.getDataStaxReadConsistentCl(), type, fields1 , uniqueIndexRepair);
+ 
+                 //Short circuit if we don't have any uniqueValues from the given fields.
+                 if ( !set.iterator().hasNext() ) {
+ 
+                     fields1.forEach( field -> {
+ 
+                         if(logger.isTraceEnabled()){
+                             logger.trace("Requested field [{}={}] not found in unique value table",
+                                 field.getName(), field.getValue().toString());
+                         }
+ 
+                     });
+ 
+                     if(logger.isTraceEnabled()) {
+                         logger.trace("No unique values found for requested fields, returning empty FieldSet");
+                     }
+ 
+                     return new MutableFieldSet( 0 );
+                 }
  
 +            //Short circuit if we don't have any uniqueValues from the given fields.
 +            if ( !set.iterator().hasNext() ) {
 +                return new MutableFieldSet( 0 );
 +            }
  
 -                //loop through each field, and construct an entity load
 -                List<Id> entityIds = new ArrayList<>( fields1.size() );
 -                List<UniqueValue> uniqueValues = new ArrayList<>( fields1.size() );
  
 -                for ( final Field expectedField : fields1 ) {
 +            //loop through each field, and construct an entity load
 +            List<Id> entityIds = new ArrayList<>( fields1.size() );
 +            List<UniqueValue> uniqueValues = new ArrayList<>( fields1.size() );
  
 -                    UniqueValue value = set.getValue( expectedField.getName() );
 +            for ( final Field expectedField : fields1 ) {
  
 -                    if ( value == null ) {
 -                        logger.debug( "Field does not correspond to a unique value" );
 -                    }
 +                UniqueValue value = set.getValue( expectedField.getName() );
  
 -                    entityIds.add( value.getEntityId() );
 -                    uniqueValues.add( value );
 +                if ( value == null ) {
 +                    logger.debug( "Field does not correspond to a unique value" );
                  }
  
 -                //Load a entity for each entityId we retrieved.
 -                final EntitySet entitySet = entitySerializationStrategy.load( applicationScope, entityIds, startTime );
 +                entityIds.add( value.getEntityId() );
 +                uniqueValues.add( value );
 +            }
  
 -                //now loop through and ensure the entities are there.
 -                final MutationBatch deleteBatch = keyspace.prepareMutationBatch();
 +            //Load a entity for each entityId we retrieved.
 +            final EntitySet entitySet = entitySerializationStrategy.load( applicationScope, entityIds, startTime );
  
 -                final MutableFieldSet response = new MutableFieldSet( fields1.size() );
 +            final BatchStatement uniqueDeleteBatch = new BatchStatement();
  
 -                for ( final UniqueValue expectedUnique : uniqueValues ) {
 -                    final MvccEntity entity = entitySet.getEntity( expectedUnique.getEntityId() );
+ 
 -                    //bad unique value, delete this, it's inconsistent
 -                    if ( entity == null || !entity.getEntity().isPresent() ) {
 +            final MutableFieldSet response = new MutableFieldSet( fields1.size() );
  
 -                        if(logger.isTraceEnabled()) {
 -                            logger.trace("Unique value [{}={}] does not have corresponding entity [{}], executing " +
 -                                "read repair to remove stale unique value entry",
 -                                expectedUnique.getField().getName(),
 -                                expectedUnique.getField().getValue().toString(),
 -                                expectedUnique.getEntityId()
 -                            );
 -                        }
 +            for ( final UniqueValue expectedUnique : uniqueValues ) {
 +                final MvccEntity entity = entitySet.getEntity( expectedUnique.getEntityId() );
  
 -                        final MutationBatch valueDelete =
 -                            uniqueValueSerializationStrategy.delete( applicationScope, expectedUnique );
 +                //bad unique value, delete this, it's inconsistent
 +                if ( entity == null || !entity.getEntity().isPresent() ) {
+ 
 -                        deleteBatch.mergeShallow( valueDelete );
 -                        continue;
++                    if(logger.isTraceEnabled()) {
++                        logger.trace("Unique value [{}={}] does not have corresponding entity [{}], executing " +
++                                "read repair to remove stale unique value entry",
++                            expectedUnique.getField().getName(),
++                            expectedUnique.getField().getValue().toString(),
++                            expectedUnique.getEntityId()
++                        );
+                     }
+ 
 -                    //TODO, we need to validate the property in the entity matches the property in the unique value
 -
 -
 -                    //else add it to our result set
 -                    response.addEntity( expectedUnique.getField(), entity );
 +                    uniqueDeleteBatch.add(
 +                        uniqueValueSerializationStrategy.deleteCQL( applicationScope, expectedUnique ));
 +                    continue;
                  }
  
 -                if ( deleteBatch.getRowCount() > 0 ) {
 +                //TODO, we need to validate the property in the entity matches the property in the unique value
  
 -                    response.setEntityRepairExecuted(true);
 -                    deleteBatch.execute();
  
 -                }
+ 
 -                return response;
 +                //else add it to our result set
 +                response.addEntity( expectedUnique.getField(), entity );
              }
 -            catch ( ConnectionException e ) {
 -                logger.error( "Failed to getIdField", e );
 -                throw new RuntimeException( e );
 +
-             //TODO: explore making this an Async process
-             session.execute(uniqueDeleteBatch);
++
++            if ( uniqueDeleteBatch.getStatements().size() > 0 ) {
++
++                response.setEntityRepairExecuted(true);
++                //TODO: explore making this an Async process
++                session.execute(uniqueDeleteBatch);
+             }
++
 +
 +            return response;
 +
          } );
  
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommit.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommit.java
index cfac8e4,5b98ca5..fc1382f
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommit.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommit.java
@@@ -18,10 -18,15 +18,20 @@@
  package org.apache.usergrid.persistence.collection.mvcc.stage.write;
  
  
+ import java.util.HashMap;
+ import java.util.Map;
  import java.util.UUID;
  
++
 +import com.datastax.driver.core.BatchStatement;
 +import com.datastax.driver.core.Session;
++
+ import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+ import org.apache.usergrid.persistence.collection.exception.WriteUniqueVerifyException;
+ import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValueException;
+ import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValuesFig;
+ import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValuesService;
++
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
@@@ -76,7 -83,9 +90,11 @@@ public class WriteCommit implements Fun
      public WriteCommit( final MvccLogEntrySerializationStrategy logStrat,
                          final MvccEntitySerializationStrategy entryStrat,
                          final UniqueValueSerializationStrategy uniqueValueStrat,
-                         final Session session) {
+                         final ActorSystemFig actorSystemFig,
+                         final UniqueValuesFig uniqueValuesFig,
 -                        final UniqueValuesService akkaUvService ) {
++                        final UniqueValuesService akkaUvService,
++                        final Session session ) {
++
  
          Preconditions.checkNotNull( logStrat, "MvccLogEntrySerializationStrategy is required" );
          Preconditions.checkNotNull( entryStrat, "MvccEntitySerializationStrategy is required" );
@@@ -85,7 -94,9 +103,11 @@@
          this.logEntryStrat = logStrat;
          this.entityStrat = entryStrat;
          this.uniqueValueStrat = uniqueValueStrat;
+         this.actorSystemFig = actorSystemFig;
+         this.uniqueValuesFig = uniqueValuesFig;
+         this.akkaUvService = akkaUvService;
 +        this.session = session;
++
      }
  
  
@@@ -107,10 -122,9 +133,11 @@@
          MvccValidationUtils.verifyMvccEntityWithEntity( ioEvent.getEvent() );
          ValidationUtils.verifyTimeUuid( version ,"version" );
  
-         final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, Stage.COMMITTED, MvccLogEntry.State.COMPLETE );
+         final MvccLogEntry startEntry =
+             new MvccLogEntryImpl( entityId, version, Stage.COMMITTED, MvccLogEntry.State.COMPLETE );
  
 +
 +
          MutationBatch logMutation = logEntryStrat.write( applicationScope, startEntry );
  
          // now get our actual insert into the entity data
@@@ -119,15 -133,44 +146,46 @@@
          // merge the 2 into 1 mutation
          logMutation.mergeShallow( entityMutation );
  
+         // akkaFig may be null when this is called from JUnit tests
+         if ( actorSystemFig != null && actorSystemFig.getEnabled() ) {
+             String region = ioEvent.getRegion();
+             if ( region == null ) {
+                 region = uniqueValuesFig.getAuthoritativeRegion();
+             }
+             if ( region == null ) {
+                 region = actorSystemFig.getRegionLocal();
+             }
+             confirmUniqueFieldsAkka( mvccEntity, version, applicationScope, region );
+         } else {
+             confirmUniqueFields( mvccEntity, version, applicationScope, logMutation );
+         }
+ 
+         try {
+             logMutation.execute();
+         }
+         catch ( ConnectionException e ) {
+             logger.error( "Failed to execute write asynchronously ", e );
+             throw new WriteCommitException( mvccEntity, applicationScope,
+                 "Failed to execute write asynchronously ", e );
+         }
+ 
+         return ioEvent;
+     }
+ 
+ 
+     private void confirmUniqueFields(
+         MvccEntity mvccEntity, UUID version, ApplicationScope scope, MutationBatch logMutation) {
+ 
+         final Entity entity = mvccEntity.getEntity().get();
+ 
          // re-write the unique values but this time with no TTL
 +        final BatchStatement uniqueBatch = new BatchStatement();
 +
          for ( Field field : EntityUtils.getUniqueFields(mvccEntity.getEntity().get()) ) {
  
-                 UniqueValue written  = new UniqueValueImpl( field,
-                     entityId,version);
+                 UniqueValue written  = new UniqueValueImpl( field, entity.getId(), version);
  
-                 uniqueBatch.add(uniqueValueStrat.writeCQL(applicationScope,  written, -1 ));
 -                MutationBatch mb = uniqueValueStrat.write(scope,  written );
++                uniqueBatch.add(uniqueValueStrat.writeCQL(scope,  written, -1 ));
  
                  logger.debug("Finalizing {} unique value {}", field.getName(), field.getValue().toString());
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
index 5e99a05,a3565ea..e7dbb10
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
@@@ -18,18 -18,18 +18,22 @@@
  package org.apache.usergrid.persistence.collection.mvcc.stage.write;
  
  
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
 +
 +import com.datastax.driver.core.BatchStatement;
 +import com.datastax.driver.core.ConsistencyLevel;
 +import com.datastax.driver.core.Session;
 +import com.netflix.hystrix.HystrixCommandProperties;
 +import org.slf4j.Logger;
 +import org.slf4j.LoggerFactory;
 +
+ import com.google.common.base.Preconditions;
+ import com.google.inject.Inject;
+ import com.google.inject.Singleton;
+ import com.netflix.astyanax.Keyspace;
 -import com.netflix.astyanax.MutationBatch;
 -import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
 -import com.netflix.astyanax.model.ConsistencyLevel;
+ import com.netflix.hystrix.HystrixCommand;
+ import com.netflix.hystrix.HystrixCommandGroupKey;
 -import com.netflix.hystrix.HystrixCommandProperties;
+ import com.netflix.hystrix.HystrixThreadPoolProperties;
+ import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
  import org.apache.usergrid.persistence.collection.MvccEntity;
  import org.apache.usergrid.persistence.collection.exception.WriteUniqueVerifyException;
  import org.apache.usergrid.persistence.collection.mvcc.entity.MvccValidationUtils;
@@@ -39,24 -39,21 +43,20 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
  import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
  import org.apache.usergrid.persistence.collection.serialization.impl.UniqueValueImpl;
 +import org.apache.usergrid.persistence.core.CassandraConfig;
+ import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValueException;
+ import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValuesFig;
+ import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValuesService;
 -import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
  import org.apache.usergrid.persistence.core.scope.ApplicationScope;
  import org.apache.usergrid.persistence.model.entity.Entity;
  import org.apache.usergrid.persistence.model.entity.Id;
  import org.apache.usergrid.persistence.model.field.Field;
  import org.apache.usergrid.persistence.model.util.EntityUtils;
 -import org.slf4j.Logger;
 -import org.slf4j.LoggerFactory;
 +
- import com.google.common.base.Preconditions;
- import com.google.inject.Inject;
- import com.google.inject.Singleton;
- import com.netflix.astyanax.Keyspace;
- import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
- import com.netflix.hystrix.HystrixCommand;
- import com.netflix.hystrix.HystrixCommandGroupKey;
- import com.netflix.hystrix.HystrixThreadPoolProperties;
- 
  import rx.functions.Action1;
  
+ import java.util.*;
+ 
  
  /**
   * This phase execute all unique value verification on the MvccEntity.
@@@ -66,9 -63,13 +66,13 @@@ public class WriteUniqueVerify implemen
  
      private static final Logger logger = LoggerFactory.getLogger( WriteUniqueVerify.class );
  
 -    ActorSystemFig actorSystemFig;
 -    UniqueValuesFig uniqueValuesFig;
 -    UniqueValuesService akkaUvService;
++    private ActorSystemFig actorSystemFig;
++    private UniqueValuesFig uniqueValuesFig;
++    private UniqueValuesService akkaUvService;
+ 
      private final UniqueValueSerializationStrategy uniqueValueStrat;
  
 -    public static int uniqueVerifyPoolSize = 100;
 +    private static int uniqueVerifyPoolSize = 100;
  
      private static int uniqueVerifyTimeoutMillis= 5000;
  
@@@ -82,13 -80,19 +86,21 @@@
  
  
      @Inject
-     public WriteUniqueVerify( final UniqueValueSerializationStrategy uniqueValueSerializiationStrategy,
-                               final SerializationFig serializationFig, final Keyspace keyspace,
-                               final CassandraConfig cassandraFig, final Session session ) {
+     public WriteUniqueVerify(final UniqueValueSerializationStrategy uniqueValueSerializiationStrategy,
+                              final SerializationFig serializationFig,
+                              final Keyspace keyspace,
+                              final CassandraConfig cassandraFig,
+                              final ActorSystemFig actorSystemFig,
+                              final UniqueValuesFig uniqueValuesFig,
 -                             final UniqueValuesService akkaUvService ) {
++                             final UniqueValuesService akkaUvService,
++                             final Session session ) {
  
          this.keyspace = keyspace;
          this.cassandraFig = cassandraFig;
+         this.actorSystemFig = actorSystemFig;
+         this.uniqueValuesFig = uniqueValuesFig;
+         this.akkaUvService = akkaUvService;
 +        this.session = session;
  
          Preconditions.checkNotNull( uniqueValueSerializiationStrategy, "uniqueValueSerializationStrategy is required" );
          Preconditions.checkNotNull( serializationFig, "serializationFig is required" );
@@@ -128,10 -168,58 +176,52 @@@
              // use write-first then read strategy
              final UniqueValue written = new UniqueValueImpl( field, mvccEntity.getId(), mvccEntity.getVersion() );
  
-             // use TTL in case something goes wrong before entity is finally committed
-             batch.add(uniqueValueStrat.writeCQL( scope, written, serializationFig.getTimeout() ));
 -            try {
  
-             uniqueFields.add(field);
 -                // don't use read repair on this pre-write check
 -                // stronger consistency is extremely important here, more so than performance
 -                UniqueValueSet set = uniqueValueStrat.load(scope, cassandraFig.getConsistentReadCL(),
 -                    written.getEntityId().getType(), Collections.singletonList(written.getField()), false);
++            // don't use read repair on this pre-write check
++            // stronger consistency is extremely important here, more so than performance
++            UniqueValueSet set = uniqueValueStrat.load(scope, cassandraFig.getDataStaxReadConsistentCl(),
++                written.getEntityId().getType(), Collections.singletonList(written.getField()), false);
+ 
 -                set.forEach(uniqueValue -> {
++            set.forEach(uniqueValue -> {
+ 
 -                    if(!uniqueValue.getEntityId().getUuid().equals(written.getEntityId().getUuid())){
 -
 -                        if(logger.isTraceEnabled()){
 -                            logger.trace("Pre-write violation detected. Attempted write for unique value [{}={}] and " +
 -                                "entity id [{}], entity version [{}] conflicts with already existing entity id [{}], " +
 -                                "entity version [{}]",
 -                                written.getField().getName(),
 -                                written.getField().getValue().toString(),
 -                                written.getEntityId().getUuid(),
 -                                written.getEntityVersion(),
 -                                uniqueValue.getEntityId().getUuid(),
 -                                uniqueValue.getEntityVersion());
 -                        }
 -
 -                        preWriteUniquenessViolations.put(field.getName(), field);
++                if(!uniqueValue.getEntityId().getUuid().equals(written.getEntityId().getUuid())){
+ 
++                    if(logger.isTraceEnabled()){
++                        logger.trace("Pre-write violation detected. Attempted write for unique value [{}={}] and " +
++                            "entity id [{}], entity version [{}] conflicts with already existing entity id [{}], " +
++                            "entity version [{}]",
++                            written.getField().getName(),
++                            written.getField().getValue().toString(),
++                            written.getEntityId().getUuid(),
++                            written.getEntityVersion(),
++                            uniqueValue.getEntityId().getUuid(),
++                            uniqueValue.getEntityVersion());
+                     }
+ 
 -                });
++                    preWriteUniquenessViolations.put(field.getName(), field);
+ 
++                }
++
++            });
+ 
 -            } catch (ConnectionException e) {
+ 
 -                throw new RuntimeException("Error connecting to cassandra", e);
 -            }
+ 
+             // only build the batch statement if we don't have a violation for the field
+             if( preWriteUniquenessViolations.get(field.getName()) == null) {
+ 
+                 // use TTL in case something goes wrong before entity is finally committed
 -                final MutationBatch mb = uniqueValueStrat.write(scope, written, serializationFig.getTimeout());
++                batch.add(uniqueValueStrat.writeCQL(scope, written, serializationFig.getTimeout()));
+ 
 -                batch.mergeShallow(mb);
+                 uniqueFields.add(field);
+             }
+         }
+ 
+         if(preWriteUniquenessViolations.size() > 0 ){
+             if(logger.isTraceEnabled()){
+                 logger.trace("Pre-write unique violations found, raising exception before executing first write");
+             }
+ 
+             throw new WriteUniqueVerifyException(mvccEntity, scope, preWriteUniquenessViolations );
          }
  
          //short circuit nothing to do
@@@ -140,13 -228,18 +230,14 @@@
          }
  
          //perform the write
 -        try {
 -            batch.execute();
 -        }
 -        catch ( ConnectionException ex ) {
 -            throw new RuntimeException( "Unable to write to cassandra", ex );
 -        }
 +        session.execute(batch);
 +
  
          // use simple thread pool to verify fields in parallel
-         ConsistentReplayCommand cmd = new ConsistentReplayCommand(uniqueValueStrat,cassandraFig,scope, entity.getId().getType(), uniqueFields,entity);
+         ConsistentReplayCommand cmd = new ConsistentReplayCommand(
+             uniqueValueStrat,cassandraFig,scope, entity.getId().getType(), uniqueFields,entity);
  
-         Map<String,Field>  uniquenessViolations = cmd.execute();
+         Map<String,Field> uniquenessViolations = cmd.execute();
  
          //do we want to do this?
  
@@@ -184,16 -278,24 +276,21 @@@
  
          @Override
          protected Map<String, Field> getFallback() {
 -            // fallback with same CL as there are many reasons the 1st execution failed,
 -            // not just due to consistency problems
 -            return executeStrategy(fig.getReadCL());
 +            // fallback with same CL as there are many reasons the 1st execution failed, not just due to consistency problems
 +            return executeStrategy(fig.getDataStaxReadCl());
++
          }
  
          public Map<String, Field> executeStrategy(ConsistencyLevel consistencyLevel){
--            //allocate our max size, worst case
--            //now get the set of fields back
++
              final UniqueValueSet uniqueValues;
 -            try {
 -                // load ascending for verification to make sure we wrote is the last read back
 -                // don't read repair on this read because our write-first strategy will introduce a duplicate
 -                uniqueValues =
 -                    uniqueValueSerializationStrategy.load( scope, consistencyLevel, type,  uniqueFields, false);
 -            }
 -            catch ( ConnectionException e ) {
 -                throw new RuntimeException( "Unable to read from cassandra", e );
 -            }
 +
-             uniqueValues = uniqueValueSerializationStrategy.load( scope, consistencyLevel, type,  uniqueFields );
++            // load ascending for verification to make sure we wrote is the last read back
++            // don't read repair on this read because our write-first strategy will introduce a duplicate
++            uniqueValues =
++                uniqueValueSerializationStrategy.load( scope, consistencyLevel, type,  uniqueFields, false);
++
++
  
              final Map<String, Field> uniquenessViolations = new HashMap<>( uniqueFields.size() );
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
index eb43985,c6c70b9..cb6cd2b
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
@@@ -43,12 -54,13 +43,13 @@@ public interface UniqueValueSerializati
       * @param applicationScope scope
       * @param uniqueValue Object to be written
       * @param timeToLive How long object should live in seconds.  -1 implies store forever
 -     * @return MutatationBatch that encapsulates operation, caller may or may not execute.
 +     * @return BatchStatement that encapsulates CQL statements, caller may or may not execute.
       */
 -    MutationBatch write( ApplicationScope applicationScope, UniqueValue uniqueValue, int timeToLive );
 +    BatchStatement writeCQL(ApplicationScope applicationScope, UniqueValue uniqueValue, int timeToLive );
  
      /**
-      * Load UniqueValue that matches field from collection or null if that value does not exist.
+      * Load UniqueValue that matches field from collection or null if that value does not exist.  Returns the oldest
+      * unique value entry if more than 1 exists
       *
       * @param applicationScope scope in which to look for field name/value
       * @param type The type the unique value exists within
@@@ -56,9 -68,26 +57,24 @@@
       *
       * @return UniqueValueSet containing fields from the collection that exist in cassandra
       *
 -     * @throws ConnectionException on error connecting to Cassandra
       */
 -    UniqueValueSet load( ApplicationScope applicationScope, String type, Collection<Field> fields )
 -        throws ConnectionException;
 +    UniqueValueSet load( ApplicationScope applicationScope, String type, Collection<Field> fields );
 +
+ 
+     /**
+      * Load UniqueValue that matches field from collection or null if that value does not exist.  Returns the oldest
+      * unique value entry if more than 1 exists
+      *
+      * @param applicationScope scope in which to look for field name/value
+      * @param type The type the unique value exists within
+      * @param fields Field name/value to search for
+      *
+      * @return UniqueValueSet containing fields from the collection that exist in cassandra
+      *
 -     * @throws ConnectionException on error connecting to Cassandra
+      */
+     UniqueValueSet load( ApplicationScope applicationScope, String type, Collection<Field> fields,
 -                         boolean useReadRepair ) throws ConnectionException;
++                         boolean useReadRepair );
+ 
      /**
      * Load UniqueValue that matches field from collection or null if that value does not exist.
      *
@@@ -66,11 -95,13 +82,13 @@@
      * @param consistencyLevel Consistency level of query
      * @param type The type the unique value exists within
      * @param fields Field name/value to search for
 +    * @return UniqueValueSet containing fields from the collection that exist in cassandra
++    *
+     * @param useReadRepair
+      * @return UniqueValueSet containing fields from the collection that exist in cassandra
 -    * @throws ConnectionException on error connecting to Cassandra
      */
      UniqueValueSet load(ApplicationScope applicationScope, ConsistencyLevel consistencyLevel, String type,
-                         Collection<Field> fields );
 -                        Collection<Field> fields, boolean useReadRepair) throws ConnectionException;
--
++                        Collection<Field> fields, boolean useReadRepair);
  
      /**
       * Loads the currently persisted history of every unique value the entity has held.  This will


[03/38] usergrid git commit: Create object for defining our table schema and provide utilities for generating CQL to create or ALTER the table schema.

Posted by mr...@apache.org.
Create object for defining our table schema and provide utilities for generating CQL to create or ALTER the table schema.


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

Branch: refs/heads/master
Commit: a62fb0a0c95ece13c84a563e58802230bdcff1cb
Parents: 01c4970
Author: Michael Russo <mi...@gmail.com>
Authored: Tue Feb 9 17:14:38 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Tue Feb 9 17:14:38 2016 -0800

----------------------------------------------------------------------
 stack/corepersistence/common/pom.xml            |  11 --
 .../persistence/core/datastax/CQLUtils.java     |  77 ++++++++++-
 .../core/datastax/TableDefinition.java          | 129 +++++++++++++++++++
 .../core/migration/schema/Migration.java        |   2 +
 .../persistence/core/datastax/CQLUtilsTest.java |  73 +++++++++++
 .../core/datastax/DatastaxClusterTest.java      |   4 +-
 6 files changed, 281 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/a62fb0a0/stack/corepersistence/common/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/pom.xml b/stack/corepersistence/common/pom.xml
index 6b617cf..983c665 100644
--- a/stack/corepersistence/common/pom.xml
+++ b/stack/corepersistence/common/pom.xml
@@ -196,17 +196,6 @@
                 </exclusion>
             </exclusions>
         </dependency>
-        <dependency>
-            <groupId>com.datastax.cassandra</groupId>
-            <artifactId>cassandra-driver-mapping</artifactId>
-            <version>${datastax.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.datastax.cassandra</groupId>
-                    <artifactId>cassandra-driver-core</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
 
         <!-- LZ4 compression used for Datastax Java Driver:
              https://datastax.github.io/java-driver/2.1.7/features/compression/ -->

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a62fb0a0/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
index b663934..0a7408a 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
@@ -20,12 +20,35 @@ package org.apache.usergrid.persistence.core.datastax;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.usergrid.persistence.core.util.StringUtils;
 
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.StringJoiner;
 
 public class CQLUtils {
 
+
+    enum ACTION {
+        CREATE, UPDATE
+    }
+
+    static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS";
+    static String ALTER_TABLE = "ALTER TABLE";
+    static String WITH ="WITH";
+    static String AND = "AND";
+    static String EQUAL = "=";
+    static String COMPRESSION = "compression";
+    static String COMPACTION = "compaction";
+    static String GC_GRACE_SECONDS = "gc_grace_seconds";
+    static String PRIMARY_KEY = "PRIMARY KEY";
+    static String COMPACT_STORAGE = "COMPACT STORAGE";
+    static String CLUSTERING_ORDER_BY = "CLUSTERING ORDER BY";
+
+    private final static ObjectMapper mapper = new ObjectMapper();
+
+
     public static String getFormattedReplication(String strategy, String strategyOptions) throws JsonProcessingException {
 
         Map<String, String> replicationSettings = new HashMap<>();
@@ -35,13 +58,63 @@ public class CQLUtils {
             String[] splitOptions = option.split(":");
             replicationSettings.put(splitOptions[0], splitOptions[1]);
         }
-        ObjectMapper mapper = new ObjectMapper();
         return mapper.writeValueAsString(replicationSettings).replace("\"", "'");
     }
 
 
-    public static void createColumnFamily(){
+    public static String getMapAsCQLString(Map<String, Object> map) throws JsonProcessingException {
+
+        return mapper.writeValueAsString(map).replace("\"", "'");
+    }
+
+
+    public static String getTableCQL(TableDefinition tableDefinition, ACTION tableAction) throws Exception {
+
+        StringJoiner cql = new StringJoiner(" ");
+
+        if ( tableAction.equals(ACTION.CREATE) ){
+            cql.add(CREATE_TABLE);
+        } else if ( tableAction.equals(ACTION.UPDATE) ){
+            cql.add(ALTER_TABLE);
+        }else{
+            throw new Exception("Invalid Action specified.  Must of of type CQLUtils.Action");
+        }
+
+        cql.add( "\""+tableDefinition.getTableName()+"\"" );
+
+
+        StringJoiner columnsString = new StringJoiner(",");
+        Map<String, String> columns = tableDefinition.getColumns();
+        columns.forEach( (key, value) -> columnsString.add(key+" "+value));
+        columnsString.add(PRIMARY_KEY +" ( "+StringUtils.join(tableDefinition.getPrimaryKeys(), ",") + " )");
+
+        StringJoiner orderingString = new StringJoiner(" ");
+        Map<String, String> ordering = tableDefinition.getClusteringOrder();
+        ordering.forEach( (key, value) -> orderingString.add(key+" "+value));
+
+        if ( tableAction.equals(ACTION.CREATE) ){
+            cql.add("(").add(columnsString.toString()).add(")")
+                .add(WITH)
+                .add(CLUSTERING_ORDER_BY).add("(").add(orderingString.toString()).add(")")
+                .add(AND)
+                .add(COMPACT_STORAGE)
+                .add(AND);
+
+        } else if ( tableAction.equals(ACTION.UPDATE) ){
+            cql.add(WITH);
+
+        }
+
+
+        cql.add(COMPACTION).add(EQUAL).add( getMapAsCQLString( tableDefinition.getCompaction() ) )
+            .add(AND)
+            .add(COMPRESSION).add(EQUAL).add( getMapAsCQLString( tableDefinition.getCompression() ) )
+            .add(AND)
+            .add(GC_GRACE_SECONDS).add(EQUAL).add( tableDefinition.getGcGraceSeconds() );
+
+
 
+        return cql.toString();
 
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a62fb0a0/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
new file mode 100644
index 0000000..58d43a5
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
@@ -0,0 +1,129 @@
+/*
+ *
+ *  * 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 org.apache.usergrid.persistence.core.datastax;
+
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+public class TableDefinition {
+
+
+    public enum CacheOption {
+
+        ALL( "ALL" ),
+        KEYS( "KEYS_ONLY" ),
+        ROWS( "ROWS_ONLY" ),
+        NONE( "NONE" );
+
+        private String value;
+
+
+        CacheOption( String value ) {
+            this.value = value;
+        }
+
+
+        public String getValue() {
+            return value;
+        }
+    }
+
+
+    private final String tableName;
+    private final Collection<String> primaryKeys;
+    private final Map<String, String> columns;
+    private final CacheOption cacheOption;
+    private final Map<String, Object> compaction;
+    private final String bloomFilterChance;
+    private final String readRepairChance;
+    private final Map<String, Object> compression;
+    private final String gcGraceSeconds;
+    private final Map<String, String> clusteringOrder;
+
+    public TableDefinition( final String tableName, final Collection<String> primaryKeys,
+                            final Map<String, String> columns, final CacheOption cacheOption,
+                            final Map<String, String> clusteringOrder){
+
+        this.tableName = tableName;
+        this.primaryKeys = primaryKeys;
+        this.columns = columns;
+        this.cacheOption = cacheOption;
+        this.clusteringOrder = clusteringOrder;
+
+
+        // this are default settings always used
+        this.compaction = new HashMap<>(1);
+        compaction.put( "class", "LeveledCompactionStrategy" );
+        this.bloomFilterChance = "0.1d";
+        this.readRepairChance = "0.1d";
+        this.compression = new HashMap<>(1);
+        compression.put("sstable_compression", "LZ4Compressor");
+        this.gcGraceSeconds = "864000";
+
+
+
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public Collection<String> getPrimaryKeys() {
+        return primaryKeys;
+    }
+
+    public Map<String, String> getColumns() {
+        return columns;
+    }
+
+    public CacheOption getCacheOption() {
+        return cacheOption;
+    }
+
+    public Map<String, Object> getCompaction() {
+        return compaction;
+    }
+
+    public String getBloomFilterChance() {
+        return bloomFilterChance;
+    }
+
+    public String getReadRepairChance() {
+        return readRepairChance;
+    }
+
+    public Map<String, Object> getCompression() {
+        return compression;
+    }
+
+    public String getGcGraceSeconds() {
+        return gcGraceSeconds;
+    }
+
+    public Map<String, String> getClusteringOrder() {
+        return clusteringOrder;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a62fb0a0/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
index 9938b88..3896df2 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
@@ -33,4 +33,6 @@ public interface Migration {
      * Get the column families required for this implementation.  If one does not exist it will be created.
      */
     Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies();
+
+    //Collection<String> getTables();
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a62fb0a0/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
new file mode 100644
index 0000000..8ddfa3f
--- /dev/null
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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 org.apache.usergrid.persistence.core.datastax;
+
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertTrue;
+
+public class CQLUtilsTest {
+
+    private static final Logger logger = LoggerFactory.getLogger( CQLUtilsTest.class );
+
+    @Test
+    public void testTableCQL() throws Exception {
+
+
+        Map<String, String> columns = new HashMap<>();
+        columns.put("key", "blob");
+        columns.put("column1", "text");
+        columns.put("value", "blob");
+
+        List<String> primaryKeys = new ArrayList<>();
+        primaryKeys.add("key");
+        primaryKeys.add("column1");
+
+        Map<String, String> clusteringOrder = new HashMap<>();
+        clusteringOrder.put("column1", "DESC");
+
+
+
+        TableDefinition table1 = new TableDefinition(
+            "table1",
+            primaryKeys,
+            columns,
+            TableDefinition.CacheOption.KEYS,
+            clusteringOrder
+            );
+
+        String createCQL = CQLUtils.getTableCQL(table1, CQLUtils.ACTION.CREATE);
+        String updateCQL = CQLUtils.getTableCQL(table1, CQLUtils.ACTION.UPDATE);
+
+        assertTrue( createCQL.contains( CQLUtils.CREATE_TABLE ) && !createCQL.contains( CQLUtils.ALTER_TABLE ) );
+        assertTrue( updateCQL.contains( CQLUtils.ALTER_TABLE ) && !updateCQL.contains( CQLUtils.CREATE_TABLE ) );
+        //logger.info("CREATE: {}", createCQL);
+        //logger.info("UPDATE: {}", updateCQL);
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a62fb0a0/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
index 477a205..5da23ce 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
@@ -1,5 +1,3 @@
-package org.apache.usergrid.persistence.core.datastax;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,8 @@ package org.apache.usergrid.persistence.core.datastax;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.usergrid.persistence.core.datastax;
+
 public class DatastaxClusterTest {
 
     //TODO


[13/38] usergrid git commit: Expose creation of keyspace via the interface so other classes can use that method to create the keyspace if for some reason it does not already exist.

Posted by mr...@apache.org.
Expose creation of keyspace via the interface so other classes can use that method to create the keyspace if for some reason it does not already exist.


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

Branch: refs/heads/master
Commit: ecbd495970b73e0c1ed85fa6491c906cac33de6e
Parents: 7ff31eb
Author: Michael Russo <mi...@gmail.com>
Authored: Fri Feb 12 22:48:09 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Fri Feb 12 22:48:09 2016 -0800

----------------------------------------------------------------------
 .../usergrid/persistence/core/datastax/DataStaxCluster.java      | 2 ++
 .../persistence/core/datastax/impl/DatastaxClusterImpl.java      | 4 +++-
 .../persistence/core/migration/schema/MigrationManagerImpl.java  | 3 ++-
 .../usergrid/persistence/core/datastax/DatastaxClusterTest.java  | 2 +-
 4 files changed, 8 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/ecbd4959/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
index 206c2a0..768a7a2 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
@@ -30,6 +30,8 @@ public interface DataStaxCluster {
 
     Session getApplicationSession();
 
+    void createOrUpdateKeyspace() throws Exception;
+
     void waitForSchemaAgreement();
 
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ecbd4959/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
index 1e9061f..e15475e 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
@@ -26,6 +26,7 @@ import com.google.inject.Singleton;
 import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
+import org.safehaus.guicyfig.Overrides;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -92,7 +93,8 @@ public class DataStaxClusterImpl implements DataStaxCluster {
      * Execute CQL that will create the keyspace if it doesn't exist and alter it if it does.
      * @throws Exception
      */
-    private void createOrUpdateKeyspace() throws Exception {
+    @Override
+    public void createOrUpdateKeyspace() throws Exception {
 
         clusterSession = getClusterSession();
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ecbd4959/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
index 105f93a..9ab403d 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
@@ -71,9 +71,10 @@ public class MigrationManagerImpl implements MigrationManager {
     @Override
     public void migrate() throws MigrationException {
 
-
         try {
 
+            dataStaxCluster.createOrUpdateKeyspace();
+
             for ( Migration migration : migrations ) {
 
                 final Collection<MultiTenantColumnFamilyDefinition> columnFamilies = migration.getColumnFamilies();

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ecbd4959/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
index 81b7d8f..593e71b 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
@@ -57,7 +57,7 @@ public class DatastaxClusterTest {
         cluster = dataStaxCluster.getCluster();
         assertTrue(!cluster.isClosed());
 
-        
+
     }
 
     @Test


[28/38] usergrid git commit: Initial UniqueValueSerialization conversion to CQL.

Posted by mr...@apache.org.
Initial UniqueValueSerialization conversion to CQL.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/0c609878
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/0c609878
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/0c609878

Branch: refs/heads/master
Commit: 0c609878e1eccd35f31bc4fdc86bd3fe9da21593
Parents: ff3f7e8
Author: Michael Russo <mr...@apigee.com>
Authored: Fri May 6 22:36:37 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Fri May 6 22:36:37 2016 +0800

----------------------------------------------------------------------
 .../mvcc/stage/write/WriteCommit.java           |  18 +-
 .../mvcc/stage/write/WriteUniqueVerify.java     |  23 +-
 .../UniqueValueSerializationStrategy.java       |   6 +-
 .../UniqueValueSerializationStrategyImpl.java   | 287 ++++++++++++-
 ...iqueValueSerializationStrategyProxyImpl.java |  31 +-
 .../UniqueValueSerializationStrategyV1Impl.java | 410 ++++++++++++++++++-
 .../UniqueValueSerializationStrategyV2Impl.java | 379 ++++++++++++++++-
 .../migration/MvccEntityDataMigrationImpl.java  |  26 +-
 .../mvcc/stage/delete/MarkCommitTest.java       |  13 +-
 .../mvcc/stage/write/WriteCommitTest.java       |  15 +-
 .../mvcc/stage/write/WriteUniqueVerifyTest.java |   6 +-
 ...niqueValueSerializationStrategyImplTest.java |  41 +-
 ...ctMvccEntityDataMigrationV1ToV3ImplTest.java |   5 +-
 .../core/datastax/impl/DataStaxClusterImpl.java |   3 +
 14 files changed, 1169 insertions(+), 94 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommit.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommit.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommit.java
index 7eb96e7..cfac8e4 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommit.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommit.java
@@ -20,6 +20,8 @@ package org.apache.usergrid.persistence.collection.mvcc.stage.write;
 
 import java.util.UUID;
 
+import com.datastax.driver.core.BatchStatement;
+import com.datastax.driver.core.Session;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -67,11 +69,14 @@ public class WriteCommit implements Func1<CollectionIoEvent<MvccEntity>, Collect
 
     private final MvccEntitySerializationStrategy entityStrat;
 
+    private final Session session;
+
 
     @Inject
     public WriteCommit( final MvccLogEntrySerializationStrategy logStrat,
                         final MvccEntitySerializationStrategy entryStrat,
-                        final UniqueValueSerializationStrategy uniqueValueStrat) {
+                        final UniqueValueSerializationStrategy uniqueValueStrat,
+                        final Session session) {
 
         Preconditions.checkNotNull( logStrat, "MvccLogEntrySerializationStrategy is required" );
         Preconditions.checkNotNull( entryStrat, "MvccEntitySerializationStrategy is required" );
@@ -80,6 +85,7 @@ public class WriteCommit implements Func1<CollectionIoEvent<MvccEntity>, Collect
         this.logEntryStrat = logStrat;
         this.entityStrat = entryStrat;
         this.uniqueValueStrat = uniqueValueStrat;
+        this.session = session;
     }
 
 
@@ -103,6 +109,8 @@ public class WriteCommit implements Func1<CollectionIoEvent<MvccEntity>, Collect
 
         final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, Stage.COMMITTED, MvccLogEntry.State.COMPLETE );
 
+
+
         MutationBatch logMutation = logEntryStrat.write( applicationScope, startEntry );
 
         // now get our actual insert into the entity data
@@ -112,21 +120,23 @@ public class WriteCommit implements Func1<CollectionIoEvent<MvccEntity>, Collect
         logMutation.mergeShallow( entityMutation );
 
         // re-write the unique values but this time with no TTL
+        final BatchStatement uniqueBatch = new BatchStatement();
+
         for ( Field field : EntityUtils.getUniqueFields(mvccEntity.getEntity().get()) ) {
 
                 UniqueValue written  = new UniqueValueImpl( field,
                     entityId,version);
 
-                MutationBatch mb = uniqueValueStrat.write(applicationScope,  written );
+                uniqueBatch.add(uniqueValueStrat.writeCQL(applicationScope,  written, -1 ));
 
                 logger.debug("Finalizing {} unique value {}", field.getName(), field.getValue().toString());
 
-                // merge into our existing mutation batch
-                logMutation.mergeShallow( mb );
+
         }
 
         try {
             logMutation.execute();
+            session.execute(uniqueBatch);
         }
         catch ( ConnectionException e ) {
             logger.error( "Failed to execute write asynchronously ", e );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
index 585c26e..8e0b202 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
@@ -23,6 +23,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.datastax.driver.core.BatchStatement;
+import com.datastax.driver.core.Session;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -71,14 +73,20 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
     protected final SerializationFig serializationFig;
 
     protected final Keyspace keyspace;
+
+    protected final Session session;
+
     private final CassandraConfig cassandraFig;
 
 
     @Inject
     public WriteUniqueVerify( final UniqueValueSerializationStrategy uniqueValueSerializiationStrategy,
-                              final SerializationFig serializationFig, final Keyspace keyspace, final CassandraConfig cassandraFig ) {
+                              final SerializationFig serializationFig, final Keyspace keyspace,
+                              final CassandraConfig cassandraFig, final Session session ) {
+
         this.keyspace = keyspace;
         this.cassandraFig = cassandraFig;
+        this.session = session;
 
         Preconditions.checkNotNull( uniqueValueSerializiationStrategy, "uniqueValueSerializationStrategy is required" );
         Preconditions.checkNotNull( serializationFig, "serializationFig is required" );
@@ -101,7 +109,7 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
 
         final ApplicationScope scope = ioevent.getEntityCollection();
 
-        final MutationBatch batch = keyspace.prepareMutationBatch();
+        final BatchStatement batch = new BatchStatement();
         //allocate our max size, worst case
         final List<Field> uniqueFields = new ArrayList<>( entity.getFields().size() );
 
@@ -119,9 +127,8 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
             final UniqueValue written = new UniqueValueImpl( field, mvccEntity.getId(), mvccEntity.getVersion() );
 
             // use TTL in case something goes wrong before entity is finally committed
-            final MutationBatch mb = uniqueValueStrat.write( scope, written, serializationFig.getTimeout() );
+            batch.add(uniqueValueStrat.writeCQL( scope, written, serializationFig.getTimeout() ));
 
-            batch.mergeShallow( mb );
             uniqueFields.add(field);
         }
 
@@ -131,12 +138,8 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
         }
 
         //perform the write
-        try {
-            batch.execute();
-        }
-        catch ( ConnectionException ex ) {
-            throw new RuntimeException( "Unable to write to cassandra", ex );
-        }
+        session.execute(batch);
+
 
         // use simple thread pool to verify fields in parallel
         ConsistentReplayCommand cmd = new ConsistentReplayCommand(uniqueValueStrat,cassandraFig,scope, entity.getId().getType(), uniqueFields,entity);

http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
index 3645107..56e8b87 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
@@ -21,6 +21,8 @@ package org.apache.usergrid.persistence.collection.serialization;
 import java.util.Collection;
 import java.util.Iterator;
 
+import com.datastax.driver.core.BatchStatement;
+import org.apache.usergrid.persistence.collection.serialization.impl.UniqueValueSerializationStrategyImpl;
 import org.apache.usergrid.persistence.core.migration.data.VersionedData;
 import org.apache.usergrid.persistence.core.migration.schema.Migration;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
@@ -46,7 +48,6 @@ public interface UniqueValueSerializationStrategy extends Migration, VersionedDa
      *
      * @return MutatationBatch that encapsulates operation, caller may or may not execute.
      */
-    MutationBatch write( ApplicationScope applicationScope, UniqueValue uniqueValue );
 
     /**
      * Write the specified UniqueValue to Cassandra with optional timeToLive in milliseconds.
@@ -56,7 +57,8 @@ public interface UniqueValueSerializationStrategy extends Migration, VersionedDa
      * @param timeToLive How long object should live in seconds.  -1 implies store forever
      * @return MutatationBatch that encapsulates operation, caller may or may not execute.
      */
-    MutationBatch write( ApplicationScope applicationScope, UniqueValue uniqueValue, int timeToLive );
+
+    BatchStatement writeCQL(ApplicationScope applicationScope, UniqueValue uniqueValue, int timeToLive );
 
     /**
      * Load UniqueValue that matches field from collection or null if that value does not exist.

http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
index 0f27167..27a8609 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
@@ -18,9 +18,19 @@
 package org.apache.usergrid.persistence.collection.serialization.impl;
 
 
+import java.nio.ByteBuffer;
 import java.util.*;
 
+import com.datastax.driver.core.*;
+import com.datastax.driver.core.querybuilder.Clause;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.datastax.driver.core.querybuilder.Using;
+import com.netflix.astyanax.model.*;
+import com.netflix.astyanax.util.RangeBuilder;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
+import org.apache.usergrid.persistence.model.entity.SimpleId;
+import org.apache.usergrid.persistence.model.field.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,18 +50,13 @@ import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.util.ValidationUtils;
 import org.apache.usergrid.persistence.model.entity.Id;
-import org.apache.usergrid.persistence.model.field.Field;
 
 import com.google.common.base.Preconditions;
 import com.netflix.astyanax.ColumnListMutation;
 import com.netflix.astyanax.Keyspace;
 import com.netflix.astyanax.MutationBatch;
 import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.model.Column;
-import com.netflix.astyanax.model.ConsistencyLevel;
-import com.netflix.astyanax.model.Row;
 import com.netflix.astyanax.query.RowQuery;
-import com.netflix.astyanax.util.RangeBuilder;
 
 
 /**
@@ -62,6 +67,9 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
     private static final Logger log = LoggerFactory.getLogger( UniqueValueSerializationStrategyImpl.class );
 
+    public static final String UUID_TYPE_REVERSED = "UUIDType(reversed=true)";
+
+
 
     private final MultiTenantColumnFamily<ScopedRowKey<FieldKey>, EntityVersion>
         CF_UNIQUE_VALUES;
@@ -70,6 +78,15 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     private final MultiTenantColumnFamily<ScopedRowKey<EntityKey>, UniqueFieldEntry>
         CF_ENTITY_UNIQUE_VALUE_LOG ;
 
+    private final String TABLE_UNIQUE_VALUES;
+    private final String TABLE_UNIQUE_VALUES_LOG;
+
+
+    private final Map COLUMNS_UNIQUE_VALUES;
+    private final Map COLUMNS_UNIQUE_VALUES_LOG;
+
+
+
     public static final int COL_VALUE = 0x0;
 
 
@@ -77,6 +94,9 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     protected final Keyspace keyspace;
     private final CassandraFig cassandraFig;
 
+    private final Session session;
+    private final CassandraConfig cassandraConfig;
+
 
     /**
      * Construct serialization strategy for keyspace.
@@ -86,13 +106,24 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
      * @param serializationFig The serialization configuration
      */
     public UniqueValueSerializationStrategyImpl( final Keyspace keyspace, final CassandraFig cassandraFig,
-                                                 final SerializationFig serializationFig ) {
+                                                 final SerializationFig serializationFig,
+                                                 final Session session, final CassandraConfig cassandraConfig) {
         this.keyspace = keyspace;
         this.cassandraFig = cassandraFig;
         this.serializationFig = serializationFig;
 
+        this.session = session;
+        this.cassandraConfig = cassandraConfig;
+
         CF_UNIQUE_VALUES = getUniqueValuesCF();
         CF_ENTITY_UNIQUE_VALUE_LOG = getEntityUniqueLogCF();
+
+        TABLE_UNIQUE_VALUES = getUniqueValuesTable().getTableName();
+        TABLE_UNIQUE_VALUES_LOG = getEntityUniqueLogTable().getTableName();
+
+        COLUMNS_UNIQUE_VALUES = getUniqueValuesTable().getColumns();
+        COLUMNS_UNIQUE_VALUES_LOG = getEntityUniqueLogTable().getColumns();
+
     }
 
 
@@ -129,7 +160,6 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     }
 
 
-    @Override
     public MutationBatch write( final ApplicationScope collectionScope, final UniqueValue value,
                                 final int timeToLive ) {
 
@@ -163,6 +193,86 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
         } );
     }
 
+    @Override
+    public BatchStatement writeCQL( final ApplicationScope collectionScope, final UniqueValue value,
+                           final int timeToLive  ){
+
+
+        Preconditions.checkNotNull( value, "value is required" );
+
+        BatchStatement batch = new BatchStatement();
+
+        Using ttl = null;
+        if(timeToLive > 0){
+
+            ttl = QueryBuilder.ttl(timeToLive);
+
+        }
+
+        final Id entityId = value.getEntityId();
+        final UUID entityVersion = value.getEntityVersion();
+        final Field<?> field = value.getField();
+
+        ValidationUtils.verifyIdentity( entityId );
+        ValidationUtils.verifyVersion( entityVersion );
+
+        final EntityVersion ev = new EntityVersion( entityId, entityVersion );
+        final UniqueFieldEntry uniqueFieldEntry = new UniqueFieldEntry( entityVersion, field );
+
+        ByteBuffer partitionKey = getPartitionKey(collectionScope.getApplication(), value.getEntityId().getType(),
+            field.getTypeName().toString(), field.getName(), field.getValue());
+
+        ByteBuffer logPartitionKey = getLogPartitionKey(collectionScope.getApplication(), value.getEntityId());
+
+
+        if(ttl != null) {
+
+            Statement uniqueValueStatement = QueryBuilder.insertInto(TABLE_UNIQUE_VALUES)
+                .value("key", partitionKey)
+                .value("column1", serializeUniqueValueColumn(ev))
+                .value("value", DataType.serializeValue(COL_VALUE, ProtocolVersion.NEWEST_SUPPORTED))
+                .using(ttl);
+
+            batch.add(uniqueValueStatement);
+
+
+        }else{
+
+            Statement uniqueValueStatement = QueryBuilder.insertInto(TABLE_UNIQUE_VALUES)
+                .value("key", partitionKey)
+                .value("column1", serializeUniqueValueColumn(ev))
+                .value("value", DataType.serializeValue(COL_VALUE, ProtocolVersion.NEWEST_SUPPORTED));
+
+            batch.add(uniqueValueStatement);
+
+        }
+
+        // we always want to retain the log entry, so never write with the TTL
+        Statement uniqueValueLogStatement = QueryBuilder.insertInto(TABLE_UNIQUE_VALUES_LOG)
+            .value("key", logPartitionKey)
+            .value("column1", serializeUniqueValueLogColumn(uniqueFieldEntry))
+            .value("value", DataType.serializeValue(COL_VALUE, ProtocolVersion.NEWEST_SUPPORTED));
+
+        batch.add(uniqueValueLogStatement);
+
+
+
+        return batch;
+
+        /**
+         *  @Override
+        public void doLookup( final ColumnListMutation<EntityVersion> colMutation ) {
+        colMutation.putColumn( ev, COL_VALUE );
+        }
+
+
+         @Override
+         public void doLog( final ColumnListMutation<UniqueFieldEntry> colMutation ) {
+         colMutation.putColumn( uniqueFieldEntry, COL_VALUE );
+         }
+         */
+    }
+
 
     @Override
     public MutationBatch delete( final ApplicationScope scope, UniqueValue value ) {
@@ -236,18 +346,26 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     @Override
     public UniqueValueSet load( final ApplicationScope colScope, final String type, final Collection<Field> fields )
         throws ConnectionException {
-        return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getAstyanaxReadCL() ), type, fields );
+        return load( colScope, com.netflix.astyanax.model.ConsistencyLevel.valueOf( cassandraFig.getAstyanaxReadCL() ), type, fields );
     }
 
 
     @Override
-    public UniqueValueSet load( final ApplicationScope appScope, final ConsistencyLevel consistencyLevel,
+    public UniqueValueSet load( final ApplicationScope appScope, final com.netflix.astyanax.model.ConsistencyLevel consistencyLevel,
                                 final String type, final Collection<Field> fields ) throws ConnectionException {
 
         Preconditions.checkNotNull( fields, "fields are required" );
         Preconditions.checkArgument( fields.size() > 0, "More than 1 field must be specified" );
 
+        return loadCQL(appScope, com.datastax.driver.core.ConsistencyLevel.LOCAL_QUORUM, type, fields);
 
+        //return loadLegacy( appScope, type, fields);
+
+    }
+
+
+    private UniqueValueSet loadLegacy(final ApplicationScope appScope,
+                                      final String type, final Collection<Field> fields) throws ConnectionException {
         final List<ScopedRowKey<FieldKey>> keys = new ArrayList<>( fields.size() );
 
         final Id applicationId = appScope.getApplication();
@@ -265,16 +383,16 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
         final UniqueValueSetImpl uniqueValueSet = new UniqueValueSetImpl( fields.size() );
 
-        Iterator<Row<ScopedRowKey<FieldKey>, EntityVersion>> results =
-            keyspace.prepareQuery( CF_UNIQUE_VALUES ).setConsistencyLevel( consistencyLevel ).getKeySlice( keys )
-                    .withColumnRange( new RangeBuilder().setLimit( 1 ).build() ).execute().getResult().iterator();
+        Iterator<com.netflix.astyanax.model.Row<ScopedRowKey<FieldKey>, EntityVersion>> results =
+            keyspace.prepareQuery( CF_UNIQUE_VALUES ).setConsistencyLevel(com.netflix.astyanax.model.ConsistencyLevel.CL_LOCAL_QUORUM ).getKeySlice( keys )
+                .withColumnRange( new RangeBuilder().setLimit( 1 ).build() ).execute().getResult().iterator();
 
 
         while ( results.hasNext() )
 
         {
 
-            final Row<ScopedRowKey<FieldKey>, EntityVersion> unique = results.next();
+            final com.netflix.astyanax.model.Row<ScopedRowKey<FieldKey>, EntityVersion> unique = results.next();
 
 
             final Field field = parseRowKey( unique.getKey() );
@@ -296,9 +414,112 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
         }
 
         return uniqueValueSet;
+
+    }
+
+    private UniqueValueSet loadCQL( final ApplicationScope appScope, final com.datastax.driver.core.ConsistencyLevel consistencyLevel,
+                                final String type, final Collection<Field> fields ) throws ConnectionException {
+
+        Preconditions.checkNotNull( fields, "fields are required" );
+        Preconditions.checkArgument( fields.size() > 0, "More than 1 field must be specified" );
+
+
+        final Id applicationId = appScope.getApplication();
+
+        // row key = app UUID + app type + entityType + field type + field name + field value
+
+        List<ByteBuffer> partitionKeys = new ArrayList<>( fields.size() );
+        for ( Field field : fields ) {
+
+            //log.info(Bytes.toHexString(getPartitionKey(applicationId, type, field.getTypeName().toString(), field.getName(), field.getValue())));
+
+            partitionKeys.add(getPartitionKey(applicationId, type, field.getTypeName().toString(), field.getName(), field.getValue()));
+
+        }
+
+        final UniqueValueSetImpl uniqueValueSet = new UniqueValueSetImpl( fields.size() );
+
+        final Clause inKey = QueryBuilder.in("key", partitionKeys );
+
+        final Statement statement = QueryBuilder.select().all().from(TABLE_UNIQUE_VALUES)
+            .where(inKey)
+            .setConsistencyLevel(com.datastax.driver.core.ConsistencyLevel.LOCAL_QUORUM);
+
+        final ResultSet resultSet = session.execute(statement);
+
+
+        Iterator<com.datastax.driver.core.Row> results = resultSet.iterator();
+
+
+        while( results.hasNext() ){
+
+            final com.datastax.driver.core.Row unique = results.next();
+            ByteBuffer partitionKey = unique.getBytes("key");
+            ByteBuffer column = unique.getBytesUnsafe("column1");
+
+            List<Object> keyContents = deserializePartitionKey(partitionKey);
+            List<Object> columnContents = deserializeUniqueValueColumn(column);
+
+            Field field = null;
+            FieldTypeName fieldType;
+            String name;
+            String value;
+            if(this instanceof UniqueValueSerializationStrategyV2Impl) {
+
+                 fieldType = FieldTypeName.valueOf((String) keyContents.get(3));
+                 name = (String) keyContents.get(4);
+                 value = (String) keyContents.get(5);
+
+            }else{
+
+                fieldType = FieldTypeName.valueOf((String) keyContents.get(5));
+                name = (String) keyContents.get(6);
+                value = (String) keyContents.get(7);
+
+            }
+
+            switch ( fieldType ) {
+                case BOOLEAN:
+                    field = new BooleanField( name, Boolean.parseBoolean( value ) );
+                    break;
+                case DOUBLE:
+                    field = new DoubleField( name, Double.parseDouble( value ) );
+                    break;
+                case FLOAT:
+                    field = new FloatField( name, Float.parseFloat( value ) );
+                    break;
+                case INTEGER:
+                    field =  new IntegerField( name, Integer.parseInt( value ) );
+                    break;
+                case LONG:
+                    field = new LongField( name, Long.parseLong( value ) );
+                    break;
+                case STRING:
+                    field = new StringField( name, value );
+                    break;
+                case UUID:
+                    field = new UUIDField( name, UUID.fromString( value ) );
+                    break;
+            }
+
+            final EntityVersion entityVersion = new EntityVersion(
+                new SimpleId((UUID)columnContents.get(1), (String)columnContents.get(2)), (UUID)columnContents.get(0));
+
+
+            final UniqueValueImpl uniqueValue =
+              new UniqueValueImpl( field, entityVersion.getEntityId(), entityVersion.getEntityVersion() );
+
+            uniqueValueSet.addValue(uniqueValue);
+
+        }
+
+        return uniqueValueSet;
+
     }
 
 
+
+
     @Override
     public Iterator<UniqueValue> getAllUniqueFields( final ApplicationScope collectionScope, final Id entityId ) {
         Preconditions.checkNotNull( collectionScope, "collectionScope is required" );
@@ -378,7 +599,13 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     @Override
     public Collection<TableDefinition> getTables() {
 
-        return Collections.emptyList();
+        final TableDefinition uniqueValues = getUniqueValuesTable();
+
+        final TableDefinition uniqueValuesLog = getEntityUniqueLogTable();
+
+
+        return Arrays.asList( uniqueValues, uniqueValuesLog );
+
     }
 
 
@@ -389,6 +616,12 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
 
     /**
+     * Get the CQL table definition for the unique values log table
+     */
+    protected abstract TableDefinition getUniqueValuesTable();
+
+
+    /**
      * Generate a key that is compatible with the column family
      *
      * @param applicationId The applicationId
@@ -405,10 +638,32 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     protected abstract Field parseRowKey(final ScopedRowKey<FieldKey> rowKey);
 
 
+    protected abstract List<Object> deserializePartitionKey(ByteBuffer bb);
+
+
+    protected abstract Object serializeUniqueValueLogColumn(UniqueFieldEntry fieldEntry);
+
+    protected abstract ByteBuffer getPartitionKey(Id applicationId, String entityType, String fieldType, String fieldName, Object fieldValue );
+
+    protected abstract ByteBuffer getLogPartitionKey(final Id applicationId, final Id uniqueValueId);
+
+    protected abstract ByteBuffer serializeUniqueValueColumn(EntityVersion entityVersion);
+
+    protected abstract List<Object> deserializeUniqueValueColumn(ByteBuffer bb);
+
+
+
+
+
+        /**
+         * Get the column family for the unique field CF
+         */
+    protected abstract MultiTenantColumnFamily<ScopedRowKey<EntityKey>, UniqueFieldEntry> getEntityUniqueLogCF();
+
     /**
-     * Get the column family for the unique field CF
+     * Get the CQL table definition for the unique values log table
      */
-    protected abstract MultiTenantColumnFamily<ScopedRowKey<EntityKey>, UniqueFieldEntry> getEntityUniqueLogCF();
+    protected abstract TableDefinition getEntityUniqueLogTable();
 
     /**
      * Generate a key that is compatible with the column family

http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
index 87b1641..bbfaa2d 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
@@ -24,6 +24,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 
+import com.datastax.driver.core.BatchStatement;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValue;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
@@ -67,40 +68,22 @@ public class UniqueValueSerializationStrategyProxyImpl implements UniqueValueSer
 
 
     @Override
-    public MutationBatch write( final ApplicationScope applicationScope, final UniqueValue uniqueValue ) {
-        final MigrationRelationship<UniqueValueSerializationStrategy> migration = getMigrationRelationShip();
-
-        if ( migration.needsMigration() ) {
-            final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
-
-            aggregateBatch.mergeShallow( migration.from.write( applicationScope, uniqueValue ) );
-            aggregateBatch.mergeShallow( migration.to.write( applicationScope, uniqueValue ) );
-
-            return aggregateBatch;
-        }
+    public BatchStatement writeCQL(final ApplicationScope applicationScope, final UniqueValue uniqueValue,
+                                   final int timeToLive ){
 
-        return migration.to.write( applicationScope, uniqueValue );
-    }
-
-
-    @Override
-    public MutationBatch write( final ApplicationScope applicationScope, final UniqueValue uniqueValue,
-                                final int timeToLive ) {
         final MigrationRelationship<UniqueValueSerializationStrategy> migration = getMigrationRelationShip();
 
         if ( migration.needsMigration() ) {
-            final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
-
-            aggregateBatch.mergeShallow( migration.from.write( applicationScope, uniqueValue, timeToLive ) );
-            aggregateBatch.mergeShallow( migration.to.write( applicationScope, uniqueValue, timeToLive ) );
+            migration.from.writeCQL( applicationScope, uniqueValue, timeToLive );
+            migration.to.writeCQL( applicationScope, uniqueValue, timeToLive );
 
-            return aggregateBatch;
         }
 
-        return migration.to.write( applicationScope, uniqueValue, timeToLive );
+        return migration.to.writeCQL( applicationScope, uniqueValue, timeToLive );
     }
 
 
+
     @Override
     public UniqueValueSet load( final ApplicationScope applicationScope, final String type,
                                 final Collection<Field> fields ) throws ConnectionException {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
index 2235f63..75666fa 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
@@ -20,20 +20,24 @@
 package org.apache.usergrid.persistence.collection.serialization.impl;
 
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
+import java.nio.ByteBuffer;
+import java.util.*;
 
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.ProtocolVersion;
+import com.datastax.driver.core.Session;
 import org.apache.cassandra.db.marshal.BytesType;
 
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
 import org.apache.usergrid.persistence.collection.serialization.impl.util.LegacyScopeUtils;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;
 import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
+import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.field.Field;
@@ -50,6 +54,40 @@ import com.netflix.astyanax.Keyspace;
 public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializationStrategyImpl<CollectionPrefixedKey<Field>, CollectionPrefixedKey<Id>> {
 
 
+
+    private static final String UNIQUE_VALUES_TABLE = CQLUtils.quote("Unique_Values");
+    private static final Collection<String> UNIQUE_VALUES_PARTITION_KEYS = Collections.singletonList("key");
+    private static final Collection<String> UNIQUE_VALUES_COLUMN_KEYS = Collections.singletonList("column1");
+    private static final Map<String, DataType.Name> UNIQUE_VALUES_COLUMNS =
+        new HashMap<String, DataType.Name>() {{
+            put( "key", DataType.Name.BLOB );
+            put( "column1", DataType.Name.BLOB );
+            put( "value", DataType.Name.BLOB ); }};
+    private static final Map<String, String> UNIQUE_VALUES_CLUSTERING_ORDER =
+        new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
+
+
+    private static final String UNIQUE_VALUES_LOG_TABLE = CQLUtils.quote("Entity_Unique_Values");
+    private static final Collection<String> UNIQUE_VALUES_LOG_PARTITION_KEYS = Collections.singletonList("key");
+    private static final Collection<String> UNIQUE_VALUES_LOG_COLUMN_KEYS = Collections.singletonList("column1");
+    private static final Map<String, DataType.Name> UNIQUE_VALUES_LOG_COLUMNS =
+        new HashMap<String, DataType.Name>() {{
+            put( "key", DataType.Name.BLOB );
+            put( "column1", DataType.Name.BLOB );
+            put( "value", DataType.Name.BLOB ); }};
+    private static final Map<String, String> UNIQUE_VALUES_LOG_CLUSTERING_ORDER =
+        new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
+
+
+    private final static TableDefinition uniqueValues =
+        new TableDefinition( UNIQUE_VALUES_TABLE, UNIQUE_VALUES_PARTITION_KEYS, UNIQUE_VALUES_COLUMN_KEYS,
+            UNIQUE_VALUES_COLUMNS, TableDefinition.CacheOption.KEYS, UNIQUE_VALUES_CLUSTERING_ORDER);
+
+    private final static TableDefinition uniqueValuesLog =
+        new TableDefinition( UNIQUE_VALUES_LOG_TABLE, UNIQUE_VALUES_LOG_PARTITION_KEYS, UNIQUE_VALUES_LOG_COLUMN_KEYS,
+            UNIQUE_VALUES_LOG_COLUMNS, TableDefinition.CacheOption.KEYS, UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
+
+
     private static final CollectionScopedRowKeySerializer<Field> ROW_KEY_SER =
         new CollectionScopedRowKeySerializer<>( UniqueFieldRowKeySerializer.get() );
 
@@ -79,9 +117,11 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
      * @param serializationFig The serialization configuration
      */
     @Inject
-    public UniqueValueSerializationStrategyV1Impl( final Keyspace keyspace, final CassandraFig cassandraFig,
-                                                   final SerializationFig serializationFig ) {
-        super( keyspace, cassandraFig, serializationFig );
+    public UniqueValueSerializationStrategyV1Impl(final Keyspace keyspace, final CassandraFig cassandraFig,
+                                                  final SerializationFig serializationFig,
+                                                  final Session session,
+                                                  final CassandraConfig cassandraConfig) {
+        super( keyspace, cassandraFig, serializationFig, session, cassandraConfig );
     }
 
 
@@ -113,6 +153,12 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
         return CF_UNIQUE_VALUES;
     }
 
+    @Override
+    protected TableDefinition getUniqueValuesTable(){
+
+        return uniqueValues;
+    }
+
 
     @Override
     protected MultiTenantColumnFamily<ScopedRowKey<CollectionPrefixedKey<Id>>, UniqueFieldEntry>
@@ -122,6 +168,14 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
 
 
     @Override
+    protected TableDefinition getEntityUniqueLogTable(){
+
+        return uniqueValuesLog;
+
+    }
+
+
+    @Override
     protected CollectionPrefixedKey<Field> createUniqueValueKey( final Id applicationId,
                                                                  final String type, final Field field) {
 
@@ -141,6 +195,242 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
         return rowKey.getKey().getSubKey();
     }
 
+    @Override
+    protected List<Object> deserializePartitionKey(ByteBuffer bb){
+
+
+        /**
+         *  List<Object> keys = new ArrayList<>(8);
+            keys.add(0, appUUID);
+            keys.add(1, applicationType);
+            keys.add(2, appUUID);
+            keys.add(3, applicationType);
+            keys.add(4, entityType);
+            keys.add(5, fieldType);
+            keys.add(6, fieldName);
+            keys.add(7, fieldValueString);
+
+         */
+
+        int count = 0;
+        List<Object> stuff = new ArrayList<>();
+        while(bb.hasRemaining()){
+            ByteBuffer data = CQLUtils.getWithShortLength(bb);
+            if(count == 0 || count == 2){
+                stuff.add(DataType.uuid().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
+            }else{
+                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
+            }
+            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
+            count++;
+        }
+
+        return stuff;
+
+    }
+
+    @Override
+    protected Object serializeUniqueValueLogColumn(UniqueFieldEntry fieldEntry){
+
+        /**
+         *         final UUID version = value.getVersion();
+         final Field<?> field = value.getField();
+
+         final FieldTypeName fieldType = field.getTypeName();
+         final String fieldValue = field.getValue().toString().toLowerCase();
+
+
+         DynamicComposite composite = new DynamicComposite(  );
+
+         //we want to sort ascending to descending by version
+         composite.addComponent( version,  UUID_SERIALIZER, ColumnTypes.UUID_TYPE_REVERSED);
+         composite.addComponent( field.getName(), STRING_SERIALIZER );
+         composite.addComponent( fieldValue, STRING_SERIALIZER );
+         composite.addComponent( fieldType.name() , STRING_SERIALIZER);
+         */
+
+        // values are serialized as strings, not sure why, and always lower cased
+        String fieldValueString = fieldEntry.getField().getValue().toString().toLowerCase();
+
+
+        List<Object> keys = new ArrayList<>(4);
+        keys.add(fieldEntry.getVersion());
+        keys.add(fieldEntry.getField().getName());
+        keys.add(fieldValueString);
+        keys.add(fieldEntry.getField().getTypeName().name());
+
+        String comparator = UUID_TYPE_REVERSED;
+
+        int size = 16+fieldEntry.getField().getName().length()+fieldEntry.getField().getValue().toString().length()+
+            fieldEntry.getField().getTypeName().name().length();
+
+        // we always need to add length for the 2 byte comparator short,  2 byte length short and 1 byte equality
+        size += keys.size()*65;
+
+        // uuid type comparator is longest, ensure we allocate buffer using the max size to avoid overflow
+        size += keys.size()*comparator.length();
+
+        ByteBuffer stuff = ByteBuffer.allocate(size);
+
+
+        for (Object key : keys) {
+
+            if(key.equals(fieldEntry.getVersion())) {
+                int p = comparator.indexOf("(reversed=true)");
+                boolean desc = false;
+                if (p >= 0) {
+                    comparator = comparator.substring(0, p);
+                    desc = true;
+                }
+
+                byte a = (byte) 85; // this is the byte value for UUIDType in astyanax used in legacy data
+                if (desc) {
+                    a = (byte) Character.toUpperCase((char) a);
+                }
+
+                stuff.putShort((short) ('\u8000' | a));
+            }else{
+                comparator = "UTF8Type"; // only strings are being serialized other than UUIDs here
+                stuff.putShort((short)comparator.length());
+                stuff.put(DataType.serializeValue(comparator, ProtocolVersion.NEWEST_SUPPORTED));
+            }
+
+            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
+            if (kb == null) {
+                kb = ByteBuffer.allocate(0);
+            }
+
+            // put a short that indicates how big the buffer is for this item
+            stuff.putShort((short) kb.remaining());
+
+            // put the actual item
+            stuff.put(kb.slice());
+
+            // put an equality byte ( again not used by part of legacy thrift Astyanax schema)
+            stuff.put((byte) 0);
+
+
+        }
+
+        stuff.flip();
+        return stuff.duplicate();
+
+    }
+
+    @Override
+    protected ByteBuffer getPartitionKey(Id applicationId, String entityType, String fieldType, String fieldName, Object fieldValue ){
+
+        return serializeKey(applicationId.getUuid(), applicationId.getType(),
+            entityType, fieldType, fieldName, fieldValue);
+
+    }
+
+    @Override
+    protected ByteBuffer getLogPartitionKey(final Id applicationId, final Id uniqueValueId){
+
+        return serializeLogKey(applicationId.getUuid(), applicationId.getType(),
+            uniqueValueId.getUuid(), uniqueValueId.getType());
+
+    }
+
+    @Override
+    protected ByteBuffer serializeUniqueValueColumn(EntityVersion entityVersion){
+
+        /**
+         *         final Id entityId = ev.getEntityId();
+         final UUID entityUuid = entityId.getUuid();
+         final String entityType = entityId.getType();
+
+         CompositeBuilder builder = Composites.newDynamicCompositeBuilder();
+
+         builder.addUUID( entityVersion );
+         builder.addUUID( entityUuid );
+         builder.addString(entityType );
+         */
+
+        String comparator = "UTF8Type";
+
+        List<Object> keys = new ArrayList<>(3);
+        keys.add(entityVersion.getEntityVersion());
+        keys.add(entityVersion.getEntityId().getUuid());
+        keys.add(entityVersion.getEntityId().getType());
+
+        // UUIDs are 16 bytes
+        int size = 16+16+entityVersion.getEntityId().getType().length();
+
+        // we always need to add length for the 2 byte comparator short,  2 byte length short and 1 byte equality
+        size += keys.size()*5;
+
+        // we always add comparator to the buffer as well
+        size += keys.size()*comparator.length();
+
+        ByteBuffer stuff = ByteBuffer.allocate(size);
+
+        for (Object key : keys) {
+
+            if(key instanceof UUID){
+                comparator = "UUIDType";
+            }else{
+                comparator = "UTF8Type"; // if it's not a UUID, the only other thing we're serializing is text
+            }
+
+            stuff.putShort((short)comparator.length());
+            stuff.put(DataType.serializeValue(comparator, ProtocolVersion.NEWEST_SUPPORTED));
+
+            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
+            if (kb == null) {
+                kb = ByteBuffer.allocate(0);
+            }
+
+            // put a short that indicates how big the buffer is for this item
+            stuff.putShort((short) kb.remaining());
+
+            // put the actual item
+            stuff.put(kb.slice());
+
+            // put an equality byte ( again not used by part of legacy thrift Astyanax schema)
+            stuff.put((byte) 0);
+
+
+        }
+
+        stuff.flip();
+        return stuff.duplicate();
+
+    }
+
+    @Override
+    protected List<Object> deserializeUniqueValueColumn(ByteBuffer bb){
+
+        List<Object> stuff = new ArrayList<>();
+        int count = 0;
+        while(bb.hasRemaining()){
+
+            // custom columns have a short at beginning for comparator (which we don't use here )
+            ByteBuffer comparator = CQLUtils.getWithShortLength(bb);
+
+            ByteBuffer data = CQLUtils.getWithShortLength(bb);
+
+
+            // first two composites are UUIDs, rest are strings
+            if(count == 0) {
+                stuff.add(new UUID(data.getLong(), data.getLong()));
+            }else if(count ==1){
+                stuff.add(new UUID(data.getLong(), data.getLong()));
+            }else{
+                stuff.add(DataType.text().deserialize(data.duplicate(), ProtocolVersion.NEWEST_SUPPORTED));
+            }
+
+            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
+
+            count++;
+        }
+
+        return stuff;
+
+    }
+
+
 
     @Override
     protected CollectionPrefixedKey<Id> createEntityUniqueLogKey( final Id applicationId,
@@ -163,4 +453,112 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
     public int getImplementationVersion() {
         return CollectionDataVersions.INITIAL.getVersion();
     }
+
+
+
+    private ByteBuffer serializeKey( UUID appUUID,
+                                     String applicationType,
+                                     String entityType,
+                                     String fieldType,
+                                     String fieldName,
+                                     Object fieldValue  ){
+
+        final String collectionName = LegacyScopeUtils.getCollectionScopeNameFromEntityType( entityType );
+
+//        final CollectionPrefixedKey<Field> uniquePrefixedKey =
+//            new CollectionPrefixedKey<>( collectionName, applicationId, field );
+
+//        //read back the id
+//        final Id orgId = ID_SER.fromComposite( parser );
+//        final Id scopeId = ID_SER.fromComposite( parser );
+//        final String scopeName = parser.readString();
+//        final K value = keySerializer.fromComposite( parser );
+
+
+        // values are serialized as strings, not sure why, and always lower cased
+        String fieldValueString = fieldValue.toString().toLowerCase();
+
+        List<Object> keys = new ArrayList<>(8);
+        keys.add(0, appUUID);
+        keys.add(1, applicationType);
+        keys.add(2, appUUID);
+        keys.add(3, applicationType);
+        keys.add(4, collectionName);
+        keys.add(5, fieldType);
+        keys.add(6, fieldName);
+        keys.add(7, fieldValueString);
+
+
+        // UUIDs are 16 bytes, allocate the buffer accordingly
+        int size = 16 + applicationType.length() + 16 + applicationType.length() + collectionName.length() +
+            fieldType.length() + fieldName.length()+fieldValueString.length();
+
+
+        // we always need to add length for the 2 byte short and 1 byte equality
+        size += keys.size()*3;
+
+        ByteBuffer stuff = ByteBuffer.allocate(size);
+
+        for (Object key : keys) {
+
+            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
+            if (kb == null) {
+                kb = ByteBuffer.allocate(0);
+            }
+
+            stuff.putShort((short) kb.remaining());
+            stuff.put(kb.slice());
+            stuff.put((byte) 0);
+
+
+        }
+        stuff.flip();
+        return stuff.duplicate();
+
+    }
+
+    private ByteBuffer serializeLogKey(UUID appUUID, String applicationType, UUID entityId, String entityType){
+
+
+       final String collectionName = LegacyScopeUtils.getCollectionScopeNameFromEntityType( entityType );
+//
+//
+//        final CollectionPrefixedKey<Id> collectionPrefixedEntityKey =
+//            new CollectionPrefixedKey<>( collectionName, applicationId, uniqueValueId );
+
+        List<Object> keys = new ArrayList<>(4);
+        keys.add(appUUID);
+        keys.add(applicationType);
+        keys.add(appUUID);
+        keys.add(applicationType);
+        keys.add(collectionName);
+        keys.add(entityId);
+        keys.add(entityType);
+
+        int size = 16+applicationType.length()+16+applicationType.length()+collectionName.length()+16+entityType.length();
+
+        // we always need to add length for the 2 byte short and 1 byte equality
+        size += keys.size()*3;
+
+        ByteBuffer stuff = ByteBuffer.allocate(size);
+
+        for (Object key : keys) {
+
+            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
+            if (kb == null) {
+                kb = ByteBuffer.allocate(0);
+            }
+
+            stuff.putShort((short) kb.remaining());
+            stuff.put(kb.slice());
+            stuff.put((byte) 0);
+
+
+        }
+        stuff.flip();
+        return stuff.duplicate();
+
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
index 0f233cf..4177c37 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
@@ -20,13 +20,16 @@
 package org.apache.usergrid.persistence.collection.serialization.impl;
 
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
+import java.nio.ByteBuffer;
+import java.util.*;
 
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.ProtocolVersion;
+import com.datastax.driver.core.Session;
 import org.apache.cassandra.db.marshal.BytesType;
 
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
+import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;
 import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
@@ -34,6 +37,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
+import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.field.Field;
@@ -49,6 +53,37 @@ import com.netflix.astyanax.Keyspace;
 @Singleton
 public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializationStrategyImpl<TypeField, Id> {
 
+    private static final String UNIQUE_VALUES_TABLE = CQLUtils.quote("Unique_Values_V2");
+    private static final Collection<String> UNIQUE_VALUES_PARTITION_KEYS = Collections.singletonList("key");
+    private static final Collection<String> UNIQUE_VALUES_COLUMN_KEYS = Collections.singletonList("column1");
+    private static final Map<String, DataType.Name> UNIQUE_VALUES_COLUMNS =
+        new HashMap<String, DataType.Name>() {{
+            put( "key", DataType.Name.BLOB );
+            put( "column1", DataType.Name.BLOB );
+            put( "value", DataType.Name.BLOB ); }};
+    private static final Map<String, String> UNIQUE_VALUES_CLUSTERING_ORDER =
+        new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
+
+
+    private static final String UNIQUE_VALUES_LOG_TABLE = CQLUtils.quote("Entity_Unique_Values_V2");
+    private static final Collection<String> UNIQUE_VALUES_LOG_PARTITION_KEYS = Collections.singletonList("key");
+    private static final Collection<String> UNIQUE_VALUES_LOG_COLUMN_KEYS = Collections.singletonList("column1");
+    private static final Map<String, DataType.Name> UNIQUE_VALUES_LOG_COLUMNS =
+        new HashMap<String, DataType.Name>() {{
+            put( "key", DataType.Name.BLOB );
+            put( "column1", DataType.Name.BLOB );
+            put( "value", DataType.Name.BLOB ); }};
+    private static final Map<String, String> UNIQUE_VALUES_LOG_CLUSTERING_ORDER =
+        new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
+
+    private final static TableDefinition uniqueValues =
+        new TableDefinition( UNIQUE_VALUES_TABLE, UNIQUE_VALUES_PARTITION_KEYS, UNIQUE_VALUES_COLUMN_KEYS,
+            UNIQUE_VALUES_COLUMNS, TableDefinition.CacheOption.KEYS, UNIQUE_VALUES_CLUSTERING_ORDER);
+
+    private final static TableDefinition uniqueValuesLog =
+        new TableDefinition( UNIQUE_VALUES_LOG_TABLE, UNIQUE_VALUES_LOG_PARTITION_KEYS, UNIQUE_VALUES_LOG_COLUMN_KEYS,
+            UNIQUE_VALUES_LOG_COLUMNS, TableDefinition.CacheOption.KEYS, UNIQUE_VALUES_LOG_CLUSTERING_ORDER);
+
 
     private static final ScopedRowKeySerializer<TypeField>  ROW_KEY_SER = new ScopedRowKeySerializer<>( UniqueTypeFieldRowKeySerializer.get() );
 
@@ -80,8 +115,10 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
      */
     @Inject
     public UniqueValueSerializationStrategyV2Impl( final Keyspace keyspace, final CassandraFig cassandraFig,
-                                                   final SerializationFig serializationFig ) {
-        super( keyspace, cassandraFig, serializationFig );
+                                                   final SerializationFig serializationFig,
+                                                   final Session session,
+                                                   final CassandraConfig cassandraConfig) {
+        super( keyspace, cassandraFig, serializationFig, session, cassandraConfig );
     }
 
 
@@ -104,7 +141,9 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
     @Override
     public Collection<TableDefinition> getTables() {
 
-        return Collections.emptyList();
+
+        return Arrays.asList( uniqueValues, uniqueValuesLog );
+
     }
 
     @Override
@@ -114,6 +153,12 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
 
 
     @Override
+    protected TableDefinition getUniqueValuesTable(){
+        return uniqueValues;
+    }
+
+
+    @Override
     protected MultiTenantColumnFamily<ScopedRowKey<Id>, UniqueFieldEntry>
     getEntityUniqueLogCF() {
         return CF_ENTITY_UNIQUE_VALUE_LOG;
@@ -121,6 +166,13 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
 
 
     @Override
+    protected TableDefinition getEntityUniqueLogTable(){
+        return uniqueValuesLog;
+    }
+
+
+
+    @Override
     protected TypeField createUniqueValueKey( final Id applicationId,  final String type, final Field field) {
         return new TypeField(type,field);
     }
@@ -131,6 +183,238 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
         return rowKey.getKey().getField();
     }
 
+    @Override
+    protected List<Object> deserializePartitionKey(ByteBuffer bb){
+
+
+        /**
+         *  List<Object> keys = new ArrayList<>(6);
+         keys.add(0, appUUID); // UUID
+         keys.add(1, applicationType); // String
+         keys.add(2, entityType); // String
+         keys.add(3, fieldType); // String
+         keys.add(4, fieldName); // String
+         keys.add(5, fieldValueString); // String
+
+         */
+
+        List<Object> stuff = new ArrayList<>();
+        while(bb.hasRemaining()){
+            ByteBuffer data = CQLUtils.getWithShortLength(bb);
+            if(stuff.size() == 0){
+                stuff.add(DataType.uuid().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
+            }else{
+                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
+            }
+            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
+
+        }
+
+        return stuff;
+
+    }
+
+    @Override
+    protected Object serializeUniqueValueLogColumn(UniqueFieldEntry fieldEntry){
+
+        /**
+         *         final UUID version = value.getVersion();
+         final Field<?> field = value.getField();
+
+         final FieldTypeName fieldType = field.getTypeName();
+         final String fieldValue = field.getValue().toString().toLowerCase();
+
+
+         DynamicComposite composite = new DynamicComposite(  );
+
+         //we want to sort ascending to descending by version
+         composite.addComponent( version,  UUID_SERIALIZER, ColumnTypes.UUID_TYPE_REVERSED);
+         composite.addComponent( field.getName(), STRING_SERIALIZER );
+         composite.addComponent( fieldValue, STRING_SERIALIZER );
+         composite.addComponent( fieldType.name() , STRING_SERIALIZER);
+         */
+
+        // values are serialized as strings, not sure why, and always lower cased
+        String fieldValueString = fieldEntry.getField().getValue().toString().toLowerCase();
+
+
+        List<Object> keys = new ArrayList<>(4);
+        keys.add(fieldEntry.getVersion());
+        keys.add(fieldEntry.getField().getName());
+        keys.add(fieldValueString);
+        keys.add(fieldEntry.getField().getTypeName().name());
+
+        String comparator = UUID_TYPE_REVERSED;
+
+        int size = 16+fieldEntry.getField().getName().length()+fieldEntry.getField().getValue().toString().length()+
+            fieldEntry.getField().getTypeName().name().length();
+
+        // we always need to add length for the 2 byte comparator short,  2 byte length short and 1 byte equality
+        size += keys.size()*65;
+
+        // uuid type comparator is longest, ensure we allocate buffer using the max size to avoid overflow
+        size += keys.size()*comparator.length();
+
+        ByteBuffer stuff = ByteBuffer.allocate(size);
+
+
+        for (Object key : keys) {
+
+            if(key.equals(fieldEntry.getVersion())) {
+                int p = comparator.indexOf("(reversed=true)");
+                boolean desc = false;
+                if (p >= 0) {
+                    comparator = comparator.substring(0, p);
+                    desc = true;
+                }
+
+                byte a = (byte) 85; // this is the byte value for UUIDType in astyanax used in legacy data
+                if (desc) {
+                    a = (byte) Character.toUpperCase((char) a);
+                }
+
+                stuff.putShort((short) ('\u8000' | a));
+            }else{
+                comparator = "UTF8Type"; // only strings are being serialized other than UUIDs here
+                stuff.putShort((short)comparator.length());
+                stuff.put(DataType.serializeValue(comparator, ProtocolVersion.NEWEST_SUPPORTED));
+            }
+
+            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
+            if (kb == null) {
+                kb = ByteBuffer.allocate(0);
+            }
+
+            // put a short that indicates how big the buffer is for this item
+            stuff.putShort((short) kb.remaining());
+
+            // put the actual item
+            stuff.put(kb.slice());
+
+            // put an equality byte ( again not used by part of legacy thrift Astyanax schema)
+            stuff.put((byte) 0);
+
+
+        }
+
+        stuff.flip();
+        return stuff.duplicate();
+
+    }
+
+    @Override
+    protected ByteBuffer getPartitionKey(Id applicationId, String entityType, String fieldType, String fieldName, Object fieldValue ){
+
+        return serializeKey(applicationId.getUuid(), applicationId.getType(),
+            entityType, fieldType, fieldName, fieldValue);
+
+    }
+
+    @Override
+    protected ByteBuffer getLogPartitionKey(final Id applicationId, final Id uniqueValueId){
+
+        return serializeLogKey(applicationId.getUuid(), applicationId.getType(),
+            uniqueValueId.getUuid(), uniqueValueId.getType());
+
+    }
+
+    @Override
+    protected ByteBuffer serializeUniqueValueColumn(EntityVersion entityVersion){
+
+        /**
+         *         final Id entityId = ev.getEntityId();
+         final UUID entityUuid = entityId.getUuid();
+         final String entityType = entityId.getType();
+
+         CompositeBuilder builder = Composites.newDynamicCompositeBuilder();
+
+         builder.addUUID( entityVersion );
+         builder.addUUID( entityUuid );
+         builder.addString(entityType );
+         */
+
+        String comparator = "UTF8Type";
+
+        List<Object> keys = new ArrayList<>(3);
+        keys.add(entityVersion.getEntityVersion());
+        keys.add(entityVersion.getEntityId().getUuid());
+        keys.add(entityVersion.getEntityId().getType());
+
+        // UUIDs are 16 bytes
+        int size = 16+16+entityVersion.getEntityId().getType().length();
+
+        // we always need to add length for the 2 byte comparator short,  2 byte length short and 1 byte equality
+        size += keys.size()*5;
+
+        // we always add comparator to the buffer as well
+        size += keys.size()*comparator.length();
+
+        ByteBuffer stuff = ByteBuffer.allocate(size);
+
+        for (Object key : keys) {
+
+            if(key instanceof UUID){
+                comparator = "UUIDType";
+            }else{
+                comparator = "UTF8Type"; // if it's not a UUID, the only other thing we're serializing is text
+            }
+
+            stuff.putShort((short)comparator.length());
+            stuff.put(DataType.serializeValue(comparator, ProtocolVersion.NEWEST_SUPPORTED));
+
+            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
+            if (kb == null) {
+                kb = ByteBuffer.allocate(0);
+            }
+
+            // put a short that indicates how big the buffer is for this item
+            stuff.putShort((short) kb.remaining());
+
+            // put the actual item
+            stuff.put(kb.slice());
+
+            // put an equality byte ( again not used by part of legacy thrift Astyanax schema)
+            stuff.put((byte) 0);
+
+
+        }
+
+        stuff.flip();
+        return stuff.duplicate();
+
+    }
+
+    @Override
+    protected List<Object> deserializeUniqueValueColumn(ByteBuffer bb){
+
+        List<Object> stuff = new ArrayList<>();
+        int count = 0;
+        while(bb.hasRemaining()){
+
+            // custom columns have a short at beginning for comparator (which we don't use here )
+            ByteBuffer comparator = CQLUtils.getWithShortLength(bb);
+
+            ByteBuffer data = CQLUtils.getWithShortLength(bb);
+
+
+            // first two composites are UUIDs, rest are strings
+            if(count == 0) {
+                stuff.add(new UUID(data.getLong(), data.getLong()));
+            }else if(count ==1){
+                stuff.add(new UUID(data.getLong(), data.getLong()));
+            }else{
+                stuff.add(DataType.text().deserialize(data.duplicate(), ProtocolVersion.NEWEST_SUPPORTED));
+            }
+
+            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
+
+            count++;
+        }
+
+        return stuff;
+
+    }
+
 
     @Override
     protected Id createEntityUniqueLogKey( final Id applicationId, final Id uniqueValueId ) {
@@ -142,4 +426,87 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
     public int getImplementationVersion() {
         return CollectionDataVersions.LOG_REMOVAL.getVersion();
     }
+
+
+
+    // row key = app UUID + app type + app UUID + app type + field type + field name + field value
+    private ByteBuffer serializeKey(UUID appUUID,
+                                    String applicationType,
+                                    String entityType,
+                                    String fieldType,
+                                    String fieldName,
+                                    Object fieldValue  ){
+
+        // values are serialized as strings, not sure why, and always lower cased
+        String fieldValueString = fieldValue.toString().toLowerCase();
+
+        List<Object> keys = new ArrayList<>(6);
+        keys.add(0, appUUID);
+        keys.add(1, applicationType);
+        keys.add(2, entityType);
+        keys.add(3, fieldType);
+        keys.add(4, fieldName);
+        keys.add(5, fieldValueString);
+
+
+        // UUIDs are 16 bytes, allocate the buffer accordingly
+        int size = 16 + applicationType.length() + entityType.length() + fieldType.length() + fieldName.length()+fieldValueString.length();
+
+
+        // we always need to add length for the 2 byte short and 1 byte equality
+        size += keys.size()*3;
+
+        ByteBuffer stuff = ByteBuffer.allocate(size);
+
+        for (Object key : keys) {
+
+            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
+            if (kb == null) {
+                kb = ByteBuffer.allocate(0);
+            }
+
+            stuff.putShort((short) kb.remaining());
+            stuff.put(kb.slice());
+            stuff.put((byte) 0);
+
+
+        }
+        stuff.flip();
+        return stuff.duplicate();
+
+    }
+
+    private ByteBuffer serializeLogKey(UUID appUUID, String applicationType, UUID entityId, String entityType){
+
+        List<Object> keys = new ArrayList<>(4);
+        keys.add(appUUID);
+        keys.add(applicationType);
+        keys.add(entityId);
+        keys.add(entityType);
+
+        int size = 16+applicationType.length()+16+entityType.length();
+
+        // we always need to add length for the 2 byte short and 1 byte equality
+        size += keys.size()*3;
+
+        ByteBuffer stuff = ByteBuffer.allocate(size);
+
+        for (Object key : keys) {
+
+            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
+            if (kb == null) {
+                kb = ByteBuffer.allocate(0);
+            }
+
+            stuff.putShort((short) kb.remaining());
+            stuff.put(kb.slice());
+            stuff.put((byte) 0);
+
+
+        }
+        stuff.flip();
+        return stuff.duplicate();
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/migration/MvccEntityDataMigrationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/migration/MvccEntityDataMigrationImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/migration/MvccEntityDataMigrationImpl.java
index a110ed7..8d52d8b 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/migration/MvccEntityDataMigrationImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/migration/MvccEntityDataMigrationImpl.java
@@ -26,6 +26,8 @@ import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicLong;
 
+import com.datastax.driver.core.Session;
+import org.apache.cassandra.cql.BatchStatement;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -71,6 +73,7 @@ public class MvccEntityDataMigrationImpl implements DataMigration{
     private static final Logger logger = LoggerFactory.getLogger( MvccEntityDataMigrationImpl.class );
 
     private final Keyspace keyspace;
+    private final Session session;
     private final VersionedMigrationSet<MvccEntitySerializationStrategy> allVersions;
     private final MvccEntitySerializationStrategyV3Impl mvccEntitySerializationStrategyV3;
     private final UniqueValueSerializationStrategy uniqueValueSerializationStrategy;
@@ -80,12 +83,14 @@ public class MvccEntityDataMigrationImpl implements DataMigration{
 
     @Inject
     public MvccEntityDataMigrationImpl( final Keyspace keyspace,
+                                        final Session session,
                                         final VersionedMigrationSet<MvccEntitySerializationStrategy> allVersions,
                                         final MvccEntitySerializationStrategyV3Impl mvccEntitySerializationStrategyV3,
                                         final UniqueValueSerializationStrategy uniqueValueSerializationStrategy,
                                         final MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy,
                                         final MigrationDataProvider<EntityIdScope> migrationDataProvider ) {
         this.keyspace = keyspace;
+        this.session = session;
         this.allVersions = allVersions;
         this.mvccEntitySerializationStrategyV3 = mvccEntitySerializationStrategyV3;
         this.uniqueValueSerializationStrategy = uniqueValueSerializationStrategy;
@@ -163,8 +168,9 @@ public class MvccEntityDataMigrationImpl implements DataMigration{
 
                         final List<Id> toSaveIds = new ArrayList<>( entities.size() );
 
+                    final com.datastax.driver.core.BatchStatement uniqueBatch = new com.datastax.driver.core.BatchStatement();
 
-                        for ( EntityToSaveMessage message : entities ) {
+                    for ( EntityToSaveMessage message : entities ) {
                             try {
                                 final MutationBatch entityRewrite = migration.to.write(message.scope, message.entity);
 
@@ -197,17 +203,14 @@ public class MvccEntityDataMigrationImpl implements DataMigration{
                                 // time with
                                 // no TTL so that cleanup can clean up
                                 // older values
+
+
                                 for (final Field field : EntityUtils.getUniqueFields(message.entity.getEntity().get())) {
 
                                     final UniqueValue written = new UniqueValueImpl(field, entityId, version);
 
-                                    final MutationBatch mb = uniqueValueSerializationStrategy.write(message.scope, written);
-
+                                    uniqueBatch.add(uniqueValueSerializationStrategy.writeCQL(message.scope, written, -1));
 
-                                    // merge into our
-                                    // existing mutation
-                                    // batch
-                                    totalBatch.mergeShallow(mb);
                                 }
 
 
@@ -232,7 +235,7 @@ public class MvccEntityDataMigrationImpl implements DataMigration{
 
                         }
 
-                        executeBatch( migration.to.getImplementationVersion(), totalBatch, observer, atomicLong );
+                        executeBatch( migration.to.getImplementationVersion(), totalBatch, observer, atomicLong, uniqueBatch );
 
                         //now run our cleanup task
 
@@ -252,10 +255,13 @@ public class MvccEntityDataMigrationImpl implements DataMigration{
     }
 
 
-    protected void executeBatch( final int targetVersion, final MutationBatch batch, final ProgressObserver po,
-                                 final AtomicLong count ) {
+    protected void executeBatch(final int targetVersion, final MutationBatch batch, final ProgressObserver po,
+                                final AtomicLong count, com.datastax.driver.core.BatchStatement uniqueBatch) {
         try {
+
             batch.execute();
+            session.execute(uniqueBatch);
+
 
             po.update( targetVersion, "Finished copying " + count + " entities to the new format" );
         }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommitTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommitTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommitTest.java
index ad6eac6..b18b095 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommitTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommitTest.java
@@ -1,7 +1,13 @@
 package org.apache.usergrid.persistence.collection.mvcc.stage.delete;
 
 
+import com.datastax.driver.core.Session;
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
+import org.apache.usergrid.persistence.core.test.ITRunner;
+import org.apache.usergrid.persistence.core.test.UseModules;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 
 import org.apache.usergrid.persistence.collection.MvccEntity;
@@ -32,6 +38,9 @@ import static org.mockito.Mockito.when;
 /** @author tnine */
 public class MarkCommitTest extends AbstractMvccEntityStageTest {
 
+    @Inject
+
+
     /** Standard flow */
     @Test
     public void testStartStage() throws Exception {
@@ -39,6 +48,8 @@ public class MarkCommitTest extends AbstractMvccEntityStageTest {
 
         final ApplicationScope context = mock( ApplicationScope.class );
 
+        final Session session = mock(Session.class);
+
 
         //mock returning a mock mutation when we do a log entry write
         final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
@@ -71,7 +82,7 @@ public class MarkCommitTest extends AbstractMvccEntityStageTest {
 
 
         //run the stage
-        WriteCommit newStage = new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy );
+        WriteCommit newStage = new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy, session );
 
 
         //verify the observable is correct

http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommitTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommitTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommitTest.java
index 58642d3..60281d4 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommitTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteCommitTest.java
@@ -18,7 +18,13 @@
 package org.apache.usergrid.persistence.collection.mvcc.stage.write;
 
 
+import com.datastax.driver.core.Session;
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
+import org.apache.usergrid.persistence.core.test.ITRunner;
+import org.apache.usergrid.persistence.core.test.UseModules;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 
 import org.apache.usergrid.persistence.collection.MvccEntity;
@@ -53,6 +59,8 @@ public class WriteCommitTest extends AbstractMvccEntityStageTest {
 
         final ApplicationScope context = mock( ApplicationScope.class );
 
+        final Session session = mock(Session.class);
+
 
         //mock returning a mock mutation when we do a log entry write
         final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
@@ -84,7 +92,7 @@ public class WriteCommitTest extends AbstractMvccEntityStageTest {
 
 
         //run the stage
-        WriteCommit newStage = new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy );
+        WriteCommit newStage = new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy, session );
 
 
         Entity result = newStage.call( new CollectionIoEvent<MvccEntity>( context, mvccEntityInput ) ).getEvent().getEntity().get();
@@ -116,6 +124,9 @@ public class WriteCommitTest extends AbstractMvccEntityStageTest {
         /**
          * Write up mock mutations so we don't npe on the our operations, but rather on the input
          */
+
+        final Session session = mock(Session.class);
+
         final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
         final MutationBatch logMutation = mock( MutationBatch.class );
 
@@ -131,7 +142,7 @@ public class WriteCommitTest extends AbstractMvccEntityStageTest {
         when( mvccEntityStrategy.write( any( ApplicationScope.class ), any( MvccEntity.class ) ) )
                 .thenReturn( entityMutation );
 
-        new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy ).call( event );
+        new WriteCommit( logStrategy, mvccEntityStrategy, uniqueValueStrategy, session ).call( event );
     }
 }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java
index 09876fb..3ddc14d 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerifyTest.java
@@ -18,6 +18,7 @@
 package org.apache.usergrid.persistence.collection.mvcc.stage.write;
 
 
+import com.datastax.driver.core.Session;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -59,7 +60,8 @@ public class WriteUniqueVerifyTest {
     @Rule
     public MigrationManagerRule migrationManagerRule;
 
-
+    @Inject
+    private Session session;
 
     @Inject
     private SerializationFig fig;
@@ -82,7 +84,7 @@ public class WriteUniqueVerifyTest {
         final MvccEntity mvccEntity = fromEntity( entity );
 
         // run the stage
-        WriteUniqueVerify newStage = new WriteUniqueVerify( uvstrat, fig, keyspace,cassandraConfig );
+        WriteUniqueVerify newStage = new WriteUniqueVerify( uvstrat, fig, keyspace,cassandraConfig, session );
 
        newStage.call(
             new CollectionIoEvent<>( collectionScope, mvccEntity ) ) ;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java
index fcf22cf..3ffdb65 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java
@@ -23,6 +23,8 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.UUID;
 
+import com.datastax.driver.core.BatchStatement;
+import com.datastax.driver.core.Session;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
@@ -64,6 +66,8 @@ public abstract class UniqueValueSerializationStrategyImplTest {
     @Rule
     public MigrationManagerRule migrationManagerRule;
 
+    @Inject
+    private Session session;
 
     private UniqueValueSerializationStrategy strategy;
 
@@ -91,7 +95,9 @@ public abstract class UniqueValueSerializationStrategyImplTest {
         Id entityId = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
         UUID version = UUIDGenerator.newTimeUUID();
         UniqueValue stored = new UniqueValueImpl( field, entityId, version );
-        strategy.write( scope, stored ).execute();
+        //strategy.write( scope, stored ).execute();
+        BatchStatement batch = strategy.writeCQL(scope, stored, -1);
+        session.execute(batch);
 
         UniqueValueSet fields = strategy.load( scope, entityId.getType(), Collections.<Field>singleton( field ) );
 
@@ -127,7 +133,9 @@ public abstract class UniqueValueSerializationStrategyImplTest {
         Id entityId = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
         UUID version = UUIDGenerator.newTimeUUID();
         UniqueValue stored = new UniqueValueImpl( field, entityId, version );
-        strategy.write( scope, stored, 5 ).execute();
+        //strategy.write( scope, stored, 5 ).execute();
+        BatchStatement batch = strategy.writeCQL(scope, stored, 5);
+        session.execute(batch);
 
         Thread.sleep( 1000 );
 
@@ -179,7 +187,10 @@ public abstract class UniqueValueSerializationStrategyImplTest {
         Id entityId = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
         UUID version = UUIDGenerator.newTimeUUID();
         UniqueValue stored = new UniqueValueImpl( field, entityId, version );
-        strategy.write( scope, stored ).execute();
+
+        //strategy.write( scope, stored ).execute();
+        BatchStatement batch = strategy.writeCQL( scope, stored, -1);
+        session.execute(batch);
 
         strategy.delete( scope, stored ).execute();
 
@@ -207,8 +218,9 @@ public abstract class UniqueValueSerializationStrategyImplTest {
         Id entityId = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
         UUID version = UUIDGenerator.newTimeUUID();
         UniqueValue stored = new UniqueValueImpl( field, entityId, version );
-        strategy.write( scope, stored ).execute();
-
+        //strategy.write( scope, stored ).execute();
+        BatchStatement batch = strategy.writeCQL( scope, stored, -1);
+        session.execute(batch);
 
         UniqueValueSet fields = strategy.load( scope, entityId.getType(), Collections.<Field>singleton( field ) );
 
@@ -278,9 +290,13 @@ public abstract class UniqueValueSerializationStrategyImplTest {
         UniqueValue version1Field1Value = new UniqueValueImpl( version1Field1, entityId, version1 );
         UniqueValue version1Field2Value = new UniqueValueImpl( version1Field2, entityId, version1 );
 
-        final MutationBatch batch = strategy.write( scope, version1Field1Value );
-        batch.mergeShallow( strategy.write( scope, version1Field2Value ) );
+        //final MutationBatch batch = strategy.write( scope, version1Field1Value );
+        //batch.mergeShallow( strategy.write( scope, version1Field2Value ) );
 
+        final BatchStatement batch = new BatchStatement();
+
+        batch.add(strategy.writeCQL( scope, version1Field1Value, -1));
+        batch.add(strategy.writeCQL( scope, version1Field2Value, -1));
 
         //write V2 of everything
         final UUID version2 = UUIDGenerator.newTimeUUID();
@@ -292,10 +308,15 @@ public abstract class UniqueValueSerializationStrategyImplTest {
         UniqueValue version2Field1Value = new UniqueValueImpl( version2Field1, entityId, version2 );
         UniqueValue version2Field2Value = new UniqueValueImpl( version2Field2, entityId, version2 );
 
-        batch.mergeShallow( strategy.write( scope, version2Field1Value ) );
-        batch.mergeShallow( strategy.write( scope, version2Field2Value ) );
+        //batch.mergeShallow( strategy.write( scope, version2Field1Value ) );
+        //batch.mergeShallow( strategy.write( scope, version2Field2Value ) );
+
+        batch.add(strategy.writeCQL( scope, version2Field1Value, -1));
+        batch.add(strategy.writeCQL( scope, version2Field2Value, -1));
+
+        session.execute(batch);
 
-        batch.execute();
+        //batch.execute();
 
 
         UniqueValueSet fields = strategy.load( scope, entityId.getType(), Arrays.<Field>asList( version1Field1, version1Field2 ) );


[31/38] usergrid git commit: Merge branch 'master' into datastax-cass-driver

Posted by mr...@apache.org.
Merge branch 'master' into datastax-cass-driver


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

Branch: refs/heads/master
Commit: eccb4d546f548cc66c14b7bef6f6b5272c2f4ab4
Parents: 24b4285 e4beaea
Author: Michael Russo <mr...@apigee.com>
Authored: Sun May 8 22:21:09 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun May 8 22:21:09 2016 +0800

----------------------------------------------------------------------
 .../main/resources/usergrid-default.properties  |  10 +-
 .../corepersistence/ApplicationIdCacheImpl.java |   9 +-
 .../corepersistence/CpEntityManager.java        |   4 +-
 .../index/IndexSchemaCacheFig.java              |   2 +-
 .../index/IndexSchemaCacheImpl.java             |   3 +-
 .../corepersistence/index/IndexServiceImpl.java |   1 +
 .../org/apache/usergrid/utils/StringUtils.java  |   8 +
 .../main/resources/usergrid-core-context.xml    |   6 +
 .../shard/impl/NodeShardAllocationImpl.java     |   7 +-
 .../shard/impl/ShardGroupCompactionImpl.java    |  18 +--
 .../usergrid/persistence/queue/QueueFig.java    |   4 +-
 .../queue/impl/QueueManagerFactoryImpl.java     |  27 ++--
 .../org/apache/usergrid/rest/RootResource.java  |  25 +++
 .../rest/applications/CollectionResource.java   |   8 +-
 .../apache/usergrid/rest/NotificationsIT.java   |  11 ++
 .../collection/CollectionsResourceIT.java       | 147 +++++++++++++++---
 .../events/ApplicationRequestCounterIT.java     |  48 ++++++
 .../cassandra/ManagementServiceImpl.java        |  93 ++++++------
 .../ApplicationQueueManagerCache.java           | 143 ++++++++++++++++++
 .../notifications/NotificationsService.java     |  11 +-
 .../services/notifications/QueueListener.java   |  58 ++-----
 .../services/notifications/TaskManager.java     | 117 +++++++-------
 .../impl/ApplicationQueueManagerImpl.java       | 151 +++++++++++++------
 .../services/notifiers/NotifiersService.java    |   6 +
 .../gcm/NotificationsServiceIT.java             |  77 ++++++++++
 25 files changed, 741 insertions(+), 253 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/eccb4d54/stack/config/src/main/resources/usergrid-default.properties
----------------------------------------------------------------------


[30/38] usergrid git commit: Unique Value serialization table creation now via CQL instead of Astyanax/Thrift.

Posted by mr...@apache.org.
Unique Value serialization table creation now via CQL instead of Astyanax/Thrift.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/24b42856
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/24b42856
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/24b42856

Branch: refs/heads/master
Commit: 24b42856293470f87bba701e01359a2f56a0850a
Parents: 866d11b
Author: Michael Russo <mr...@apigee.com>
Authored: Sun May 8 22:16:37 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun May 8 22:16:37 2016 +0800

----------------------------------------------------------------------
 .../corepersistence/CpEntityManagerFactory.java |  6 ++---
 .../UniqueValueSerializationStrategyImpl.java   | 26 ++------------------
 .../UniqueValueSerializationStrategyV1Impl.java | 18 +++++++++++---
 .../UniqueValueSerializationStrategyV2Impl.java | 18 ++++++++++----
 .../persistence/core/datastax/CQLUtils.java     | 12 ++++++++-
 5 files changed, 43 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/24b42856/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
index c3bcaf6..91a936d 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
@@ -530,12 +530,12 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
         // Always make sure the database schema is initialized
         getSetup().initSchema();
 
-        // Make sure the management application is created
-        initMgmtAppInternal();
-
         // Roll the new 2.x Migration classes to the latest version supported
         getSetup().runDataMigration();
 
+        // Make sure the management application is created
+        initMgmtAppInternal();
+
         // Ensure management app is initialized
         getSetup().initMgmtApp();
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/24b42856/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
index e0a9035..fe4e06f 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
@@ -361,32 +361,10 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
 
     @Override
-    public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
-
-        final MultiTenantColumnFamilyDefinition uniqueLookupCF =
-            new MultiTenantColumnFamilyDefinition( CF_UNIQUE_VALUES, BytesType.class.getSimpleName(),
-                ColumnTypes.DYNAMIC_COMPOSITE_TYPE, BytesType.class.getSimpleName(),
-                MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
-
-        final MultiTenantColumnFamilyDefinition uniqueLogCF =
-            new MultiTenantColumnFamilyDefinition( CF_ENTITY_UNIQUE_VALUE_LOG, BytesType.class.getSimpleName(),
-                ColumnTypes.DYNAMIC_COMPOSITE_TYPE, BytesType.class.getSimpleName(),
-                MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
-
-        return Arrays.asList( uniqueLookupCF, uniqueLogCF );
-    }
+    public abstract Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies();
 
     @Override
-    public Collection<TableDefinition> getTables() {
-
-        final TableDefinition uniqueValues = getUniqueValuesTable();
-
-        final TableDefinition uniqueValuesLog = getEntityUniqueLogTable();
-
-
-        return Arrays.asList( uniqueValues, uniqueValuesLog );
-
-    }
+    public abstract Collection<TableDefinition> getTables();
 
 
     /**

http://git-wip-us.apache.org/repos/asf/usergrid/blob/24b42856/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
index cbd8a3e..73df64a 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
@@ -61,10 +61,10 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
     private static final Map<String, DataType.Name> UNIQUE_VALUES_COLUMNS =
         new HashMap<String, DataType.Name>() {{
             put( "key", DataType.Name.BLOB );
-            put( "column1", DataType.Name.BLOB );
+            put( "column1", DataType.Name.CUSTOM );
             put( "value", DataType.Name.BLOB ); }};
     private static final Map<String, String> UNIQUE_VALUES_CLUSTERING_ORDER =
-        new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
+        new HashMap<String, String>(){{ put( "column1", "ASC" );}};
 
 
     private static final String UNIQUE_VALUES_LOG_TABLE = CQLUtils.quote("Entity_Unique_Values");
@@ -73,7 +73,7 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
     private static final Map<String, DataType.Name> UNIQUE_VALUES_LOG_COLUMNS =
         new HashMap<String, DataType.Name>() {{
             put( "key", DataType.Name.BLOB );
-            put( "column1", DataType.Name.BLOB );
+            put( "column1", DataType.Name.CUSTOM );
             put( "value", DataType.Name.BLOB ); }};
     private static final Map<String, String> UNIQUE_VALUES_LOG_CLUSTERING_ORDER =
         new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
@@ -138,13 +138,23 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
                 ColumnTypes.DYNAMIC_COMPOSITE_TYPE, BytesType.class.getSimpleName(),
                 MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
 
-        return Arrays.asList( uniqueLookupCF, uniqueLogCF );
+        //return Collections.emptyList();
+
+        return Arrays.asList(uniqueLookupCF, uniqueLogCF);
     }
 
     @Override
     public Collection<TableDefinition> getTables() {
 
+        final TableDefinition uniqueValues = getUniqueValuesTable();
+
+        final TableDefinition uniqueValuesLog = getEntityUniqueLogTable();
+
+
+        //return Arrays.asList( uniqueValues, uniqueValuesLog );
+
         return Collections.emptyList();
+
     }
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/24b42856/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
index 3e4932a..8e13f86 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
@@ -58,10 +58,10 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
     private static final Map<String, DataType.Name> UNIQUE_VALUES_COLUMNS =
         new HashMap<String, DataType.Name>() {{
             put( "key", DataType.Name.BLOB );
-            put( "column1", DataType.Name.BLOB );
+            put( "column1", DataType.Name.CUSTOM );
             put( "value", DataType.Name.BLOB ); }};
     private static final Map<String, String> UNIQUE_VALUES_CLUSTERING_ORDER =
-        new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
+        new HashMap<String, String>(){{ put( "column1", "ASC" );}};
 
 
     private static final String UNIQUE_VALUES_LOG_TABLE = CQLUtils.quote("Entity_Unique_Values_V2");
@@ -70,10 +70,10 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
     private static final Map<String, DataType.Name> UNIQUE_VALUES_LOG_COLUMNS =
         new HashMap<String, DataType.Name>() {{
             put( "key", DataType.Name.BLOB );
-            put( "column1", DataType.Name.BLOB );
+            put( "column1", DataType.Name.CUSTOM );
             put( "value", DataType.Name.BLOB ); }};
     private static final Map<String, String> UNIQUE_VALUES_LOG_CLUSTERING_ORDER =
-        new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
+        new HashMap<String, String>(){{ put( "column1", "ASC" );}};
 
     private final static TableDefinition uniqueValues =
         new TableDefinition( UNIQUE_VALUES_TABLE, UNIQUE_VALUES_PARTITION_KEYS, UNIQUE_VALUES_COLUMN_KEYS,
@@ -134,15 +134,23 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
                 ColumnTypes.DYNAMIC_COMPOSITE_TYPE, BytesType.class.getSimpleName(),
                 MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
 
-        return Arrays.asList( uniqueLookupCF, uniqueLogCF );
+        return Collections.emptyList();
+
+        //return Arrays.asList(uniqueLookupCF, uniqueLogCF);
     }
 
     @Override
     public Collection<TableDefinition> getTables() {
 
+        final TableDefinition uniqueValues = getUniqueValuesTable();
+
+        final TableDefinition uniqueValuesLog = getEntityUniqueLogTable();
+
 
         return Arrays.asList( uniqueValues, uniqueValuesLog );
 
+        //return Collections.emptyList();
+
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/usergrid/blob/24b42856/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
index f65a260..0d6a312 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
@@ -18,6 +18,7 @@
  */
 package org.apache.usergrid.persistence.core.datastax;
 
+import com.datastax.driver.core.DataType;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.inject.Inject;
@@ -52,6 +53,8 @@ public class CQLUtils {
     static String PAREN_LEFT = "(";
     static String PAREN_RIGHT = ")";
 
+    static String COMPOSITE_TYPE = "'org.apache.cassandra.db.marshal.DynamicCompositeType(a=>org.apache.cassandra.db.marshal.AsciiType,A=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.AsciiType),b=>org.apache.cassandra.db.marshal.BytesType,B=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.BytesType),i=>org.apache.cassandra.db.marshal.IntegerType,I=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.IntegerType),l=>org.apache.cassandra.db.marshal.LongType,L=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.LongType),s=>org.apache.cassandra.db.marshal.UTF8Type,S=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.UTF8Type),t=>org.apache.cassandra.db.marshal.TimeUUIDType,T=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.TimeUUIDType),u=>org.apache.cassandra.db.marshal.UUIDType,U=>org.apache.cassandra.db.marshal.Revers
 edType(org.apache.cassandra.db.marshal.UUIDType),x=>org.apache.cassandra.db.marshal.LexicalUUIDType,X=>org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.LexicalUUIDType))'";
+
     @Inject
     public CQLUtils ( final CassandraFig cassandraFig ){
 
@@ -145,7 +148,14 @@ public class CQLUtils {
     public static String spaceSeparatedKeyValue(Map<String, ?> columns){
 
         StringJoiner columnsSchema = new StringJoiner(",");
-        columns.forEach( (key, value) -> columnsSchema.add(key+" "+String.valueOf(value)));
+        columns.forEach( (key, value) -> {
+
+            if( value == DataType.Name.CUSTOM ){
+                columnsSchema.add(key+" "+COMPOSITE_TYPE);
+            }else {
+                columnsSchema.add(key + " " + String.valueOf(value));
+            }
+        });
 
         return columnsSchema.toString();
 


[23/38] usergrid git commit: Remove Astyanax dependencies for Scoped Cache serialization.

Posted by mr...@apache.org.
Remove Astyanax dependencies for Scoped Cache serialization.


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

Branch: refs/heads/master
Commit: f9a29e803cab3940d5e3521b16201cd95067c460
Parents: 4475158
Author: Michael Russo <mr...@apigee.com>
Authored: Sun May 1 16:57:45 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun May 1 16:57:45 2016 +0800

----------------------------------------------------------------------
 .../cache/impl/ScopedCacheSerializationImpl.java  | 18 +-----------------
 1 file changed, 1 insertion(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/f9a29e80/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
index ffa5f1f..f8dcccc 100644
--- a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
+++ b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
@@ -22,27 +22,12 @@ import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.datastax.driver.core.querybuilder.Using;
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.PropertyAccessor;
-import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Preconditions;
 import com.google.common.hash.Funnel;
-import com.google.common.hash.PrimitiveSink;
 import com.google.inject.Inject;
-import com.netflix.astyanax.Keyspace;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.Serializer;
-import com.netflix.astyanax.connectionpool.OperationResult;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.connectionpool.exceptions.NotFoundException;
-import com.netflix.astyanax.model.Column;
-import com.netflix.astyanax.model.CompositeBuilder;
-import com.netflix.astyanax.model.CompositeParser;
-import com.netflix.astyanax.serializers.ObjectSerializer;
-import com.netflix.astyanax.serializers.StringSerializer;
-import org.apache.cassandra.db.marshal.BytesType;
 import org.apache.usergrid.persistence.cache.CacheScope;
 import org.apache.usergrid.persistence.core.astyanax.*;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
@@ -55,7 +40,6 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.*;
-import java.util.concurrent.Callable;
 
 
 /**
@@ -258,7 +242,7 @@ public class ScopedCacheSerializationImpl<K,V> implements ScopedCacheSerializati
 
     }
 
-    
+
     @Override
     public void invalidate(CacheScope scope) {
 


[08/38] usergrid git commit: Fix header in TableDefinition.

Posted by mr...@apache.org.
Fix header in TableDefinition.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/25454f95
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/25454f95
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/25454f95

Branch: refs/heads/master
Commit: 25454f950f9b16eb0ede1905dfa6cc64b1530c3a
Parents: 3066ab4
Author: Michael Russo <mi...@gmail.com>
Authored: Thu Feb 11 18:23:55 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Thu Feb 11 18:23:55 2016 -0800

----------------------------------------------------------------------
 .../core/datastax/TableDefinition.java          | 30 +++++++++-----------
 1 file changed, 14 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/25454f95/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
index 0635b93..3dc3145 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
@@ -1,22 +1,20 @@
 /*
+ * 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
  *
- *  * 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.
+ *    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 org.apache.usergrid.persistence.core.datastax;


[29/38] usergrid git commit: Unique value serialization completely converted to use CQL. Complete Astyanax removal still needs to be completed.

Posted by mr...@apache.org.
Unique value serialization completely converted to use CQL.  Complete Astyanax removal still needs to be completed.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/866d11bf
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/866d11bf
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/866d11bf

Branch: refs/heads/master
Commit: 866d11bf3ecf909682f9fbc91195323f26a1e2ad
Parents: 0c60987
Author: Michael Russo <mr...@apigee.com>
Authored: Sun May 8 15:45:28 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun May 8 15:45:28 2016 +0800

----------------------------------------------------------------------
 .../EntityCollectionManagerFactoryImpl.java     |   9 +-
 .../impl/EntityCollectionManagerImpl.java       |  21 +-
 .../mvcc/stage/delete/UniqueCleanup.java        |  21 +-
 .../mvcc/stage/write/RollbackAction.java        |  44 +--
 .../mvcc/stage/write/WriteUniqueVerify.java     |  15 +-
 .../UniqueValueSerializationStrategy.java       |  19 +-
 .../impl/AllUniqueFieldsIterator.java           |  29 ++
 .../serialization/impl/EntityVersion.java       |  12 +-
 .../UniqueValueSerializationStrategyImpl.java   | 384 ++++++-------------
 ...iqueValueSerializationStrategyProxyImpl.java |  12 +-
 .../UniqueValueSerializationStrategyV1Impl.java | 125 +++---
 .../UniqueValueSerializationStrategyV2Impl.java | 109 ++++--
 .../serialization/impl/UniqueValueSetImpl.java  |   6 +-
 .../stage/write/WriteOptimisticVerifyTest.java  |  17 +-
 ...niqueValueSerializationStrategyImplTest.java |   5 +-
 15 files changed, 383 insertions(+), 445 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java
index a52ee9c..71e56f5 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java
@@ -23,6 +23,7 @@ package org.apache.usergrid.persistence.collection.impl;
 
 import java.util.concurrent.ExecutionException;
 
+import com.datastax.driver.core.Session;
 import org.apache.usergrid.persistence.collection.EntityCollectionManager;
 import org.apache.usergrid.persistence.collection.EntityCollectionManagerFactory;
 import org.apache.usergrid.persistence.collection.cache.EntityCacheFig;
@@ -75,6 +76,7 @@ public class EntityCollectionManagerFactoryImpl implements EntityCollectionManag
     private final UniqueValueSerializationStrategy uniqueValueSerializationStrategy;
     private final MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy;
     private final Keyspace keyspace;
+    private final Session session;
     private final MetricsFactory metricsFactory;
     private final RxTaskScheduler rxTaskScheduler;
 
@@ -89,7 +91,7 @@ public class EntityCollectionManagerFactoryImpl implements EntityCollectionManag
                                 entitySerializationStrategy, uniqueValueSerializationStrategy,
                                 mvccLogEntrySerializationStrategy, keyspace,
                                 metricsFactory, serializationFig,
-                                rxTaskScheduler, scope );
+                                rxTaskScheduler, scope, session );
 
                             return target;
                         }
@@ -107,7 +109,9 @@ public class EntityCollectionManagerFactoryImpl implements EntityCollectionManag
                                                final UniqueValueSerializationStrategy uniqueValueSerializationStrategy,
                                                final MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy,
                                                final Keyspace keyspace, final EntityCacheFig entityCacheFig,
-                                               final MetricsFactory metricsFactory, @CollectionExecutorScheduler  final RxTaskScheduler rxTaskScheduler ) {
+                                               final MetricsFactory metricsFactory,
+                                               @CollectionExecutorScheduler  final RxTaskScheduler rxTaskScheduler,
+                                               final Session session ) {
 
         this.writeStart = writeStart;
         this.writeVerifyUnique = writeVerifyUnique;
@@ -125,6 +129,7 @@ public class EntityCollectionManagerFactoryImpl implements EntityCollectionManag
         this.keyspace = keyspace;
         this.metricsFactory = metricsFactory;
         this.rxTaskScheduler = rxTaskScheduler;
+        this.session = session;
     }
     @Override
     public EntityCollectionManager createCollectionManager(ApplicationScope applicationScope) {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
index e71e6bb..6d42fa2 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
@@ -26,6 +26,8 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.UUID;
 
+import com.datastax.driver.core.BatchStatement;
+import com.datastax.driver.core.Session;
 import com.netflix.astyanax.model.ConsistencyLevel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -64,7 +66,6 @@ import org.apache.usergrid.persistence.core.util.ValidationUtils;
 import org.apache.usergrid.persistence.model.entity.Entity;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.field.Field;
-import org.apache.usergrid.persistence.model.util.EntityUtils;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
 
 import com.codahale.metrics.Timer;
@@ -72,7 +73,6 @@ import com.google.common.base.Preconditions;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 import com.netflix.astyanax.Keyspace;
-import com.netflix.astyanax.MutationBatch;
 import com.netflix.astyanax.connectionpool.OperationResult;
 import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
 import com.netflix.astyanax.model.ColumnFamily;
@@ -81,7 +81,6 @@ import com.netflix.astyanax.serializers.StringSerializer;
 
 import rx.Observable;
 import rx.Subscriber;
-import rx.functions.Action0;
 
 
 /**
@@ -114,6 +113,7 @@ public class EntityCollectionManagerImpl implements EntityCollectionManager {
 
 
     private final Keyspace keyspace;
+    private final Session session;
     private final Timer writeTimer;
     private final Timer deleteTimer;
     private final Timer fieldIdTimer;
@@ -136,7 +136,8 @@ public class EntityCollectionManagerImpl implements EntityCollectionManager {
                                         final MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy,
                                         final Keyspace keyspace, final MetricsFactory metricsFactory,
                                         final SerializationFig serializationFig, final RxTaskScheduler rxTaskScheduler,
-                                        @Assisted final ApplicationScope applicationScope ) {
+                                        @Assisted final ApplicationScope applicationScope,
+                                        final Session session) {
         this.uniqueValueSerializationStrategy = uniqueValueSerializationStrategy;
         this.entitySerializationStrategy = entitySerializationStrategy;
         this.uniqueCleanup = uniqueCleanup;
@@ -157,6 +158,7 @@ public class EntityCollectionManagerImpl implements EntityCollectionManager {
         this.markCommit = markCommit;
 
         this.keyspace = keyspace;
+        this.session = session;
 
 
         this.applicationScope = applicationScope;
@@ -347,8 +349,7 @@ public class EntityCollectionManagerImpl implements EntityCollectionManager {
                 //Load a entity for each entityId we retrieved.
                 final EntitySet entitySet = entitySerializationStrategy.load( applicationScope, entityIds, startTime );
 
-                //now loop through and ensure the entities are there.
-                final MutationBatch deleteBatch = keyspace.prepareMutationBatch();
+                final BatchStatement uniqueDeleteBatch = new BatchStatement();
 
                 final MutableFieldSet response = new MutableFieldSet( fields1.size() );
 
@@ -357,9 +358,8 @@ public class EntityCollectionManagerImpl implements EntityCollectionManager {
 
                     //bad unique value, delete this, it's inconsistent
                     if ( entity == null || !entity.getEntity().isPresent() ) {
-                        final MutationBatch valueDelete =
-                            uniqueValueSerializationStrategy.delete( applicationScope, expectedUnique );
-                        deleteBatch.mergeShallow( valueDelete );
+                        uniqueDeleteBatch.add(
+                            uniqueValueSerializationStrategy.deleteCQL( applicationScope, expectedUnique ));
                         continue;
                     }
 
@@ -371,8 +371,7 @@ public class EntityCollectionManagerImpl implements EntityCollectionManager {
                 }
 
                 //TODO: explore making this an Async process
-                //We'll repair it again if we have to
-                deleteBatch.execute();
+                session.execute(uniqueDeleteBatch);
 
                 return response;
             }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/UniqueCleanup.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/UniqueCleanup.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/UniqueCleanup.java
index 8aa5cfc..9f2b994 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/UniqueCleanup.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/UniqueCleanup.java
@@ -26,6 +26,8 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.UUID;
 
+import com.datastax.driver.core.BatchStatement;
+import com.datastax.driver.core.Session;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -63,6 +65,7 @@ public class UniqueCleanup
 
     private final UniqueValueSerializationStrategy uniqueValueSerializationStrategy;
     private final Keyspace keyspace;
+    private final Session session;
 
     private final SerializationFig serializationFig;
 
@@ -70,12 +73,14 @@ public class UniqueCleanup
     @Inject
     public UniqueCleanup( final SerializationFig serializationFig,
                           final UniqueValueSerializationStrategy uniqueValueSerializationStrategy,
-                          final Keyspace keyspace, final MetricsFactory metricsFactory ) {
+                          final Keyspace keyspace, final MetricsFactory metricsFactory,
+                          final Session session ) {
 
         this.serializationFig = serializationFig;
         this.uniqueValueSerializationStrategy = uniqueValueSerializationStrategy;
         this.keyspace = keyspace;
         this.uniqueCleanupTimer = metricsFactory.getTimer( UniqueCleanup.class, "uniquecleanup.base" );
+        this.session = session;
     }
 
 
@@ -127,22 +132,20 @@ public class UniqueCleanup
                             //roll them up
 
                         .doOnNext( uniqueValues -> {
-                            final MutationBatch uniqueCleanupBatch = keyspace.prepareMutationBatch();
+
+                            final BatchStatement uniqueCleanupBatch = new BatchStatement();
 
 
                             for ( UniqueValue value : uniqueValues ) {
                                 logger
                                     .debug( "Deleting value:{} from application scope: {} ", value, applicationScope );
                                 uniqueCleanupBatch
-                                    .mergeShallow( uniqueValueSerializationStrategy.delete( applicationScope, value ) );
+                                    .add( uniqueValueSerializationStrategy.deleteCQL( applicationScope, value ) );
                             }
 
-                            try {
-                                uniqueCleanupBatch.execute();
-                            }
-                            catch ( ConnectionException e ) {
-                                throw new RuntimeException( "Unable to execute batch mutation", e );
-                            }
+
+                            session.execute(uniqueCleanupBatch);
+
                         } ).lastOrDefault( Collections.emptyList() ).map( list -> mvccEntityCollectionIoEvent );
 
                 return ObservableTimer.time( uniqueValueCleanup, uniqueCleanupTimer );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/RollbackAction.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/RollbackAction.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/RollbackAction.java
index 23c6dfe..e5c4c96 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/RollbackAction.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/RollbackAction.java
@@ -18,6 +18,8 @@
 package org.apache.usergrid.persistence.collection.mvcc.stage.write;
 
 
+import com.datastax.driver.core.BatchStatement;
+import com.datastax.driver.core.Session;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,14 +53,17 @@ public class RollbackAction implements Action1<Throwable> {
 
     private final UniqueValueSerializationStrategy uniqueValueStrat;
     private final MvccLogEntrySerializationStrategy logEntryStrat;
+    private final Session session;
 
 
     @Inject
-    public RollbackAction(MvccLogEntrySerializationStrategy logEntryStrat,
-                           UniqueValueSerializationStrategy uniqueValueStrat ) {
+    public RollbackAction( final MvccLogEntrySerializationStrategy logEntryStrat,
+                           final UniqueValueSerializationStrategy uniqueValueStrat,
+                           final Session session ) {
 
         this.uniqueValueStrat = uniqueValueStrat;
         this.logEntryStrat = logEntryStrat;
+        this.session = session;
     }
 
 
@@ -72,6 +77,7 @@ public class RollbackAction implements Action1<Throwable> {
 
             // one batch to handle rollback
             MutationBatch rollbackMb = null;
+            final BatchStatement uniqueDeleteBatch = new BatchStatement();
             final Optional<Entity> entity = mvccEntity.getEntity();
 
             if ( entity.isPresent() ) {
@@ -83,45 +89,17 @@ public class RollbackAction implements Action1<Throwable> {
                         UniqueValue toDelete =
                                 new UniqueValueImpl( field, entity.get().getId(), mvccEntity.getVersion() );
 
-                        MutationBatch deleteMb = uniqueValueStrat.delete(scope,  toDelete );
+                        uniqueDeleteBatch.add(uniqueValueStrat.deleteCQL(scope,  toDelete ));
 
-                        if ( rollbackMb == null ) {
-                            rollbackMb = deleteMb;
-                        }
-                        else {
-                            rollbackMb.mergeShallow( deleteMb );
-                        }
                     }
                 }
 
-
-                if ( rollbackMb != null ) {
-                    try {
-                        rollbackMb.execute();
-                    }
-                    catch ( ConnectionException ex ) {
-                        throw new RuntimeException( "Error rolling back changes", ex );
-                    }
-                }
+                // execute the batch statements for deleting unique field entries
+                session.execute(uniqueDeleteBatch);
 
                 logEntryStrat.delete( scope, entity.get().getId(), mvccEntity.getVersion() );
             }
         }
     }
 
-
-    class FieldDeleteResult {
-
-        private final String name;
-
-
-        public FieldDeleteResult( String name ) {
-            this.name = name;
-        }
-
-
-        public String getName() {
-            return this.name;
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
index 8e0b202..501950a 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteUniqueVerify.java
@@ -25,6 +25,7 @@ import java.util.Map;
 
 import com.datastax.driver.core.BatchStatement;
 import com.datastax.driver.core.Session;
+import com.netflix.hystrix.HystrixCommandProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -68,7 +69,9 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
 
     private final UniqueValueSerializationStrategy uniqueValueStrat;
 
-    public static int uniqueVerifyPoolSize = 100;
+    private static int uniqueVerifyPoolSize = 100;
+
+    private static int uniqueVerifyTimeoutMillis= 5000;
 
     protected final SerializationFig serializationFig;
 
@@ -224,8 +227,10 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
     /**
      * Command group used for realtime user commands
      */
-    public static final HystrixCommand.Setter
-        REPLAY_GROUP = HystrixCommand.Setter.withGroupKey(
-            HystrixCommandGroupKey.Factory.asKey( "uniqueVerify" ) ).andThreadPoolPropertiesDefaults(
-                HystrixThreadPoolProperties.Setter().withCoreSize( uniqueVerifyPoolSize ) );
+    private static final HystrixCommand.Setter
+        REPLAY_GROUP = HystrixCommand.Setter.withGroupKey( HystrixCommandGroupKey.Factory.asKey( "uniqueVerify" ) )
+        .andThreadPoolPropertiesDefaults(
+            HystrixThreadPoolProperties.Setter().withCoreSize( uniqueVerifyPoolSize ) )
+        .andCommandPropertiesDefaults(
+            HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(uniqueVerifyTimeoutMillis));
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
index 56e8b87..bb6f5fe 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValueSerializationStrategy.java
@@ -41,23 +41,14 @@ public interface UniqueValueSerializationStrategy extends Migration, VersionedDa
 
 
     /**
-     * Write the specified UniqueValue to Cassandra with optional timeToLive in milliseconds.
-     *
-     * @param applicationScope scope
-     * @param uniqueValue Object to be written
-     *
-     * @return MutatationBatch that encapsulates operation, caller may or may not execute.
-     */
-
-    /**
-     * Write the specified UniqueValue to Cassandra with optional timeToLive in milliseconds.
+     * Write the specified UniqueValue to Cassandra with optional timeToLive in milliseconds. -1 is the same as no ttl
+     * (lives forever)
      *
      * @param applicationScope scope
      * @param uniqueValue Object to be written
      * @param timeToLive How long object should live in seconds.  -1 implies store forever
-     * @return MutatationBatch that encapsulates operation, caller may or may not execute.
+     * @return BatchStatement that encapsulates CQL statements, caller may or may not execute.
      */
-
     BatchStatement writeCQL(ApplicationScope applicationScope, UniqueValue uniqueValue, int timeToLive );
 
     /**
@@ -103,9 +94,9 @@ public interface UniqueValueSerializationStrategy extends Migration, VersionedDa
      *
      * @param applicationScope The scope of the application
      * @param uniqueValue Object to be deleted.
-     * @return MutatationBatch that encapsulates operation, caller may or may not execute.
+     * @return BatchStatement that encapsulates the CQL statements, caller may or may not execute.
      */
-    MutationBatch delete( ApplicationScope applicationScope, UniqueValue uniqueValue );
+    BatchStatement deleteCQL( ApplicationScope applicationScope, UniqueValue uniqueValue);
 
 
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/AllUniqueFieldsIterator.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/AllUniqueFieldsIterator.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/AllUniqueFieldsIterator.java
new file mode 100644
index 0000000..ed210e9
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/AllUniqueFieldsIterator.java
@@ -0,0 +1,29 @@
+/*
+ * 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 org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.Statement;
+import org.apache.usergrid.persistence.collection.serialization.UniqueValue;
+
+import java.util.Iterator;
+
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/EntityVersion.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/EntityVersion.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/EntityVersion.java
index 274cf5d..d451adc 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/EntityVersion.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/EntityVersion.java
@@ -42,7 +42,8 @@ public class EntityVersion {
         return entityVersion;
     }
 
-    public boolean equals( Object o ) {
+    @Override
+    public boolean equals( final Object o ) {
 
         if ( o == null || !(o instanceof EntityVersion) ) {
             return false;
@@ -60,5 +61,12 @@ public class EntityVersion {
 
         return true;
     }
-    
+
+    @Override
+    public int hashCode() {
+        int result = entityId.hashCode();
+        result = 31 * result + entityVersion.hashCode();
+        return result;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
index 27a8609..e0a9035 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
@@ -22,11 +22,10 @@ import java.nio.ByteBuffer;
 import java.util.*;
 
 import com.datastax.driver.core.*;
+import com.datastax.driver.core.Row;
 import com.datastax.driver.core.querybuilder.Clause;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.datastax.driver.core.querybuilder.Using;
-import com.netflix.astyanax.model.*;
-import com.netflix.astyanax.util.RangeBuilder;
 import org.apache.usergrid.persistence.core.CassandraConfig;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.SimpleId;
@@ -41,8 +40,6 @@ import org.apache.usergrid.persistence.collection.serialization.UniqueValue;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
 import org.apache.usergrid.persistence.core.CassandraFig;
-import org.apache.usergrid.persistence.core.astyanax.ColumnNameIterator;
-import org.apache.usergrid.persistence.core.astyanax.ColumnParser;
 import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
@@ -56,7 +53,6 @@ import com.netflix.astyanax.ColumnListMutation;
 import com.netflix.astyanax.Keyspace;
 import com.netflix.astyanax.MutationBatch;
 import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.query.RowQuery;
 
 
 /**
@@ -126,73 +122,6 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
     }
 
-
-    public MutationBatch write( final ApplicationScope collectionScope, UniqueValue value ) {
-
-
-        Preconditions.checkNotNull( value, "value is required" );
-
-
-        final Id entityId = value.getEntityId();
-        final UUID entityVersion = value.getEntityVersion();
-        final Field<?> field = value.getField();
-
-        ValidationUtils.verifyIdentity( entityId );
-        ValidationUtils.verifyVersion( entityVersion );
-
-
-        final EntityVersion ev = new EntityVersion( entityId, entityVersion );
-        final UniqueFieldEntry uniqueFieldEntry = new UniqueFieldEntry( entityVersion, field );
-
-        return doWrite( collectionScope, value, new RowOp() {
-
-            @Override
-            public void doLookup( final ColumnListMutation<EntityVersion> colMutation ) {
-                colMutation.putColumn( ev, COL_VALUE );
-            }
-
-
-            @Override
-            public void doLog( final ColumnListMutation<UniqueFieldEntry> colMutation ) {
-                colMutation.putColumn( uniqueFieldEntry, COL_VALUE );
-            }
-        } );
-    }
-
-
-    public MutationBatch write( final ApplicationScope collectionScope, final UniqueValue value,
-                                final int timeToLive ) {
-
-        Preconditions.checkNotNull( value, "value is required" );
-        Preconditions.checkArgument( timeToLive > 0, "timeToLive must be greater than 0 is required" );
-
-        final Id entityId = value.getEntityId();
-        final UUID entityVersion = value.getEntityVersion();
-        final Field<?> field = value.getField();
-
-        ValidationUtils.verifyIdentity( entityId );
-        ValidationUtils.verifyVersion( entityVersion );
-
-        final EntityVersion ev = new EntityVersion( entityId, entityVersion );
-        final UniqueFieldEntry uniqueFieldEntry = new UniqueFieldEntry( entityVersion, field );
-
-        return doWrite( collectionScope, value, new RowOp() {
-
-            @Override
-            public void doLookup( final ColumnListMutation<EntityVersion> colMutation ) {
-                colMutation.putColumn( ev, COL_VALUE, timeToLive );
-            }
-
-
-            //we purposefully leave out TTL.  Worst case we issue deletes against tombstoned columns
-            //best case, we clean up an invalid secondary index entry when the log is used
-            @Override
-            public void doLog( final ColumnListMutation<UniqueFieldEntry> colMutation ) {
-                colMutation.putColumn( uniqueFieldEntry, COL_VALUE );
-            }
-        } );
-    }
-
     @Override
     public BatchStatement writeCQL( final ApplicationScope collectionScope, final UniqueValue value,
                            final int timeToLive  ){
@@ -259,26 +188,15 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
         return batch;
 
-        /**
-         *  @Override
-        public void doLookup( final ColumnListMutation<EntityVersion> colMutation ) {
-        colMutation.putColumn( ev, COL_VALUE );
-        }
-
-
-         @Override
-         public void doLog( final ColumnListMutation<UniqueFieldEntry> colMutation ) {
-         colMutation.putColumn( uniqueFieldEntry, COL_VALUE );
-         }
-         */
     }
 
 
     @Override
-    public MutationBatch delete( final ApplicationScope scope, UniqueValue value ) {
+    public BatchStatement deleteCQL( final ApplicationScope scope, UniqueValue value){
 
         Preconditions.checkNotNull( value, "value is required" );
 
+        final BatchStatement batch = new BatchStatement();
 
         final Id entityId = value.getEntityId();
         final UUID entityVersion = value.getEntityVersion();
@@ -291,52 +209,31 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
         final EntityVersion ev = new EntityVersion( entityId, entityVersion );
         final UniqueFieldEntry uniqueFieldEntry = new UniqueFieldEntry( entityVersion, field );
 
-        return doWrite( scope, value, new RowOp() {
-
-            @Override
-            public void doLookup( final ColumnListMutation<EntityVersion> colMutation ) {
-                colMutation.deleteColumn( ev );
-            }
-
-
-            @Override
-            public void doLog( final ColumnListMutation<UniqueFieldEntry> colMutation ) {
-                colMutation.deleteColumn( uniqueFieldEntry );
-            }
-        } );
-    }
 
+        ByteBuffer partitionKey = getPartitionKey( scope.getApplication(), value.getEntityId().getType(),
+            value.getField().getTypeName().toString(), value.getField().getName(), value.getField().getValue());
 
-    /**
-     * Do the column update or delete for the given column and row key
-     *
-     * @param applicationScope We need to use this when getting the keyspace
-     * @param uniqueValue The unique value to write
-     * @param op The operation to write
-     */
-    private MutationBatch doWrite( ApplicationScope applicationScope, UniqueValue uniqueValue, RowOp op ) {
-        final MutationBatch batch = keyspace.prepareMutationBatch();
+        ByteBuffer columnValue = serializeUniqueValueColumn(ev);
 
-        final Id applicationId = applicationScope.getApplication();
+        final Clause uniqueEqKey = QueryBuilder.eq("key", partitionKey );
+        final Clause uniqueEqColumn = QueryBuilder.eq("column1", columnValue );
+        Statement uniqueDelete = QueryBuilder.delete().from(TABLE_UNIQUE_VALUES).where(uniqueEqKey).and(uniqueEqColumn);
+        batch.add(uniqueDelete);
 
-        final FieldKey fieldKey = createUniqueValueKey( applicationId, uniqueValue.getEntityId().getType(), uniqueValue.getField() );
 
 
-        op.doLookup( batch.withRow( CF_UNIQUE_VALUES, ScopedRowKey.fromKey( applicationId, fieldKey ) ) );
+        ByteBuffer logPartitionKey = getLogPartitionKey(scope.getApplication(), entityId);
+        ByteBuffer logColumnValue = serializeUniqueValueLogColumn(uniqueFieldEntry);
 
 
-        final EntityKey entityKey = createEntityUniqueLogKey( applicationId, uniqueValue.getEntityId() );
+        final Clause uniqueLogEqKey = QueryBuilder.eq("key", logPartitionKey );
+        final Clause uniqueLogEqColumn = QueryBuilder.eq("column1", logColumnValue );
 
-        op.doLog( batch.withRow( CF_ENTITY_UNIQUE_VALUE_LOG,
-            ScopedRowKey.fromKey( applicationId, entityKey ) ) );
+        Statement uniqueLogDelete = QueryBuilder.delete()
+            .from(TABLE_UNIQUE_VALUES_LOG).where(uniqueLogEqKey).and( uniqueLogEqColumn);
 
+        batch.add(uniqueLogDelete);
 
-        if ( log.isTraceEnabled() ) {
-            log.trace( "Writing unique value version={} name={} value={} ",
-                    uniqueValue.getEntityVersion(), uniqueValue.getField().getName(),
-                    uniqueValue.getField().getValue()
-                );
-        }
 
 
         return batch;
@@ -364,59 +261,6 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     }
 
 
-    private UniqueValueSet loadLegacy(final ApplicationScope appScope,
-                                      final String type, final Collection<Field> fields) throws ConnectionException {
-        final List<ScopedRowKey<FieldKey>> keys = new ArrayList<>( fields.size() );
-
-        final Id applicationId = appScope.getApplication();
-
-        for ( Field field : fields ) {
-
-            final FieldKey key = createUniqueValueKey( applicationId, type,  field );
-
-
-            final ScopedRowKey<FieldKey> rowKey =
-                ScopedRowKey.fromKey( applicationId, key );
-
-            keys.add( rowKey );
-        }
-
-        final UniqueValueSetImpl uniqueValueSet = new UniqueValueSetImpl( fields.size() );
-
-        Iterator<com.netflix.astyanax.model.Row<ScopedRowKey<FieldKey>, EntityVersion>> results =
-            keyspace.prepareQuery( CF_UNIQUE_VALUES ).setConsistencyLevel(com.netflix.astyanax.model.ConsistencyLevel.CL_LOCAL_QUORUM ).getKeySlice( keys )
-                .withColumnRange( new RangeBuilder().setLimit( 1 ).build() ).execute().getResult().iterator();
-
-
-        while ( results.hasNext() )
-
-        {
-
-            final com.netflix.astyanax.model.Row<ScopedRowKey<FieldKey>, EntityVersion> unique = results.next();
-
-
-            final Field field = parseRowKey( unique.getKey() );
-
-            final Iterator<Column<EntityVersion>> columnList = unique.getColumns().iterator();
-
-            //sanity check, nothing to do, skip it
-            if ( !columnList.hasNext() ) {
-                continue;
-            }
-
-            final EntityVersion entityVersion = columnList.next().getName();
-
-
-            final UniqueValueImpl uniqueValue =
-                new UniqueValueImpl( field, entityVersion.getEntityId(), entityVersion.getEntityVersion() );
-
-            uniqueValueSet.addValue( uniqueValue );
-        }
-
-        return uniqueValueSet;
-
-    }
-
     private UniqueValueSet loadCQL( final ApplicationScope appScope, final com.datastax.driver.core.ConsistencyLevel consistencyLevel,
                                 final String type, final Collection<Field> fields ) throws ConnectionException {
 
@@ -460,7 +304,6 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
             List<Object> keyContents = deserializePartitionKey(partitionKey);
             List<Object> columnContents = deserializeUniqueValueColumn(column);
 
-            Field field = null;
             FieldTypeName fieldType;
             String name;
             String value;
@@ -478,29 +321,8 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
             }
 
-            switch ( fieldType ) {
-                case BOOLEAN:
-                    field = new BooleanField( name, Boolean.parseBoolean( value ) );
-                    break;
-                case DOUBLE:
-                    field = new DoubleField( name, Double.parseDouble( value ) );
-                    break;
-                case FLOAT:
-                    field = new FloatField( name, Float.parseFloat( value ) );
-                    break;
-                case INTEGER:
-                    field =  new IntegerField( name, Integer.parseInt( value ) );
-                    break;
-                case LONG:
-                    field = new LongField( name, Long.parseLong( value ) );
-                    break;
-                case STRING:
-                    field = new StringField( name, value );
-                    break;
-                case UUID:
-                    field = new UUIDField( name, UUID.fromString( value ) );
-                    break;
-            }
+            Field field = getField(name, value, fieldType);
+
 
             final EntityVersion entityVersion = new EntityVersion(
                 new SimpleId((UUID)columnContents.get(1), (String)columnContents.get(2)), (UUID)columnContents.get(0));
@@ -526,59 +348,17 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
         Preconditions.checkNotNull( entityId, "entity id is required" );
 
 
-        final Id applicationId = collectionScope.getApplication();
-
-        final EntityKey entityKey = createEntityUniqueLogKey( applicationId, entityId );
-
-
-        final ScopedRowKey<EntityKey> rowKey =
-            ScopedRowKey.fromKey( applicationId, entityKey );
-
-
-        RowQuery<ScopedRowKey<EntityKey>, UniqueFieldEntry> query =
-            keyspace.prepareQuery( CF_ENTITY_UNIQUE_VALUE_LOG ).getKey( rowKey )
-                    .withColumnRange( ( UniqueFieldEntry ) null, null, false, serializationFig.getBufferSize() );
-
-        return new ColumnNameIterator( query, new UniqueEntryParser( entityId ), false );
-    }
+        Clause inKey = QueryBuilder.in("key", getLogPartitionKey(collectionScope.getApplication(), entityId));
 
+        Statement statement = QueryBuilder.select().all().from(TABLE_UNIQUE_VALUES_LOG)
+            .where(inKey);
 
-    /**
-     * Simple callback to perform puts and deletes with a common row setup code
-     */
-    private interface RowOp {
+        return new AllUniqueFieldsIterator(session, statement, entityId);
 
-        /**
-         * Execute the mutation into the lookup CF_UNIQUE_VALUES row
-         */
-        void doLookup( ColumnListMutation<EntityVersion> colMutation );
 
-        /**
-         * Execute the mutation into the lCF_ENTITY_UNIQUE_VALUESLUE row
-         */
-        void doLog( ColumnListMutation<UniqueFieldEntry> colMutation );
     }
 
 
-    /**
-     * Converts raw columns to the expected output
-     */
-    private static final class UniqueEntryParser implements ColumnParser<UniqueFieldEntry, UniqueValue> {
-
-        private final Id entityId;
-
-
-        private UniqueEntryParser( final Id entityId ) {this.entityId = entityId;}
-
-
-        @Override
-        public UniqueValue parseColumn( final Column<UniqueFieldEntry> column ) {
-            final UniqueFieldEntry entry = column.getName();
-
-            return new UniqueValueImpl( entry.getField(), entityId, entry.getVersion() );
-        }
-    }
-
 
     @Override
     public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
@@ -621,27 +401,9 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
     protected abstract TableDefinition getUniqueValuesTable();
 
 
-    /**
-     * Generate a key that is compatible with the column family
-     *
-     * @param applicationId The applicationId
-     * @param type The type in the field
-     * @param field The field we're creating the key for
-     */
-    protected abstract FieldKey createUniqueValueKey(final Id applicationId, final String type, final Field field );
-
-    /**
-     * Parse the row key into the field
-     * @param rowKey
-     * @return
-     */
-    protected abstract Field parseRowKey(final ScopedRowKey<FieldKey> rowKey);
-
-
     protected abstract List<Object> deserializePartitionKey(ByteBuffer bb);
 
-
-    protected abstract Object serializeUniqueValueLogColumn(UniqueFieldEntry fieldEntry);
+    protected abstract ByteBuffer serializeUniqueValueLogColumn(UniqueFieldEntry fieldEntry);
 
     protected abstract ByteBuffer getPartitionKey(Id applicationId, String entityType, String fieldType, String fieldName, Object fieldValue );
 
@@ -651,6 +413,8 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
 
     protected abstract List<Object> deserializeUniqueValueColumn(ByteBuffer bb);
 
+    protected abstract List<Object> deserializeUniqueValueLogColumn(ByteBuffer bb);
+
 
 
 
@@ -672,4 +436,100 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
      * @param uniqueValueId The uniqueValue
      */
     protected abstract EntityKey createEntityUniqueLogKey(final Id applicationId,  final Id uniqueValueId );
+
+
+    public class AllUniqueFieldsIterator implements Iterable<UniqueValue>, Iterator<UniqueValue> {
+
+        private final Session session;
+        private final Statement query;
+        private final Id entityId;
+
+        private Iterator<Row> sourceIterator;
+
+
+
+        public AllUniqueFieldsIterator( final Session session, final Statement query, final Id entityId){
+
+            this.session = session;
+            this.query = query;
+            this.entityId = entityId;
+
+        }
+
+
+        @Override
+        public Iterator<UniqueValue> iterator() {
+            return this;
+        }
+
+        @Override
+        public boolean hasNext() {
+
+            if ( sourceIterator == null ) {
+
+                advanceIterator();
+
+                return sourceIterator.hasNext();
+            }
+
+            return sourceIterator.hasNext();
+        }
+
+        @Override
+        public UniqueValue next() {
+
+            com.datastax.driver.core.Row next = sourceIterator.next();
+
+            ByteBuffer column = next.getBytesUnsafe("column1");
+
+            List<Object> columnContents = deserializeUniqueValueLogColumn(column);
+
+            UUID version = (UUID) columnContents.get(0);
+            String name = (String) columnContents.get(1);
+            String value = (String) columnContents.get(2);
+            FieldTypeName fieldType = FieldTypeName.valueOf((String) columnContents.get(3));
+
+
+            return new UniqueValueImpl(getField(name, value, fieldType), entityId, version);
+
+        }
+
+        private void advanceIterator() {
+
+            sourceIterator = session.execute(query).iterator();
+        }
+    }
+
+    private Field getField( String name, String value, FieldTypeName fieldType){
+
+        Field field = null;
+
+        switch ( fieldType ) {
+            case BOOLEAN:
+                field = new BooleanField( name, Boolean.parseBoolean( value ) );
+                break;
+            case DOUBLE:
+                field = new DoubleField( name, Double.parseDouble( value ) );
+                break;
+            case FLOAT:
+                field = new FloatField( name, Float.parseFloat( value ) );
+                break;
+            case INTEGER:
+                field =  new IntegerField( name, Integer.parseInt( value ) );
+                break;
+            case LONG:
+                field = new LongField( name, Long.parseLong( value ) );
+                break;
+            case STRING:
+                field = new StringField( name, value );
+                break;
+            case UUID:
+                field = new UUIDField( name, UUID.fromString( value ) );
+                break;
+        }
+
+        return field;
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
index bbfaa2d..dc5b48f 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
@@ -125,19 +125,19 @@ public class UniqueValueSerializationStrategyProxyImpl implements UniqueValueSer
 
 
     @Override
-    public MutationBatch delete( final ApplicationScope applicationScope, final UniqueValue uniqueValue ) {
+    public BatchStatement deleteCQL( final ApplicationScope applicationScope, final UniqueValue uniqueValue ) {
         final MigrationRelationship<UniqueValueSerializationStrategy> migration = getMigrationRelationShip();
 
         if ( migration.needsMigration() ) {
-            final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
+            final BatchStatement batch = new BatchStatement();
 
-            aggregateBatch.mergeShallow( migration.from.delete( applicationScope, uniqueValue ) );
-            aggregateBatch.mergeShallow( migration.to.delete( applicationScope, uniqueValue ) );
+            batch.add(migration.from.deleteCQL( applicationScope, uniqueValue ) );
+            batch.add(migration.to.deleteCQL( applicationScope, uniqueValue ) );
 
-            return aggregateBatch;
+            return batch;
         }
 
-        return migration.to.delete( applicationScope, uniqueValue );
+        return migration.to.deleteCQL( applicationScope, uniqueValue );
     }
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
index 75666fa..cbd8a3e 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
@@ -176,26 +176,6 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
 
 
     @Override
-    protected CollectionPrefixedKey<Field> createUniqueValueKey( final Id applicationId,
-                                                                 final String type, final Field field) {
-
-
-        final String collectionName = LegacyScopeUtils.getCollectionScopeNameFromEntityType( type );
-
-
-        final CollectionPrefixedKey<Field> uniquePrefixedKey =
-            new CollectionPrefixedKey<>( collectionName, applicationId, field );
-
-        return uniquePrefixedKey;
-    }
-
-
-    @Override
-    protected Field parseRowKey( final ScopedRowKey<CollectionPrefixedKey<Field>> rowKey ) {
-        return rowKey.getKey().getSubKey();
-    }
-
-    @Override
     protected List<Object> deserializePartitionKey(ByteBuffer bb){
 
 
@@ -230,23 +210,23 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
     }
 
     @Override
-    protected Object serializeUniqueValueLogColumn(UniqueFieldEntry fieldEntry){
+    protected ByteBuffer serializeUniqueValueLogColumn(UniqueFieldEntry fieldEntry){
 
         /**
-         *         final UUID version = value.getVersion();
-         final Field<?> field = value.getField();
+         *  final UUID version = value.getVersion();
+            final Field<?> field = value.getField();
 
-         final FieldTypeName fieldType = field.getTypeName();
-         final String fieldValue = field.getValue().toString().toLowerCase();
+             final FieldTypeName fieldType = field.getTypeName();
+             final String fieldValue = field.getValue().toString().toLowerCase();
 
 
-         DynamicComposite composite = new DynamicComposite(  );
+             DynamicComposite composite = new DynamicComposite(  );
 
-         //we want to sort ascending to descending by version
-         composite.addComponent( version,  UUID_SERIALIZER, ColumnTypes.UUID_TYPE_REVERSED);
-         composite.addComponent( field.getName(), STRING_SERIALIZER );
-         composite.addComponent( fieldValue, STRING_SERIALIZER );
-         composite.addComponent( fieldType.name() , STRING_SERIALIZER);
+             //we want to sort ascending to descending by version
+             composite.addComponent( version,  UUID_SERIALIZER, ColumnTypes.UUID_TYPE_REVERSED);
+             composite.addComponent( field.getName(), STRING_SERIALIZER );
+             composite.addComponent( fieldValue, STRING_SERIALIZER );
+             composite.addComponent( fieldType.name() , STRING_SERIALIZER);
          */
 
         // values are serialized as strings, not sure why, and always lower cased
@@ -337,15 +317,15 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
     protected ByteBuffer serializeUniqueValueColumn(EntityVersion entityVersion){
 
         /**
-         *         final Id entityId = ev.getEntityId();
-         final UUID entityUuid = entityId.getUuid();
-         final String entityType = entityId.getType();
+         *  final Id entityId = ev.getEntityId();
+            final UUID entityUuid = entityId.getUuid();
+            final String entityType = entityId.getType();
 
-         CompositeBuilder builder = Composites.newDynamicCompositeBuilder();
+            CompositeBuilder builder = Composites.newDynamicCompositeBuilder();
 
-         builder.addUUID( entityVersion );
-         builder.addUUID( entityUuid );
-         builder.addString(entityType );
+            builder.addUUID( entityVersion );
+            builder.addUUID( entityUuid );
+            builder.addString(entityType );
          */
 
         String comparator = "UTF8Type";
@@ -418,7 +398,49 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
             }else if(count ==1){
                 stuff.add(new UUID(data.getLong(), data.getLong()));
             }else{
-                stuff.add(DataType.text().deserialize(data.duplicate(), ProtocolVersion.NEWEST_SUPPORTED));
+                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
+            }
+
+            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
+
+            count++;
+        }
+
+        return stuff;
+
+    }
+
+    @Override
+    protected List<Object> deserializeUniqueValueLogColumn(ByteBuffer bb){
+
+
+        /**
+         *  List<Object> keys = new ArrayList<>(4);
+            keys.add(fieldEntry.getVersion());
+            keys.add(fieldEntry.getField().getName());
+            keys.add(fieldValueString);
+            keys.add(fieldEntry.getField().getTypeName().name());
+         */
+
+        List<Object> stuff = new ArrayList<>();
+        int count = 0;
+        while(bb.hasRemaining()){
+
+            // the comparator info is different for the UUID reversed type vs. UTF8 type
+            if(count ==0){
+                bb.getShort(); // take the reversed comparator byte off
+            }else {
+                ByteBuffer comparator = CQLUtils.getWithShortLength(bb);
+            }
+
+            ByteBuffer data = CQLUtils.getWithShortLength(bb);
+
+
+            // first composite is a UUID, rest are strings
+            if(count == 0) {
+                stuff.add(new UUID(data.getLong(), data.getLong()));
+            }else{
+                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
             }
 
             byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
@@ -465,15 +487,15 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
 
         final String collectionName = LegacyScopeUtils.getCollectionScopeNameFromEntityType( entityType );
 
-//        final CollectionPrefixedKey<Field> uniquePrefixedKey =
-//            new CollectionPrefixedKey<>( collectionName, applicationId, field );
-
-//        //read back the id
-//        final Id orgId = ID_SER.fromComposite( parser );
-//        final Id scopeId = ID_SER.fromComposite( parser );
-//        final String scopeName = parser.readString();
-//        final K value = keySerializer.fromComposite( parser );
+        /**
+            final CollectionPrefixedKey<Field> uniquePrefixedKey =
+                new CollectionPrefixedKey<>( collectionName, applicationId, field );
 
+            final Id orgId = ID_SER.fromComposite( parser );
+            final Id scopeId = ID_SER.fromComposite( parser );
+            final String scopeName = parser.readString();
+            final K value = keySerializer.fromComposite( parser );
+        **/
 
         // values are serialized as strings, not sure why, and always lower cased
         String fieldValueString = fieldValue.toString().toLowerCase();
@@ -521,10 +543,11 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
 
 
        final String collectionName = LegacyScopeUtils.getCollectionScopeNameFromEntityType( entityType );
-//
-//
-//        final CollectionPrefixedKey<Id> collectionPrefixedEntityKey =
-//            new CollectionPrefixedKey<>( collectionName, applicationId, uniqueValueId );
+
+      /**
+            final CollectionPrefixedKey<Id> collectionPrefixedEntityKey =
+                new CollectionPrefixedKey<>( collectionName, applicationId, uniqueValueId );
+       **/
 
         List<Object> keys = new ArrayList<>(4);
         keys.add(appUUID);

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
index 4177c37..3e4932a 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
@@ -40,7 +40,6 @@ import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.Id;
-import org.apache.usergrid.persistence.model.field.Field;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -171,30 +170,18 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
     }
 
 
-
-    @Override
-    protected TypeField createUniqueValueKey( final Id applicationId,  final String type, final Field field) {
-        return new TypeField(type,field);
-    }
-
-
-    @Override
-    protected Field parseRowKey( final ScopedRowKey<TypeField> rowKey ) {
-        return rowKey.getKey().getField();
-    }
-
     @Override
     protected List<Object> deserializePartitionKey(ByteBuffer bb){
 
 
         /**
-         *  List<Object> keys = new ArrayList<>(6);
-         keys.add(0, appUUID); // UUID
-         keys.add(1, applicationType); // String
-         keys.add(2, entityType); // String
-         keys.add(3, fieldType); // String
-         keys.add(4, fieldName); // String
-         keys.add(5, fieldValueString); // String
+         *   List<Object> keys = new ArrayList<>(6);
+             keys.add(0, appUUID); // UUID
+             keys.add(1, applicationType); // String
+             keys.add(2, entityType); // String
+             keys.add(3, fieldType); // String
+             keys.add(4, fieldName); // String
+             keys.add(5, fieldValueString); // String
 
          */
 
@@ -215,23 +202,23 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
     }
 
     @Override
-    protected Object serializeUniqueValueLogColumn(UniqueFieldEntry fieldEntry){
+    protected ByteBuffer serializeUniqueValueLogColumn(UniqueFieldEntry fieldEntry){
 
         /**
-         *         final UUID version = value.getVersion();
-         final Field<?> field = value.getField();
+         *   final UUID version = value.getVersion();
+             final Field<?> field = value.getField();
 
-         final FieldTypeName fieldType = field.getTypeName();
-         final String fieldValue = field.getValue().toString().toLowerCase();
+             final FieldTypeName fieldType = field.getTypeName();
+             final String fieldValue = field.getValue().toString().toLowerCase();
 
 
-         DynamicComposite composite = new DynamicComposite(  );
+             DynamicComposite composite = new DynamicComposite(  );
 
-         //we want to sort ascending to descending by version
-         composite.addComponent( version,  UUID_SERIALIZER, ColumnTypes.UUID_TYPE_REVERSED);
-         composite.addComponent( field.getName(), STRING_SERIALIZER );
-         composite.addComponent( fieldValue, STRING_SERIALIZER );
-         composite.addComponent( fieldType.name() , STRING_SERIALIZER);
+             //we want to sort ascending to descending by version
+             composite.addComponent( version,  UUID_SERIALIZER, ColumnTypes.UUID_TYPE_REVERSED);
+             composite.addComponent( field.getName(), STRING_SERIALIZER );
+             composite.addComponent( fieldValue, STRING_SERIALIZER );
+             composite.addComponent( fieldType.name() , STRING_SERIALIZER);
          */
 
         // values are serialized as strings, not sure why, and always lower cased
@@ -250,7 +237,7 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
             fieldEntry.getField().getTypeName().name().length();
 
         // we always need to add length for the 2 byte comparator short,  2 byte length short and 1 byte equality
-        size += keys.size()*65;
+        size += keys.size()*5;
 
         // uuid type comparator is longest, ensure we allocate buffer using the max size to avoid overflow
         size += keys.size()*comparator.length();
@@ -322,15 +309,15 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
     protected ByteBuffer serializeUniqueValueColumn(EntityVersion entityVersion){
 
         /**
-         *         final Id entityId = ev.getEntityId();
-         final UUID entityUuid = entityId.getUuid();
-         final String entityType = entityId.getType();
+         *   final Id entityId = ev.getEntityId();
+             final UUID entityUuid = entityId.getUuid();
+             final String entityType = entityId.getType();
 
-         CompositeBuilder builder = Composites.newDynamicCompositeBuilder();
+             CompositeBuilder builder = Composites.newDynamicCompositeBuilder();
 
-         builder.addUUID( entityVersion );
-         builder.addUUID( entityUuid );
-         builder.addString(entityType );
+             builder.addUUID( entityVersion );
+             builder.addUUID( entityUuid );
+             builder.addString(entityType );
          */
 
         String comparator = "UTF8Type";
@@ -403,7 +390,49 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
             }else if(count ==1){
                 stuff.add(new UUID(data.getLong(), data.getLong()));
             }else{
-                stuff.add(DataType.text().deserialize(data.duplicate(), ProtocolVersion.NEWEST_SUPPORTED));
+                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
+            }
+
+            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
+
+            count++;
+        }
+
+        return stuff;
+
+    }
+
+    @Override
+    protected List<Object> deserializeUniqueValueLogColumn(ByteBuffer bb){
+
+
+        /**
+         *   List<Object> keys = new ArrayList<>(4);
+             keys.add(fieldEntry.getVersion());
+             keys.add(fieldEntry.getField().getName());
+             keys.add(fieldValueString);
+             keys.add(fieldEntry.getField().getTypeName().name());
+         */
+
+        List<Object> stuff = new ArrayList<>();
+        int count = 0;
+        while(bb.hasRemaining()){
+
+            // the comparator info is different for the UUID reversed type vs. UTF8 type
+            if(count ==0){
+                bb.getShort(); // take the reversed comparator byte off
+            }else {
+                ByteBuffer comparator = CQLUtils.getWithShortLength(bb);
+            }
+
+            ByteBuffer data = CQLUtils.getWithShortLength(bb);
+
+
+            // first composite is a UUID, rest are strings
+            if(count == 0) {
+                stuff.add(new UUID(data.getLong(), data.getLong()));
+            }else{
+                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
             }
 
             byte equality = bb.get(); // we don't use this but take the equality byte off the buffer

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSetImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSetImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSetImpl.java
index 8dd9528..853913b 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSetImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSetImpl.java
@@ -37,7 +37,11 @@ public class UniqueValueSetImpl implements UniqueValueSet {
 
 
     public void addValue(UniqueValue value){
-        values.put( value.getField().getName(), value );
+        values.putIfAbsent( value.getField().getName(), value );
+        // ^^ putIfAbsent important here as CQL returns column values differently than Asytanax/thrift due to CQL not
+        //    having a 'column range' for each row slice and all columns are returned. We don't want to overwrite the
+        //    first column values retrieved
+
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteOptimisticVerifyTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteOptimisticVerifyTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteOptimisticVerifyTest.java
index 6a705e4..148cc09 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteOptimisticVerifyTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteOptimisticVerifyTest.java
@@ -21,7 +21,12 @@ package org.apache.usergrid.persistence.collection.mvcc.stage.write;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.datastax.driver.core.BatchStatement;
+import com.datastax.driver.core.Session;
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.test.ITRunner;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,8 +58,6 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
-
-
 @UseModules( TestCollectionModule.class )
 public class WriteOptimisticVerifyTest extends AbstractMvccEntityStageTest {
 
@@ -110,6 +113,7 @@ public class WriteOptimisticVerifyTest extends AbstractMvccEntityStageTest {
         when( scope.getApplication() )
             .thenReturn( new SimpleId( UUIDGenerator.newTimeUUID(), "organization" ) );
 
+        final Session session = mock(Session.class);
 
         // there is an entity
         final Entity entity = generateEntity();
@@ -135,16 +139,13 @@ public class WriteOptimisticVerifyTest extends AbstractMvccEntityStageTest {
         UniqueValueSerializationStrategy uvstrat = mock( UniqueValueSerializationStrategy.class);
         UniqueValue uv1 = new UniqueValueImpl(entity.getField("name"), entity.getId(), entity.getVersion());
         UniqueValue uv2 = new UniqueValueImpl(  entity.getField("identifier"), entity.getId(), entity.getVersion());
-        MutationBatch mb = mock( MutationBatch.class );
-        when( uvstrat.delete(scope, uv1) ).thenReturn(mb);
-        when( uvstrat.delete(scope, uv2) ).thenReturn(mb);
 
         // Run the stage, conflict should be detected
         final MvccEntity mvccEntity = fromEntity( entity );
         boolean conflictDetected = false;
 
         WriteOptimisticVerify newStage = new WriteOptimisticVerify( mvccLog );
-        RollbackAction rollbackAction = new RollbackAction( mvccLog, uvstrat );
+        RollbackAction rollbackAction = new RollbackAction( mvccLog, uvstrat, session );
 
         try {
             newStage.call( new CollectionIoEvent<>(scope, mvccEntity));
@@ -157,8 +158,8 @@ public class WriteOptimisticVerifyTest extends AbstractMvccEntityStageTest {
         assertTrue( conflictDetected );
 
         // check that unique values were deleted
-        verify( uvstrat, times(1) ).delete(scope,  uv1 );
-        verify( uvstrat, times(1) ).delete(scope,  uv2 );
+        verify( uvstrat, times(1) ).deleteCQL(scope,  uv1 );
+        verify( uvstrat, times(1) ).deleteCQL(scope,  uv2 );
     }
 
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/866d11bf/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java
index 3ffdb65..185cfb7 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java
@@ -192,7 +192,10 @@ public abstract class UniqueValueSerializationStrategyImplTest {
         BatchStatement batch = strategy.writeCQL( scope, stored, -1);
         session.execute(batch);
 
-        strategy.delete( scope, stored ).execute();
+
+        //strategy.delete( scope, stored ).execute();
+        BatchStatement deleteBatch = strategy.deleteCQL(scope, stored);
+        session.execute(deleteBatch);
 
         UniqueValueSet fields = strategy.load( scope, entityId.getType(), Collections.<Field>singleton( field ) );
 


[11/38] usergrid git commit: Fix issues with adding getTables() to Migration interface.

Posted by mr...@apache.org.
Fix issues with adding getTables() to Migration interface.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/29814ef5
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/29814ef5
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/29814ef5

Branch: refs/heads/master
Commit: 29814ef50f47254e45371f355c1c1065ebf1aac4
Parents: df7d2ff
Author: Michael Russo <mi...@gmail.com>
Authored: Fri Feb 12 19:15:33 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Fri Feb 12 19:15:33 2016 -0800

----------------------------------------------------------------------
 .../cache/impl/ScopedCacheSerializationImpl.java      | 10 +++++++++-
 .../impl/UniqueValueSerializationStrategyImpl.java    | 14 ++++++++------
 .../core/datastax/impl/DatastaxClusterImpl.java       |  2 --
 .../core/migration/schema/MigrationManagerImpl.java   |  5 +----
 .../impl/EdgeMetadataSerializationProxyImpl.java      |  6 ++++++
 .../impl/EdgeMetadataSerializationV1Impl.java         |  8 ++++++++
 .../impl/EdgeMetadataSerializationV2Impl.java         | 14 ++++++++------
 .../serialization/impl/NodeSerializationImpl.java     |  7 +++++++
 .../impl/shard/impl/EdgeShardSerializationImpl.java   |  7 +++++++
 .../impl/shard/impl/SizebasedEdgeColumnFamilies.java  |  8 ++++++++
 .../usergrid/persistence/map/MapManagerTest.java      |  2 +-
 11 files changed, 63 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/29814ef5/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
index 1f763b2..cf835c8 100644
--- a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
+++ b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
@@ -39,6 +39,7 @@ import com.netflix.astyanax.serializers.StringSerializer;
 import org.apache.cassandra.db.marshal.BytesType;
 import org.apache.usergrid.persistence.cache.CacheScope;
 import org.apache.usergrid.persistence.core.astyanax.*;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.shard.ExpandingShardLocator;
 import org.apache.usergrid.persistence.core.shard.StringHashUtils;
 import org.slf4j.Logger;
@@ -47,6 +48,7 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.concurrent.Callable;
 
 
@@ -284,7 +286,13 @@ public class ScopedCacheSerializationImpl<K,V> implements ScopedCacheSerializati
                 BytesType.class.getSimpleName(),
                 MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
 
-        return Arrays.asList(scopedCache);
+        return Collections.singletonList(scopedCache);
+    }
+
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
     }
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/29814ef5/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
index 1795511..197fd4e 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
@@ -18,13 +18,9 @@
 package org.apache.usergrid.persistence.collection.serialization.impl;
 
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
 
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -379,6 +375,12 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey>
         return Arrays.asList( uniqueLookupCF, uniqueLogCF );
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
+
 
     /**
      * Get the column family for the unique fields

http://git-wip-us.apache.org/repos/asf/usergrid/blob/29814ef5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
index 5fc804b..43e2eb2 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
@@ -150,8 +150,6 @@ public class DataStaxClusterImpl implements DataStaxCluster {
         logger.info("Updating application keyspace with the following CQL: {}", updateApplicationKeyspace);
         clusterSession.executeAsync(updateApplicationKeyspace);
 
-        // this session pool is only used when running database setup so close it when finished to clear resources
-        clusterSession.close();
 
         waitForSchemaAgreement();
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/29814ef5/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
index 39a78b7..d746482 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
@@ -91,7 +91,7 @@ public class MigrationManagerImpl implements MigrationManager {
                     continue;
                 }
 
-                if (columnFamilies != null && columnFamilies.isEmpty()) {
+                if (columnFamilies != null && !columnFamilies.isEmpty()) {
                     for (MultiTenantColumnFamilyDefinition cf : columnFamilies) {
                         testAndCreateColumnFamilyDef(cf);
                     }
@@ -182,9 +182,6 @@ public class MigrationManagerImpl implements MigrationManager {
         logger.info("Updating application keyspace with the following CQL: {}", updateApplicationKeyspace);
         clusterSession.executeAsync(updateApplicationKeyspace);
 
-        // this session pool is only used when running database setup so close it when finished to clear resources
-        clusterSession.close();
-
         waitForSchemaAgreement();
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/29814ef5/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java
index 44d0b73..46acd1c 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationProxyImpl.java
@@ -26,6 +26,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -288,6 +289,11 @@ public class EdgeMetadataSerializationProxyImpl implements EdgeMetadataSerializa
         return Collections.EMPTY_LIST;
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
 
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/29814ef5/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
index da4d044..870ba16 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV1Impl.java
@@ -22,6 +22,7 @@ package org.apache.usergrid.persistence.graph.serialization.impl;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 
 import org.apache.cassandra.db.marshal.BytesType;
@@ -36,6 +37,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefi
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 import org.apache.usergrid.persistence.core.astyanax.StringColumnParser;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.schema.Migration;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.util.ValidationUtils;
@@ -376,6 +378,12 @@ public class EdgeMetadataSerializationV1Impl implements EdgeMetadataSerializatio
                 graphCf( CF_SOURCE_EDGE_ID_TYPES ), graphCf( CF_TARGET_EDGE_ID_TYPES ) );
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
+
 
     /**
      * Helper to generate an edge definition by the type

http://git-wip-us.apache.org/repos/asf/usergrid/blob/29814ef5/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
index 2af62a8..1aa86cc 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/EdgeMetadataSerializationV2Impl.java
@@ -22,12 +22,7 @@
 package org.apache.usergrid.persistence.graph.serialization.impl;
 
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
 
 import org.apache.cassandra.db.marshal.BytesType;
 import org.apache.cassandra.db.marshal.UTF8Type;
@@ -42,6 +37,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiRowColumnIterator;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.StringColumnParser;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.schema.Migration;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.shard.ExpandingShardLocator;
@@ -470,6 +466,12 @@ public class EdgeMetadataSerializationV2Impl implements EdgeMetadataSerializatio
                 graphCf( CF_SOURCE_EDGE_ID_TYPES ), graphCf( CF_TARGET_EDGE_ID_TYPES ) );
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
+
 
     /**
      * Helper to generate an edge definition by the type

http://git-wip-us.apache.org/repos/asf/usergrid/blob/29814ef5/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
index cd803e8..8a2da54 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/NodeSerializationImpl.java
@@ -38,6 +38,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.schema.Migration;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.util.ValidationUtils;
@@ -110,6 +111,12 @@ public class NodeSerializationImpl implements NodeSerialization, Migration {
                         MultiTenantColumnFamilyDefinition.CacheOption.ALL ) );
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
+
 
     @Override
     public MutationBatch mark( final ApplicationScope scope, final Id node, final long timestamp ) {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/29814ef5/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
index 120a15c..8730950 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/EdgeShardSerializationImpl.java
@@ -34,6 +34,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.util.ValidationUtils;
 import org.apache.usergrid.persistence.graph.GraphFig;
@@ -173,6 +174,12 @@ public class EdgeShardSerializationImpl implements EdgeShardSerialization {
                         MultiTenantColumnFamilyDefinition.CacheOption.KEYS ) );
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
+
 
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/29814ef5/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java
index 9185ac8..f4e19d6 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/serialization/impl/shard/impl/SizebasedEdgeColumnFamilies.java
@@ -23,6 +23,7 @@ package org.apache.usergrid.persistence.graph.serialization.impl.shard.impl;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 
 import org.apache.cassandra.db.marshal.BytesType;
 import org.apache.cassandra.db.marshal.DynamicCompositeType;
@@ -32,6 +33,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.DirectedEdge;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeColumnFamilies;
 import org.apache.usergrid.persistence.graph.serialization.impl.shard.EdgeRowKey;
@@ -143,6 +145,12 @@ public class SizebasedEdgeColumnFamilies implements EdgeColumnFamilies {
                                 MultiTenantColumnFamilyDefinition.CacheOption.ALL ) );
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
+
 
     /**
      * Helper to generate an edge definition by the type

http://git-wip-us.apache.org/repos/asf/usergrid/blob/29814ef5/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java b/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
index 1ce0a40..2a68247 100644
--- a/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
+++ b/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
@@ -27,7 +27,7 @@ import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
 import org.junit.Before;
-\import org.junit.Rule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 


[14/38] usergrid git commit: Let the keyspace be created only if database/setup is called. Maybe later add option for auto-keyspace creation.

Posted by mr...@apache.org.
Let the keyspace be created only if database/setup is called.  Maybe later add option for auto-keyspace creation.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/65e873e0
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/65e873e0
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/65e873e0

Branch: refs/heads/master
Commit: 65e873e0ddae370f07af84824225b1a59f7c1a19
Parents: ecbd495
Author: Michael Russo <mi...@gmail.com>
Authored: Sat Feb 13 10:23:33 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Sat Feb 13 10:23:33 2016 -0800

----------------------------------------------------------------------
 .../persistence/core/datastax/impl/DatastaxClusterImpl.java         | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/65e873e0/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
index e15475e..702c1e3 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
@@ -52,7 +52,6 @@ public class DataStaxClusterImpl implements DataStaxCluster {
             cluster.getConfiguration().getPoolingOptions().getIdleTimeoutSeconds(),
             cluster.getConfiguration().getPoolingOptions().getPoolTimeoutMillis() / 1000);
 
-        createOrUpdateKeyspace();
 
     }
 


[17/38] usergrid git commit: Move CassandraFig outside of Astyanax package. Update handling of protocol version for datastax cluster.

Posted by mr...@apache.org.
Move CassandraFig outside of Astyanax package.  Update handling of protocol version for datastax cluster.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/75cc3a43
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/75cc3a43
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/75cc3a43

Branch: refs/heads/master
Commit: 75cc3a43edf3bb6efe32b715823a30872453358b
Parents: bb225e8
Author: Michael Russo <mi...@gmail.com>
Authored: Sun Feb 14 18:36:03 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Sun Feb 14 18:36:03 2016 -0800

----------------------------------------------------------------------
 .../index/ApplicationIndexLocationStrategy.java |   2 +-
 .../index/IndexLocationStrategyFactoryImpl.java |   2 +-
 .../index/ManagementIndexLocationStrategy.java  |   2 +-
 .../cassandra/AstyanaxLockManagerImpl.java      |   1 +
 .../persistence/cassandra/CassandraService.java |   3 +-
 .../corepersistence/index/IndexNamingTest.java  |   2 +-
 .../MvccEntitySerializationStrategyImpl.java    |   2 +-
 .../MvccEntitySerializationStrategyV1Impl.java  |   2 +-
 .../MvccEntitySerializationStrategyV2Impl.java  |   2 +-
 .../MvccEntitySerializationStrategyV3Impl.java  |   2 +-
 .../serialization/impl/SettingsValidation.java  |   2 +-
 .../UniqueValueSerializationStrategyImpl.java   |   2 +-
 .../UniqueValueSerializationStrategyV1Impl.java |   2 +-
 .../UniqueValueSerializationStrategyV2Impl.java |   2 +-
 ...MvccEntitySerializationStrategyImplTest.java |   2 +-
 .../MvccEntitySerializationStrategyV2Test.java  |   2 +-
 .../impl/SettingsValidationTest.java            |   2 +-
 .../usergrid/persistence/core/CassandraFig.java | 218 +++++++++++++++++++
 .../core/astyanax/CassandraClusterImpl.java     |   1 +
 .../core/astyanax/CassandraConfigImpl.java      |   1 +
 .../persistence/core/astyanax/CassandraFig.java | 213 ------------------
 .../persistence/core/datastax/CQLUtils.java     |  11 +-
 .../core/datastax/impl/DatastaxClusterImpl.java |  29 ++-
 .../persistence/core/guice/CommonModule.java    |   1 +
 .../migration/schema/MigrationManagerImpl.java  |   3 +-
 .../core/astyanax/ColumnNameIteratorTest.java   |   2 +-
 .../MultiKeyColumnNameIteratorTest.java         |   4 +-
 .../astyanax/MultiRowColumnIteratorTest.java    |   3 +-
 .../persistence/core/datastax/CQLUtilsTest.java |   4 +-
 .../core/datastax/DatastaxClusterTest.java      |   3 +-
 .../persistence/index/impl/EntityIndexTest.java |   2 +-
 .../persistence/index/impl/GeoPagingTest.java   |   2 +-
 .../index/impl/IndexLoadTestsIT.java            |   2 +-
 .../index/impl/TestIndexIdentifier.java         |   3 +-
 .../queue/impl/SNSQueueManagerImpl.java         |   2 +-
 35 files changed, 285 insertions(+), 253 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ApplicationIndexLocationStrategy.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ApplicationIndexLocationStrategy.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ApplicationIndexLocationStrategy.java
index e13566d..53d2144 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ApplicationIndexLocationStrategy.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ApplicationIndexLocationStrategy.java
@@ -19,7 +19,7 @@
  */
 package org.apache.usergrid.corepersistence.index;
 
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.guicyfig.ClusterFig;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.index.IndexAlias;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexLocationStrategyFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexLocationStrategyFactoryImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexLocationStrategyFactoryImpl.java
index 6a99890..93fb677 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexLocationStrategyFactoryImpl.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexLocationStrategyFactoryImpl.java
@@ -21,7 +21,7 @@ package org.apache.usergrid.corepersistence.index;
 
 import com.google.inject.Inject;
 import org.apache.usergrid.corepersistence.util.CpNamingUtils;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.guicyfig.ClusterFig;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.index.IndexFig;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ManagementIndexLocationStrategy.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ManagementIndexLocationStrategy.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ManagementIndexLocationStrategy.java
index 1e13bbf..ffa02cf 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ManagementIndexLocationStrategy.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ManagementIndexLocationStrategy.java
@@ -20,7 +20,7 @@
 package org.apache.usergrid.corepersistence.index;
 
 import org.apache.usergrid.corepersistence.util.CpNamingUtils;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.guicyfig.ClusterFig;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.index.IndexAlias;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/core/src/main/java/org/apache/usergrid/locking/cassandra/AstyanaxLockManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/locking/cassandra/AstyanaxLockManagerImpl.java b/stack/core/src/main/java/org/apache/usergrid/locking/cassandra/AstyanaxLockManagerImpl.java
index a69aee2..f767042 100644
--- a/stack/core/src/main/java/org/apache/usergrid/locking/cassandra/AstyanaxLockManagerImpl.java
+++ b/stack/core/src/main/java/org/apache/usergrid/locking/cassandra/AstyanaxLockManagerImpl.java
@@ -33,6 +33,7 @@ import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.usergrid.locking.Lock;
 import org.apache.usergrid.locking.LockManager;
 import org.apache.usergrid.locking.LockPathBuilder;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/CassandraService.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/CassandraService.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/CassandraService.java
index 2431533..2de41bf 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/CassandraService.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/CassandraService.java
@@ -17,7 +17,6 @@
 package org.apache.usergrid.persistence.cassandra;
 
 
-import com.google.inject.Inject;
 import com.google.inject.Injector;
 import me.prettyprint.cassandra.connection.HConnectionManager;
 import me.prettyprint.cassandra.model.ConfigurableConsistencyLevel;
@@ -36,7 +35,7 @@ import me.prettyprint.hector.api.query.ColumnQuery;
 import me.prettyprint.hector.api.query.QueryResult;
 import me.prettyprint.hector.api.query.SliceQuery;
 import org.apache.usergrid.locking.LockManager;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.hector.CountingMutator;
 import org.apache.usergrid.utils.MapUtils;
 import org.slf4j.Logger;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/IndexNamingTest.java
----------------------------------------------------------------------
diff --git a/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/IndexNamingTest.java b/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/IndexNamingTest.java
index 4fea8e2..1661af4 100644
--- a/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/IndexNamingTest.java
+++ b/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/IndexNamingTest.java
@@ -23,7 +23,7 @@ import com.google.inject.Inject;
 import net.jcip.annotations.NotThreadSafe;
 import org.apache.usergrid.corepersistence.TestIndexModule;
 import org.apache.usergrid.corepersistence.util.CpNamingUtils;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.guicyfig.ClusterFig;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.scope.ApplicationScopeImpl;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
index 3e2d391..2d7892a 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
@@ -41,7 +41,7 @@ import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImp
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
 import org.apache.usergrid.persistence.collection.serialization.impl.util.LegacyScopeUtils;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.ColumnNameIterator;
 import org.apache.usergrid.persistence.core.astyanax.ColumnParser;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV1Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV1Impl.java
index 9e29e9c..ee548e3 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV1Impl.java
@@ -26,7 +26,7 @@ import java.util.UUID;
 import org.apache.usergrid.persistence.collection.MvccEntity;
 import org.apache.usergrid.persistence.collection.exception.DataCorruptionException;
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV2Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV2Impl.java
index 13d9613..e9b0781 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV2Impl.java
@@ -29,7 +29,7 @@ import org.apache.usergrid.persistence.collection.MvccEntity;
 import org.apache.usergrid.persistence.collection.exception.DataCorruptionException;
 import org.apache.usergrid.persistence.collection.exception.EntityTooLargeException;
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.FieldBuffer;
 import org.apache.usergrid.persistence.core.astyanax.FieldBufferBuilder;
 import org.apache.usergrid.persistence.core.astyanax.FieldBufferParser;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
index 2fa5d09..ecd0f5c 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
@@ -32,7 +32,7 @@ import org.apache.usergrid.persistence.collection.exception.EntityTooLargeExcept
 import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.ColumnParser;
 import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SettingsValidation.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SettingsValidation.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SettingsValidation.java
index 6715cfb..0f3f6b9 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SettingsValidation.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SettingsValidation.java
@@ -21,7 +21,7 @@ package org.apache.usergrid.persistence.collection.serialization.impl;
 
 
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 
 import com.google.common.base.Preconditions;
 import com.google.inject.Inject;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
index 197fd4e..0f27167 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java
@@ -30,7 +30,7 @@ import org.apache.usergrid.persistence.collection.serialization.SerializationFig
 import org.apache.usergrid.persistence.collection.serialization.UniqueValue;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.ColumnNameIterator;
 import org.apache.usergrid.persistence.core.astyanax.ColumnParser;
 import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
index dafbf2b..2235f63 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
@@ -28,7 +28,7 @@ import org.apache.cassandra.db.marshal.BytesType;
 
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
 import org.apache.usergrid.persistence.collection.serialization.impl.util.LegacyScopeUtils;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;
 import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
index 17b8b37..0f233cf 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
@@ -27,7 +27,7 @@ import java.util.Collections;
 import org.apache.cassandra.db.marshal.BytesType;
 
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.ColumnTypes;
 import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
index f6720f9..ef3aabd 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
@@ -33,7 +33,7 @@ import org.junit.Test;
 import org.apache.usergrid.persistence.collection.MvccEntity;
 import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.guice.MigrationManagerRule;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.scope.ApplicationScopeImpl;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV2Test.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV2Test.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV2Test.java
index f8b65d9..2dca27d 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV2Test.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV2Test.java
@@ -36,7 +36,7 @@ import org.apache.usergrid.persistence.collection.exception.EntityTooLargeExcept
 import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
 import org.apache.usergrid.persistence.collection.util.EntityHelper;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.guicyfig.SetConfigTestBypass;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.scope.ApplicationScopeImpl;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SettingsValidationTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SettingsValidationTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SettingsValidationTest.java
index 273bec0..cf700f3 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SettingsValidationTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SettingsValidationTest.java
@@ -23,7 +23,7 @@ package org.apache.usergrid.persistence.collection.serialization.impl;
 import org.junit.Test;
 
 import org.apache.usergrid.persistence.collection.serialization.SerializationFig;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
new file mode 100644
index 0000000..7a2a9d1
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
@@ -0,0 +1,218 @@
+/*
+ * 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 org.apache.usergrid.persistence.core;
+
+
+import org.safehaus.guicyfig.Default;
+import org.safehaus.guicyfig.FigSingleton;
+import org.safehaus.guicyfig.GuicyFig;
+import org.safehaus.guicyfig.Key;
+
+
+/**
+ * Cassandra configuration interface.
+ */
+@FigSingleton
+public interface CassandraFig extends GuicyFig {
+
+    // cassndra properties used by datastax driver
+    String READ_CL = "cassandra.readcl";
+    String WRITE_CL = "cassandra.writecl";
+    String STRATEGY = "cassandra.strategy";
+    String STRATEGY_OPTIONS = "cassandra.strategy.options";
+
+    // main application cassandra properties
+    String ASTYANAX_READ_CONSISTENT_CL = "usergrid.consistent.read.cl";
+    String ASTYANAX_READ_CL = "usergrid.read.cl";
+    String ASTYANAX_WRITE_CL = "usergrid.write.cl";
+    String SHARD_VALUES = "cassandra.shardvalues";
+    String THRIFT_TRANSPORT_SIZE = "cassandra.thrift.transport.frame";
+
+    // locks cassandra properties
+    String LOCKS_KEYSPACE_NAME = "cassandra.lock.keyspace";
+    String LOCKS_KEYSPACE_REPLICATION = "cassandra.lock.keyspace.replication";
+    String LOCKS_KEYSPACE_STRATEGY = "cassandra.lock.keyspace.strategy";
+    String LOCKS_CL = "cassandra.lock.cl";
+    String LOCKS_SHARED_POOL_FLAG = "cassandra.lock.use_shared_pool";
+    String LOCKS_CONNECTIONS = "cassandra.lock.connections";
+    String LOCKS_EXPIRATION = "cassandra.lock.expiration.milliseconds";
+
+
+
+
+    // re-usable default values
+    String DEFAULT_CONNECTION_POOLSIZE = "15";
+    String DEFAULT_LOCKS_EXPIRATION = "3600000";  // 1 hour
+    String DEFAULT_LOCAL_DC = "";
+    String DEFAULT_USERNAME = "";
+    String DEFAULT_PASSWORD = "";
+
+
+    @Key( "cassandra.hosts" )
+    String getHosts();
+
+    /**
+     * Valid options are 1.2, 2.0, 2.1
+     *
+     * @return
+     */
+    @Key( "cassandra.version" )
+    @Default( "2.1" )
+    String getVersion();
+
+    @Key( "cassandra.cluster_name" )
+    @Default( "Usergrid" )
+    String getClusterName();
+
+    @Key( "cassandra.keyspace.application" )
+    @Default( "Usergrid_Applications" )
+    String getApplicationKeyspace();
+
+    @Key( "cassandra.port" )
+    @Default( "9160" )
+    int getThriftPort();
+
+    @Key( "cassandra.username" )
+    @Default( DEFAULT_USERNAME )
+    String getUsername();
+
+    @Key( "cassandra.password" )
+    @Default( DEFAULT_PASSWORD )
+    String getPassword();
+
+    @Key( "cassandra.datacenter.local" )
+    @Default( DEFAULT_LOCAL_DC )
+    String getLocalDataCenter();
+
+    @Key( "cassandra.connections" )
+    @Default( DEFAULT_CONNECTION_POOLSIZE )
+    int getConnections();
+
+    @Key( "cassandra.timeout" )
+    @Default( "10000" )
+    int getTimeout();
+
+    @Key( "cassandra.timeout.pool" )
+    @Default( "5000" )
+    int getPoolTimeout();
+
+    @Key("cassandra.discovery")
+    @Default( "RING_DESCRIBE" )
+    String getDiscoveryType();
+
+
+    @Default("CL_LOCAL_QUORUM")
+    @Key(ASTYANAX_READ_CL)
+    String getAstyanaxReadCL();
+
+    @Default("CL_QUORUM")
+    @Key(ASTYANAX_READ_CONSISTENT_CL)
+    String getAstyanaxConsistentReadCL();
+
+    @Default("CL_LOCAL_QUORUM")
+    @Key(ASTYANAX_WRITE_CL)
+    String getAstyanaxWriteCL();
+
+
+    @Default("LOCAL_QUORUM")
+    @Key(READ_CL)
+    String getReadCl();
+
+    @Default("LOCAL_QUORUM")
+    @Key(WRITE_CL)
+    String getWriteCl();
+
+    @Default("SimpleStrategy")
+    @Key( STRATEGY )
+    String getStrategy();
+
+    @Default("replication_factor:1")
+    @Key( STRATEGY_OPTIONS )
+    String getStrategyOptions();
+
+    /**
+     * Return the history of all shard values which are immutable.  For instance, if shard values
+     * are initially set to 20 (the default) then increased to 40, the property should contain the string of
+     * "20, 40" so that we can read historic data.
+     *
+     * @return
+     */
+    @Default("20")
+    @Key(SHARD_VALUES)
+    String getShardValues();
+
+    /**
+     * Get the thrift transport size.  Should be set to what is on the cassandra servers.  As we move to CQL, this will become obsolete
+     * @return
+     */
+    @Key( THRIFT_TRANSPORT_SIZE)
+    @Default( "15728640" )
+    int getThriftBufferSize();
+
+
+    /**
+     * Returns the name of the keyspace that should be used for Locking
+     */
+    @Key( LOCKS_KEYSPACE_NAME )
+    @Default("Locks")
+    String getLocksKeyspace();
+
+    /**
+     * Returns the Astyanax consistency level for writing a Lock
+     */
+    @Key(LOCKS_CL)
+    @Default("CL_LOCAL_QUORUM")
+    String getLocksCl();
+
+    /**
+     * Returns a flag on whether or not to share the connection pool with other keyspaces
+     */
+    @Key( LOCKS_SHARED_POOL_FLAG )
+    @Default("true")
+    boolean useSharedPoolForLocks();
+
+    /**
+     * Returns a flag on whether or not to share the connection pool with other keyspaces
+     */
+    @Key( LOCKS_CONNECTIONS )
+    @Default( DEFAULT_CONNECTION_POOLSIZE )
+    int getConnectionsLocks();
+
+    /**
+     * Returns a flag on whether or not to share the connection pool with other keyspaces
+     */
+    @Key( LOCKS_KEYSPACE_REPLICATION )
+    @Default("replication_factor:1")
+    String getLocksKeyspaceReplication();
+
+    /**
+     * Returns a flag on whether or not to share the connection pool with other keyspaces
+     */
+    @Key( LOCKS_KEYSPACE_STRATEGY )
+    @Default( "org.apache.cassandra.locator.SimpleStrategy" )
+    String getLocksKeyspaceStrategy();
+
+    /**
+     * Return the expiration that should be used for expiring a lock if it's not released
+     */
+    @Key( LOCKS_EXPIRATION )
+    @Default(DEFAULT_LOCKS_EXPIRATION)
+    int getLocksExpiration();
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraClusterImpl.java
index cc52f1b..b433ecc 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraClusterImpl.java
@@ -35,6 +35,7 @@ import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl;
 import com.netflix.astyanax.connectionpool.impl.Slf4jConnectionPoolMonitorImpl;
 import com.netflix.astyanax.impl.AstyanaxConfigurationImpl;
 import com.netflix.astyanax.thrift.ThriftFamilyFactory;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
index 15f434c..0135c95 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
@@ -26,6 +26,7 @@ import java.beans.PropertyChangeListener;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.netflix.astyanax.model.ConsistencyLevel;
+import org.apache.usergrid.persistence.core.CassandraFig;
 
 
 /**

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java
deleted file mode 100644
index 78c4fbc..0000000
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * 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 org.apache.usergrid.persistence.core.astyanax;
-
-
-import org.safehaus.guicyfig.Default;
-import org.safehaus.guicyfig.FigSingleton;
-import org.safehaus.guicyfig.GuicyFig;
-import org.safehaus.guicyfig.Key;
-
-
-/**
- * Cassandra configuration interface.
- */
-@FigSingleton
-public interface CassandraFig extends GuicyFig {
-
-    // cassndra properties used by datastax driver
-    String READ_CL = "cassandra.readcl";
-    String WRITE_CL = "cassandra.writecl";
-    String STRATEGY = "cassandra.strategy";
-    String STRATEGY_OPTIONS = "cassandra.strategy.options";
-
-    // main application cassandra properties
-    String ASTYANAX_READ_CONSISTENT_CL = "usergrid.consistent.read.cl";
-    String ASTYANAX_READ_CL = "usergrid.read.cl";
-    String ASTYANAX_WRITE_CL = "usergrid.write.cl";
-    String SHARD_VALUES = "cassandra.shardvalues";
-    String THRIFT_TRANSPORT_SIZE = "cassandra.thrift.transport.frame";
-
-    // locks cassandra properties
-    String LOCKS_KEYSPACE_NAME = "cassandra.lock.keyspace";
-    String LOCKS_KEYSPACE_REPLICATION = "cassandra.lock.keyspace.replication";
-    String LOCKS_KEYSPACE_STRATEGY = "cassandra.lock.keyspace.strategy";
-    String LOCKS_CL = "cassandra.lock.cl";
-    String LOCKS_SHARED_POOL_FLAG = "cassandra.lock.use_shared_pool";
-    String LOCKS_CONNECTIONS = "cassandra.lock.connections";
-    String LOCKS_EXPIRATION = "cassandra.lock.expiration.milliseconds";
-
-
-
-
-    // re-usable default values
-    String DEFAULT_CONNECTION_POOLSIZE = "15";
-    String DEFAULT_LOCKS_EXPIRATION = "3600000";  // 1 hour
-    String DEFAULT_LOCAL_DC = "";
-    String DEFAULT_USERNAME = "";
-    String DEFAULT_PASSWORD = "";
-
-
-    @Key( "cassandra.hosts" )
-    String getHosts();
-
-    @Key( "cassandra.version" )
-    @Default( "2.1" )
-    String getVersion();
-
-    @Key( "cassandra.cluster_name" )
-    @Default( "Usergrid" )
-    String getClusterName();
-
-    @Key( "cassandra.keyspace.application" )
-    @Default( "Usergrid_Applications" )
-    String getApplicationKeyspace();
-
-    @Key( "cassandra.port" )
-    @Default( "9160" )
-    int getThriftPort();
-
-    @Key( "cassandra.username" )
-    @Default( DEFAULT_USERNAME )
-    String getUsername();
-
-    @Key( "cassandra.password" )
-    @Default( DEFAULT_PASSWORD )
-    String getPassword();
-
-    @Key( "cassandra.datacenter.local" )
-    @Default( DEFAULT_LOCAL_DC )
-    String getLocalDataCenter();
-
-    @Key( "cassandra.connections" )
-    @Default( DEFAULT_CONNECTION_POOLSIZE )
-    int getConnections();
-
-    @Key( "cassandra.timeout" )
-    @Default( "10000" )
-    int getTimeout();
-
-    @Key( "cassandra.timeout.pool" )
-    @Default( "5000" )
-    int getPoolTimeout();
-
-    @Key("cassandra.discovery")
-    @Default( "RING_DESCRIBE" )
-    String getDiscoveryType();
-
-
-    @Default("CL_LOCAL_QUORUM")
-    @Key(ASTYANAX_READ_CL)
-    String getAstyanaxReadCL();
-
-    @Default("CL_QUORUM")
-    @Key(ASTYANAX_READ_CONSISTENT_CL)
-    String getAstyanaxConsistentReadCL();
-
-    @Default("CL_LOCAL_QUORUM")
-    @Key(ASTYANAX_WRITE_CL)
-    String getAstyanaxWriteCL();
-
-
-    @Default("LOCAL_QUORUM")
-    @Key(READ_CL)
-    String getReadCl();
-
-    @Default("LOCAL_QUORUM")
-    @Key(WRITE_CL)
-    String getWriteCl();
-
-    @Default("SimpleStrategy")
-    @Key( STRATEGY )
-    String getStrategy();
-
-    @Default("replication_factor:1")
-    @Key( STRATEGY_OPTIONS )
-    String getStrategyOptions();
-
-    /**
-     * Return the history of all shard values which are immutable.  For instance, if shard values
-     * are initially set to 20 (the default) then increased to 40, the property should contain the string of
-     * "20, 40" so that we can read historic data.
-     *
-     * @return
-     */
-    @Default("20")
-    @Key(SHARD_VALUES)
-    String getShardValues();
-
-    /**
-     * Get the thrift transport size.  Should be set to what is on the cassandra servers.  As we move to CQL, this will become obsolete
-     * @return
-     */
-    @Key( THRIFT_TRANSPORT_SIZE)
-    @Default( "15728640" )
-    int getThriftBufferSize();
-
-
-    /**
-     * Returns the name of the keyspace that should be used for Locking
-     */
-    @Key( LOCKS_KEYSPACE_NAME )
-    @Default("Locks")
-    String getLocksKeyspace();
-
-    /**
-     * Returns the Astyanax consistency level for writing a Lock
-     */
-    @Key(LOCKS_CL)
-    @Default("CL_LOCAL_QUORUM")
-    String getLocksCl();
-
-    /**
-     * Returns a flag on whether or not to share the connection pool with other keyspaces
-     */
-    @Key( LOCKS_SHARED_POOL_FLAG )
-    @Default("true")
-    boolean useSharedPoolForLocks();
-
-    /**
-     * Returns a flag on whether or not to share the connection pool with other keyspaces
-     */
-    @Key( LOCKS_CONNECTIONS )
-    @Default( DEFAULT_CONNECTION_POOLSIZE )
-    int getConnectionsLocks();
-
-    /**
-     * Returns a flag on whether or not to share the connection pool with other keyspaces
-     */
-    @Key( LOCKS_KEYSPACE_REPLICATION )
-    @Default("replication_factor:1")
-    String getLocksKeyspaceReplication();
-
-    /**
-     * Returns a flag on whether or not to share the connection pool with other keyspaces
-     */
-    @Key( LOCKS_KEYSPACE_STRATEGY )
-    @Default( "org.apache.cassandra.locator.SimpleStrategy" )
-    String getLocksKeyspaceStrategy();
-
-    /**
-     * Return the expiration that should be used for expiring a lock if it's not released
-     */
-    @Key( LOCKS_EXPIRATION )
-    @Default(DEFAULT_LOCKS_EXPIRATION)
-    int getLocksExpiration();
-
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
index f04e1a9..f65a260 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
@@ -21,7 +21,7 @@ package org.apache.usergrid.persistence.core.datastax;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.inject.Inject;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.util.StringUtils;
 
 import java.nio.ByteBuffer;
@@ -192,6 +192,10 @@ public class CQLUtils {
                 cacheValue.put("keys", "NONE");
                 cacheValue.put("rows_per_partition", "NONE");
                 break;
+            default:
+                cacheValue.put("keys", "NONE");
+                cacheValue.put("rows_per_partition", "NONE");
+                break;
 
         }
 
@@ -201,7 +205,7 @@ public class CQLUtils {
 
     public static String getLegacyCacheValue( TableDefinition.CacheOption cacheOption ){
 
-        String cacheValue = "none"; // default to no caching
+        String cacheValue;
         switch (cacheOption) {
 
             case ALL:
@@ -219,6 +223,9 @@ public class CQLUtils {
             case NONE:
                 cacheValue = "none";
                 break;
+            default:
+                cacheValue = "none";
+                break;
 
         }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
index 875c5c2..34cfec8 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
@@ -23,7 +23,7 @@ import com.datastax.driver.core.policies.DCAwareRoundRobinPolicy;
 import com.datastax.driver.core.policies.LoadBalancingPolicy;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
 import org.slf4j.Logger;
@@ -179,7 +179,7 @@ public class DataStaxClusterImpl implements DataStaxCluster {
             .withLoadBalancingPolicy(loadBalancingPolicy)
             .withPoolingOptions(poolingOptions)
             .withQueryOptions(queryOptions)
-            .withProtocolVersion(ProtocolVersion.NEWEST_SUPPORTED);
+            .withProtocolVersion(getProtocolVersion(cassandraFig.getVersion()));
 
         // only add auth credentials if they were provided
         if ( !cassandraFig.getUsername().isEmpty() && !cassandraFig.getPassword().isEmpty() ){
@@ -194,4 +194,29 @@ public class DataStaxClusterImpl implements DataStaxCluster {
 
     }
 
+    private ProtocolVersion getProtocolVersion(String versionNumber){
+
+        ProtocolVersion protocolVersion;
+        switch (versionNumber) {
+
+            case "2.1":
+                protocolVersion = ProtocolVersion.V3;
+                break;
+            case "2.0":
+                protocolVersion = ProtocolVersion.V2;
+                break;
+            case "1.2":
+                protocolVersion = ProtocolVersion.V1;
+                break;
+            default:
+                protocolVersion = ProtocolVersion.NEWEST_SUPPORTED;
+                break;
+
+        }
+
+        return protocolVersion;
+
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
index 460efa5..94aac60 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java
@@ -21,6 +21,7 @@ package org.apache.usergrid.persistence.core.guice;
 
 import com.datastax.driver.core.Session;
 import com.netflix.astyanax.Keyspace;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.astyanax.*;
 import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
 import org.apache.usergrid.persistence.core.datastax.DataStaxSessionProvider;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
index 3630fc8..f5f5d7b 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
@@ -22,8 +22,7 @@ package org.apache.usergrid.persistence.core.migration.schema;
 import java.util.Collection;
 import java.util.Set;
 
-import com.datastax.driver.core.Session;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
index dccbd45..415eafa 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
@@ -24,8 +24,8 @@ package org.apache.usergrid.persistence.core.astyanax;
 
 import java.util.HashMap;
 
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
index d020949..55ed421 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
@@ -26,8 +26,8 @@ import java.util.Arrays;
 import java.util.Comparator;
 import java.util.HashMap;
 
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -50,8 +50,6 @@ import com.netflix.astyanax.serializers.StringSerializer;
 import com.netflix.astyanax.util.RangeBuilder;
 
 import rx.Observable;
-import rx.functions.Action1;
-import rx.functions.Func1;
 import rx.schedulers.Schedulers;
 
 import static org.junit.Assert.assertEquals;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
index 8bcdcb2..d48795e 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
@@ -28,8 +28,8 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.concurrent.CountDownLatch;
 
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -53,7 +53,6 @@ import com.netflix.astyanax.util.RangeBuilder;
 import rx.Observable;
 import rx.Observer;
 import rx.functions.Action1;
-import rx.functions.Func1;
 import rx.schedulers.Schedulers;
 
 import static org.junit.Assert.assertEquals;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
index 5bad54e..34dd370 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
@@ -21,11 +21,10 @@ package org.apache.usergrid.persistence.core.datastax;
 
 import com.datastax.driver.core.DataType;
 import com.google.inject.Inject;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.guice.TestCommonModule;
 import org.apache.usergrid.persistence.core.test.ITRunner;
 import org.apache.usergrid.persistence.core.test.UseModules;
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.slf4j.Logger;
@@ -35,7 +34,6 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ExecutionException;
 
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
index 593e71b..ca7f97a 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
@@ -21,11 +21,10 @@ package org.apache.usergrid.persistence.core.datastax;
 import com.datastax.driver.core.Cluster;
 import com.datastax.driver.core.Session;
 import com.google.inject.Inject;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.guice.TestCommonModule;
 import org.apache.usergrid.persistence.core.test.ITRunner;
 import org.apache.usergrid.persistence.core.test.UseModules;
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
index 3978956..2f9b673 100644
--- a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
+++ b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
@@ -29,7 +29,7 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicLong;
 
 import com.google.common.base.Optional;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.index.*;
 import org.apache.usergrid.persistence.model.field.*;
 import org.junit.Before;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/GeoPagingTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/GeoPagingTest.java b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/GeoPagingTest.java
index eb6651f..3d68fe1 100644
--- a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/GeoPagingTest.java
+++ b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/GeoPagingTest.java
@@ -25,7 +25,7 @@ package org.apache.usergrid.persistence.index.impl;
 
 import java.util.*;
 
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.index.*;
 import org.apache.usergrid.persistence.model.entity.SimpleId;
 import org.junit.Before;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/IndexLoadTestsIT.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/IndexLoadTestsIT.java b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/IndexLoadTestsIT.java
index a6cef60..afaebb7 100644
--- a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/IndexLoadTestsIT.java
+++ b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/IndexLoadTestsIT.java
@@ -24,7 +24,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.usergrid.StressTest;
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.index.*;
 import org.junit.After;
 import org.junit.Before;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/TestIndexIdentifier.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/TestIndexIdentifier.java b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/TestIndexIdentifier.java
index 2cc7e62..ffd25f3 100644
--- a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/TestIndexIdentifier.java
+++ b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/TestIndexIdentifier.java
@@ -20,9 +20,8 @@
 package org.apache.usergrid.persistence.index.impl;
 
 
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
-import org.apache.usergrid.persistence.core.util.StringUtils;
 import org.apache.usergrid.persistence.index.IndexAlias;
 import org.apache.usergrid.persistence.index.IndexFig;
 import org.apache.usergrid.persistence.index.IndexLocationStrategy;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/75cc3a43/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/SNSQueueManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/SNSQueueManagerImpl.java b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/SNSQueueManagerImpl.java
index 4028d46..ed22fea 100644
--- a/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/SNSQueueManagerImpl.java
+++ b/stack/corepersistence/queue/src/main/java/org/apache/usergrid/persistence/queue/impl/SNSQueueManagerImpl.java
@@ -31,7 +31,7 @@ import java.util.concurrent.ExecutorService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.CassandraFig;
 import org.apache.usergrid.persistence.core.executor.TaskExecutorFactory;
 import org.apache.usergrid.persistence.core.guicyfig.ClusterFig;
 import org.apache.usergrid.persistence.queue.Queue;


[34/38] usergrid git commit: Merge branch 'master' into datastax-cass-driver Fix issue with UniqueValueSerialization backwards compatibility via CQL and legacy Usergrid data.

Posted by mr...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java
index 185cfb7,3dbf1ec..c4c083f
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImplTest.java
@@@ -23,8 -23,7 +23,10 @@@ import java.util.Collections
  import java.util.Iterator;
  import java.util.UUID;
  
 -import com.netflix.astyanax.model.ConsistencyLevel;
 +import com.datastax.driver.core.BatchStatement;
++import com.datastax.driver.core.ConsistencyLevel;
 +import com.datastax.driver.core.Session;
++
  import org.junit.Assert;
  import org.junit.Before;
  import org.junit.Rule;
@@@ -49,7 -47,7 +50,6 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.model.util.UUIDGenerator;
  
  import com.google.inject.Inject;
--import com.netflix.astyanax.MutationBatch;
  import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
  
  import static org.junit.Assert.assertEquals;
@@@ -365,4 -341,232 +365,229 @@@ public abstract class UniqueValueSerial
  
      }
  
+     /**
+      * Test that inserting duplicates always show the oldest entity UUID being returned (versions of that OK to change).
+      *
+      * @throws ConnectionException
+      * @throws InterruptedException
+      */
+     @Test
+     public void testWritingDuplicates() throws ConnectionException, InterruptedException {
+ 
+         ApplicationScope scope =
+             new ApplicationScopeImpl( new SimpleId( "organization" ) );
+ 
+         IntegerField field = new IntegerField( "count", 5 );
+         Id entityId1 = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
+         Id entityId2 = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
+ 
+ 
+ 
+         UUID version1 = UUIDGenerator.newTimeUUID();
+         UUID version2 = UUIDGenerator.newTimeUUID();
+ 
+         UniqueValue stored1 = new UniqueValueImpl( field, entityId1, version2 );
+         UniqueValue stored2 = new UniqueValueImpl( field, entityId2,  version1 );
+ 
+ 
 -        strategy.write( scope, stored1 ).execute();
 -        strategy.write( scope, stored2 ).execute();
++        session.execute(strategy.writeCQL( scope, stored1, -1 ));
++        session.execute(strategy.writeCQL( scope, stored2, -1 ));
+ 
+         // load descending to get the older version of entity for this unique value
 -        UniqueValueSet fields = strategy.load( scope, ConsistencyLevel.CL_LOCAL_QUORUM,
++        UniqueValueSet fields = strategy.load( scope, ConsistencyLevel.LOCAL_QUORUM,
+             entityId1.getType(), Collections.<Field>singleton( field ), true);
+ 
+         UniqueValue retrieved = fields.getValue( field.getName() );
+ 
+         // validate that the first entity UUID is returned after inserting a duplicate mapping
+         assertEquals( stored1, retrieved );
+ 
+ 
+ 
+         UUID version3 = UUIDGenerator.newTimeUUID();
+         UniqueValue stored3 = new UniqueValueImpl( field, entityId2, version3);
 -        strategy.write( scope, stored3 ).execute();
++        session.execute(strategy.writeCQL( scope, stored3, -1 ));
+ 
+         // load the values again, we should still only get back the original unique value
 -        fields = strategy.load( scope, ConsistencyLevel.CL_LOCAL_QUORUM,
++        fields = strategy.load( scope, ConsistencyLevel.LOCAL_QUORUM,
+             entityId1.getType(), Collections.<Field>singleton( field ), true);
+ 
+         retrieved = fields.getValue( field.getName() );
+ 
+         // validate that the first entity UUID is still returned after inserting duplicate with newer version
+         assertEquals( stored1, retrieved );
+ 
+ 
+         UUID version4 = UUIDGenerator.newTimeUUID();
+         UniqueValue stored4 = new UniqueValueImpl( field, entityId1, version4);
 -        strategy.write( scope, stored4 ).execute();
++        session.execute(strategy.writeCQL( scope, stored4, -1 ));
+ 
+         // load the values again, now we should get the latest version of the original UUID written
 -        fields = strategy.load( scope, ConsistencyLevel.CL_LOCAL_QUORUM,
++        fields = strategy.load( scope, ConsistencyLevel.LOCAL_QUORUM,
+             entityId1.getType(), Collections.<Field>singleton( field ), true);
+ 
+         retrieved = fields.getValue( field.getName() );
+ 
+         // validate that the first entity UUID is still returned, but with the latest version
+         assertEquals( stored4, retrieved );
+ 
+     }
+ 
+     /**
+      * Test that inserting multiple versions of the same entity UUID result in the latest version being returned.
+      *
+      * @throws ConnectionException
+      * @throws InterruptedException
+      */
+     @Test
+     public void testMultipleVersionsSameEntity() throws ConnectionException, InterruptedException {
+ 
+         ApplicationScope scope =
+             new ApplicationScopeImpl( new SimpleId( "organization" ) );
+ 
+         IntegerField field = new IntegerField( "count", 5 );
+         Id entityId1 = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
+ 
+ 
+ 
+         UUID version1 = UUIDGenerator.newTimeUUID();
+         UUID version2 = UUIDGenerator.newTimeUUID();
+ 
+         UniqueValue stored1 = new UniqueValueImpl( field, entityId1, version1 );
+         UniqueValue stored2 = new UniqueValueImpl( field, entityId1,  version2 );
+ 
+ 
 -        strategy.write( scope, stored1 ).execute();
 -        strategy.write( scope, stored2 ).execute();
++        session.execute(strategy.writeCQL( scope, stored1, -1 ));
++        session.execute(strategy.writeCQL( scope, stored2, -1 ));
+ 
+         // load descending to get the older version of entity for this unique value
 -        UniqueValueSet fields = strategy.load( scope, ConsistencyLevel.CL_LOCAL_QUORUM,
++        UniqueValueSet fields = strategy.load( scope, ConsistencyLevel.LOCAL_QUORUM,
+             entityId1.getType(), Collections.<Field>singleton( field ), true);
+ 
+         UniqueValue retrieved = fields.getValue( field.getName() );
+         Assert.assertNotNull( retrieved );
+         assertEquals( stored2, retrieved );
+ 
+ 
+     }
+ 
+     @Test
+     public void testDuplicateEntitiesDescending() throws ConnectionException, InterruptedException {
+ 
+         ApplicationScope scope =
+             new ApplicationScopeImpl( new SimpleId( "organization" ) );
+ 
+         IntegerField field = new IntegerField( "count", 5 );
+         Id entityId1 = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
+         Id entityId2 = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
+         Id entityId3 = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
+ 
+ 
+ 
+         UUID version1 = UUIDGenerator.newTimeUUID();
+         UUID version2 = UUIDGenerator.newTimeUUID();
+         UUID version3 = UUIDGenerator.newTimeUUID();
+ 
+         UniqueValue stored1 = new UniqueValueImpl( field, entityId3, version1 );
+         UniqueValue stored2 = new UniqueValueImpl( field, entityId2,  version2 );
+         UniqueValue stored3 = new UniqueValueImpl( field, entityId1,  version3 );
+ 
+ 
 -        strategy.write( scope, stored1 ).execute();
 -        strategy.write( scope, stored2 ).execute();
 -        strategy.write( scope, stored3 ).execute();
++        session.execute(strategy.writeCQL( scope, stored1, -1 ));
++        session.execute(strategy.writeCQL( scope, stored2, -1 ));
++        session.execute(strategy.writeCQL( scope, stored3, -1 ));
+ 
+ 
+         // load descending to get the older version of entity for this unique value
 -        UniqueValueSet fields = strategy.load( scope, ConsistencyLevel.CL_LOCAL_QUORUM,
++        UniqueValueSet fields = strategy.load( scope, ConsistencyLevel.LOCAL_QUORUM,
+             entityId1.getType(), Collections.<Field>singleton( field ), true);
+ 
+ 
 -        fields = strategy.load( scope, ConsistencyLevel.CL_LOCAL_QUORUM,
 -            entityId1.getType(), Collections.<Field>singleton( field ), false);
 -
+         UniqueValue retrieved = fields.getValue( field.getName() );
+         assertEquals( stored3, retrieved );
+ 
+ 
+     }
+ 
+     @Test
+     public void testDuplicateEntitiesAscending() throws ConnectionException, InterruptedException {
+ 
+         ApplicationScope scope =
+             new ApplicationScopeImpl( new SimpleId( "organization" ) );
+ 
+         IntegerField field = new IntegerField( "count", 5 );
+         Id entityId1 = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
+         Id entityId2 = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
+         Id entityId3 = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
+ 
+ 
+ 
+         UUID version1 = UUIDGenerator.newTimeUUID();
+         UUID version2 = UUIDGenerator.newTimeUUID();
+         UUID version3 = UUIDGenerator.newTimeUUID();
+ 
+         UniqueValue stored1 = new UniqueValueImpl( field, entityId1, version1 );
+         UniqueValue stored2 = new UniqueValueImpl( field, entityId2,  version2 );
+         UniqueValue stored3 = new UniqueValueImpl( field, entityId3,  version3 );
+ 
+ 
 -        strategy.write( scope, stored1 ).execute();
 -        strategy.write( scope, stored2 ).execute();
 -        strategy.write( scope, stored3 ).execute();
++        session.execute(strategy.writeCQL( scope, stored1, -1 ));
++        session.execute(strategy.writeCQL( scope, stored2, -1 ));
++        session.execute(strategy.writeCQL( scope, stored3, -1 ));
+ 
+ 
+         // load descending to get the older version of entity for this unique value
+         UniqueValueSet fields = strategy.load( scope,
 -            ConsistencyLevel.CL_LOCAL_QUORUM, entityId1.getType(), Collections.<Field>singleton( field ), true);
++            ConsistencyLevel.LOCAL_QUORUM, entityId1.getType(), Collections.<Field>singleton( field ), true);
+ 
+         UniqueValue retrieved = fields.getValue( field.getName() );
+         assertEquals( stored1, retrieved );
+ 
+ 
+     }
+ 
+     @Test
+     public void testMixedDuplicates() throws ConnectionException, InterruptedException {
+ 
+         ApplicationScope scope =
+             new ApplicationScopeImpl( new SimpleId( "organization" ) );
+ 
+         IntegerField field = new IntegerField( "count", 5 );
+         Id entityId1 = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
+         Id entityId2 = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
+         Id entityId3 = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
+ 
+ 
+ 
+         UUID version1 = UUIDGenerator.newTimeUUID();
+         UUID version2 = UUIDGenerator.newTimeUUID();
+         UUID version3 = UUIDGenerator.newTimeUUID();
+         UUID version4 = UUIDGenerator.newTimeUUID();
+         UUID version5 = UUIDGenerator.newTimeUUID();
+ 
+         UniqueValue stored1 = new UniqueValueImpl( field, entityId1, version5 );
+         UniqueValue stored2 = new UniqueValueImpl( field, entityId2,  version4 );
+         UniqueValue stored3 = new UniqueValueImpl( field, entityId1, version3 );
+         UniqueValue stored4 = new UniqueValueImpl( field, entityId3,  version2 );
+         UniqueValue stored5 = new UniqueValueImpl( field, entityId3,  version1 );
+ 
+ 
+ 
 -        strategy.write( scope, stored1 ).execute();
 -        strategy.write( scope, stored2 ).execute();
 -        strategy.write( scope, stored3 ).execute();
 -        strategy.write( scope, stored4 ).execute();
 -        strategy.write( scope, stored5 ).execute();
++        session.execute(strategy.writeCQL( scope, stored1, -1 ));
++        session.execute(strategy.writeCQL( scope, stored2, -1 ));
++        session.execute(strategy.writeCQL( scope, stored3, -1 ));
++        session.execute(strategy.writeCQL( scope, stored4, -1 ));
++        session.execute(strategy.writeCQL( scope, stored5, -1 ));
+ 
+ 
+         // load descending to get the older version of entity for this unique value
 -        UniqueValueSet fields = strategy.load( scope, ConsistencyLevel.CL_LOCAL_QUORUM,
++        UniqueValueSet fields = strategy.load( scope, ConsistencyLevel.LOCAL_QUORUM,
+             entityId1.getType(), Collections.<Field>singleton( field ), true);
+ 
+         UniqueValue retrieved = fields.getValue( field.getName() );
+         assertEquals( stored1, retrieved );
+ 
+ 
+     }
+ 
  }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties
index 92d0041,d404b1e..ebae735
--- a/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties
+++ b/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties
@@@ -1,7 -1,26 +1,25 @@@
+ # 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.
+ #
+ 
  # These are for CHOP environment settings
  
 -cassandra.connections=20
 +cassandra.connections=50
  cassandra.port=9160
 -cassandra.version=1.2
  
  # a comma delimited private IP address list to your chop cassandra cluster
  # define this in your settings.xml and have it as an always active profile

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/collection/src/test/resources/usergrid-UNIT.properties
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/common/pom.xml
----------------------------------------------------------------------
diff --cc stack/corepersistence/common/pom.xml
index c389a5b,bbcadff..63d339b
--- a/stack/corepersistence/common/pom.xml
+++ b/stack/corepersistence/common/pom.xml
@@@ -57,9 -73,9 +73,13 @@@
              <version>${cassandra.version}</version>
              <exclusions>
                  <exclusion>
 +                    <groupId>net.jpountz.lz4</groupId>
 +                    <artifactId>*</artifactId>
 +                </exclusion>
++                <exclusion>
+                     <artifactId>netty</artifactId>
+                     <groupId>io.netty</groupId>
+                 </exclusion>
              </exclusions>
          </dependency>
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
index 3c58dfb,0000000..2996465
mode 100644,000000..100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
@@@ -1,225 -1,0 +1,239 @@@
 +/*
 + * 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 org.apache.usergrid.persistence.core;
 +
 +
 +import org.safehaus.guicyfig.Default;
 +import org.safehaus.guicyfig.FigSingleton;
 +import org.safehaus.guicyfig.GuicyFig;
 +import org.safehaus.guicyfig.Key;
 +
 +
 +/**
 + * Cassandra configuration interface.
 + */
 +@FigSingleton
 +public interface CassandraFig extends GuicyFig {
 +
 +    // cassndra properties used by datastax driver
 +    String READ_CL = "cassandra.readcl";
 +    String READ_CL_CONSISTENT = "cassandra.readcl.consistent";
 +    String WRITE_CL = "cassandra.writecl";
 +    String STRATEGY = "cassandra.strategy";
 +    String STRATEGY_OPTIONS = "cassandra.strategy.options";
 +
 +    // main application cassandra properties
 +    String ASTYANAX_READ_CONSISTENT_CL = "usergrid.consistent.read.cl";
 +    String ASTYANAX_READ_CL = "usergrid.read.cl";
 +    String ASTYANAX_WRITE_CL = "usergrid.write.cl";
 +    String SHARD_VALUES = "cassandra.shardvalues";
 +    String THRIFT_TRANSPORT_SIZE = "cassandra.thrift.transport.frame";
 +    String USERNAME = "cassandra.username";
 +    String PASSWORD = "cassandra.password";
 +
 +    // locks cassandra properties
 +    String LOCKS_KEYSPACE_NAME = "cassandra.lock.keyspace";
 +    String LOCKS_KEYSPACE_REPLICATION = "cassandra.lock.keyspace.replication";
 +    String LOCKS_KEYSPACE_STRATEGY = "cassandra.lock.keyspace.strategy";
 +    String LOCKS_CL = "cassandra.lock.cl";
 +    String LOCKS_SHARED_POOL_FLAG = "cassandra.lock.use_shared_pool";
 +    String LOCKS_CONNECTIONS = "cassandra.lock.connections";
 +    String LOCKS_EXPIRATION = "cassandra.lock.expiration.milliseconds";
 +
- 
- 
++    String LOCK_MANAGER_INIT_RETRIES = "cassandra.lock.init.retries";
++    String LOCK_MANAGER_INIT_INTERVAL = "cassandra.lock.init.interval";
 +
 +    // re-usable default values
 +    String DEFAULT_CONNECTION_POOLSIZE = "15";
 +    String DEFAULT_LOCKS_EXPIRATION = "3600000";  // 1 hour
 +    String DEFAULT_LOCAL_DC = "";
 +    String DEFAULT_USERNAME = "";
 +    String DEFAULT_PASSWORD = "";
 +
 +
 +    @Key( "cassandra.hosts" )
 +    String getHosts();
 +
 +    /**
 +     * Valid options are 1.2, 2.0, 2.1
 +     *
 +     * @return
 +     */
 +    @Key( "cassandra.version" )
 +    @Default( "2.1" )
 +    String getVersion();
 +
 +    @Key( "cassandra.cluster_name" )
 +    @Default( "Usergrid" )
 +    String getClusterName();
 +
 +    @Key( "cassandra.keyspace.application" )
 +    @Default( "Usergrid_Applications" )
 +    String getApplicationKeyspace();
 +
 +    @Key( "cassandra.port" )
 +    @Default( "9160" )
 +    int getThriftPort();
 +
 +    @Key( USERNAME )
 +    @Default( DEFAULT_USERNAME )
 +    String getUsername();
 +
 +    @Key( PASSWORD )
 +    @Default( DEFAULT_PASSWORD )
 +    String getPassword();
 +
 +    @Key( "cassandra.datacenter.local" )
 +    @Default( DEFAULT_LOCAL_DC )
 +    String getLocalDataCenter();
 +
 +    @Key( "cassandra.connections" )
 +    @Default( DEFAULT_CONNECTION_POOLSIZE )
 +    int getConnections();
 +
 +    @Key( "cassandra.timeout" )
 +    @Default( "10000" )
 +    int getTimeout();
 +
 +    @Key( "cassandra.timeout.pool" )
 +    @Default( "5000" )
 +    int getPoolTimeout();
 +
 +    @Key("cassandra.discovery")
 +    @Default( "RING_DESCRIBE" )
 +    String getDiscoveryType();
 +
 +
 +    @Default("CL_LOCAL_QUORUM")
 +    @Key(ASTYANAX_READ_CL)
 +    String getAstyanaxReadCL();
 +
 +    @Default("CL_QUORUM")
 +    @Key(ASTYANAX_READ_CONSISTENT_CL)
 +    String getAstyanaxConsistentReadCL();
 +
 +    @Default("CL_LOCAL_QUORUM")
 +    @Key(ASTYANAX_WRITE_CL)
 +    String getAstyanaxWriteCL();
 +
 +
 +    @Default("LOCAL_QUORUM")
 +    @Key(READ_CL)
 +    String getReadCl();
 +
 +    @Default("QUORUM")
 +    @Key(READ_CL_CONSISTENT)
 +    String getReadClConsistent();
 +
 +    @Default("LOCAL_QUORUM")
 +    @Key(WRITE_CL)
 +    String getWriteCl();
 +
 +    @Default("SimpleStrategy")
 +    @Key( STRATEGY )
 +    String getStrategy();
 +
 +    @Default("replication_factor:1")
 +    @Key( STRATEGY_OPTIONS )
 +    String getStrategyOptions();
 +
 +    /**
 +     * Return the history of all shard values which are immutable.  For instance, if shard values
 +     * are initially set to 20 (the default) then increased to 40, the property should contain the string of
 +     * "20, 40" so that we can read historic data.
 +     *
 +     * @return
 +     */
 +    @Default("20")
 +    @Key(SHARD_VALUES)
 +    String getShardValues();
 +
 +    /**
 +     * Get the thrift transport size.  Should be set to what is on the cassandra servers.  As we move to CQL, this will become obsolete
 +     * @return
 +     */
 +    @Key( THRIFT_TRANSPORT_SIZE)
 +    @Default( "15728640" )
 +    int getThriftBufferSize();
 +
 +
 +    /**
 +     * Returns the name of the keyspace that should be used for Locking
 +     */
 +    @Key( LOCKS_KEYSPACE_NAME )
 +    @Default("Locks")
 +    String getLocksKeyspace();
 +
 +    /**
 +     * Returns the Astyanax consistency level for writing a Lock
 +     */
 +    @Key(LOCKS_CL)
 +    @Default("CL_LOCAL_QUORUM")
 +    String getLocksCl();
 +
 +    /**
 +     * Returns a flag on whether or not to share the connection pool with other keyspaces
 +     */
 +    @Key( LOCKS_SHARED_POOL_FLAG )
 +    @Default("true")
 +    boolean useSharedPoolForLocks();
 +
 +    /**
 +     * Returns a flag on whether or not to share the connection pool with other keyspaces
 +     */
 +    @Key( LOCKS_CONNECTIONS )
 +    @Default( DEFAULT_CONNECTION_POOLSIZE )
 +    int getConnectionsLocks();
 +
 +    /**
 +     * Returns a flag on whether or not to share the connection pool with other keyspaces
 +     */
 +    @Key( LOCKS_KEYSPACE_REPLICATION )
 +    @Default("replication_factor:1")
 +    String getLocksKeyspaceReplication();
 +
 +    /**
 +     * Returns a flag on whether or not to share the connection pool with other keyspaces
 +     */
 +    @Key( LOCKS_KEYSPACE_STRATEGY )
 +    @Default( "org.apache.cassandra.locator.SimpleStrategy" )
 +    String getLocksKeyspaceStrategy();
 +
 +    /**
 +     * Return the expiration that should be used for expiring a lock if it's not released
 +     */
 +    @Key( LOCKS_EXPIRATION )
 +    @Default(DEFAULT_LOCKS_EXPIRATION)
 +    int getLocksExpiration();
 +
++    /**
++     * How many times to attempt lock keyspace and column family creation
++     */
++    @Key( LOCK_MANAGER_INIT_RETRIES )
++    @Default( "100" )
++    int getLockManagerInitRetries();
++
++    /**
++     * Return the expiration that should be used for expiring a lock if it's not released
++     */
++    @Key( LOCK_MANAGER_INIT_INTERVAL )
++    @Default( "1000" )
++    int getLockManagerInitInterval();
++
 +}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/common/src/test/resources/usergrid-UNIT.properties
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/rest/src/test/resources/usergrid-custom-test.properties
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/b23c20a2/stack/tools/src/main/java/org/apache/usergrid/tools/UniqueValueScanner.java
----------------------------------------------------------------------
diff --cc stack/tools/src/main/java/org/apache/usergrid/tools/UniqueValueScanner.java
index 0000000,68f366b..40cedcd
mode 000000,100644..100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/UniqueValueScanner.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/UniqueValueScanner.java
@@@ -1,0 -1,298 +1,298 @@@
+ /*
+  * 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 org.apache.usergrid.tools;
+ 
+ 
+ import java.util.*;
+ import java.util.concurrent.atomic.AtomicInteger;
+ 
++import com.datastax.driver.core.ConsistencyLevel;
+ import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+ import com.netflix.astyanax.model.Column;
 -import com.netflix.astyanax.model.ConsistencyLevel;
+ import com.netflix.astyanax.util.RangeBuilder;
+ import org.apache.usergrid.persistence.Entity;
+ import org.apache.usergrid.persistence.EntityManager;
+ import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+ import org.apache.usergrid.persistence.collection.serialization.UniqueValueSerializationStrategy;
+ import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
+ import org.apache.usergrid.persistence.collection.serialization.impl.*;
+ import org.apache.usergrid.persistence.core.scope.ApplicationScopeImpl;
+ import org.apache.usergrid.persistence.model.entity.SimpleId;
+ import org.apache.usergrid.persistence.model.field.StringField;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
+ 
+ import org.apache.commons.cli.CommandLine;
+ import org.apache.commons.cli.Option;
+ import org.apache.commons.cli.OptionBuilder;
+ import org.apache.commons.cli.Options;
+ 
+ 
+ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
+ import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
+ import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
+ 
+ 
+ 
+ public class UniqueValueScanner extends ToolBase {
+ 
+     private static final Logger logger = LoggerFactory.getLogger( UniqueValueScanner.class );
+ 
+     private static final String APPLICATION_ARG = "app";
+ 
+     private static final String ENTITY_TYPE_ARG = "entityType";
+ 
+     private static final String ENTITY_NAME_ARG = "entityName";
+ 
+     private static final String ENTITY_FIELD_TYPE_ARG = "fieldType";
+ 
+ 
+ 
+     //copied shamelessly from unique value serialization strat.
+     private static final ScopedRowKeySerializer<TypeField> ROW_KEY_SER =
+         new ScopedRowKeySerializer<>( UniqueTypeFieldRowKeySerializer.get() );
+ 
+ 
+     private final EntityVersionSerializer ENTITY_VERSION_SER = new EntityVersionSerializer();
+ 
+     private final MultiTenantColumnFamily<ScopedRowKey<TypeField>, EntityVersion> CF_UNIQUE_VALUES =
+         new MultiTenantColumnFamily<>( "Unique_Values_V2", ROW_KEY_SER, ENTITY_VERSION_SER );
+ 
+     private com.netflix.astyanax.Keyspace keyspace;
+ 
+     private MvccEntitySerializationStrategy mvccEntitySerializationStrategy;
+ 
+     private UniqueValueSerializationStrategy uniqueValueSerializationStrategy;
+ 
+     private EntityManager em;
+ 
+     @Override
+     @SuppressWarnings( "static-access" )
+     public Options createOptions() {
+ 
+ 
+         Options options = super.createOptions();
+ 
+ 
+         Option appOption = OptionBuilder.withArgName( APPLICATION_ARG ).hasArg().isRequired( true )
+             .withDescription( "application id" ).create( APPLICATION_ARG );
+ 
+ 
+         options.addOption( appOption );
+ 
+         Option collectionOption =
+             OptionBuilder.withArgName(ENTITY_TYPE_ARG).hasArg().isRequired( true ).withDescription( "collection name" )
+                 .create(ENTITY_TYPE_ARG);
+ 
+         options.addOption( collectionOption );
+ 
+         Option specificEntityNameOption =
+             OptionBuilder.withArgName(ENTITY_NAME_ARG).hasArg().isRequired( false ).withDescription( "specific entity name" )
+                 .create(ENTITY_NAME_ARG);
+ 
+         options.addOption( specificEntityNameOption );
+ 
+         Option fieldTypeOption =
+             OptionBuilder.withArgName(ENTITY_FIELD_TYPE_ARG).hasArg().isRequired( false ).withDescription( "field type" )
+                 .create(ENTITY_FIELD_TYPE_ARG);
+ 
+         options.addOption( fieldTypeOption );
+ 
+         return options;
+     }
+ 
+ 
+     /*
+      * (non-Javadoc)
+      *
+      * @see
+      * org.apache.usergrid.tools.ToolBase#runTool(org.apache.commons.cli.CommandLine)
+      */
+     @Override
+     public void runTool( CommandLine line ) throws Exception {
+ 
+         startSpring();
+ 
+         UUID appToFilter = null;
+         if (!line.getOptionValue(APPLICATION_ARG).isEmpty()) {
+             appToFilter = UUID.fromString(line.getOptionValue(APPLICATION_ARG));
+         }
+ 
+         logger.info("Staring Tool: UniqueValueScanner");
+         logger.info("Using Cassandra consistency level: {}", System.getProperty("usergrid.read.cl", "CL_LOCAL_QUORUM"));
+ 
+ 
+         keyspace = injector.getInstance(com.netflix.astyanax.Keyspace.class);
+         mvccEntitySerializationStrategy = injector.getInstance(MvccEntitySerializationStrategy.class);
+         uniqueValueSerializationStrategy = injector.getInstance(UniqueValueSerializationStrategy.class);
+ 
+         String fieldType =
+             line.getOptionValue(ENTITY_FIELD_TYPE_ARG) != null ?  line.getOptionValue(ENTITY_FIELD_TYPE_ARG)  : "name" ;
+         String entityType = line.getOptionValue(ENTITY_TYPE_ARG);
+         String entityName = line.getOptionValue(ENTITY_NAME_ARG);
+ 
+         AtomicInteger count = new AtomicInteger(0);
+ 
+         if (entityName != null && !entityName.isEmpty()) {
+ 
+             if(appToFilter == null){
+                 throw new RuntimeException("Cannot execute UniqueValueScanner with specific entity without the " +
+                     "application UUID for which the entity should exist.");
+             }
+ 
+             if(entityType == null){
+                 throw new RuntimeException("Cannot execute UniqueValueScanner without the entity type (singular " +
+                     "collection name).");
+             }
+ 
+             logger.info("Running entity unique load only");
+ 
+ 
+             //do stuff w/o read repair
+             UniqueValueSet uniqueValueSet = uniqueValueSerializationStrategy.load(
+                 new ApplicationScopeImpl( new SimpleId(appToFilter, "application" ) ),
 -                ConsistencyLevel.valueOf(System.getProperty("usergrid.read.cl", "CL_LOCAL_QUORUM")), entityType,
++                ConsistencyLevel.valueOf(System.getProperty("usergrid.read.cl", "LOCAL_QUORUM")), entityType,
+                 Collections.singletonList(new StringField( fieldType, entityName) ), false);
+ 
+             StringBuilder stringBuilder = new StringBuilder();
+ 
+             stringBuilder.append("[");
+ 
+             uniqueValueSet.forEach( uniqueValue -> {
+ 
+ 
+                 String entry = "fieldName="+uniqueValue.getField().getName()+
+                     ", fieldValue="+uniqueValue.getField().getValue()+
+                     ", uuid="+uniqueValue.getEntityId().getUuid()+
+                     ", type="+uniqueValue.getEntityId().getType()+
+                     ", version="+uniqueValue.getEntityVersion();
+                 stringBuilder.append("{").append(entry).append("},");
+             });
+ 
+             stringBuilder.deleteCharAt(stringBuilder.length() -1);
+             stringBuilder.append("]");
+ 
+             logger.info("Returned unique value set from serialization load = {}", stringBuilder.toString());
+ 
+         } else {
+ 
+             logger.info("Running entity unique scanner only");
+ 
+ 
+             // scan through all unique values and log some info
+ 
+             Iterator<com.netflix.astyanax.model.Row<ScopedRowKey<TypeField>, EntityVersion>> rows = null;
+             try {
+ 
+                 rows = keyspace.prepareQuery(CF_UNIQUE_VALUES)
 -                    .setConsistencyLevel(ConsistencyLevel.valueOf(System.getProperty("usergrid.read.cl", "CL_LOCAL_QUORUM")))
++                    .setConsistencyLevel(com.netflix.astyanax.model.ConsistencyLevel.valueOf(System.getProperty("usergrid.read.cl", "CL_LOCAL_QUORUM")))
+                     .getAllRows()
+                     .withColumnRange(new RangeBuilder().setLimit(1000).build())
+                     .execute().getResult().iterator();
+ 
+             } catch (ConnectionException e) {
+ 
+                 logger.error("Error connecting to cassandra", e);
+             }
+ 
+ 
+             UUID finalAppToFilter = appToFilter;
+ 
+             if( rows != null) {
+                 rows.forEachRemaining(row -> {
+ 
+                     count.incrementAndGet();
+ 
+                     if(count.get() % 1000 == 0 ){
+                         logger.info("Scanned {} rows in {}", count.get(), CF_UNIQUE_VALUES.getName());
+                     }
+ 
+                     final String fieldName = row.getKey().getKey().getField().getName();
+                     final String fieldValue = row.getKey().getKey().getField().getValue().toString();
+                     final String scopeType = row.getKey().getScope().getType();
+                     final UUID scopeUUID = row.getKey().getScope().getUuid();
+ 
+ 
+                     if (!fieldName.equalsIgnoreCase(fieldType) ||
+                         (finalAppToFilter != null && !finalAppToFilter.equals(scopeUUID))
+                         ) {
+                         // do nothing
+ 
+                     } else {
+ 
+ 
+                         // if we have more than 1 column, let's check for a duplicate
+                         if (row.getColumns() != null && row.getColumns().size() > 1) {
+ 
+                             final List<EntityVersion> values = new ArrayList<>(row.getColumns().size());
+ 
+                             Iterator<Column<EntityVersion>> columns = row.getColumns().iterator();
+                             columns.forEachRemaining(column -> {
+ 
+ 
+                                 final EntityVersion entityVersion = column.getName();
+ 
+ 
+                                 logger.trace(
+                                     scopeType + ": " + scopeUUID + ", " +
+                                         fieldName + ": " + fieldValue + ", " +
+                                         "entity type: " + entityVersion.getEntityId().getType() + ", " +
+                                         "entity uuid: " + entityVersion.getEntityId().getUuid()
+                                 );
+ 
+ 
+                                 if (entityType != null &&
+                                     entityVersion.getEntityId().getType().equalsIgnoreCase(entityType)
+                                     ) {
+ 
+                                     // add the first value into the list
+                                     if (values.size() == 0) {
+ 
+                                         values.add(entityVersion);
+ 
+ 
+                                     } else {
+ 
+                                         if (!values.get(0).getEntityId().getUuid().equals(entityVersion.getEntityId().getUuid())) {
+ 
+                                             values.add(entityVersion);
+ 
+                                             logger.error("Duplicate found for field [{}={}].  Entry 1: [{}], Entry 2: [{}]",
+                                                 fieldName, fieldValue, values.get(0).getEntityId(), entityVersion.getEntityId());
+ 
+                                         }
+ 
+                                     }
+ 
+ 
+                                 }
+ 
+                             });
+                         }
+                     }
+ 
+ 
+                 });
+             }else{
+ 
+                 logger.warn("No rows returned from table: {}", CF_UNIQUE_VALUES.getName());
+ 
+             }
+ 
+         }
+     }
+ }


[12/38] usergrid git commit: Add tests for DataStaxCluster and improve cluster/connection handling to ensure the cluster is always available through the interface.

Posted by mr...@apache.org.
Add tests for DataStaxCluster and improve cluster/connection handling to ensure the cluster is always available through the interface.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/7ff31ebf
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/7ff31ebf
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/7ff31ebf

Branch: refs/heads/master
Commit: 7ff31ebff0cb431c9655764e922d94d7f215a673
Parents: 29814ef
Author: Michael Russo <mi...@gmail.com>
Authored: Fri Feb 12 21:45:08 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Fri Feb 12 21:45:08 2016 -0800

----------------------------------------------------------------------
 .../persistence/core/datastax/CQLUtils.java     |   4 +-
 .../core/datastax/DataStaxCluster.java          |   2 +
 .../core/datastax/TableDefinition.java          |   7 +-
 .../core/datastax/impl/DatastaxClusterImpl.java | 138 +++++++++++--------
 .../migration/schema/MigrationManagerImpl.java  |  66 +--------
 .../persistence/core/datastax/CQLUtilsTest.java |  30 ++--
 .../core/datastax/DatastaxClusterTest.java      |  63 ++++++++-
 .../map/impl/MapSerializationImpl.java          |  25 ++--
 8 files changed, 186 insertions(+), 149 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/7ff31ebf/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
index f2e4f57..38b6b7b 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
@@ -134,10 +134,10 @@ public class CQLUtils {
 
     }
 
-    public static String spaceSeparatedKeyValue(Map<String, String> columns){
+    public static String spaceSeparatedKeyValue(Map<String, ?> columns){
 
         StringJoiner columnsSchema = new StringJoiner(",");
-        columns.forEach( (key, value) -> columnsSchema.add(key+" "+value));
+        columns.forEach( (key, value) -> columnsSchema.add(key+" "+String.valueOf(value)));
 
         return columnsSchema.toString();
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/7ff31ebf/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
index 7515bf5..206c2a0 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java
@@ -30,4 +30,6 @@ public interface DataStaxCluster {
 
     Session getApplicationSession();
 
+    void waitForSchemaAgreement();
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/7ff31ebf/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
index 3dc3145..2f83513 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
@@ -20,6 +20,7 @@
 package org.apache.usergrid.persistence.core.datastax;
 
 
+import com.datastax.driver.core.DataType;
 import com.google.common.base.Preconditions;
 
 import java.util.Collection;
@@ -53,7 +54,7 @@ public class TableDefinition {
     private final String tableName;
     private final Collection<String> partitionKeys;
     private final Collection<String> columnKeys;
-    private final Map<String, String> columns;
+    private final Map<String, DataType.Name> columns;
     private final CacheOption cacheOption;
     private final Map<String, Object> compaction;
     private final String bloomFilterChance;
@@ -63,7 +64,7 @@ public class TableDefinition {
     private final Map<String, String> clusteringOrder;
 
     public TableDefinition( final String tableName, final Collection<String> partitionKeys,
-                            final Collection<String> columnKeys, final Map<String, String> columns,
+                            final Collection<String> columnKeys, final Map<String, DataType.Name> columns,
                             final CacheOption cacheOption, final Map<String, String> clusteringOrder){
 
         Preconditions.checkNotNull(tableName, "Table name cannot be null");
@@ -105,7 +106,7 @@ public class TableDefinition {
         return columnKeys;
     }
 
-    public Map<String, String> getColumns() {
+    public Map<String, DataType.Name> getColumns() {
         return columns;
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/7ff31ebf/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
index 43e2eb2..1e9061f 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
@@ -37,63 +37,15 @@ public class DataStaxClusterImpl implements DataStaxCluster {
 
 
     private final CassandraFig cassandraFig;
-    private final Cluster cluster;
+    private Cluster cluster;
     private Session applicationSession;
     private Session clusterSession;
 
     @Inject
     public DataStaxClusterImpl(final CassandraFig cassandraFig ) throws Exception {
         this.cassandraFig = cassandraFig;
+        this.cluster = buildCluster();
 
-        ConsistencyLevel defaultConsistencyLevel;
-        try {
-            defaultConsistencyLevel = ConsistencyLevel.valueOf(cassandraFig.getReadCl());
-        } catch (IllegalArgumentException e){
-
-            logger.error("Unable to parse provided consistency level in property: {}, defaulting to: {}",
-                CassandraFig.READ_CL,
-                ConsistencyLevel.LOCAL_QUORUM);
-
-            defaultConsistencyLevel = ConsistencyLevel.LOCAL_QUORUM;
-        }
-
-
-        LoadBalancingPolicy loadBalancingPolicy;
-        if( !cassandraFig.getLocalDataCenter().isEmpty() ){
-
-            loadBalancingPolicy = new DCAwareRoundRobinPolicy.Builder()
-                .withLocalDc( cassandraFig.getLocalDataCenter() ).build();
-        }else{
-            loadBalancingPolicy = new DCAwareRoundRobinPolicy.Builder().build();
-        }
-
-        final PoolingOptions poolingOptions = new PoolingOptions()
-            .setCoreConnectionsPerHost(HostDistance.LOCAL, cassandraFig.getConnections() / 2)
-            .setMaxConnectionsPerHost(HostDistance.LOCAL, cassandraFig.getConnections())
-            .setIdleTimeoutSeconds(cassandraFig.getTimeout() / 1000)
-            .setPoolTimeoutMillis(cassandraFig.getPoolTimeout());
-
-        final QueryOptions queryOptions = new QueryOptions()
-            .setConsistencyLevel(defaultConsistencyLevel);
-
-        final Cluster.Builder datastaxCluster = Cluster.builder()
-            .withClusterName(cassandraFig.getClusterName())
-            .addContactPoints(cassandraFig.getHosts().split(","))
-            .withCompression(ProtocolOptions.Compression.LZ4)
-            .withLoadBalancingPolicy(loadBalancingPolicy)
-            .withPoolingOptions(poolingOptions)
-            .withQueryOptions(queryOptions)
-            .withProtocolVersion(ProtocolVersion.NEWEST_SUPPORTED);
-
-        // only add auth credentials if they were provided
-        if ( !cassandraFig.getUsername().isEmpty() && !cassandraFig.getPassword().isEmpty() ){
-            datastaxCluster.withCredentials(
-                cassandraFig.getUsername(),
-                cassandraFig.getPassword()
-            );
-        }
-
-        this.cluster = datastaxCluster.build();
         logger.info("Initialized datastax cluster client. Hosts={}, Idle Timeout={}s,  Pool Timeout={}s",
             cluster.getMetadata().getAllHosts().toString(),
             cluster.getConfiguration().getPoolingOptions().getIdleTimeoutSeconds(),
@@ -106,14 +58,20 @@ public class DataStaxClusterImpl implements DataStaxCluster {
     @Override
     public Cluster getCluster(){
 
+        // ensure we can build the cluster if it was previously closed
+        if ( cluster.isClosed() ){
+            cluster = buildCluster();
+        }
+
         return cluster;
     }
 
     @Override
     public Session getClusterSession(){
 
+        // always grab cluster from getCluster() in case it was prematurely closed
         if ( clusterSession == null || clusterSession.isClosed() ){
-            clusterSession = cluster.connect();
+            clusterSession = getCluster().connect();
         }
 
         return clusterSession;
@@ -122,34 +80,39 @@ public class DataStaxClusterImpl implements DataStaxCluster {
     @Override
     public Session getApplicationSession(){
 
+        // always grab cluster from getCluster() in case it was prematurely closed
         if ( applicationSession == null || applicationSession.isClosed() ){
-            applicationSession = cluster.connect( CQLUtils.quote(cassandraFig.getApplicationKeyspace() ) );
+            applicationSession = getCluster().connect( CQLUtils.quote(cassandraFig.getApplicationKeyspace() ) );
         }
         return applicationSession;
     }
 
+
+    /**
+     * Execute CQL that will create the keyspace if it doesn't exist and alter it if it does.
+     * @throws Exception
+     */
     private void createOrUpdateKeyspace() throws Exception {
 
         clusterSession = getClusterSession();
 
         final String createApplicationKeyspace = String.format(
-            "CREATE KEYSPACE IF NOT EXISTS \"%s\" WITH replication = %s",
-            cassandraFig.getApplicationKeyspace(),
+            "CREATE KEYSPACE IF NOT EXISTS %s WITH replication = %s",
+            CQLUtils.quote(cassandraFig.getApplicationKeyspace()),
             CQLUtils.getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
 
         );
 
         final String updateApplicationKeyspace = String.format(
-            "ALTER KEYSPACE \"%s\" WITH replication = %s",
-            cassandraFig.getApplicationKeyspace(),
+            "ALTER KEYSPACE %s WITH replication = %s",
+            CQLUtils.quote(cassandraFig.getApplicationKeyspace()),
             CQLUtils.getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
         );
 
-        logger.info("Creating application keyspace with the following CQL: {}", createApplicationKeyspace);
         clusterSession.execute(createApplicationKeyspace);
-        logger.info("Updating application keyspace with the following CQL: {}", updateApplicationKeyspace);
         clusterSession.executeAsync(updateApplicationKeyspace);
 
+        logger.info("Created/Updated keyspace: {}", cassandraFig.getApplicationKeyspace());
 
         waitForSchemaAgreement();
     }
@@ -158,11 +121,11 @@ public class DataStaxClusterImpl implements DataStaxCluster {
      * Wait until all Cassandra nodes agree on the schema.  Sleeps 100ms between checks.
      *
      */
-    private void waitForSchemaAgreement() {
+    public void waitForSchemaAgreement() {
 
         while ( true ) {
 
-            if( cluster.getMetadata().checkSchemaAgreement() ){
+            if( this.cluster.getMetadata().checkSchemaAgreement() ){
                 return;
             }
 
@@ -176,4 +139,59 @@ public class DataStaxClusterImpl implements DataStaxCluster {
         }
     }
 
+    public Cluster buildCluster(){
+
+        ConsistencyLevel defaultConsistencyLevel;
+        try {
+            defaultConsistencyLevel = ConsistencyLevel.valueOf(cassandraFig.getReadCl());
+        } catch (IllegalArgumentException e){
+
+            logger.error("Unable to parse provided consistency level in property: {}, defaulting to: {}",
+                CassandraFig.READ_CL,
+                ConsistencyLevel.LOCAL_QUORUM);
+
+            defaultConsistencyLevel = ConsistencyLevel.LOCAL_QUORUM;
+        }
+
+
+        LoadBalancingPolicy loadBalancingPolicy;
+        if( !cassandraFig.getLocalDataCenter().isEmpty() ){
+
+            loadBalancingPolicy = new DCAwareRoundRobinPolicy.Builder()
+                .withLocalDc( cassandraFig.getLocalDataCenter() ).build();
+        }else{
+            loadBalancingPolicy = new DCAwareRoundRobinPolicy.Builder().build();
+        }
+
+        final PoolingOptions poolingOptions = new PoolingOptions()
+            .setCoreConnectionsPerHost(HostDistance.LOCAL, cassandraFig.getConnections() / 2)
+            .setMaxConnectionsPerHost(HostDistance.LOCAL, cassandraFig.getConnections())
+            .setIdleTimeoutSeconds(cassandraFig.getTimeout() / 1000)
+            .setPoolTimeoutMillis(cassandraFig.getPoolTimeout());
+
+        final QueryOptions queryOptions = new QueryOptions()
+            .setConsistencyLevel(defaultConsistencyLevel);
+
+        Cluster.Builder datastaxCluster = Cluster.builder()
+            .withClusterName(cassandraFig.getClusterName())
+            .addContactPoints(cassandraFig.getHosts().split(","))
+            .withCompression(ProtocolOptions.Compression.LZ4)
+            .withLoadBalancingPolicy(loadBalancingPolicy)
+            .withPoolingOptions(poolingOptions)
+            .withQueryOptions(queryOptions)
+            .withProtocolVersion(ProtocolVersion.NEWEST_SUPPORTED);
+
+        // only add auth credentials if they were provided
+        if ( !cassandraFig.getUsername().isEmpty() && !cassandraFig.getPassword().isEmpty() ){
+            datastaxCluster.withCredentials(
+                cassandraFig.getUsername(),
+                cassandraFig.getPassword()
+            );
+        }
+
+
+        return datastaxCluster.build();
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/7ff31ebf/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
index d746482..105f93a 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
@@ -41,7 +41,7 @@ import com.netflix.astyanax.ddl.KeyspaceDefinition;
 
 
 /**
- * Implementation of the migration manager to set up keyspace
+ * Implementation of the migration manager to set up column families / tables
  *
  * @author tnine
  */
@@ -74,8 +74,6 @@ public class MigrationManagerImpl implements MigrationManager {
 
         try {
 
-            createOrUpdateKeyspace();
-
             for ( Migration migration : migrations ) {
 
                 final Collection<MultiTenantColumnFamilyDefinition> columnFamilies = migration.getColumnFamilies();
@@ -107,8 +105,6 @@ public class MigrationManagerImpl implements MigrationManager {
                 }
 
 
-
-
             }
         }
         catch ( Throwable t ) {
@@ -136,77 +132,23 @@ public class MigrationManagerImpl implements MigrationManager {
 
         logger.info( "Created column family {}", columnFamily.getColumnFamily().getName() );
 
-        waitForSchemaAgreement();
+        dataStaxCluster.waitForSchemaAgreement();
     }
 
     private void createTable(TableDefinition tableDefinition ) throws Exception {
 
-        logger.info("Creating, if not exists, table: {}", tableDefinition.getTableName());
         String CQL = CQLUtils.getTableCQL( tableDefinition, CQLUtils.ACTION.CREATE );
-        logger.info( CQL );
         if (logger.isDebugEnabled()){
             logger.debug( CQL );
         }
         dataStaxCluster.getApplicationSession()
             .execute( CQL );
 
-        waitForSchemaAgreement();
-    }
-
-
-    /**
-     * Execute CQL to create the keyspace if it does not already exists.  Always update the keyspace with the
-     * configured strategy options to allow for real time replication updates.
-     *
-     * @throws Exception
-     */
-    private void createOrUpdateKeyspace() throws Exception {
-
-        Session clusterSession = dataStaxCluster.getClusterSession();
-
-        final String createApplicationKeyspace = String.format(
-            "CREATE KEYSPACE IF NOT EXISTS \"%s\" WITH replication = %s",
-            cassandraFig.getApplicationKeyspace(),
-            CQLUtils.getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
-
-        );
-
-        final String updateApplicationKeyspace = String.format(
-            "ALTER KEYSPACE \"%s\" WITH replication = %s",
-            cassandraFig.getApplicationKeyspace(),
-            CQLUtils.getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
-        );
+        logger.info("Created table: {}", tableDefinition.getTableName());
 
-        logger.info("Creating application keyspace with the following CQL: {}", createApplicationKeyspace);
-        clusterSession.execute(createApplicationKeyspace);
-        logger.info("Updating application keyspace with the following CQL: {}", updateApplicationKeyspace);
-        clusterSession.executeAsync(updateApplicationKeyspace);
-
-        waitForSchemaAgreement();
+        dataStaxCluster.waitForSchemaAgreement();
     }
 
 
-    /**
-     * Wait until all Cassandra nodes agree on the schema.  Sleeps 100ms between checks.
-     *
-     */
-    private void waitForSchemaAgreement() {
-
-        while ( true ) {
-
-            if( dataStaxCluster.getCluster().getMetadata().checkSchemaAgreement() ){
-                return;
-            }
-
-            //sleep and try it again
-            try {
-                Thread.sleep( 100 );
-            }
-            catch ( InterruptedException e ) {
-                //swallow
-            }
-        }
-    }
-
 
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/7ff31ebf/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
index 76fcefe..c47312d 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
@@ -19,6 +19,7 @@
 package org.apache.usergrid.persistence.core.datastax;
 
 
+import com.datastax.driver.core.DataType;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,10 +39,10 @@ public class CQLUtilsTest {
     public void testTableCQL() throws Exception {
 
 
-        Map<String, String> columns = new HashMap<>();
-        columns.put("key", "blob");
-        columns.put("column1", "text");
-        columns.put("value", "blob");
+        Map<String, DataType.Name> columns = new HashMap<>();
+        columns.put("key", DataType.Name.BLOB);
+        columns.put("column1", DataType.Name.TEXT);
+        columns.put("value", DataType.Name.BLOB);
 
         List<String> partitionKeys = new ArrayList<>();
         partitionKeys.add("key");
@@ -55,7 +56,7 @@ public class CQLUtilsTest {
 
 
         TableDefinition table1 = new TableDefinition(
-            "table1",
+            CQLUtils.quote("table1"),
             partitionKeys,
             columnKeys,
             columns,
@@ -66,10 +67,21 @@ public class CQLUtilsTest {
         String createCQL = CQLUtils.getTableCQL(table1, CQLUtils.ACTION.CREATE);
         String updateCQL = CQLUtils.getTableCQL(table1, CQLUtils.ACTION.UPDATE);
 
-        assertTrue( createCQL.contains( CQLUtils.CREATE_TABLE ) && !createCQL.contains( CQLUtils.ALTER_TABLE ) );
-        assertTrue( updateCQL.contains( CQLUtils.ALTER_TABLE ) && !updateCQL.contains( CQLUtils.CREATE_TABLE ) );
-        logger.info("CREATE: {}", createCQL);
-        logger.info("UPDATE: {}", updateCQL);
+        assertTrue(
+            createCQL.contains(CQLUtils.CREATE_TABLE ) &&
+                !createCQL.contains( CQLUtils.ALTER_TABLE )  &&
+                createCQL.contains( DataType.Name.BLOB.toString() ) &&
+                createCQL.contains( DataType.Name.TEXT.toString() )
+
+        );
+        assertTrue(
+            updateCQL.contains( CQLUtils.ALTER_TABLE ) &&
+                !updateCQL.contains( CQLUtils.CREATE_TABLE ) &&
+                !updateCQL.contains( DataType.Name.BLOB.toString() ) &&
+                !updateCQL.contains( DataType.Name.TEXT.toString() )
+        );
+        logger.info(createCQL);
+        logger.info(updateCQL);
 
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/7ff31ebf/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
index 5da23ce..81b7d8f 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
@@ -18,7 +18,68 @@
  */
 package org.apache.usergrid.persistence.core.datastax;
 
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.Session;
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.guice.TestCommonModule;
+import org.apache.usergrid.persistence.core.test.ITRunner;
+import org.apache.usergrid.persistence.core.test.UseModules;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+@RunWith( ITRunner.class )
+@UseModules( TestCommonModule.class )
 public class DatastaxClusterTest {
 
-    //TODO
+
+    @Inject
+    DataStaxCluster dataStaxCluster;
+
+    @Inject
+    CassandraFig cassandraFig;
+
+
+    @Test
+    public void testConnectCloseCluster() {
+
+        Cluster cluster = dataStaxCluster.getCluster();
+
+        assertTrue(!cluster.isClosed());
+
+        cluster.close();
+        assertTrue(cluster.isClosed());
+
+        // validate getCluster will re-init the cluster
+        cluster = dataStaxCluster.getCluster();
+        assertTrue(!cluster.isClosed());
+
+        
+    }
+
+    @Test
+    public void testGetClusterSession() {
+
+        Session session = dataStaxCluster.getClusterSession();
+        String clusterName = session.getCluster().getClusterName();
+        String keyspaceName = session.getLoggedKeyspace();
+
+        // cluster session is not logged to a keyspace
+        assertNull(keyspaceName);
+        assertNotNull(clusterName);
+    }
+
+    @Test
+    public void testGetApplicationSession() {
+
+        Session session = dataStaxCluster.getApplicationSession();
+        String keyspaceName = session.getLoggedKeyspace();
+
+
+        assertEquals(cassandraFig.getApplicationKeyspace(), keyspaceName);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/7ff31ebf/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
index 958b6f2..e2ea681 100644
--- a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
+++ b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
@@ -49,24 +49,25 @@ public class MapSerializationImpl implements MapSerialization {
     private static final String MAP_ENTRIES_TABLE = CQLUtils.quote("Map_Entries");
     private static final Collection<String> MAP_ENTRIES_PARTITION_KEYS = Collections.singletonList("key");
     private static final Collection<String> MAP_ENTRIES_COLUMN_KEYS = Collections.singletonList("column1");
-    private static final Map<String, String> MAP_ENTRIES_COLUMNS =
-        new HashMap<String, String>() {{
-            put( "key", "blob");
-            put( "column1", "blob");
-            put( "value", "blob"); }};
+    private static final Map<String, DataType.Name> MAP_ENTRIES_COLUMNS =
+        new HashMap<String, DataType.Name>() {{
+            put( "key", DataType.Name.BLOB );
+            put( "column1", DataType.Name.BLOB );
+            put( "value", DataType.Name.BLOB ); }};
     private static final Map<String, String> MAP_ENTRIES_CLUSTERING_ORDER =
-        new HashMap<String, String>(){{ put("column1", "ASC"); }};
+        new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
+
 
     private static final String MAP_KEYS_TABLE = CQLUtils.quote("Map_Keys");
     private static final Collection<String> MAP_KEYS_PARTITION_KEYS = Collections.singletonList("key");
     private static final Collection<String> MAP_KEYS_COLUMN_KEYS = Collections.singletonList("column1");
-    private static final Map<String, String> MAP_KEYS_COLUMNS =
-        new HashMap<String, String>() {{
-            put( "key", "blob");
-            put( "column1", "blob");
-            put( "value", "blob"); }};
+    private static final Map<String, DataType.Name> MAP_KEYS_COLUMNS =
+        new HashMap<String, DataType.Name>() {{
+            put( "key", DataType.Name.BLOB );
+            put( "column1", DataType.Name.BLOB );
+            put( "value", DataType.Name.BLOB ); }};
     private static final Map<String, String> MAP_KEYS_CLUSTERING_ORDER =
-        new HashMap<String, String>(){{ put("column1", "ASC"); }};
+        new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
 
 
 


[27/38] usergrid git commit: Initial UniqueValueSerialization conversion to CQL.

Posted by mr...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/migration/AbstractMvccEntityDataMigrationV1ToV3ImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/migration/AbstractMvccEntityDataMigrationV1ToV3ImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/migration/AbstractMvccEntityDataMigrationV1ToV3ImplTest.java
index 9be979b..046aaf5 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/migration/AbstractMvccEntityDataMigrationV1ToV3ImplTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/migration/AbstractMvccEntityDataMigrationV1ToV3ImplTest.java
@@ -22,6 +22,7 @@ package org.apache.usergrid.persistence.collection.serialization.impl.migration;
 
 import java.util.UUID;
 
+import com.datastax.driver.core.Session;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -87,6 +88,8 @@ public abstract class AbstractMvccEntityDataMigrationV1ToV3ImplTest
     @Inject
     public Keyspace keyspace;
     @Inject
+    public Session session;
+    @Inject
     public VersionedMigrationSet<MvccEntitySerializationStrategy> allVersions;
     @Inject
     public MvccEntitySerializationStrategyV3Impl mvccEntitySerializationStrategyV3;
@@ -148,7 +151,7 @@ public abstract class AbstractMvccEntityDataMigrationV1ToV3ImplTest
         assertEquals( "Same instance for to", v3Impl.getClass(), tuple.to.getClass() );
 
 
-        MvccEntityDataMigrationImpl mvccEntityDataMigrationImpl = new MvccEntityDataMigrationImpl(keyspace, allVersions, mvccEntitySerializationStrategyV3, uniqueValueSerializationStrategy,  mvccLogEntrySerializationStrategy, migrationProvider);
+        MvccEntityDataMigrationImpl mvccEntityDataMigrationImpl = new MvccEntityDataMigrationImpl(keyspace, session, allVersions, mvccEntitySerializationStrategyV3, uniqueValueSerializationStrategy,  mvccLogEntrySerializationStrategy, migrationProvider);
 
 
         //now migration

http://git-wip-us.apache.org/repos/asf/usergrid/blob/0c609878/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
index 34cfec8..c7b736f 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
@@ -46,6 +46,9 @@ public class DataStaxClusterImpl implements DataStaxCluster {
         this.cassandraFig = cassandraFig;
         this.cluster = buildCluster();
 
+        // always initialize the keyspaces
+        this.createOrUpdateKeyspace();
+
         logger.info("Initialized datastax cluster client. Hosts={}, Idle Timeout={}s,  Pool Timeout={}s",
             cluster.getMetadata().getAllHosts().toString(),
             cluster.getConfiguration().getPoolingOptions().getIdleTimeoutSeconds(),


[38/38] usergrid git commit: Merge branch 'master' into datastax-cass-driver

Posted by mr...@apache.org.
Merge branch 'master' into datastax-cass-driver


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/5095891d
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/5095891d
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/5095891d

Branch: refs/heads/master
Commit: 5095891dd3882adb33a5b50eeab1748c6e3d9df1
Parents: 32782a3 f9196037
Author: Michael Russo <mr...@apigee.com>
Authored: Wed Aug 17 14:16:35 2016 -0700
Committer: Michael Russo <mr...@apigee.com>
Committed: Wed Aug 17 14:16:35 2016 -0700

----------------------------------------------------------------------
 .../Usergrid.Sdk.IntegrationTests/BaseTest.cs   |   23 +-
 .../EntityPagingTests.cs                        |    2 +-
 .../Usergrid.Sdk.IntegrationTests/GroupTests.cs |    4 +-
 .../Usergrid.Sdk.IntegrationTests/LoginTests.cs |   12 +-
 .../Usergrid.Sdk.IntegrationTests.dll.config    |    1 +
 .../usergrid/java/client/UsergridClient.java    |    2 +
 .../java/client/UsergridRequestManager.java     |   13 +-
 .../usergrid/java/client/auth/UsergridAuth.java |    1 +
 .../java/client/auth/UsergridUserAuth.java      |   16 +-
 .../java/client/model/UsergridEntity.java       |    2 +-
 .../java/client/query/UsergridQuery.java        |   11 +-
 sdks/python/.gitignore                          |   57 +
 sdks/python/GUIDE.md                            |    2 +
 sdks/python/LICENSE                             |  202 ++
 sdks/python/README.md                           |   16 +
 sdks/python/README.rst                          |   20 +
 sdks/python/sample_app.py                       |   77 +
 sdks/python/setup.py                            |   51 +
 sdks/python/usergrid/UsergridApplication.py     |   65 +
 sdks/python/usergrid/UsergridAuth.py            |  105 +
 sdks/python/usergrid/UsergridClient.py          |  401 ++++
 sdks/python/usergrid/UsergridCollection.py      |   82 +
 sdks/python/usergrid/UsergridConnection.py      |   30 +
 sdks/python/usergrid/UsergridError.py           |   21 +
 sdks/python/usergrid/UsergridOrganization.py    |   35 +
 sdks/python/usergrid/UsergridQueryIterator.py   |  157 ++
 sdks/python/usergrid/__init__.py                |   37 +
 sdks/python/usergrid/app_templates.py           |   38 +
 sdks/python/usergrid/management_templates.py    |   27 +
 stack/README.md                                 |    2 +-
 .../main/resources/usergrid-default.properties  |   37 +-
 .../batch/service/JobSchedulerService.java      |    4 +-
 .../corepersistence/CpEntityManager.java        |   33 +-
 .../corepersistence/CpEntityManagerFactory.java |   13 +-
 .../corepersistence/CpRelationManager.java      |   55 +-
 .../pipeline/builder/IdBuilder.java             |   20 +-
 .../pipeline/read/FilterFactory.java            |    8 +
 .../AbstractReadReverseGraphFilter.java         |  291 +++
 .../ReadGraphReverseConnectionFilter.java       |   53 +
 .../service/ConnectionSearch.java               |    8 +-
 .../service/ConnectionServiceImpl.java          |    9 +-
 .../usergrid/mq/cassandra/CassandraMQUtils.java |    4 +-
 .../usergrid/persistence/PersistenceModule.java |   12 +-
 .../org/apache/usergrid/persistence/Query.java  |   39 +-
 .../corepersistence/index/IndexServiceTest.java |    4 -
 .../persistence/EntityConnectionsIT.java        |   65 +-
 .../actorsystem/ActorSystemManager.java         |    9 +-
 .../actorsystem/ActorSystemManagerImpl.java     |   40 +-
 .../persistence/actorsystem/RouterProducer.java |   28 +-
 .../actorsystem/ActorServiceServiceTest.java    |    8 +-
 .../uniquevalues/UniqueValuesFig.java           |   19 +-
 .../uniquevalues/UniqueValuesServiceImpl.java   |  127 +-
 .../collection/AbstractUniqueValueTest.java     |    4 -
 .../index/impl/EsEntityIndexImpl.java           |   53 +-
 .../persistence/index/impl/EntityIndexTest.java |   12 +-
 stack/pom.xml                                   |    2 +-
 stack/query-validator/pom.xml                   |   32 +-
 .../query/validator/ApiServerRunner.java        |  103 +-
 .../query/validator/AbstractQueryIT.java        |   26 +-
 .../usergrid/query/validator/QueryITSuite.java  |   12 +-
 .../query/validator/users/UserQueryIT.java      |   56 +-
 .../test/resources/usergrid-test-context.xml    |    5 +-
 stack/rest/pom.xml                              |    8 +
 .../usergrid/rest/AbstractContextResource.java  |   16 +
 .../applications/events/EventsResource.java     |    6 +-
 .../usergrid/rest/exceptions/AuthErrorInfo.java |    1 +
 .../rest/exceptions/RuntimeExceptionMapper.java |   43 +
 .../rest/management/ManagementResource.java     |  180 +-
 .../organizations/OrganizationsResource.java    |   46 +-
 .../organizations/users/UsersResource.java      |   59 +-
 .../rest/management/users/UserResource.java     |   86 +-
 .../rest/management/users/UsersResource.java    |   54 +-
 .../organizations/OrganizationsResource.java    |   24 +
 .../security/SecuredResourceFilterFactory.java  |   16 +-
 .../shiro/filters/BasicAuthSecurityFilter.java  |    3 +
 .../ClientCredentialsSecurityFilter.java        |    4 +
 .../OAuth2AccessTokenSecurityFilter.java        |   10 +-
 .../security/shiro/filters/SecurityFilter.java  |   12 +
 .../java/org/apache/usergrid/rest/ITSetup.java  |   56 +-
 .../applications/events/EventsResourceIT.java   |   32 +-
 .../rest/management/ExternalSSOEnabledIT.java   |  175 ++
 .../rest/management/ManagementResourceIT.java   |   38 +-
 stack/services/pom.xml                          |    7 +
 .../usergrid/management/ManagementService.java  |   19 +-
 .../cassandra/AccountCreationPropsImpl.java     |    4 +-
 .../cassandra/ManagementServiceImpl.java        |   77 +-
 ...alSSOProviderAdminUserNotFoundException.java |   28 +
 .../security/shiro/utils/SubjectUtils.java      |   32 +-
 .../security/sso/ApigeeSSO2Provider.java        |  220 ++
 .../security/sso/ExternalSSOProvider.java       |   42 +
 .../security/sso/SSOProviderFactory.java        |   85 +
 .../security/sso/UsergridExternalProvider.java  |  291 +++
 .../usergrid/security/tokens/TokenService.java  |   10 +-
 .../tokens/cassandra/TokenServiceImpl.java      |  284 +--
 .../services/AbstractConnectionsService.java    |   37 +-
 .../AbstractPathBasedCollectionService.java     |  153 ++
 .../AbstractPathBasedColllectionService.java    |  153 --
 .../usergrid/services/assets/AssetsService.java |    4 +-
 .../usergrid/services/groups/GroupsService.java |    4 +-
 .../resources/usergrid-services-context.xml     |   14 +
 .../usergrid/services/ConnectionsServiceIT.java |   74 +-
 utils/usergrid-util-python/.gitignore           |   61 +
 utils/usergrid-util-python/LICENSE              |  202 ++
 utils/usergrid-util-python/README.md            |   15 +
 .../es_tools/alias_mover.py                     |   72 +
 .../es_tools/cluster_shard_allocation.py        |  111 +
 .../es_tools/command_sender.py                  |   52 +
 .../es_tools/es_index_iterator_reindexer.py     |  128 +
 .../es_tools/es_searcher.py                     |   45 +
 .../es_tools/index_deleter.py                   |   98 +
 .../es_tools/index_prefix_checker.py            |  100 +
 .../es_tools/index_replica_setter.py            |  124 +
 .../es_tools/index_shard_allocator.py           |  149 ++
 .../es_tools/mapping_deleter.py                 |   53 +
 .../es_tools/mapping_retriever.py               |   64 +
 .../es_tools/monitor_tasks.py                   |   61 +
 utils/usergrid-util-python/index_test/README.md |    1 +
 .../index_test/document_creator.py              |  276 +++
 .../index_test/index_test_mixed_batch.py        |  552 +++++
 .../index_test/index_test_single_type_batch.py  |  555 +++++
 utils/usergrid-util-python/requirements.txt     |    4 +
 .../activity_streams/activity_streams.py        |  154 ++
 .../samples/beacon-event-example.py             |  238 ++
 .../samples/counter_test.py                     |   52 +
 utils/usergrid-util-python/setup.py             |   59 +
 .../usergrid_tools/__init__.py                  |    4 +
 .../usergrid_tools/general/__init__.py          |   21 +
 .../usergrid_tools/general/deleter.py           |  170 ++
 .../general/duplicate_name_checker.py           |   47 +
 .../usergrid_tools/general/queue_monitor.py     |  138 ++
 .../usergrid_tools/general/url_tester.py        |  108 +
 .../general/user_confirm_activate.py            |   51 +
 .../usergrid_tools/groups/__init__.py           |    2 +
 .../usergrid_tools/groups/big_group_creater.py  |  100 +
 .../usergrid_tools/indexing/README.md           |   22 +
 .../usergrid_tools/indexing/__init__.py         |   21 +
 .../usergrid_tools/indexing/batch_index_test.py |  362 +++
 .../indexing/entity_index_test.py               |  339 +++
 .../usergrid_tools/iterators/README.md          |    8 +
 .../usergrid_tools/iterators/__init__.py        |   18 +
 .../usergrid_tools/iterators/simple_iterator.py |  101 +
 .../iterators/usergrid_cross_region_iterator.py |  425 ++++
 .../iterators/usergrid_iterator.py              |  504 ++++
 .../usergrid_tools/library_check.py             |   45 +
 .../usergrid_tools/migration/README.md          |  234 ++
 .../usergrid_tools/migration/__init__.py        |   24 +
 .../migration/usergrid_data_exporter.py         |  943 ++++++++
 .../migration/usergrid_data_migrator.py         | 2186 ++++++++++++++++++
 .../usergrid_tools/parse_importer/README.md     |   90 +
 .../usergrid_tools/parse_importer/__init__.py   |   21 +
 .../parse_importer/parse_importer.py            |  404 ++++
 .../usergrid_tools/permissions/README.md        |    3 +
 .../usergrid_tools/permissions/permissions.py   |  168 ++
 .../usergrid_tools/queue/README.md              |    1 +
 .../queue/dlq-iterator-checker.py               |  162 ++
 .../usergrid_tools/queue/dlq_requeue.py         |  192 ++
 .../queue/queue-config-sample.json              |   22 +
 .../usergrid_tools/queue/queue_cleaner.py       |  174 ++
 .../usergrid_tools/redis/redis_iterator.py      |   52 +
 .../usergrid_tools/redis/redisscan.py           |   37 +
 160 files changed, 14501 insertions(+), 1034 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/5095891d/stack/config/src/main/resources/usergrid-default.properties
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/5095891d/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/5095891d/stack/pom.xml
----------------------------------------------------------------------


[22/38] usergrid git commit: Re-write SCOPED_CACHE serialization to use Datastax driver and CQL.

Posted by mr...@apache.org.
Re-write SCOPED_CACHE serialization to use Datastax driver and CQL.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/4475158f
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/4475158f
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/4475158f

Branch: refs/heads/master
Commit: 4475158f1b48aa485d6af7d90caa91948ac2f46f
Parents: 6a1fd22
Author: Michael Russo <mr...@apigee.com>
Authored: Sun May 1 16:56:56 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun May 1 16:56:56 2016 +0800

----------------------------------------------------------------------
 .../impl/ScopedCacheSerializationImpl.java      | 311 ++++++++++---------
 1 file changed, 170 insertions(+), 141 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/4475158f/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
index 1646d36..ffa5f1f 100644
--- a/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
+++ b/stack/corepersistence/cache/src/main/java/org/apache/usergrid/persistence/cache/impl/ScopedCacheSerializationImpl.java
@@ -16,10 +16,16 @@
  */
 package org.apache.usergrid.persistence.cache.impl;
 
+import com.datastax.driver.core.*;
+import com.datastax.driver.core.querybuilder.Clause;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.datastax.driver.core.querybuilder.Using;
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Preconditions;
 import com.google.common.hash.Funnel;
@@ -39,6 +45,7 @@ import com.netflix.astyanax.serializers.StringSerializer;
 import org.apache.cassandra.db.marshal.BytesType;
 import org.apache.usergrid.persistence.cache.CacheScope;
 import org.apache.usergrid.persistence.core.astyanax.*;
+import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.shard.ExpandingShardLocator;
 import org.apache.usergrid.persistence.core.shard.StringHashUtils;
@@ -46,9 +53,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
+import java.nio.ByteBuffer;
+import java.util.*;
 import java.util.concurrent.Callable;
 
 
@@ -57,55 +63,50 @@ import java.util.concurrent.Callable;
  */
 public class ScopedCacheSerializationImpl<K,V> implements ScopedCacheSerialization<K,V> {
 
-    // row-keys are application ID + consistent hash key
-    // column names are K key toString()
-    // column values are serialization of V value
-
     public static final Logger logger = LoggerFactory.getLogger(ScopedCacheSerializationImpl.class);
 
+    // row-keys are (app UUID, application type, app UUID as string, consistent hash int as bucket number)
+    // column names are K key toString()
+    // column values are serialization of V value
 
-    private static final CacheRowKeySerializer ROWKEY_SERIALIZER = new CacheRowKeySerializer();
-
-    private static final BucketScopedRowKeySerializer<String> BUCKET_ROWKEY_SERIALIZER =
-        new BucketScopedRowKeySerializer<>( ROWKEY_SERIALIZER );
-
-    private static final Serializer<String> COLUMN_NAME_SERIALIZER = StringSerializer.get();
+    private static final String SCOPED_CACHE_TABLE = CQLUtils.quote("SCOPED_CACHE");
+    private static final Collection<String> SCOPED_CACHE_PARTITION_KEYS = Collections.singletonList("key");
+    private static final Collection<String> SCOPED_CACHE_COLUMN_KEYS = Collections.singletonList("column1");
+    private static final Map<String, DataType.Name> SCOPED_CACHE_COLUMNS =
+        new HashMap<String, DataType.Name>() {{
+            put( "key", DataType.Name.BLOB );
+            put( "column1", DataType.Name.BLOB );
+            put( "value", DataType.Name.BLOB ); }};
+    private static final Map<String, String> SCOPED_CACHE_CLUSTERING_ORDER =
+        new HashMap<String, String>(){{ put( "column1", "ASC" ); }};
 
-    private static final ObjectSerializer COLUMN_VALUE_SERIALIZER = ObjectSerializer.get();
 
-    public static final MultiTenantColumnFamily<BucketScopedRowKey<String>, String> SCOPED_CACHE
-        = new MultiTenantColumnFamily<>( "SCOPED_CACHE",
-            BUCKET_ROWKEY_SERIALIZER, COLUMN_NAME_SERIALIZER, COLUMN_VALUE_SERIALIZER );
 
     /** Number of buckets to hash across */
     private static final int[] NUM_BUCKETS = {20};
 
     /** How to funnel keys for buckets */
-    private static final Funnel<String> MAP_KEY_FUNNEL = new Funnel<String>() {
-
-        @Override
-        public void funnel( final String key, final PrimitiveSink into ) {
-            into.putString(key, StringHashUtils.UTF8);
-        }
-    };
+    private static final Funnel<String> MAP_KEY_FUNNEL =
+        (Funnel<String>) (key, into) -> into.putString(key, StringHashUtils.UTF8);
 
-    /**
-     * Locator to get us all buckets
-     */
+    /** Locator to get us all buckets */
     private static final ExpandingShardLocator<String>
         BUCKET_LOCATOR = new ExpandingShardLocator<>(MAP_KEY_FUNNEL, NUM_BUCKETS);
 
-    private final Keyspace keyspace;
 
+    private final Session session;
+    private final CassandraConfig cassandraConfig;
     private final ObjectMapper MAPPER = new ObjectMapper();
 
 
-    //------------------------------------------------------------------------------------------
+
 
     @Inject
-    public ScopedCacheSerializationImpl( final Keyspace keyspace ) {
-        this.keyspace = keyspace;
-        //MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+    public ScopedCacheSerializationImpl( final Session session,
+                                         final CassandraConfig cassandraConfig ) {
+        this.session = session;
+        this.cassandraConfig = cassandraConfig;
+
         MAPPER.enableDefaultTyping();
         MAPPER.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
         MAPPER.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
@@ -115,77 +116,76 @@ public class ScopedCacheSerializationImpl<K,V> implements ScopedCacheSerializati
     @Override
     public V readValue(CacheScope scope, K key, TypeReference typeRef ) {
 
+        return readValueCQL( scope, key, typeRef);
+
+    }
+
+
+    private V readValueCQL(CacheScope scope, K key, TypeReference typeRef){
+
         Preconditions.checkNotNull(scope, "scope is required");
         Preconditions.checkNotNull(key, "key is required");
 
-        // determine bucketed row-key based application UUID
-        String rowKeyString = scope.getApplication().getUuid().toString();
+        final String rowKeyString = scope.getApplication().getUuid().toString();
         final int bucket = BUCKET_LOCATOR.getCurrentBucket(rowKeyString);
-        final BucketScopedRowKey<String> keyRowKey =
-            BucketScopedRowKey.fromKey(scope.getApplication(), rowKeyString, bucket);
 
         // determine column name based on K key to string
-        String columnName = key.toString();
+        final String columnName = key.toString();
 
-        try {
-            try {
-                Column<String> result = keyspace.prepareQuery(SCOPED_CACHE)
-                    .getKey(keyRowKey).getColumn( columnName ).execute().getResult();
-
-                result.getByteBufferValue();
-                //V value = MAPPER.readValue(result.getByteArrayValue(), new TypeReference<V>() {});
-                V value = MAPPER.readValue(result.getByteArrayValue(), typeRef);
-
-                logger.debug("Read cache item from scope {}\n   key/value types {}/{}\n   key:value: {}:{}",
-                        scope.getApplication().getUuid(),
-                        key.getClass().getSimpleName(),
-                        value.getClass().getSimpleName(),
-                        key,
-                        value);
-
-                return value;
-
-            } catch (NotFoundException nfe) {
-                if(logger.isDebugEnabled()) {
-                    logger.debug("Value not found");
-                }
-
-            } catch (IOException ioe) {
-                logger.error("Unable to read cached value", ioe);
-                throw new RuntimeException("Unable to read cached value", ioe);
+        final Clause inKey = QueryBuilder.eq("key", getPartitionKey(scope, rowKeyString, bucket) );
+        final Clause inColumn = QueryBuilder.eq("column1", DataType.text().serialize(columnName, ProtocolVersion.NEWEST_SUPPORTED) );
+
+        final Statement statement = QueryBuilder.select().all().from(SCOPED_CACHE_TABLE)
+            .where(inKey)
+            .and(inColumn)
+            .setConsistencyLevel(cassandraConfig.getDataStaxReadCl());
+
+        final ResultSet resultSet = session.execute(statement);
+        final com.datastax.driver.core.Row row = resultSet.one();
+
+        if (row == null){
+
+            if(logger.isDebugEnabled()){
+                logger.debug("Cache value not found for key {}", key );
             }
 
-        } catch (ConnectionException e) {
-            throw new RuntimeException("Unable to connect to cassandra", e);
+            return null;
         }
 
-        if(logger.isDebugEnabled()){
-            logger.debug("Cache value not found for key {}", key );
 
+        try {
+
+            return MAPPER.readValue(row.getBytes("value").array(), typeRef);
+
+        } catch (IOException ioe) {
+            logger.error("Unable to read cached value", ioe);
+            throw new RuntimeException("Unable to read cached value", ioe);
         }
 
-        return null;
+
     }
 
 
     @Override
     public V writeValue(CacheScope scope, K key, V value, Integer ttl) {
 
+        return writeValueCQL( scope, key, value, ttl);
+
+    }
+
+    private V writeValueCQL(CacheScope scope, K key, V value, Integer ttl) {
+
         Preconditions.checkNotNull( scope, "scope is required");
         Preconditions.checkNotNull( key, "key is required" );
         Preconditions.checkNotNull( value, "value is required");
         Preconditions.checkNotNull( ttl, "ttl is required");
 
-        // determine bucketed row-key based application UUID
 
-        String rowKeyString = scope.getApplication().getUuid().toString();
+        final String rowKeyString = scope.getApplication().getUuid().toString();
         final int bucket = BUCKET_LOCATOR.getCurrentBucket(rowKeyString);
 
-        final BucketScopedRowKey<String> keyRowKey =
-            BucketScopedRowKey.fromKey(scope.getApplication(), rowKeyString, bucket);
-
         // determine column name based on K key to string
-        String columnName = key.toString();
+        final String columnName = key.toString();
 
         // serialize cache item
         byte[] cacheBytes;
@@ -195,127 +195,156 @@ public class ScopedCacheSerializationImpl<K,V> implements ScopedCacheSerializati
             throw new RuntimeException("Unable to serialize cache value", jpe);
         }
 
-        // serialize to the entry
-        final MutationBatch batch = keyspace.prepareMutationBatch();
-        batch.withRow(SCOPED_CACHE, keyRowKey).putColumn(columnName, cacheBytes, ttl);
+        final Using timeToLive = QueryBuilder.ttl(ttl);
+
+
+        // convert to ByteBuffer for the blob DataType in Cassandra
+        final ByteBuffer bb = ByteBuffer.allocate(cacheBytes.length);
+        bb.put(cacheBytes);
+        bb.flip();
+
+        final Statement cacheEntry = QueryBuilder.insertInto(SCOPED_CACHE_TABLE)
+            .using(timeToLive)
+            .value("key", getPartitionKey(scope, rowKeyString, bucket))
+            .value("column1", DataType.text().serialize(columnName, ProtocolVersion.NEWEST_SUPPORTED))
+            .value("value", bb);
+
 
-        executeBatch(batch);
+        session.execute(cacheEntry);
 
         logger.debug("Wrote cache item to scope {}\n   key/value types {}/{}\n   key:value: {}:{}",
-                scope.getApplication().getUuid(),
-                key.getClass().getSimpleName(),
-                value.getClass().getSimpleName(),
-                key,
-                value);
+            scope.getApplication().getUuid(),
+            key.getClass().getSimpleName(),
+            value.getClass().getSimpleName(),
+            key,
+            value);
 
         return value;
+
     }
 
 
+
     @Override
     public void removeValue(CacheScope scope, K key) {
 
+        removeValueCQL(scope, key);
+
+    }
+
+
+    private void removeValueCQL(CacheScope scope, K key) {
+
         Preconditions.checkNotNull( scope, "scope is required");
         Preconditions.checkNotNull( key, "key is required" );
 
         // determine bucketed row-key based application UUID
 
-        String rowKeyString = scope.getApplication().getUuid().toString();
+        final String rowKeyString = scope.getApplication().getUuid().toString();
         final int bucket = BUCKET_LOCATOR.getCurrentBucket(rowKeyString);
 
-        final BucketScopedRowKey<String> keyRowKey =
-            BucketScopedRowKey.fromKey(scope.getApplication(), rowKeyString, bucket);
-
         // determine column name based on K key to string
-        String columnName = key.toString();
+        final String columnName = key.toString();
 
-        final MutationBatch batch = keyspace.prepareMutationBatch();
-        batch.withRow(SCOPED_CACHE, keyRowKey).deleteColumn(columnName);
 
-        executeBatch(batch);
-    }
+        final Clause inKey = QueryBuilder.eq("key", getPartitionKey(scope, rowKeyString, bucket) );
+        final Clause inColumn = QueryBuilder.eq("column1", DataType.text().serialize(columnName, ProtocolVersion.NEWEST_SUPPORTED) );
+
+        final Statement statement = QueryBuilder.delete().from(SCOPED_CACHE_TABLE)
+            .where(inKey)
+            .and(inColumn);
 
+        session.execute(statement);
 
+    }
+
+    
     @Override
     public void invalidate(CacheScope scope) {
 
+        invalidateCQL(scope);
+        logger.debug("Invalidated scope {}", scope.getApplication().getUuid());
+
+    }
+
+    private void invalidateCQL(CacheScope scope){
+
         Preconditions.checkNotNull(scope, "scope is required");
 
         // determine bucketed row-key based application UUID
-        String rowKeyString = scope.getApplication().getUuid().toString();
+        final String rowKeyString = scope.getApplication().getUuid().toString();
         final int bucket = BUCKET_LOCATOR.getCurrentBucket(rowKeyString);
-        final BucketScopedRowKey<String> keyRowKey =
-            BucketScopedRowKey.fromKey(scope.getApplication(), rowKeyString, bucket);
 
-        final MutationBatch batch = keyspace.prepareMutationBatch();
+        final Clause inKey = QueryBuilder.eq("key", getPartitionKey(scope, rowKeyString, bucket) );
 
-        batch.withRow(SCOPED_CACHE, keyRowKey).delete();
+        final Statement statement = QueryBuilder.delete().from(SCOPED_CACHE_TABLE)
+            .where(inKey);
 
-        final OperationResult<Void> result = executeBatch(batch);
+        session.execute(statement);
 
-        logger.debug("Invalidated scope {}", scope.getApplication().getUuid());
     }
 
+    @Override
+    public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
 
-    private class MutationBatchExec implements Callable<Void> {
-        private final MutationBatch myBatch;
-        private MutationBatchExec(MutationBatch batch) {
-            myBatch = batch;
-        }
-        @Override
-        public Void call() throws Exception {
-            myBatch.execute();
-            return null;
-        }
+        return Collections.emptyList();
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
 
-    private OperationResult<Void> executeBatch(MutationBatch batch) {
-        try {
-            return batch.execute();
+        final TableDefinition scopedCache =
+            new TableDefinition( SCOPED_CACHE_TABLE, SCOPED_CACHE_PARTITION_KEYS, SCOPED_CACHE_COLUMN_KEYS,
+                SCOPED_CACHE_COLUMNS, TableDefinition.CacheOption.KEYS, SCOPED_CACHE_CLUSTERING_ORDER);
 
-        } catch (ConnectionException e) {
-            throw new RuntimeException("Unable to connect to cassandra", e);
-        }
+        return Collections.singletonList(scopedCache);
     }
 
 
-    //------------------------------------------------------------------------------------------
 
-    @Override
-    public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
-        final MultiTenantColumnFamilyDefinition scopedCache =
-            new MultiTenantColumnFamilyDefinition( SCOPED_CACHE,
-                BytesType.class.getSimpleName(),
-                BytesType.class.getSimpleName(),
-                BytesType.class.getSimpleName(),
-                MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
+    private ByteBuffer getPartitionKey(CacheScope scope, String key, int bucketNumber){
+
+        return serializeKeys(scope.getApplication().getUuid(),
+            scope.getApplication().getType(), bucketNumber, key);
 
-        return Collections.singletonList(scopedCache);
     }
 
-    @Override
-    public Collection<TableDefinition> getTables() {
+    private static ByteBuffer serializeKeys(UUID ownerUUID, String ownerType, int bucketNumber, String rowKeyString ){
 
-        return Collections.emptyList();
-    }
+        List<Object> keys = new ArrayList<>(4);
+        keys.add(0, ownerUUID);
+        keys.add(1, ownerType);
+        keys.add(2, bucketNumber);
+        keys.add(3, rowKeyString);
 
+        // UUIDs are 16 bytes, allocate the buffer accordingly
+        int size = 16+ownerType.length()+rowKeyString.length();
 
-    /**
-     * Inner class to serialize cache key
-     */
-    private static class CacheRowKeySerializer implements CompositeFieldSerializer<String> {
+        // ints are 4 bytes, add for the bucket
+        size += 4;
+
+
+        // we always need to add length for the 2 byte short and 1 byte equality
+        size += keys.size()*3;
+
+        ByteBuffer stuff = ByteBuffer.allocate(size);
+
+        for (Object key : keys) {
+
+            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
+            if (kb == null) {
+                kb = ByteBuffer.allocate(0);
+            }
+
+            stuff.putShort((short) kb.remaining());
+            stuff.put(kb.slice());
+            stuff.put((byte) 0);
 
-        @Override
-        public void toComposite( final CompositeBuilder builder, final String key ) {
-            builder.addString(key);
-        }
 
-        @Override
-        public String fromComposite( final CompositeParser composite ) {
-            final String key = composite.readString();
-            return key;
         }
+        stuff.flip();
+        return stuff.duplicate();
+
     }
 
 }


[06/38] usergrid git commit: Reduce number of connections in core tests and ensure the datastax provider is a singleton.

Posted by mr...@apache.org.
Reduce number of connections in core tests and ensure the datastax provider is a singleton.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/3f8e7cba
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/3f8e7cba
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/3f8e7cba

Branch: refs/heads/master
Commit: 3f8e7cbaf4a7f8351185e803e7bd43dafc49a9a9
Parents: 2203f43
Author: Michael Russo <mi...@gmail.com>
Authored: Thu Feb 11 17:11:59 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Thu Feb 11 17:11:59 2016 -0800

----------------------------------------------------------------------
 .../resources/usergrid-custom-test.properties   |  2 +-
 .../core/datastax/DatastaxSessionProvider.java  |  2 +
 .../core/datastax/impl/DatastaxClusterImpl.java | 60 ++++++++++++++++++--
 .../migration/schema/MigrationManagerImpl.java  |  2 +-
 4 files changed, 59 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/3f8e7cba/stack/core/src/test/resources/usergrid-custom-test.properties
----------------------------------------------------------------------
diff --git a/stack/core/src/test/resources/usergrid-custom-test.properties b/stack/core/src/test/resources/usergrid-custom-test.properties
index 0fa9573..c8b4d48 100644
--- a/stack/core/src/test/resources/usergrid-custom-test.properties
+++ b/stack/core/src/test/resources/usergrid-custom-test.properties
@@ -15,7 +15,7 @@
 # these settings allow tests to run and consistently pass on 16GB MacBook Pro
 # with ug.heapmax=5000m and ug.heapmin=3000m (set in Maven settings.xml)
 cassandra.timeout=2000
-cassandra.connections=1000
+cassandra.connections=50
 
 
 #Not a good number for real systems.  Write shards should be 2x cluster size from our tests

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3f8e7cba/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
index 1b39cb8..5e9a633 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
@@ -22,7 +22,9 @@ package org.apache.usergrid.persistence.core.datastax;
 import com.datastax.driver.core.Session;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 
+@Singleton
 public class DataStaxSessionProvider implements Provider<Session> {
 
     private final DataStaxCluster dataStaxCluster;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3f8e7cba/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
index ffe61e6..a0d65e0 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
@@ -24,6 +24,7 @@ import com.datastax.driver.core.policies.LoadBalancingPolicy;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -98,18 +99,17 @@ public class DataStaxClusterImpl implements DataStaxCluster {
             cluster.getConfiguration().getPoolingOptions().getIdleTimeoutSeconds(),
             cluster.getConfiguration().getPoolingOptions().getPoolTimeoutMillis() / 1000);
 
-
-
-
-
+        createOrUpdateKeyspace();
 
     }
 
+    @Override
     public Cluster getCluster(){
 
         return cluster;
     }
 
+    @Override
     public Session getClusterSession(){
 
         if ( clusterSession == null || clusterSession.isClosed() ){
@@ -119,13 +119,63 @@ public class DataStaxClusterImpl implements DataStaxCluster {
         return clusterSession;
     }
 
+    @Override
     public Session getApplicationSession(){
 
         if ( applicationSession == null || applicationSession.isClosed() ){
-            applicationSession = cluster.connect( "\""+cassandraFig.getApplicationKeyspace()+"\"" );
+            applicationSession = cluster.connect( CQLUtils.quote(cassandraFig.getApplicationKeyspace() ) );
         }
         return applicationSession;
     }
 
+    private void createOrUpdateKeyspace() throws Exception {
+
+        clusterSession = getClusterSession();
+
+        final String createApplicationKeyspace = String.format(
+            "CREATE KEYSPACE IF NOT EXISTS \"%s\" WITH replication = %s",
+            cassandraFig.getApplicationKeyspace(),
+            CQLUtils.getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
+
+        );
+
+        final String updateApplicationKeyspace = String.format(
+            "ALTER KEYSPACE \"%s\" WITH replication = %s",
+            cassandraFig.getApplicationKeyspace(),
+            CQLUtils.getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
+        );
+
+        logger.info("Creating application keyspace with the following CQL: {}", createApplicationKeyspace);
+        clusterSession.execute(createApplicationKeyspace);
+        logger.info("Updating application keyspace with the following CQL: {}", updateApplicationKeyspace);
+        clusterSession.executeAsync(updateApplicationKeyspace);
+
+        // this session pool is only used when running database setup so close it when finished to clear resources
+        clusterSession.close();
+
+        waitForSchemaAgreement();
+    }
+
+    /**
+     * Wait until all Cassandra nodes agree on the schema.  Sleeps 100ms between checks.
+     *
+     */
+    private void waitForSchemaAgreement() {
+
+        while ( true ) {
+
+            if( cluster.getMetadata().checkSchemaAgreement() ){
+                return;
+            }
+
+            //sleep and try it again
+            try {
+                Thread.sleep( 100 );
+            }
+            catch ( InterruptedException e ) {
+                //swallow
+            }
+        }
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/3f8e7cba/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
index e7e0cb5..8eb0576 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
@@ -147,7 +147,7 @@ public class MigrationManagerImpl implements MigrationManager {
         logger.info("Creating application keyspace with the following CQL: {}", createApplicationKeyspace);
         clusterSession.execute(createApplicationKeyspace);
         logger.info("Updating application keyspace with the following CQL: {}", updateApplicationKeyspace);
-        clusterSession.execute(updateApplicationKeyspace);
+        clusterSession.executeAsync(updateApplicationKeyspace);
 
         // this session pool is only used when running database setup so close it when finished to clear resources
         clusterSession.close();


[21/38] usergrid git commit: Fix compile issue post-merge with master to get current.

Posted by mr...@apache.org.
Fix compile issue post-merge with master to get current.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/6a1fd223
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/6a1fd223
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/6a1fd223

Branch: refs/heads/master
Commit: 6a1fd223b3e0f1a677af1d6b0d0c87b25d525da7
Parents: c356671
Author: Michael Russo <mr...@apigee.com>
Authored: Sun May 1 14:37:08 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun May 1 14:37:08 2016 +0800

----------------------------------------------------------------------
 .../apache/usergrid/persistence/core/CassandraFig.java    | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/6a1fd223/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
index 184eeee..d8620be 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/CassandraFig.java
@@ -90,11 +90,11 @@ public interface CassandraFig extends GuicyFig {
     @Default( "9160" )
     int getThriftPort();
 
-    @Key( "cassandra.username" )
+    @Key( USERNAME )
     @Default( DEFAULT_USERNAME )
     String getUsername();
 
-    @Key( "cassandra.password" )
+    @Key( PASSWORD )
     @Default( DEFAULT_PASSWORD )
     String getPassword();
 
@@ -102,12 +102,6 @@ public interface CassandraFig extends GuicyFig {
     @Default( DEFAULT_LOCAL_DC )
     String getLocalDataCenter();
 
-    @Key( USERNAME )
-    String getUsername();
-
-    @Key( PASSWORD )
-    String getPassword();
-
     @Key( "cassandra.connections" )
     @Default( DEFAULT_CONNECTION_POOLSIZE )
     int getConnections();


[24/38] usergrid git commit: Fix file naming issues ( had to use git mv for git to pickup case changes in filenames).

Posted by mr...@apache.org.
Fix file naming issues ( had to use git mv for git to pickup case changes in filenames).


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/190e5199
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/190e5199
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/190e5199

Branch: refs/heads/master
Commit: 190e51992c97da7e863d399eafa9cc7455d8121c
Parents: f9a29e8
Author: Michael Russo <mr...@apigee.com>
Authored: Sun May 1 17:37:22 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun May 1 17:37:22 2016 +0800

----------------------------------------------------------------------
 .../core/datastax/DataStaxSessionProvider.java  |  43 ++++
 .../core/datastax/DatastaxSessionProvider.java  |  43 ----
 .../core/datastax/impl/DataStaxClusterImpl.java | 222 +++++++++++++++++++
 .../core/datastax/impl/DatastaxClusterImpl.java | 222 -------------------
 .../core/datastax/DataStaxClusterTest.java      |  84 +++++++
 .../core/datastax/DatastaxClusterTest.java      |  84 -------
 6 files changed, 349 insertions(+), 349 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/190e5199/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxSessionProvider.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxSessionProvider.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxSessionProvider.java
new file mode 100644
index 0000000..5e9a633
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxSessionProvider.java
@@ -0,0 +1,43 @@
+/*
+ * 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 org.apache.usergrid.persistence.core.datastax;
+
+
+import com.datastax.driver.core.Session;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class DataStaxSessionProvider implements Provider<Session> {
+
+    private final DataStaxCluster dataStaxCluster;
+
+    @Inject
+    public DataStaxSessionProvider( final DataStaxCluster dataStaxCluster ){
+
+        this.dataStaxCluster = dataStaxCluster;
+    }
+
+    @Override
+    public Session get(){
+
+        return dataStaxCluster.getApplicationSession();
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/190e5199/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
deleted file mode 100644
index 5e9a633..0000000
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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 org.apache.usergrid.persistence.core.datastax;
-
-
-import com.datastax.driver.core.Session;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class DataStaxSessionProvider implements Provider<Session> {
-
-    private final DataStaxCluster dataStaxCluster;
-
-    @Inject
-    public DataStaxSessionProvider( final DataStaxCluster dataStaxCluster ){
-
-        this.dataStaxCluster = dataStaxCluster;
-    }
-
-    @Override
-    public Session get(){
-
-        return dataStaxCluster.getApplicationSession();
-    }
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/190e5199/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
new file mode 100644
index 0000000..34cfec8
--- /dev/null
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java
@@ -0,0 +1,222 @@
+/*
+ * 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 org.apache.usergrid.persistence.core.datastax.impl;
+
+import com.datastax.driver.core.*;
+import com.datastax.driver.core.policies.DCAwareRoundRobinPolicy;
+import com.datastax.driver.core.policies.LoadBalancingPolicy;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.apache.usergrid.persistence.core.CassandraFig;
+import org.apache.usergrid.persistence.core.datastax.CQLUtils;
+import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@Singleton
+public class DataStaxClusterImpl implements DataStaxCluster {
+
+    private static final Logger logger = LoggerFactory.getLogger( DataStaxClusterImpl.class );
+
+
+    private final CassandraFig cassandraFig;
+    private Cluster cluster;
+    private Session applicationSession;
+    private Session clusterSession;
+
+    @Inject
+    public DataStaxClusterImpl(final CassandraFig cassandraFig ) throws Exception {
+        this.cassandraFig = cassandraFig;
+        this.cluster = buildCluster();
+
+        logger.info("Initialized datastax cluster client. Hosts={}, Idle Timeout={}s,  Pool Timeout={}s",
+            cluster.getMetadata().getAllHosts().toString(),
+            cluster.getConfiguration().getPoolingOptions().getIdleTimeoutSeconds(),
+            cluster.getConfiguration().getPoolingOptions().getPoolTimeoutMillis() / 1000);
+
+
+    }
+
+    @Override
+    public Cluster getCluster(){
+
+        // ensure we can build the cluster if it was previously closed
+        if ( cluster.isClosed() ){
+            cluster = buildCluster();
+        }
+
+        return cluster;
+    }
+
+    @Override
+    public Session getClusterSession(){
+
+        // always grab cluster from getCluster() in case it was prematurely closed
+        if ( clusterSession == null || clusterSession.isClosed() ){
+            clusterSession = getCluster().connect();
+        }
+
+        return clusterSession;
+    }
+
+    @Override
+    public Session getApplicationSession(){
+
+        // always grab cluster from getCluster() in case it was prematurely closed
+        if ( applicationSession == null || applicationSession.isClosed() ){
+            applicationSession = getCluster().connect( CQLUtils.quote(cassandraFig.getApplicationKeyspace() ) );
+        }
+        return applicationSession;
+    }
+
+
+    /**
+     * Execute CQL that will create the keyspace if it doesn't exist and alter it if it does.
+     * @throws Exception
+     */
+    @Override
+    public void createOrUpdateKeyspace() throws Exception {
+
+        clusterSession = getClusterSession();
+
+        final String createApplicationKeyspace = String.format(
+            "CREATE KEYSPACE IF NOT EXISTS %s WITH replication = %s",
+            CQLUtils.quote(cassandraFig.getApplicationKeyspace()),
+            CQLUtils.getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
+
+        );
+
+        final String updateApplicationKeyspace = String.format(
+            "ALTER KEYSPACE %s WITH replication = %s",
+            CQLUtils.quote(cassandraFig.getApplicationKeyspace()),
+            CQLUtils.getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
+        );
+
+        clusterSession.execute(createApplicationKeyspace);
+        clusterSession.executeAsync(updateApplicationKeyspace);
+
+        logger.info("Created/Updated keyspace: {}", cassandraFig.getApplicationKeyspace());
+
+        waitForSchemaAgreement();
+    }
+
+    /**
+     * Wait until all Cassandra nodes agree on the schema.  Sleeps 100ms between checks.
+     *
+     */
+    public void waitForSchemaAgreement() {
+
+        while ( true ) {
+
+            if( this.cluster.getMetadata().checkSchemaAgreement() ){
+                return;
+            }
+
+            //sleep and try it again
+            try {
+                Thread.sleep( 100 );
+            }
+            catch ( InterruptedException e ) {
+                //swallow
+            }
+        }
+    }
+
+    public Cluster buildCluster(){
+
+        ConsistencyLevel defaultConsistencyLevel;
+        try {
+            defaultConsistencyLevel = ConsistencyLevel.valueOf(cassandraFig.getReadCl());
+        } catch (IllegalArgumentException e){
+
+            logger.error("Unable to parse provided consistency level in property: {}, defaulting to: {}",
+                CassandraFig.READ_CL,
+                ConsistencyLevel.LOCAL_QUORUM);
+
+            defaultConsistencyLevel = ConsistencyLevel.LOCAL_QUORUM;
+        }
+
+
+        LoadBalancingPolicy loadBalancingPolicy;
+        if( !cassandraFig.getLocalDataCenter().isEmpty() ){
+
+            loadBalancingPolicy = new DCAwareRoundRobinPolicy.Builder()
+                .withLocalDc( cassandraFig.getLocalDataCenter() ).build();
+        }else{
+            loadBalancingPolicy = new DCAwareRoundRobinPolicy.Builder().build();
+        }
+
+        final PoolingOptions poolingOptions = new PoolingOptions()
+            .setCoreConnectionsPerHost(HostDistance.LOCAL, cassandraFig.getConnections() / 2)
+            .setMaxConnectionsPerHost(HostDistance.LOCAL, cassandraFig.getConnections())
+            .setIdleTimeoutSeconds(cassandraFig.getTimeout() / 1000)
+            .setPoolTimeoutMillis(cassandraFig.getPoolTimeout());
+
+        final QueryOptions queryOptions = new QueryOptions()
+            .setConsistencyLevel(defaultConsistencyLevel);
+
+        Cluster.Builder datastaxCluster = Cluster.builder()
+            .withClusterName(cassandraFig.getClusterName())
+            .addContactPoints(cassandraFig.getHosts().split(","))
+            .withCompression(ProtocolOptions.Compression.LZ4)
+            .withLoadBalancingPolicy(loadBalancingPolicy)
+            .withPoolingOptions(poolingOptions)
+            .withQueryOptions(queryOptions)
+            .withProtocolVersion(getProtocolVersion(cassandraFig.getVersion()));
+
+        // only add auth credentials if they were provided
+        if ( !cassandraFig.getUsername().isEmpty() && !cassandraFig.getPassword().isEmpty() ){
+            datastaxCluster.withCredentials(
+                cassandraFig.getUsername(),
+                cassandraFig.getPassword()
+            );
+        }
+
+
+        return datastaxCluster.build();
+
+    }
+
+    private ProtocolVersion getProtocolVersion(String versionNumber){
+
+        ProtocolVersion protocolVersion;
+        switch (versionNumber) {
+
+            case "2.1":
+                protocolVersion = ProtocolVersion.V3;
+                break;
+            case "2.0":
+                protocolVersion = ProtocolVersion.V2;
+                break;
+            case "1.2":
+                protocolVersion = ProtocolVersion.V1;
+                break;
+            default:
+                protocolVersion = ProtocolVersion.NEWEST_SUPPORTED;
+                break;
+
+        }
+
+        return protocolVersion;
+
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/190e5199/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
deleted file mode 100644
index 34cfec8..0000000
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * 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 org.apache.usergrid.persistence.core.datastax.impl;
-
-import com.datastax.driver.core.*;
-import com.datastax.driver.core.policies.DCAwareRoundRobinPolicy;
-import com.datastax.driver.core.policies.LoadBalancingPolicy;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import org.apache.usergrid.persistence.core.CassandraFig;
-import org.apache.usergrid.persistence.core.datastax.CQLUtils;
-import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-@Singleton
-public class DataStaxClusterImpl implements DataStaxCluster {
-
-    private static final Logger logger = LoggerFactory.getLogger( DataStaxClusterImpl.class );
-
-
-    private final CassandraFig cassandraFig;
-    private Cluster cluster;
-    private Session applicationSession;
-    private Session clusterSession;
-
-    @Inject
-    public DataStaxClusterImpl(final CassandraFig cassandraFig ) throws Exception {
-        this.cassandraFig = cassandraFig;
-        this.cluster = buildCluster();
-
-        logger.info("Initialized datastax cluster client. Hosts={}, Idle Timeout={}s,  Pool Timeout={}s",
-            cluster.getMetadata().getAllHosts().toString(),
-            cluster.getConfiguration().getPoolingOptions().getIdleTimeoutSeconds(),
-            cluster.getConfiguration().getPoolingOptions().getPoolTimeoutMillis() / 1000);
-
-
-    }
-
-    @Override
-    public Cluster getCluster(){
-
-        // ensure we can build the cluster if it was previously closed
-        if ( cluster.isClosed() ){
-            cluster = buildCluster();
-        }
-
-        return cluster;
-    }
-
-    @Override
-    public Session getClusterSession(){
-
-        // always grab cluster from getCluster() in case it was prematurely closed
-        if ( clusterSession == null || clusterSession.isClosed() ){
-            clusterSession = getCluster().connect();
-        }
-
-        return clusterSession;
-    }
-
-    @Override
-    public Session getApplicationSession(){
-
-        // always grab cluster from getCluster() in case it was prematurely closed
-        if ( applicationSession == null || applicationSession.isClosed() ){
-            applicationSession = getCluster().connect( CQLUtils.quote(cassandraFig.getApplicationKeyspace() ) );
-        }
-        return applicationSession;
-    }
-
-
-    /**
-     * Execute CQL that will create the keyspace if it doesn't exist and alter it if it does.
-     * @throws Exception
-     */
-    @Override
-    public void createOrUpdateKeyspace() throws Exception {
-
-        clusterSession = getClusterSession();
-
-        final String createApplicationKeyspace = String.format(
-            "CREATE KEYSPACE IF NOT EXISTS %s WITH replication = %s",
-            CQLUtils.quote(cassandraFig.getApplicationKeyspace()),
-            CQLUtils.getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
-
-        );
-
-        final String updateApplicationKeyspace = String.format(
-            "ALTER KEYSPACE %s WITH replication = %s",
-            CQLUtils.quote(cassandraFig.getApplicationKeyspace()),
-            CQLUtils.getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() )
-        );
-
-        clusterSession.execute(createApplicationKeyspace);
-        clusterSession.executeAsync(updateApplicationKeyspace);
-
-        logger.info("Created/Updated keyspace: {}", cassandraFig.getApplicationKeyspace());
-
-        waitForSchemaAgreement();
-    }
-
-    /**
-     * Wait until all Cassandra nodes agree on the schema.  Sleeps 100ms between checks.
-     *
-     */
-    public void waitForSchemaAgreement() {
-
-        while ( true ) {
-
-            if( this.cluster.getMetadata().checkSchemaAgreement() ){
-                return;
-            }
-
-            //sleep and try it again
-            try {
-                Thread.sleep( 100 );
-            }
-            catch ( InterruptedException e ) {
-                //swallow
-            }
-        }
-    }
-
-    public Cluster buildCluster(){
-
-        ConsistencyLevel defaultConsistencyLevel;
-        try {
-            defaultConsistencyLevel = ConsistencyLevel.valueOf(cassandraFig.getReadCl());
-        } catch (IllegalArgumentException e){
-
-            logger.error("Unable to parse provided consistency level in property: {}, defaulting to: {}",
-                CassandraFig.READ_CL,
-                ConsistencyLevel.LOCAL_QUORUM);
-
-            defaultConsistencyLevel = ConsistencyLevel.LOCAL_QUORUM;
-        }
-
-
-        LoadBalancingPolicy loadBalancingPolicy;
-        if( !cassandraFig.getLocalDataCenter().isEmpty() ){
-
-            loadBalancingPolicy = new DCAwareRoundRobinPolicy.Builder()
-                .withLocalDc( cassandraFig.getLocalDataCenter() ).build();
-        }else{
-            loadBalancingPolicy = new DCAwareRoundRobinPolicy.Builder().build();
-        }
-
-        final PoolingOptions poolingOptions = new PoolingOptions()
-            .setCoreConnectionsPerHost(HostDistance.LOCAL, cassandraFig.getConnections() / 2)
-            .setMaxConnectionsPerHost(HostDistance.LOCAL, cassandraFig.getConnections())
-            .setIdleTimeoutSeconds(cassandraFig.getTimeout() / 1000)
-            .setPoolTimeoutMillis(cassandraFig.getPoolTimeout());
-
-        final QueryOptions queryOptions = new QueryOptions()
-            .setConsistencyLevel(defaultConsistencyLevel);
-
-        Cluster.Builder datastaxCluster = Cluster.builder()
-            .withClusterName(cassandraFig.getClusterName())
-            .addContactPoints(cassandraFig.getHosts().split(","))
-            .withCompression(ProtocolOptions.Compression.LZ4)
-            .withLoadBalancingPolicy(loadBalancingPolicy)
-            .withPoolingOptions(poolingOptions)
-            .withQueryOptions(queryOptions)
-            .withProtocolVersion(getProtocolVersion(cassandraFig.getVersion()));
-
-        // only add auth credentials if they were provided
-        if ( !cassandraFig.getUsername().isEmpty() && !cassandraFig.getPassword().isEmpty() ){
-            datastaxCluster.withCredentials(
-                cassandraFig.getUsername(),
-                cassandraFig.getPassword()
-            );
-        }
-
-
-        return datastaxCluster.build();
-
-    }
-
-    private ProtocolVersion getProtocolVersion(String versionNumber){
-
-        ProtocolVersion protocolVersion;
-        switch (versionNumber) {
-
-            case "2.1":
-                protocolVersion = ProtocolVersion.V3;
-                break;
-            case "2.0":
-                protocolVersion = ProtocolVersion.V2;
-                break;
-            case "1.2":
-                protocolVersion = ProtocolVersion.V1;
-                break;
-            default:
-                protocolVersion = ProtocolVersion.NEWEST_SUPPORTED;
-                break;
-
-        }
-
-        return protocolVersion;
-
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/190e5199/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DataStaxClusterTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DataStaxClusterTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DataStaxClusterTest.java
new file mode 100644
index 0000000..227f11d
--- /dev/null
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DataStaxClusterTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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 org.apache.usergrid.persistence.core.datastax;
+
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.Session;
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.CassandraFig;
+import org.apache.usergrid.persistence.core.guice.TestCommonModule;
+import org.apache.usergrid.persistence.core.test.ITRunner;
+import org.apache.usergrid.persistence.core.test.UseModules;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+@RunWith( ITRunner.class )
+@UseModules( TestCommonModule.class )
+public class DataStaxClusterTest {
+
+
+    @Inject
+    DataStaxCluster dataStaxCluster;
+
+    @Inject
+    CassandraFig cassandraFig;
+
+
+    @Test
+    public void testConnectCloseCluster() {
+
+        Cluster cluster = dataStaxCluster.getCluster();
+
+        assertTrue(!cluster.isClosed());
+
+        cluster.close();
+        assertTrue(cluster.isClosed());
+
+        // validate getCluster will re-init the cluster
+        cluster = dataStaxCluster.getCluster();
+        assertTrue(!cluster.isClosed());
+
+
+    }
+
+    @Test
+    public void testGetClusterSession() {
+
+        Session session = dataStaxCluster.getClusterSession();
+        String clusterName = session.getCluster().getClusterName();
+        String keyspaceName = session.getLoggedKeyspace();
+
+        // cluster session is not logged to a keyspace
+        assertNull(keyspaceName);
+        assertNotNull(clusterName);
+    }
+
+    @Test
+    public void testGetApplicationSession() {
+
+        Session session = dataStaxCluster.getApplicationSession();
+        String keyspaceName = session.getLoggedKeyspace();
+
+
+        assertEquals(cassandraFig.getApplicationKeyspace(), keyspaceName);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/190e5199/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
deleted file mode 100644
index ca7f97a..0000000
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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 org.apache.usergrid.persistence.core.datastax;
-
-import com.datastax.driver.core.Cluster;
-import com.datastax.driver.core.Session;
-import com.google.inject.Inject;
-import org.apache.usergrid.persistence.core.CassandraFig;
-import org.apache.usergrid.persistence.core.guice.TestCommonModule;
-import org.apache.usergrid.persistence.core.test.ITRunner;
-import org.apache.usergrid.persistence.core.test.UseModules;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static org.junit.Assert.*;
-
-@RunWith( ITRunner.class )
-@UseModules( TestCommonModule.class )
-public class DatastaxClusterTest {
-
-
-    @Inject
-    DataStaxCluster dataStaxCluster;
-
-    @Inject
-    CassandraFig cassandraFig;
-
-
-    @Test
-    public void testConnectCloseCluster() {
-
-        Cluster cluster = dataStaxCluster.getCluster();
-
-        assertTrue(!cluster.isClosed());
-
-        cluster.close();
-        assertTrue(cluster.isClosed());
-
-        // validate getCluster will re-init the cluster
-        cluster = dataStaxCluster.getCluster();
-        assertTrue(!cluster.isClosed());
-
-
-    }
-
-    @Test
-    public void testGetClusterSession() {
-
-        Session session = dataStaxCluster.getClusterSession();
-        String clusterName = session.getCluster().getClusterName();
-        String keyspaceName = session.getLoggedKeyspace();
-
-        // cluster session is not logged to a keyspace
-        assertNull(keyspaceName);
-        assertNotNull(clusterName);
-    }
-
-    @Test
-    public void testGetApplicationSession() {
-
-        Session session = dataStaxCluster.getApplicationSession();
-        String keyspaceName = session.getLoggedKeyspace();
-
-
-        assertEquals(cassandraFig.getApplicationKeyspace(), keyspaceName);
-    }
-
-}


[37/38] usergrid git commit: Update comment

Posted by mr...@apache.org.
Update comment


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/32782a39
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/32782a39
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/32782a39

Branch: refs/heads/master
Commit: 32782a39bf82c1bf606cf587ac4d57ec85b2b15e
Parents: b23c20a
Author: Michael Russo <mr...@apigee.com>
Authored: Tue Jul 26 11:10:29 2016 -0700
Committer: Michael Russo <mr...@apigee.com>
Committed: Tue Jul 26 11:10:29 2016 -0700

----------------------------------------------------------------------
 .../impl/UniqueValueSerializationStrategyV2Impl.java             | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/32782a39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
index 92c0a5b..a5fceeb 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
@@ -294,7 +294,9 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
 
         for (Object key : keys) {
 
-            // custom comparator mappings in  CQLUtils.COMPOSITE_TYPE ( more leftover from Asytanax )
+            // custom comparator alias to comparator mappings in  CQLUtils.COMPOSITE_TYPE ( more leftover from Asytanax )
+            // the custom mapping is used for schema creation, but datastax driver does not have the alias concept and
+            // we must work with the actual types
             if(key instanceof UUID){
                 comparator = "UUIDType";
             }else{


[16/38] usergrid git commit: Add caching options to the table creation, supporting pre 2.1 and 2.1 table properties in Cassandra. Don't default the Cassandra version in the tests.

Posted by mr...@apache.org.
Add caching options to the table creation, supporting pre 2.1 and 2.1 table properties in Cassandra.  Don't default the Cassandra version in the tests.


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

Branch: refs/heads/master
Commit: bb225e8a37cfbe1419d98e61247af45a53f39733
Parents: 6ef4c32
Author: Michael Russo <mi...@gmail.com>
Authored: Sun Feb 14 17:24:52 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Sun Feb 14 17:24:52 2016 -0800

----------------------------------------------------------------------
 .../main/resources/usergrid-default.properties  |   2 +-
 .../src/test/resources/dynamic-test.properties  |   1 -
 .../src/test/resources/usergrid-CHOP.properties |   1 -
 .../src/test/resources/usergrid-UNIT.properties |   1 -
 .../persistence/core/datastax/CQLUtils.java     |  97 +++++++++++++++--
 .../core/datastax/TableDefinition.java          |  17 +--
 .../core/datastax/impl/DatastaxClusterImpl.java |   1 -
 .../migration/schema/MigrationManagerImpl.java  |   2 +-
 .../persistence/core/datastax/CQLUtilsTest.java | 105 ++++++++++++++++++-
 .../src/test/resources/usergrid-UNIT.properties |   1 -
 .../src/test/resources/usergrid-AWS.properties  |   1 -
 .../src/test/resources/usergrid-CHOP.properties |   1 -
 .../src/test/resources/usergrid-UNIT.properties |   1 -
 .../src/test/resources/dynamic-test.properties  |   1 -
 .../src/test/resources/usergrid-CHOP.properties |   1 -
 .../src/test/resources/usergrid-UNIT.properties |   1 -
 16 files changed, 196 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/config/src/main/resources/usergrid-default.properties
----------------------------------------------------------------------
diff --git a/stack/config/src/main/resources/usergrid-default.properties b/stack/config/src/main/resources/usergrid-default.properties
index 94d02ff..89f5dd9 100644
--- a/stack/config/src/main/resources/usergrid-default.properties
+++ b/stack/config/src/main/resources/usergrid-default.properties
@@ -59,7 +59,7 @@ usergrid.persistence=CP
 
 # Set a property to tell Usergrid which version of cassandra is being used.
 #
-#cassandra.version=1.2
+#cassandra.version=2.1
 
 
 # Set the Cassandra cluster name that this instance of Usergrid should use.

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/collection/src/test/resources/dynamic-test.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/resources/dynamic-test.properties b/stack/corepersistence/collection/src/test/resources/dynamic-test.properties
index b847f50..ca203f9 100644
--- a/stack/corepersistence/collection/src/test/resources/dynamic-test.properties
+++ b/stack/corepersistence/collection/src/test/resources/dynamic-test.properties
@@ -2,7 +2,6 @@
 # safe dynamic property defaults for our testing via IDE or Maven
 cassandra.connections=50
 cassandra.port=9160
-cassandra.version=1.2
 cassandra.hosts=localhost
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties b/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties
index d276934..92d0041 100644
--- a/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties
+++ b/stack/corepersistence/collection/src/test/resources/usergrid-CHOP.properties
@@ -2,7 +2,6 @@
 
 cassandra.connections=50
 cassandra.port=9160
-cassandra.version=1.2
 
 # a comma delimited private IP address list to your chop cassandra cluster
 # define this in your settings.xml and have it as an always active profile

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/collection/src/test/resources/usergrid-UNIT.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/resources/usergrid-UNIT.properties b/stack/corepersistence/collection/src/test/resources/usergrid-UNIT.properties
index bec1c88..4a2d031 100644
--- a/stack/corepersistence/collection/src/test/resources/usergrid-UNIT.properties
+++ b/stack/corepersistence/collection/src/test/resources/usergrid-UNIT.properties
@@ -1,7 +1,6 @@
 # Keep nothing but overriding test defaults in here
 cassandra.connections=50
 cassandra.port=9160
-cassandra.version=1.2
 cassandra.hosts=localhost
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
index 38b6b7b..f04e1a9 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
@@ -18,10 +18,10 @@
  */
 package org.apache.usergrid.persistence.core.datastax;
 
-import com.datastax.driver.core.DataType;
-import com.datastax.driver.core.ProtocolVersion;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
 import org.apache.usergrid.persistence.core.util.StringUtils;
 
 import java.nio.ByteBuffer;
@@ -29,6 +29,8 @@ import java.util.*;
 
 public class CQLUtils {
 
+    private final CassandraFig cassandraFig;
+    private final static ObjectMapper mapper = new ObjectMapper();
 
     public enum ACTION {
         CREATE, UPDATE
@@ -41,6 +43,7 @@ public class CQLUtils {
     static String EQUAL = "=";
     static String COMPRESSION = "compression";
     static String COMPACTION = "compaction";
+    static String CACHING = "caching";
     static String GC_GRACE_SECONDS = "gc_grace_seconds";
     static String PRIMARY_KEY = "PRIMARY KEY";
     static String COMPACT_STORAGE = "COMPACT STORAGE";
@@ -49,8 +52,12 @@ public class CQLUtils {
     static String PAREN_LEFT = "(";
     static String PAREN_RIGHT = ")";
 
+    @Inject
+    public CQLUtils ( final CassandraFig cassandraFig ){
 
-    private final static ObjectMapper mapper = new ObjectMapper();
+        this.cassandraFig = cassandraFig;
+
+    }
 
 
     public static String getFormattedReplication(String strategy, String strategyOptions) throws JsonProcessingException {
@@ -72,7 +79,8 @@ public class CQLUtils {
     }
 
 
-    public static String getTableCQL(TableDefinition tableDefinition, ACTION tableAction) throws Exception {
+    public static String getTableCQL( CassandraFig cassandraFig, TableDefinition tableDefinition,
+                               ACTION tableAction) throws Exception {
 
         StringJoiner cql = new StringJoiner(" ");
 
@@ -120,9 +128,9 @@ public class CQLUtils {
             .add(AND)
             .add(COMPRESSION).add(EQUAL).add( getMapAsCQLString( tableDefinition.getCompression() ) )
             .add(AND)
-            .add(GC_GRACE_SECONDS).add(EQUAL).add( tableDefinition.getGcGraceSeconds() );
-
-
+            .add(GC_GRACE_SECONDS).add(EQUAL).add( tableDefinition.getGcGraceSeconds() )
+            .add(AND)
+            .add(CACHING).add(EQUAL).add( getCachingOptions( cassandraFig, tableDefinition.getCacheOption() ) );
 
         return cql.toString();
 
@@ -144,6 +152,81 @@ public class CQLUtils {
     }
 
 
+    public static String getCachingOptions(CassandraFig cassandraFig, TableDefinition.CacheOption cacheOption) throws JsonProcessingException {
+
+        // Cassandra 2.0 and below has a different CQL syntax for caching
+        if( Double.parseDouble( cassandraFig.getVersion() ) <= 2.0 ){
+
+            return quote( getLegacyCacheValue( cacheOption ) );
+
+        } else {
+
+            return getCacheValue( cacheOption );
+        }
+
+    }
+
+
+    public static String getCacheValue( TableDefinition.CacheOption cacheOption ) throws JsonProcessingException {
+
+
+        Map<String, Object>  cacheValue = new HashMap<>(2);
+        switch (cacheOption) {
+
+            case ALL:
+                cacheValue.put("keys", "ALL");
+                cacheValue.put("rows_per_partition", "ALL");
+                break;
+
+            case KEYS:
+                cacheValue.put("keys", "ALL");
+                cacheValue.put("rows_per_partition", "NONE");
+                break;
+
+            case ROWS:
+                cacheValue.put("keys", "NONE");
+                cacheValue.put("rows_per_partition", "ALL");
+                break;
+
+            case NONE:
+                cacheValue.put("keys", "NONE");
+                cacheValue.put("rows_per_partition", "NONE");
+                break;
+
+        }
+
+        return getMapAsCQLString( cacheValue );
+
+    }
+
+    public static String getLegacyCacheValue( TableDefinition.CacheOption cacheOption ){
+
+        String cacheValue = "none"; // default to no caching
+        switch (cacheOption) {
+
+            case ALL:
+                cacheValue = "all";
+                break;
+
+            case KEYS:
+                cacheValue = "keys_only";
+                break;
+
+            case ROWS:
+                cacheValue = "rows_only";
+                break;
+
+            case NONE:
+                cacheValue = "none";
+                break;
+
+        }
+
+        return cacheValue;
+
+    }
+
+
     /**
      * Below functions borrowed from Astyanax until the schema is re-written to be more CQL friendly
      */

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
index 2f83513..d749d40 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
@@ -32,22 +32,7 @@ public class TableDefinition {
 
     public enum CacheOption {
 
-        ALL( "ALL" ),
-        KEYS( "KEYS_ONLY" ),
-        ROWS( "ROWS_ONLY" ),
-        NONE( "NONE" );
-
-        private String value;
-
-
-        CacheOption( String value ) {
-            this.value = value;
-        }
-
-
-        public String getValue() {
-            return value;
-        }
+        ALL, KEYS, ROWS, NONE
     }
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
index 702c1e3..875c5c2 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java
@@ -26,7 +26,6 @@ import com.google.inject.Singleton;
 import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
-import org.safehaus.guicyfig.Overrides;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
index 9ab403d..3630fc8 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
@@ -138,7 +138,7 @@ public class MigrationManagerImpl implements MigrationManager {
 
     private void createTable(TableDefinition tableDefinition ) throws Exception {
 
-        String CQL = CQLUtils.getTableCQL( tableDefinition, CQLUtils.ACTION.CREATE );
+        String CQL = CQLUtils.getTableCQL( cassandraFig, tableDefinition, CQLUtils.ACTION.CREATE );
         if (logger.isDebugEnabled()){
             logger.debug( CQL );
         }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
index c47312d..5bad54e 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
@@ -20,7 +20,14 @@ package org.apache.usergrid.persistence.core.datastax;
 
 
 import com.datastax.driver.core.DataType;
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
+import org.apache.usergrid.persistence.core.guice.TestCommonModule;
+import org.apache.usergrid.persistence.core.test.ITRunner;
+import org.apache.usergrid.persistence.core.test.UseModules;
+import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -28,13 +35,22 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutionException;
 
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
+@RunWith( ITRunner.class )
+@UseModules( TestCommonModule.class )
 public class CQLUtilsTest {
 
     private static final Logger logger = LoggerFactory.getLogger( CQLUtilsTest.class );
 
+    @Inject
+    CassandraFig cassandraFig;
+
+
     @Test
     public void testTableCQL() throws Exception {
 
@@ -64,8 +80,8 @@ public class CQLUtilsTest {
             clusteringOrder
             );
 
-        String createCQL = CQLUtils.getTableCQL(table1, CQLUtils.ACTION.CREATE);
-        String updateCQL = CQLUtils.getTableCQL(table1, CQLUtils.ACTION.UPDATE);
+        String createCQL = CQLUtils.getTableCQL(cassandraFig, table1, CQLUtils.ACTION.CREATE);
+        String updateCQL = CQLUtils.getTableCQL(cassandraFig, table1, CQLUtils.ACTION.UPDATE);
 
         assertTrue(
             createCQL.contains(CQLUtils.CREATE_TABLE ) &&
@@ -85,4 +101,89 @@ public class CQLUtilsTest {
 
     }
 
+    @Test
+    public void testLegacyCachingOptions() throws Exception{
+
+        final CassandraFig cassandraFig = mock(CassandraFig.class);
+        when(cassandraFig.getVersion()).thenReturn("2.0");
+
+        Map<String, DataType.Name> columns = new HashMap<>();
+        columns.put("key", DataType.Name.BLOB);
+        columns.put("column1", DataType.Name.TEXT);
+        columns.put("value", DataType.Name.BLOB);
+
+        List<String> partitionKeys = new ArrayList<>();
+        partitionKeys.add("key");
+
+        List<String> columnKeys = new ArrayList<>();
+        columnKeys.add("column1");
+
+        Map<String, String> clusteringOrder = new HashMap<>();
+        clusteringOrder.put("column1", "DESC");
+
+
+
+        TableDefinition table1 = new TableDefinition(
+            CQLUtils.quote("table1"),
+            partitionKeys,
+            columnKeys,
+            columns,
+            TableDefinition.CacheOption.KEYS,
+            clusteringOrder
+        );
+
+        String createCQL = CQLUtils.getTableCQL(cassandraFig, table1, CQLUtils.ACTION.CREATE);
+        logger.info(createCQL);
+        assertTrue(
+            createCQL.contains( "\"keys_only\"" ) &&
+                !createCQL.contains( "'keys':'ALL'"  )
+
+        );
+
+
+
+    }
+
+    @Test
+    public void testCachingOptions() throws Exception {
+
+        final CassandraFig cassandraFig = mock(CassandraFig.class);
+        when(cassandraFig.getVersion()).thenReturn("2.1");
+
+        Map<String, DataType.Name> columns = new HashMap<>();
+        columns.put("key", DataType.Name.BLOB);
+        columns.put("column1", DataType.Name.TEXT);
+        columns.put("value", DataType.Name.BLOB);
+
+        List<String> partitionKeys = new ArrayList<>();
+        partitionKeys.add("key");
+
+        List<String> columnKeys = new ArrayList<>();
+        columnKeys.add("column1");
+
+        Map<String, String> clusteringOrder = new HashMap<>();
+        clusteringOrder.put("column1", "DESC");
+
+
+
+        TableDefinition table1 = new TableDefinition(
+            CQLUtils.quote("table1"),
+            partitionKeys,
+            columnKeys,
+            columns,
+            TableDefinition.CacheOption.KEYS,
+            clusteringOrder
+        );
+
+        String createCQL = CQLUtils.getTableCQL(cassandraFig, table1, CQLUtils.ACTION.CREATE);
+        logger.info(createCQL);
+        assertTrue(
+            createCQL.contains( "'keys':'ALL'"  ) &&
+            !createCQL.contains( "\"keys_only\"" )
+
+        );
+
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/common/src/test/resources/usergrid-UNIT.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/resources/usergrid-UNIT.properties b/stack/corepersistence/common/src/test/resources/usergrid-UNIT.properties
index 2004d9e..5f59711 100644
--- a/stack/corepersistence/common/src/test/resources/usergrid-UNIT.properties
+++ b/stack/corepersistence/common/src/test/resources/usergrid-UNIT.properties
@@ -1,7 +1,6 @@
 # Keep nothing but overriding test defaults in here
 cassandra.connections=50
 cassandra.port=9160
-cassandra.version=1.2
 cassandra.hosts=localhost
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/graph/src/test/resources/usergrid-AWS.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/test/resources/usergrid-AWS.properties b/stack/corepersistence/graph/src/test/resources/usergrid-AWS.properties
index e630bb8..e737815 100644
--- a/stack/corepersistence/graph/src/test/resources/usergrid-AWS.properties
+++ b/stack/corepersistence/graph/src/test/resources/usergrid-AWS.properties
@@ -1,7 +1,6 @@
 # Keep nothing but overriding test defaults in here
 cassandra.connections=50
 cassandra.port=9160
-cassandra.version=1.2
 cassandra.hosts=
 #cassandra.hosts=localhost
 cassandra.cluster_name=Usergrid

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/graph/src/test/resources/usergrid-CHOP.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/test/resources/usergrid-CHOP.properties b/stack/corepersistence/graph/src/test/resources/usergrid-CHOP.properties
index d276934..92d0041 100644
--- a/stack/corepersistence/graph/src/test/resources/usergrid-CHOP.properties
+++ b/stack/corepersistence/graph/src/test/resources/usergrid-CHOP.properties
@@ -2,7 +2,6 @@
 
 cassandra.connections=50
 cassandra.port=9160
-cassandra.version=1.2
 
 # a comma delimited private IP address list to your chop cassandra cluster
 # define this in your settings.xml and have it as an always active profile

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/graph/src/test/resources/usergrid-UNIT.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/test/resources/usergrid-UNIT.properties b/stack/corepersistence/graph/src/test/resources/usergrid-UNIT.properties
index e1c4c81..6f8a7c5 100644
--- a/stack/corepersistence/graph/src/test/resources/usergrid-UNIT.properties
+++ b/stack/corepersistence/graph/src/test/resources/usergrid-UNIT.properties
@@ -1,7 +1,6 @@
 # Keep nothing but overriding test defaults in here
 cassandra.connections=50
 cassandra.port=9160
-cassandra.version=1.2
 cassandra.hosts=localhost
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/queryindex/src/test/resources/dynamic-test.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/resources/dynamic-test.properties b/stack/corepersistence/queryindex/src/test/resources/dynamic-test.properties
index 4ac97d8..7b869af 100644
--- a/stack/corepersistence/queryindex/src/test/resources/dynamic-test.properties
+++ b/stack/corepersistence/queryindex/src/test/resources/dynamic-test.properties
@@ -2,7 +2,6 @@
 # safe dynamic property defaults for our testing via IDE or Maven
 cassandra.connections=50
 cassandra.port=9160
-cassandra.version=1.2
 cassandra.hosts=localhost
 cassandra.cluster_name=Usergrid
 collections.keyspace=Usergrid_Collections

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/queryindex/src/test/resources/usergrid-CHOP.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/resources/usergrid-CHOP.properties b/stack/corepersistence/queryindex/src/test/resources/usergrid-CHOP.properties
index ce40600..ff4f3bb 100644
--- a/stack/corepersistence/queryindex/src/test/resources/usergrid-CHOP.properties
+++ b/stack/corepersistence/queryindex/src/test/resources/usergrid-CHOP.properties
@@ -1,7 +1,6 @@
 # These are for CHOP environment settings
 cassandra.connections=50
 cassandra.port=9160
-cassandra.version=1.2
 
 # a comma delimited private IP address list to your chop cassandra cluster
 # define this in your settings.xml and have it as an always active profile

http://git-wip-us.apache.org/repos/asf/usergrid/blob/bb225e8a/stack/corepersistence/queryindex/src/test/resources/usergrid-UNIT.properties
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/resources/usergrid-UNIT.properties b/stack/corepersistence/queryindex/src/test/resources/usergrid-UNIT.properties
index 5d80cac..3c853ac 100644
--- a/stack/corepersistence/queryindex/src/test/resources/usergrid-UNIT.properties
+++ b/stack/corepersistence/queryindex/src/test/resources/usergrid-UNIT.properties
@@ -3,7 +3,6 @@
 cassandra.embedded=true
 cassandra.hosts=127.0.0.1
 cassandra.port=9160
-cassandra.version=1.2
 cassandra.cluster_name=Usergrid
 cassandra.connections=50
 


[15/38] usergrid git commit: Ensure that when specific apps are re-indexed, their index is initialized.

Posted by mr...@apache.org.
Ensure that when specific apps are re-indexed, their index is initialized.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/6ef4c321
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/6ef4c321
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/6ef4c321

Branch: refs/heads/master
Commit: 6ef4c32114044d22d9d74e42033a0cccdd2069ab
Parents: 65e873e
Author: Michael Russo <mi...@gmail.com>
Authored: Sat Feb 13 21:23:52 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Sat Feb 13 21:23:52 2016 -0800

----------------------------------------------------------------------
 .../usergrid/corepersistence/index/ReIndexServiceImpl.java   | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/6ef4c321/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java
index da2ef1d..6c65976 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java
@@ -221,7 +221,13 @@ public class ReIndexServiceImpl implements ReIndexService {
         }
         //this is intentional.  If
         else if (appId.isPresent()) {
-            return Observable.just(appId.get());
+            return Observable.just(appId.get())
+                .doOnNext(appScope -> {
+                    //make sure index is initialized on rebuild
+                    entityIndexFactory.createEntityIndex(
+                        indexLocationStrategyFactory.getIndexLocationStrategy(appScope)
+                    ).initialize();
+                });
         }
 
         return allApplicationsObservable.getData()


[09/38] usergrid git commit: MapSerialization schema now created by DataStax driver. Add getTables into Migration interface for creating schema via DataStax driver and CQL.

Posted by mr...@apache.org.
MapSerialization schema now created by DataStax driver.  Add getTables into Migration interface for creating schema via DataStax driver and CQL.


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

Branch: refs/heads/master
Commit: c0f8a4a28576ab58b1eb0b173a73966655a863c1
Parents: 25454f9
Author: Michael Russo <mi...@gmail.com>
Authored: Fri Feb 12 16:34:04 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Fri Feb 12 16:34:04 2016 -0800

----------------------------------------------------------------------
 .../MvccEntitySerializationStrategyImpl.java    |   7 +
 ...vccEntitySerializationStrategyProxyImpl.java |   6 +
 .../MvccEntitySerializationStrategyV3Impl.java  |   7 +
 .../MvccLogEntrySerializationProxyImpl.java     |   6 +
 ...MvccLogEntrySerializationStrategyV1Impl.java |   7 +
 ...MvccLogEntrySerializationStrategyV2Impl.java |   7 +
 ...iqueValueSerializationStrategyProxyImpl.java |   6 +
 .../UniqueValueSerializationStrategyV1Impl.java |   8 +
 .../UniqueValueSerializationStrategyV2Impl.java |   7 +
 .../persistence/core/datastax/CQLUtils.java     |   4 +-
 .../data/MigrationInfoSerializationImpl.java    |   7 +
 .../core/migration/schema/Migration.java        |   3 +-
 .../migration/schema/MigrationManagerImpl.java  |  43 ++++-
 .../map/impl/MapSerializationImpl.java          | 172 +++++--------------
 .../persistence/map/MapManagerTest.java         |   1 +
 15 files changed, 153 insertions(+), 138 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
index 57199e2..3e2d391 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
@@ -25,6 +25,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.UUID;
 
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -342,6 +343,12 @@ public abstract class MvccEntitySerializationStrategyImpl implements MvccEntityS
         return Collections.singleton( cf );
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
+
 
     /**
      * Do the write on the correct row for the entity id with the operation

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java
index 1fe342e..19735cc 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyProxyImpl.java
@@ -27,6 +27,7 @@ import org.apache.usergrid.persistence.collection.MvccEntity;
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.impl.migration.CollectionMigrationPlugin;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.data.MigrationInfoCache;
 import org.apache.usergrid.persistence.core.migration.data.MigrationRelationship;
 import org.apache.usergrid.persistence.core.migration.data.VersionedMigrationSet;
@@ -186,6 +187,11 @@ public class MvccEntitySerializationStrategyProxyImpl implements MvccEntitySeria
         return Collections.emptyList();
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+        return Collections.emptyList();
+    }
+
 
     @Override
     public int getImplementationVersion() {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
index 57607d0..2fa5d09 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyV3Impl.java
@@ -16,6 +16,7 @@ import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.netflix.astyanax.serializers.StringSerializer;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -304,6 +305,12 @@ public class MvccEntitySerializationStrategyV3Impl implements MvccEntitySerializ
         return Collections.singleton( cf );
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
+
 
     /**
      * Do the write on the correct row for the entity id with the operation

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java
index 8e34f01..b27651d 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationProxyImpl.java
@@ -30,6 +30,7 @@ import org.apache.usergrid.persistence.collection.VersionSet;
 import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.impl.migration.CollectionMigrationPlugin;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.data.MigrationInfoCache;
 import org.apache.usergrid.persistence.core.migration.data.MigrationRelationship;
 import org.apache.usergrid.persistence.core.migration.data.VersionedMigrationSet;
@@ -146,6 +147,11 @@ public class MvccLogEntrySerializationProxyImpl implements MvccLogEntrySerializa
         return Collections.emptyList();
     }
 
+    @Override
+    public Collection<TableDefinition> getTables(){
+        return Collections.emptyList();
+    }
+
 
     @Override
     public int getImplementationVersion() {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java
index e0c0909..62c35bb 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV1Impl.java
@@ -35,6 +35,7 @@ import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.inject.Inject;
@@ -115,4 +116,10 @@ public class MvccLogEntrySerializationStrategyV1Impl
 
         return Collections.singleton( cf );
     }
+
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java
index 1bfc289..325762d 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyV2Impl.java
@@ -35,6 +35,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.inject.Inject;
@@ -103,4 +104,10 @@ public class MvccLogEntrySerializationStrategyV2Impl extends MvccLogEntrySeriali
 
         return Collections.singleton( cf );
     }
+
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
index 1de4052..87b1641 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyProxyImpl.java
@@ -29,6 +29,7 @@ import org.apache.usergrid.persistence.collection.serialization.UniqueValueSeria
 import org.apache.usergrid.persistence.collection.serialization.UniqueValueSet;
 import org.apache.usergrid.persistence.collection.serialization.impl.migration.CollectionMigrationPlugin;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.data.MigrationInfoCache;
 import org.apache.usergrid.persistence.core.migration.data.MigrationRelationship;
 import org.apache.usergrid.persistence.core.migration.data.VersionedMigrationSet;
@@ -171,6 +172,11 @@ public class UniqueValueSerializationStrategyProxyImpl implements UniqueValueSer
         return Collections.emptyList();
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+        return Collections.emptyList();
+    }
+
 
     @Override
     public int getImplementationVersion() {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
index 6a1cb58..dafbf2b 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
@@ -22,6 +22,7 @@ package org.apache.usergrid.persistence.collection.serialization.impl;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 
 import org.apache.cassandra.db.marshal.BytesType;
 
@@ -33,6 +34,7 @@ import org.apache.usergrid.persistence.core.astyanax.IdRowCompositeSerializer;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.field.Field;
 
@@ -99,6 +101,12 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
         return Arrays.asList( uniqueLookupCF, uniqueLogCF );
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
+
 
     @Override
     protected MultiTenantColumnFamily<ScopedRowKey<CollectionPrefixedKey<Field>>, EntityVersion> getUniqueValuesCF() {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
index 40622a4..17b8b37 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV2Impl.java
@@ -22,6 +22,7 @@ package org.apache.usergrid.persistence.collection.serialization.impl;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 
 import org.apache.cassandra.db.marshal.BytesType;
 
@@ -33,6 +34,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.field.Field;
 
@@ -99,6 +101,11 @@ public class UniqueValueSerializationStrategyV2Impl  extends UniqueValueSerializ
         return Arrays.asList( uniqueLookupCF, uniqueLogCF );
     }
 
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
 
     @Override
     protected MultiTenantColumnFamily<ScopedRowKey<TypeField>, EntityVersion> getUniqueValuesCF() {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
index 7dee9c8..f2e4f57 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
@@ -30,7 +30,7 @@ import java.util.*;
 public class CQLUtils {
 
 
-    enum ACTION {
+    public enum ACTION {
         CREATE, UPDATE
     }
 
@@ -84,7 +84,7 @@ public class CQLUtils {
             throw new Exception("Invalid Action specified.  Must of of type CQLUtils.Action");
         }
 
-        cql.add( quote( tableDefinition.getTableName() ) );
+        cql.add( tableDefinition.getTableName() );
 
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java
index e02cafe..18427f7 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/MigrationInfoSerializationImpl.java
@@ -27,6 +27,7 @@ import org.apache.cassandra.db.marshal.BytesType;
 import org.apache.cassandra.db.marshal.UTF8Type;
 
 import org.apache.usergrid.persistence.core.astyanax.*;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.migration.util.AstayanxUtils;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.entity.SimpleId;
@@ -205,4 +206,10 @@ public class MigrationInfoSerializationImpl implements MigrationInfoSerializatio
                         UTF8Type.class.getSimpleName(), BytesType.class.getSimpleName(),
                         MultiTenantColumnFamilyDefinition.CacheOption.KEYS ) );
     }
+
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        return Collections.emptyList();
+    }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
index 3896df2..952f898 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/Migration.java
@@ -22,6 +22,7 @@ package org.apache.usergrid.persistence.core.migration.schema;
 import java.util.Collection;
 
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 
 
 /**
@@ -34,5 +35,5 @@ public interface Migration {
      */
     Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies();
 
-    //Collection<String> getTables();
+    Collection<TableDefinition> getTables();
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
index 8eb0576..39a78b7 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/schema/MigrationManagerImpl.java
@@ -26,6 +26,7 @@ import com.datastax.driver.core.Session;
 import org.apache.usergrid.persistence.core.astyanax.CassandraFig;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.datastax.DataStaxCluster;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -79,17 +80,35 @@ public class MigrationManagerImpl implements MigrationManager {
 
                 final Collection<MultiTenantColumnFamilyDefinition> columnFamilies = migration.getColumnFamilies();
 
+                final Collection<TableDefinition> tables = migration.getTables();
 
-                if ( columnFamilies == null || columnFamilies.size() == 0 ) {
+
+                if ((columnFamilies == null || columnFamilies.size() == 0) &&
+                    (tables == null || tables.size() == 0)) {
                     logger.warn(
-                            "Class {} implements {} but returns null column families for migration.  Either implement this method or remove the interface from the class",
-                            migration.getClass(), Migration.class );
+                        "Class {} implements {} but returns null for getColumnFamilies and getTables for migration.  Either implement this method or remove the interface from the class",
+                        migration.getClass().getSimpleName(), Migration.class.getSimpleName());
                     continue;
                 }
 
-                for ( MultiTenantColumnFamilyDefinition cf : columnFamilies ) {
-                    testAndCreateColumnFamilyDef( cf );
+                if (columnFamilies != null && columnFamilies.isEmpty()) {
+                    for (MultiTenantColumnFamilyDefinition cf : columnFamilies) {
+                        testAndCreateColumnFamilyDef(cf);
+                    }
+                }
+
+
+                if ( tables != null && !tables.isEmpty() ) {
+                    for (TableDefinition tableDefinition : tables) {
+
+                        createTable(tableDefinition);
+
+                    }
                 }
+
+
+
+
             }
         }
         catch ( Throwable t ) {
@@ -120,6 +139,20 @@ public class MigrationManagerImpl implements MigrationManager {
         waitForSchemaAgreement();
     }
 
+    private void createTable(TableDefinition tableDefinition ) throws Exception {
+
+        logger.info("Creating, if not exists, table: {}", tableDefinition.getTableName());
+        String CQL = CQLUtils.getTableCQL( tableDefinition, CQLUtils.ACTION.CREATE );
+        logger.info( CQL );
+        if (logger.isDebugEnabled()){
+            logger.debug( CQL );
+        }
+        dataStaxCluster.getApplicationSession()
+            .execute( CQL );
+
+        waitForSchemaAgreement();
+    }
+
 
     /**
      * Execute CQL to create the keyspace if it does not already exists.  Always update the keyspace with the

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
index 5fc6ee1..958b6f2 100644
--- a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
+++ b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
@@ -21,30 +21,17 @@ package org.apache.usergrid.persistence.map.impl;
 
 
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
 
 import com.datastax.driver.core.*;
 import com.datastax.driver.core.querybuilder.Clause;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.datastax.driver.core.querybuilder.Using;
-import org.apache.cassandra.db.marshal.BytesType;
-import org.apache.cassandra.db.marshal.UTF8Type;
 
-import org.apache.usergrid.persistence.core.astyanax.BucketScopedRowKey;
-import org.apache.usergrid.persistence.core.astyanax.BucketScopedRowKeySerializer;
 import org.apache.usergrid.persistence.core.astyanax.CassandraConfig;
-import org.apache.usergrid.persistence.core.astyanax.CompositeFieldSerializer;
-import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
-import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
-import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
 import org.apache.usergrid.persistence.core.datastax.CQLUtils;
+import org.apache.usergrid.persistence.core.datastax.TableDefinition;
 import org.apache.usergrid.persistence.core.shard.ExpandingShardLocator;
 import org.apache.usergrid.persistence.core.shard.StringHashUtils;
 import org.apache.usergrid.persistence.map.MapScope;
@@ -53,52 +40,41 @@ import com.google.common.base.Preconditions;
 import com.google.common.hash.Funnel;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-import com.netflix.astyanax.Keyspace;
-import com.netflix.astyanax.model.CompositeBuilder;
-import com.netflix.astyanax.model.CompositeParser;
-import com.netflix.astyanax.serializers.BooleanSerializer;
-import com.netflix.astyanax.serializers.StringSerializer;
 
 
 @Singleton
 public class MapSerializationImpl implements MapSerialization {
 
-    private static final String MAP_KEYS_TABLE = CQLUtils.quote("Map_Keys");
-    private static final String MAP_ENTRIES_TABLE = CQLUtils.quote("Map_Entries");
-
-    private static final MapKeySerializer KEY_SERIALIZER = new MapKeySerializer();
-
-    private static final BucketScopedRowKeySerializer<String> MAP_KEY_SERIALIZER =
-        new BucketScopedRowKeySerializer<>( KEY_SERIALIZER );
-
 
-    private static final MapEntrySerializer ENTRY_SERIALIZER = new MapEntrySerializer();
-    private static final ScopedRowKeySerializer<MapEntryKey> MAP_ENTRY_SERIALIZER =
-        new ScopedRowKeySerializer<>( ENTRY_SERIALIZER );
+    private static final String MAP_ENTRIES_TABLE = CQLUtils.quote("Map_Entries");
+    private static final Collection<String> MAP_ENTRIES_PARTITION_KEYS = Collections.singletonList("key");
+    private static final Collection<String> MAP_ENTRIES_COLUMN_KEYS = Collections.singletonList("column1");
+    private static final Map<String, String> MAP_ENTRIES_COLUMNS =
+        new HashMap<String, String>() {{
+            put( "key", "blob");
+            put( "column1", "blob");
+            put( "value", "blob"); }};
+    private static final Map<String, String> MAP_ENTRIES_CLUSTERING_ORDER =
+        new HashMap<String, String>(){{ put("column1", "ASC"); }};
 
+    private static final String MAP_KEYS_TABLE = CQLUtils.quote("Map_Keys");
+    private static final Collection<String> MAP_KEYS_PARTITION_KEYS = Collections.singletonList("key");
+    private static final Collection<String> MAP_KEYS_COLUMN_KEYS = Collections.singletonList("column1");
+    private static final Map<String, String> MAP_KEYS_COLUMNS =
+        new HashMap<String, String>() {{
+            put( "key", "blob");
+            put( "column1", "blob");
+            put( "value", "blob"); }};
+    private static final Map<String, String> MAP_KEYS_CLUSTERING_ORDER =
+        new HashMap<String, String>(){{ put("column1", "ASC"); }};
 
-    private static final BooleanSerializer BOOLEAN_SERIALIZER = BooleanSerializer.get();
 
-    private static final StringSerializer STRING_SERIALIZER = StringSerializer.get();
 
 
     private static final StringResultsBuilderCQL STRING_RESULTS_BUILDER_CQL = new StringResultsBuilderCQL();
 
 
     /**
-     * CFs where the row key contains the source node id
-     */
-    public static final MultiTenantColumnFamily<ScopedRowKey<MapEntryKey>, Boolean> MAP_ENTRIES =
-        new MultiTenantColumnFamily<>( "Map_Entries", MAP_ENTRY_SERIALIZER, BOOLEAN_SERIALIZER );
-
-
-    /**
-     * CFs where the row key contains the source node id
-     */
-    public static final MultiTenantColumnFamily<BucketScopedRowKey<String>, String> MAP_KEYS =
-        new MultiTenantColumnFamily<>( "Map_Keys", MAP_KEY_SERIALIZER, STRING_SERIALIZER );
-
-    /**
      * Number of buckets to hash across.
      */
     private static final int[] NUM_BUCKETS = { 20 };
@@ -115,16 +91,13 @@ public class MapSerializationImpl implements MapSerialization {
     private static final ExpandingShardLocator<String> BUCKET_LOCATOR =
         new ExpandingShardLocator<>( MAP_KEY_FUNNEL, NUM_BUCKETS );
 
-    private final Keyspace keyspace;
     private final CassandraConfig cassandraConfig;
 
     private final Session session;
 
 
     @Inject
-    public MapSerializationImpl( final Keyspace keyspace, final CassandraConfig cassandraConfig,
-                                 final Session session ) {
-        this.keyspace = keyspace;
+    public MapSerializationImpl( final CassandraConfig cassandraConfig, final Session session ) {
         this.session = session;
         this.cassandraConfig = cassandraConfig;
     }
@@ -321,17 +294,27 @@ public class MapSerializationImpl implements MapSerialization {
     @Override
     public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
 
-        final MultiTenantColumnFamilyDefinition mapEntries =
-            new MultiTenantColumnFamilyDefinition( MAP_ENTRIES, BytesType.class.getSimpleName(),
-                BytesType.class.getSimpleName(), BytesType.class.getSimpleName(),
-                MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
+        // This here only until all traces of Astyanax are removed.
+        return Collections.emptyList();
+
+    }
+
+
+    @Override
+    public Collection<TableDefinition> getTables() {
+
+        final TableDefinition mapEntries =
+            new TableDefinition( MAP_ENTRIES_TABLE, MAP_ENTRIES_PARTITION_KEYS, MAP_ENTRIES_COLUMN_KEYS,
+                MAP_ENTRIES_COLUMNS, TableDefinition.CacheOption.KEYS, MAP_ENTRIES_CLUSTERING_ORDER);
+
+        final TableDefinition mapKeys =
+            new TableDefinition( MAP_KEYS_TABLE, MAP_KEYS_PARTITION_KEYS, MAP_KEYS_COLUMN_KEYS,
+                MAP_KEYS_COLUMNS, TableDefinition.CacheOption.KEYS, MAP_KEYS_CLUSTERING_ORDER);
+
 
-        final MultiTenantColumnFamilyDefinition mapKeys =
-            new MultiTenantColumnFamilyDefinition( MAP_KEYS, BytesType.class.getSimpleName(),
-                UTF8Type.class.getSimpleName(), BytesType.class.getSimpleName(),
-                MultiTenantColumnFamilyDefinition.CacheOption.KEYS );
 
         return Arrays.asList( mapEntries, mapKeys );
+
     }
 
 
@@ -350,6 +333,7 @@ public class MapSerializationImpl implements MapSerialization {
 
 
 
+
     private <T> T getValuesCQL( final MapScope scope, final Collection<String> keys, final ResultsBuilderCQL<T> builder ) {
 
         final List<ByteBuffer> serializedKeys = new ArrayList<>();
@@ -368,78 +352,6 @@ public class MapSerializationImpl implements MapSerialization {
 
 
 
-
-    /**
-     * Inner class to serialize and edgeIdTypeKey
-     */
-    private static class MapKeySerializer implements CompositeFieldSerializer<String> {
-
-
-        @Override
-        public void toComposite( final CompositeBuilder builder, final String key ) {
-            builder.addString( key );
-        }
-
-
-        @Override
-        public String fromComposite( final CompositeParser composite ) {
-            final String key = composite.readString();
-
-            return key;
-        }
-    }
-
-
-    /**
-     * Inner class to serialize and edgeIdTypeKey
-     */
-    private static class MapEntrySerializer implements CompositeFieldSerializer<MapEntryKey> {
-
-        @Override
-        public void toComposite( final CompositeBuilder builder, final MapEntryKey key ) {
-
-            builder.addString( key.mapName );
-            builder.addString( key.key );
-        }
-
-
-        @Override
-        public MapEntryKey fromComposite( final CompositeParser composite ) {
-
-            final String mapName = composite.readString();
-
-            final String entryKey = composite.readString();
-
-            return new MapEntryKey( mapName, entryKey );
-        }
-    }
-
-
-    /**
-     * Entries for serializing map entries and keys to a row
-     */
-    private static class MapEntryKey {
-        public final String mapName;
-        public final String key;
-
-
-        private MapEntryKey( final String mapName, final String key ) {
-            this.mapName = mapName;
-            this.key = key;
-        }
-
-
-        /**
-         * Create a scoped row key from the key
-         */
-        public static ScopedRowKey<MapEntryKey> fromKey( final MapScope mapScope, final String key ) {
-
-            return ScopedRowKey.fromKey( mapScope.getApplication(), new MapEntryKey( mapScope.getName(), key ) );
-        }
-    }
-
-
-
     /**
      * Build the results from the row keys
      */

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c0f8a4a2/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java b/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
index 2a68247..bd109d1 100644
--- a/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
+++ b/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
@@ -27,6 +27,7 @@ import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
 import org.junit.Before;
+import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;


[05/38] usergrid git commit: Convert map manager serialization to read and write using CQL using the original Astyanax data modeling in Cassandra (aka no migration required).

Posted by mr...@apache.org.
Convert map manager serialization to read and write using CQL using the original Astyanax data modeling in Cassandra (aka no migration required).


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/2203f433
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/2203f433
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/2203f433

Branch: refs/heads/master
Commit: 2203f43336ae86ebcad823fb740207b4eecc36bb
Parents: ad4a337
Author: Michael Russo <mi...@gmail.com>
Authored: Thu Feb 11 14:49:44 2016 -0800
Committer: Michael Russo <mi...@gmail.com>
Committed: Thu Feb 11 14:49:44 2016 -0800

----------------------------------------------------------------------
 .../core/astyanax/CassandraConfig.java          |  19 +
 .../core/astyanax/CassandraConfigImpl.java      |  27 ++
 .../persistence/core/datastax/CQLUtils.java     |  77 +++-
 .../core/datastax/TableDefinition.java          |  22 +-
 .../core/astyanax/ColumnNameIteratorTest.java   |  16 +
 .../MultiKeyColumnNameIteratorTest.java         |  16 +
 .../astyanax/MultiRowColumnIteratorTest.java    |  16 +
 .../persistence/core/datastax/CQLUtilsTest.java |  15 +-
 .../core/datastax/TableDefinitionTest.java      |   8 +-
 .../persistence/map/impl/MapManagerImpl.java    |   1 -
 .../map/impl/MapSerializationImpl.java          | 391 ++++++++++---------
 .../persistence/map/MapManagerTest.java         |  16 +
 12 files changed, 407 insertions(+), 217 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/2203f433/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java
index c506d2d..8cb96ac 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java
@@ -48,6 +48,25 @@ public interface CassandraConfig {
      */
     ConsistencyLevel getWriteCL();
 
+
+    /**
+     * Get the currently configured read CL for DataStax driver
+     * @return
+     */
+    com.datastax.driver.core.ConsistencyLevel getDataStaxReadCl();
+
+    /**
+     * Get the currently configured write CL for DataStax driver
+     * @return
+     */
+    com.datastax.driver.core.ConsistencyLevel getDataStaxWriteCl();
+
+    /**
+     * Get the currently configured consistent read CL for DataStax driver
+     * @return
+     */
+    com.datastax.driver.core.ConsistencyLevel getDataStaxReadConsistentCl();
+
     /**
      * Return the number of shards that has been set in the property file
      * @return

http://git-wip-us.apache.org/repos/asf/usergrid/blob/2203f433/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
index a9b37fd..15f434c 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java
@@ -41,6 +41,12 @@ public class CassandraConfigImpl implements CassandraConfig {
     private int[] shardSettings;
     private ConsistencyLevel consistentCl;
 
+    // DataStax driver's CL
+    private com.datastax.driver.core.ConsistencyLevel dataStaxReadCl;
+    private com.datastax.driver.core.ConsistencyLevel dataStaxWriteCl;
+    private com.datastax.driver.core.ConsistencyLevel dataStaxReadConsistentCl;
+
+
 
     @Inject
     public CassandraConfigImpl( final CassandraFig cassandraFig ) {
@@ -53,6 +59,12 @@ public class CassandraConfigImpl implements CassandraConfig {
 
         this.consistentCl = ConsistencyLevel.valueOf(cassandraFig.getAstyanaxConsistentReadCL());
 
+        this.dataStaxReadCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getReadCl());
+
+        this.dataStaxReadConsistentCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getReadCl());
+
+        this.dataStaxWriteCl = com.datastax.driver.core.ConsistencyLevel.valueOf( cassandraFig.getWriteCl() );
+
         //add the listeners to update the values
         cassandraFig.addPropertyChangeListener( new PropertyChangeListener() {
             @Override
@@ -89,6 +101,21 @@ public class CassandraConfigImpl implements CassandraConfig {
         return writeCl;
     }
 
+    @Override
+    public com.datastax.driver.core.ConsistencyLevel getDataStaxReadCl() {
+        return dataStaxReadCl;
+    }
+
+    @Override
+    public com.datastax.driver.core.ConsistencyLevel getDataStaxWriteCl() {
+        return dataStaxWriteCl;
+    }
+
+    @Override
+    public com.datastax.driver.core.ConsistencyLevel getDataStaxReadConsistentCl() {
+        return dataStaxReadConsistentCl;
+    }
+
 
     @Override
     public int[] getShardSettings() {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/2203f433/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
index 0a7408a..7dee9c8 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/CQLUtils.java
@@ -18,14 +18,14 @@
  */
 package org.apache.usergrid.persistence.core.datastax;
 
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.ProtocolVersion;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.usergrid.persistence.core.util.StringUtils;
 
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.StringJoiner;
+import java.nio.ByteBuffer;
+import java.util.*;
 
 public class CQLUtils {
 
@@ -45,6 +45,10 @@ public class CQLUtils {
     static String PRIMARY_KEY = "PRIMARY KEY";
     static String COMPACT_STORAGE = "COMPACT STORAGE";
     static String CLUSTERING_ORDER_BY = "CLUSTERING ORDER BY";
+    static String COMMA = ",";
+    static String PAREN_LEFT = "(";
+    static String PAREN_RIGHT = ")";
+
 
     private final static ObjectMapper mapper = new ObjectMapper();
 
@@ -80,22 +84,28 @@ public class CQLUtils {
             throw new Exception("Invalid Action specified.  Must of of type CQLUtils.Action");
         }
 
-        cql.add( "\""+tableDefinition.getTableName()+"\"" );
-
+        cql.add( quote( tableDefinition.getTableName() ) );
 
-        StringJoiner columnsString = new StringJoiner(",");
-        Map<String, String> columns = tableDefinition.getColumns();
-        columns.forEach( (key, value) -> columnsString.add(key+" "+value));
-        columnsString.add(PRIMARY_KEY +" ( "+StringUtils.join(tableDefinition.getPrimaryKeys(), ",") + " )");
 
-        StringJoiner orderingString = new StringJoiner(" ");
-        Map<String, String> ordering = tableDefinition.getClusteringOrder();
-        ordering.forEach( (key, value) -> orderingString.add(key+" "+value));
 
         if ( tableAction.equals(ACTION.CREATE) ){
-            cql.add("(").add(columnsString.toString()).add(")")
+
+            cql.add(PAREN_LEFT).add( spaceSeparatedKeyValue(tableDefinition.getColumns()) ).add(COMMA)
+                .add(PRIMARY_KEY)
+                .add(PAREN_LEFT).add(PAREN_LEFT)
+                .add( StringUtils.join(tableDefinition.getPartitionKeys(), COMMA) ).add(PAREN_RIGHT);
+
+            if ( tableDefinition.getColumnKeys() != null && !tableDefinition.getColumnKeys().isEmpty() ){
+
+                cql.add(COMMA).add( StringUtils.join(tableDefinition.getColumnKeys(), COMMA) );
+            }
+
+            cql.add(PAREN_RIGHT).add(PAREN_RIGHT)
                 .add(WITH)
-                .add(CLUSTERING_ORDER_BY).add("(").add(orderingString.toString()).add(")")
+                .add(CLUSTERING_ORDER_BY)
+                .add(PAREN_LEFT)
+                .add( spaceSeparatedKeyValue(tableDefinition.getClusteringOrder()) )
+                .add(PAREN_RIGHT)
                 .add(AND)
                 .add(COMPACT_STORAGE)
                 .add(AND);
@@ -118,5 +128,42 @@ public class CQLUtils {
 
     }
 
+    public static String quote( String value){
+
+        return "\"" + value + "\"";
+
+    }
+
+    public static String spaceSeparatedKeyValue(Map<String, String> columns){
+
+        StringJoiner columnsSchema = new StringJoiner(",");
+        columns.forEach( (key, value) -> columnsSchema.add(key+" "+value));
+
+        return columnsSchema.toString();
+
+    }
+
+
+    /**
+     * Below functions borrowed from Astyanax until the schema is re-written to be more CQL friendly
+     */
+
+    public static int getShortLength(ByteBuffer bb) {
+        int length = (bb.get() & 255) << 8;
+        return length | bb.get() & 255;
+    }
+
+    public static ByteBuffer getBytes(ByteBuffer bb, int length) {
+        ByteBuffer copy = bb.duplicate();
+        copy.limit(copy.position() + length);
+        bb.position(bb.position() + length);
+        return copy;
+    }
+
+    public static ByteBuffer getWithShortLength(ByteBuffer bb) {
+        int length = getShortLength(bb);
+        return getBytes(bb, length);
+    }
+
 
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/2203f433/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
index 801eaa7..0635b93 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/TableDefinition.java
@@ -53,7 +53,8 @@ public class TableDefinition {
 
 
     private final String tableName;
-    private final Collection<String> primaryKeys;
+    private final Collection<String> partitionKeys;
+    private final Collection<String> columnKeys;
     private final Map<String, String> columns;
     private final CacheOption cacheOption;
     private final Map<String, Object> compaction;
@@ -63,18 +64,19 @@ public class TableDefinition {
     private final String gcGraceSeconds;
     private final Map<String, String> clusteringOrder;
 
-    public TableDefinition( final String tableName, final Collection<String> primaryKeys,
-                            final Map<String, String> columns, final CacheOption cacheOption,
-                            final Map<String, String> clusteringOrder){
+    public TableDefinition( final String tableName, final Collection<String> partitionKeys,
+                            final Collection<String> columnKeys, final Map<String, String> columns,
+                            final CacheOption cacheOption, final Map<String, String> clusteringOrder){
 
         Preconditions.checkNotNull(tableName, "Table name cannot be null");
-        Preconditions.checkNotNull(primaryKeys, "Primary Key(s) cannot be null");
+        Preconditions.checkNotNull(partitionKeys, "Primary Key(s) cannot be null");
         Preconditions.checkNotNull(columns, "Columns cannot be null");
         Preconditions.checkNotNull(cacheOption, "CacheOption cannot be null");
 
 
         this.tableName = tableName;
-        this.primaryKeys = primaryKeys;
+        this.partitionKeys = partitionKeys;
+        this.columnKeys = columnKeys;
         this.columns = columns;
         this.cacheOption = cacheOption;
         this.clusteringOrder = clusteringOrder;
@@ -97,8 +99,12 @@ public class TableDefinition {
         return tableName;
     }
 
-    public Collection<String> getPrimaryKeys() {
-        return primaryKeys;
+    public Collection<String> getPartitionKeys() {
+        return partitionKeys;
+    }
+
+    public Collection<String> getColumnKeys() {
+        return columnKeys;
     }
 
     public Map<String, String> getColumns() {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/2203f433/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
index 18c9327..dccbd45 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/ColumnNameIteratorTest.java
@@ -93,6 +93,22 @@ public class ColumnNameIteratorTest {
                 return ConsistencyLevel.CL_QUORUM;
             }
 
+            @Override
+            public com.datastax.driver.core.ConsistencyLevel getDataStaxReadCl() {
+                return com.datastax.driver.core.ConsistencyLevel.LOCAL_ONE;
+            }
+
+            @Override
+            public com.datastax.driver.core.ConsistencyLevel getDataStaxReadConsistentCl() {
+                return com.datastax.driver.core.ConsistencyLevel.ALL;
+            }
+
+
+            @Override
+            public com.datastax.driver.core.ConsistencyLevel getDataStaxWriteCl() {
+                return com.datastax.driver.core.ConsistencyLevel.QUORUM;
+            }
+
 
             @Override
             public int[] getShardSettings() {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/2203f433/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
index bd1ea55..d020949 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiKeyColumnNameIteratorTest.java
@@ -98,6 +98,22 @@ public class MultiKeyColumnNameIteratorTest {
                 return ConsistencyLevel.CL_QUORUM;
             }
 
+            @Override
+            public com.datastax.driver.core.ConsistencyLevel getDataStaxReadCl() {
+                return com.datastax.driver.core.ConsistencyLevel.LOCAL_ONE;
+            }
+
+            @Override
+            public com.datastax.driver.core.ConsistencyLevel getDataStaxReadConsistentCl() {
+                return com.datastax.driver.core.ConsistencyLevel.ALL;
+            }
+
+
+            @Override
+            public com.datastax.driver.core.ConsistencyLevel getDataStaxWriteCl() {
+                return com.datastax.driver.core.ConsistencyLevel.QUORUM;
+            }
+
 
             @Override
             public int[] getShardSettings() {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/2203f433/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
index 9f5741b..8bcdcb2 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/astyanax/MultiRowColumnIteratorTest.java
@@ -101,6 +101,22 @@ public class MultiRowColumnIteratorTest {
                 return ConsistencyLevel.CL_QUORUM;
             }
 
+            @Override
+            public com.datastax.driver.core.ConsistencyLevel getDataStaxReadCl() {
+                return com.datastax.driver.core.ConsistencyLevel.LOCAL_ONE;
+            }
+
+            @Override
+            public com.datastax.driver.core.ConsistencyLevel getDataStaxReadConsistentCl() {
+                return com.datastax.driver.core.ConsistencyLevel.ALL;
+            }
+
+
+            @Override
+            public com.datastax.driver.core.ConsistencyLevel getDataStaxWriteCl() {
+                return com.datastax.driver.core.ConsistencyLevel.QUORUM;
+            }
+
 
             @Override
             public int[] getShardSettings() {

http://git-wip-us.apache.org/repos/asf/usergrid/blob/2203f433/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
index 8ddfa3f..76fcefe 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/CQLUtilsTest.java
@@ -43,9 +43,11 @@ public class CQLUtilsTest {
         columns.put("column1", "text");
         columns.put("value", "blob");
 
-        List<String> primaryKeys = new ArrayList<>();
-        primaryKeys.add("key");
-        primaryKeys.add("column1");
+        List<String> partitionKeys = new ArrayList<>();
+        partitionKeys.add("key");
+
+        List<String> columnKeys = new ArrayList<>();
+        columnKeys.add("column1");
 
         Map<String, String> clusteringOrder = new HashMap<>();
         clusteringOrder.put("column1", "DESC");
@@ -54,7 +56,8 @@ public class CQLUtilsTest {
 
         TableDefinition table1 = new TableDefinition(
             "table1",
-            primaryKeys,
+            partitionKeys,
+            columnKeys,
             columns,
             TableDefinition.CacheOption.KEYS,
             clusteringOrder
@@ -65,8 +68,8 @@ public class CQLUtilsTest {
 
         assertTrue( createCQL.contains( CQLUtils.CREATE_TABLE ) && !createCQL.contains( CQLUtils.ALTER_TABLE ) );
         assertTrue( updateCQL.contains( CQLUtils.ALTER_TABLE ) && !updateCQL.contains( CQLUtils.CREATE_TABLE ) );
-        //logger.info("CREATE: {}", createCQL);
-        //logger.info("UPDATE: {}", updateCQL);
+        logger.info("CREATE: {}", createCQL);
+        logger.info("UPDATE: {}", updateCQL);
 
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/2203f433/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
index 792864b..3acce69 100644
--- a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
+++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/TableDefinitionTest.java
@@ -32,7 +32,7 @@ public class TableDefinitionTest {
     public void testNullTableName(){
 
         try{
-            TableDefinition table1 = new TableDefinition(null, null, null, null, null);
+            TableDefinition table1 = new TableDefinition(null, null, null, null, null, null);
         } catch (NullPointerException npe){
             assertEquals("Table name cannot be null", npe.getMessage());
         }
@@ -44,7 +44,7 @@ public class TableDefinitionTest {
     public void testNullPrimaryKeys(){
 
         try{
-            TableDefinition table1 = new TableDefinition("table1", null, null, null, null);
+            TableDefinition table1 = new TableDefinition("table1", null, null, null, null, null);
         } catch (NullPointerException npe){
             assertEquals("Primary Key(s) cannot be null", npe.getMessage());
         }
@@ -57,7 +57,7 @@ public class TableDefinitionTest {
 
         try{
             TableDefinition table1 = new TableDefinition("table1",
-                new ArrayList<>(), null, null, null);
+                new ArrayList<>(), null, null, null, null);
         } catch (NullPointerException npe){
             assertEquals("Columns cannot be null", npe.getMessage());
         }
@@ -71,7 +71,7 @@ public class TableDefinitionTest {
         try{
             TableDefinition table1 = new TableDefinition("table1",
                 new ArrayList<>(),
-                new HashMap<>(), null, null);
+                new ArrayList<>(), new HashMap<>(), null, null);
         } catch (NullPointerException npe){
             assertEquals("CacheOption cannot be null", npe.getMessage());
         }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/2203f433/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapManagerImpl.java b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapManagerImpl.java
index 501ade7..ae05057 100644
--- a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapManagerImpl.java
+++ b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapManagerImpl.java
@@ -51,7 +51,6 @@ public class MapManagerImpl implements MapManager {
         return mapSerialization.getString( scope, key );
     }
 
-
     @Override
     public String getStringHighConsistency( final String key ) {
         return mapSerialization.getStringHighConsistency(scope, key);

http://git-wip-us.apache.org/repos/asf/usergrid/blob/2203f433/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
index f90f80c..5fc6ee1 100644
--- a/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
+++ b/stack/corepersistence/map/src/main/java/org/apache/usergrid/persistence/map/impl/MapSerializationImpl.java
@@ -20,6 +20,7 @@
 package org.apache.usergrid.persistence.map.impl;
 
 
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -28,6 +29,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import com.datastax.driver.core.*;
+import com.datastax.driver.core.querybuilder.Clause;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.datastax.driver.core.querybuilder.Using;
 import org.apache.cassandra.db.marshal.BytesType;
 import org.apache.cassandra.db.marshal.UTF8Type;
 
@@ -39,6 +44,7 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKeySerializer;
+import org.apache.usergrid.persistence.core.datastax.CQLUtils;
 import org.apache.usergrid.persistence.core.shard.ExpandingShardLocator;
 import org.apache.usergrid.persistence.core.shard.StringHashUtils;
 import org.apache.usergrid.persistence.map.MapScope;
@@ -47,17 +53,9 @@ import com.google.common.base.Preconditions;
 import com.google.common.hash.Funnel;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-import com.netflix.astyanax.ColumnListMutation;
 import com.netflix.astyanax.Keyspace;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.connectionpool.exceptions.NotFoundException;
-import com.netflix.astyanax.model.Column;
 import com.netflix.astyanax.model.CompositeBuilder;
 import com.netflix.astyanax.model.CompositeParser;
-import com.netflix.astyanax.model.ConsistencyLevel;
-import com.netflix.astyanax.model.Row;
-import com.netflix.astyanax.model.Rows;
 import com.netflix.astyanax.serializers.BooleanSerializer;
 import com.netflix.astyanax.serializers.StringSerializer;
 
@@ -65,6 +63,9 @@ import com.netflix.astyanax.serializers.StringSerializer;
 @Singleton
 public class MapSerializationImpl implements MapSerialization {
 
+    private static final String MAP_KEYS_TABLE = CQLUtils.quote("Map_Keys");
+    private static final String MAP_ENTRIES_TABLE = CQLUtils.quote("Map_Entries");
+
     private static final MapKeySerializer KEY_SERIALIZER = new MapKeySerializer();
 
     private static final BucketScopedRowKeySerializer<String> MAP_KEY_SERIALIZER =
@@ -81,7 +82,7 @@ public class MapSerializationImpl implements MapSerialization {
     private static final StringSerializer STRING_SERIALIZER = StringSerializer.get();
 
 
-    private static final StringResultsBuilder STRING_RESULTS_BUILDER = new StringResultsBuilder();
+    private static final StringResultsBuilderCQL STRING_RESULTS_BUILDER_CQL = new StringResultsBuilderCQL();
 
 
     /**
@@ -117,137 +118,111 @@ public class MapSerializationImpl implements MapSerialization {
     private final Keyspace keyspace;
     private final CassandraConfig cassandraConfig;
 
+    private final Session session;
+
 
     @Inject
-    public MapSerializationImpl( final Keyspace keyspace, final CassandraConfig cassandraConfig ) {
+    public MapSerializationImpl( final Keyspace keyspace, final CassandraConfig cassandraConfig,
+                                 final Session session ) {
         this.keyspace = keyspace;
+        this.session = session;
         this.cassandraConfig = cassandraConfig;
     }
 
 
     @Override
     public String getString( final MapScope scope, final String key ) {
-        Column<Boolean> col = getValue( scope, key, cassandraConfig.getReadCL()  );
-        return ( col != null ) ? col.getStringValue() : null;
+
+        ByteBuffer value = getValueCQL( scope, key, cassandraConfig.getDataStaxReadCl() ) ;
+        return value != null ? (String)DataType.text().deserialize(value,ProtocolVersion.NEWEST_SUPPORTED ): null;
     }
 
 
     @Override
     public String getStringHighConsistency( final MapScope scope, final String key ) {
-        Column<Boolean> col = getValue( scope, key, cassandraConfig.getConsistentReadCL() ); // TODO: why boolean?
-        return ( col != null ) ? col.getStringValue() : null;
+
+        ByteBuffer value = getValueCQL( scope, key, cassandraConfig.getDataStaxReadConsistentCl() ) ;
+        return value != null ? (String)DataType.text().deserialize(value,ProtocolVersion.NEWEST_SUPPORTED ): null;
     }
 
 
     @Override
     public Map<String, String> getStrings( final MapScope scope, final Collection<String> keys ) {
-        return getValues( scope, keys, STRING_RESULTS_BUILDER );
+        return getValuesCQL( scope, keys, STRING_RESULTS_BUILDER_CQL );
     }
 
 
     @Override
     public void putString( final MapScope scope, final String key, final String value ) {
-        final RowOp op = new RowOp() {
-            @Override
-            public void putValue( final ColumnListMutation<Boolean> columnListMutation ) {
-                columnListMutation.putColumn( true, value );
-            }
-
 
-            @Override
-            public void putKey( final ColumnListMutation<String> keysMutation ) {
-                keysMutation.putColumn( key, true );
-            }
-        };
-
-
-        writeString( scope, key, value, op );
+        writeStringCQL( scope, key, value, -1 );
     }
 
 
     @Override
     public void putString( final MapScope scope, final String key, final String value, final int ttl ) {
-        Preconditions.checkArgument( ttl > 0, "ttl must be > than 0" );
-
-        final RowOp op = new RowOp() {
-            @Override
-            public void putValue( final ColumnListMutation<Boolean> columnListMutation ) {
-                columnListMutation.putColumn( true, value, ttl );
-            }
 
-
-            @Override
-            public void putKey( final ColumnListMutation<String> keysMutation ) {
-                keysMutation.putColumn( key, true, ttl );
-            }
-        };
-
-
-        writeString( scope, key, value, op );
+        Preconditions.checkArgument( ttl > 0, "ttl must be > than 0" );
+        writeStringCQL( scope, key, value, ttl );
     }
 
 
     /**
      * Write our string index with the specified row op
      */
-    private void writeString( final MapScope scope, final String key, final String value, final RowOp rowOp ) {
+    private void writeStringCQL( final MapScope scope, final String key, final String value, int ttl ) {
 
         Preconditions.checkNotNull( scope, "mapscope is required" );
         Preconditions.checkNotNull( key, "key is required" );
         Preconditions.checkNotNull( value, "value is required" );
 
-        final MutationBatch batch = keyspace.prepareMutationBatch();
-
-        //add it to the entry
-        final ScopedRowKey<MapEntryKey> entryRowKey = MapEntryKey.fromKey( scope, key );
+        Statement mapEntry;
+        Statement mapKey;
+        if (ttl > 0){
+            Using timeToLive = QueryBuilder.ttl(ttl);
 
-        //serialize to the
-        // entry
+            mapEntry = QueryBuilder.insertInto(MAP_ENTRIES_TABLE)
+                .using(timeToLive)
+                .value("key", getMapEntryPartitionKey(scope, key))
+                .value("column1", DataType.cboolean().serialize(true, ProtocolVersion.NEWEST_SUPPORTED))
+                .value("value", DataType.text().serialize(value, ProtocolVersion.NEWEST_SUPPORTED));
 
 
-        rowOp.putValue( batch.withRow( MAP_ENTRIES, entryRowKey ) );
+            final int bucket = BUCKET_LOCATOR.getCurrentBucket( key );
+            mapKey = QueryBuilder.insertInto(MAP_KEYS_TABLE)
+                .using(timeToLive)
+                .value("key", getMapKeyPartitionKey(scope, key, bucket))
+                .value("column1", DataType.cboolean().serialize(true, ProtocolVersion.NEWEST_SUPPORTED))
+                .value("value", DataType.text().serialize(value, ProtocolVersion.NEWEST_SUPPORTED));
+        }else{
 
+            mapEntry = QueryBuilder.insertInto(MAP_ENTRIES_TABLE)
+                .value("key", getMapEntryPartitionKey(scope, key))
+                .value("column1", DataType.cboolean().serialize(true, ProtocolVersion.NEWEST_SUPPORTED))
+                .value("value", DataType.text().serialize(value, ProtocolVersion.NEWEST_SUPPORTED));
 
-        //add it to the keys
+            // get a bucket number for the map keys table
+            final int bucket = BUCKET_LOCATOR.getCurrentBucket( key );
 
-        final int bucket = BUCKET_LOCATOR.getCurrentBucket( key );
-
-        final BucketScopedRowKey<String> keyRowKey = BucketScopedRowKey.fromKey( scope.getApplication(), key, bucket );
-
-        //serialize to the entry
+            mapKey = QueryBuilder.insertInto(MAP_KEYS_TABLE)
+                .value("key", getMapKeyPartitionKey(scope, key, bucket))
+                .value("column1", DataType.cboolean().serialize(true, ProtocolVersion.NEWEST_SUPPORTED))
+                .value("value", DataType.text().serialize(value, ProtocolVersion.NEWEST_SUPPORTED));
 
-        rowOp.putKey( batch.withRow( MAP_KEYS, keyRowKey ) );
+        }
 
+        session.execute(mapEntry);
+        session.execute(mapKey);
 
-        executeBatch( batch );
     }
 
 
-    /**
-     * Callbacks for performing row operations
-     */
-    private static interface RowOp {
-
-        /**
-         * Callback to do the row
-         *
-         * @param columnListMutation The column mutation
-         */
-        void putValue( final ColumnListMutation<Boolean> columnListMutation );
-
-
-        /**
-         * Write the key
-         */
-        void putKey( final ColumnListMutation<String> keysMutation );
-    }
-
 
     @Override
     public UUID getUuid( final MapScope scope, final String key ) {
 
-        Column<Boolean> col = getValue( scope, key, cassandraConfig.getReadCL() );
-        return ( col != null ) ? col.getUUIDValue() : null;
+        ByteBuffer value = getValueCQL( scope, key, cassandraConfig.getDataStaxReadCl() );
+        return value != null ? (UUID)DataType.uuid().deserialize(value, ProtocolVersion.NEWEST_SUPPORTED ) : null;
     }
 
 
@@ -258,31 +233,34 @@ public class MapSerializationImpl implements MapSerialization {
         Preconditions.checkNotNull( key, "key is required" );
         Preconditions.checkNotNull( putUuid, "value is required" );
 
-        final MutationBatch batch = keyspace.prepareMutationBatch();
 
-        //add it to the entry
-        final ScopedRowKey<MapEntryKey> entryRowKey = MapEntryKey.fromKey( scope, key );
+        Statement mapEntry = QueryBuilder.insertInto(MAP_ENTRIES_TABLE)
+            .value("key", getMapEntryPartitionKey(scope, key))
+            .value("column1", DataType.cboolean().serialize(true, ProtocolVersion.NEWEST_SUPPORTED))
+            .value("value", DataType.uuid().serialize(putUuid, ProtocolVersion.NEWEST_SUPPORTED));
 
-        //serialize to the entry
-        batch.withRow( MAP_ENTRIES, entryRowKey ).putColumn( true, putUuid );
+        session.execute(mapEntry);
 
-        //add it to the keys
 
         final int bucket = BUCKET_LOCATOR.getCurrentBucket( key );
+        Statement mapKey;
+        mapKey = QueryBuilder.insertInto(MAP_KEYS_TABLE)
+            .value("key", getMapKeyPartitionKey(scope, key, bucket))
+            .value("column1", DataType.text().serialize(key, ProtocolVersion.NEWEST_SUPPORTED))
+            .value("value", DataType.serializeValue(null, ProtocolVersion.NEWEST_SUPPORTED));
+
+        session.execute(mapKey);
+    }
 
-        final BucketScopedRowKey<String> keyRowKey = BucketScopedRowKey.fromKey( scope.getApplication(), key, bucket );
 
-        //serialize to the entry
-        batch.withRow( MAP_KEYS, keyRowKey ).putColumn( key, true );
 
-        executeBatch( batch );
-    }
 
 
     @Override
     public Long getLong( final MapScope scope, final String key ) {
-        Column<Boolean> col = getValue( scope, key, cassandraConfig.getReadCL() );
-        return ( col != null ) ? col.getLongValue() : null;
+
+        ByteBuffer value = getValueCQL( scope, key, cassandraConfig.getDataStaxReadCl());
+        return value != null ? (Long)DataType.bigint().deserialize(value, ProtocolVersion.NEWEST_SUPPORTED ) : null;
     }
 
 
@@ -293,46 +271,50 @@ public class MapSerializationImpl implements MapSerialization {
         Preconditions.checkNotNull( key, "key is required" );
         Preconditions.checkNotNull( value, "value is required" );
 
-        final MutationBatch batch = keyspace.prepareMutationBatch();
+        Statement mapEntry = QueryBuilder.insertInto(MAP_ENTRIES_TABLE)
+            .value("key", getMapEntryPartitionKey(scope, key))
+            .value("column1", DataType.cboolean().serialize(true, ProtocolVersion.NEWEST_SUPPORTED))
+            .value("value", DataType.bigint().serialize(value, ProtocolVersion.NEWEST_SUPPORTED));
 
-        //add it to the entry
-        final ScopedRowKey<MapEntryKey> entryRowKey = MapEntryKey.fromKey( scope, key );
+        session.execute(mapEntry);
 
-        //serialize to the entry
-        batch.withRow( MAP_ENTRIES, entryRowKey ).putColumn( true, value );
 
-        //add it to the keys
         final int bucket = BUCKET_LOCATOR.getCurrentBucket( key );
+        Statement mapKey;
+        mapKey = QueryBuilder.insertInto(MAP_KEYS_TABLE)
+            .value("key", getMapKeyPartitionKey(scope, key, bucket))
+            .value("column1", DataType.text().serialize(key, ProtocolVersion.NEWEST_SUPPORTED))
+            .value("value", DataType.serializeValue(null, ProtocolVersion.NEWEST_SUPPORTED));
 
-        final BucketScopedRowKey<String> keyRowKey = BucketScopedRowKey.fromKey( scope.getApplication(), key, bucket );
-
-        //serialize to the entry
-        batch.withRow( MAP_KEYS, keyRowKey ).putColumn( key, true );
-
-        executeBatch( batch );
+        session.execute(mapKey);
     }
 
 
     @Override
     public void delete( final MapScope scope, final String key ) {
-        final MutationBatch batch = keyspace.prepareMutationBatch();
-        final ScopedRowKey<MapEntryKey> entryRowKey = MapEntryKey.fromKey( scope, key );
 
-        //serialize to the entry
-        batch.withRow( MAP_ENTRIES, entryRowKey ).delete();
-
-        //add it to the keys, we're not sure which one it may have come from
-        final int[] buckets = BUCKET_LOCATOR.getAllBuckets( key );
+        Statement deleteMapEntry;
+        Clause equalsEntryKey = QueryBuilder.eq("key", getMapEntryPartitionKey(scope, key));
+        deleteMapEntry = QueryBuilder.delete().from(MAP_ENTRIES_TABLE)
+            .where(equalsEntryKey);
+        session.execute(deleteMapEntry);
 
 
-        final List<BucketScopedRowKey<String>> rowKeys =
-            BucketScopedRowKey.fromRange( scope.getApplication(), key, buckets );
 
-        for ( BucketScopedRowKey<String> rowKey : rowKeys ) {
-            batch.withRow( MAP_KEYS, rowKey ).deleteColumn( key );
+        // not sure which bucket the value is in, execute a delete against them all
+        final int[] buckets = BUCKET_LOCATOR.getAllBuckets( key );
+        List<ByteBuffer> mapKeys = new ArrayList<>();
+        for( int bucket :  buckets){
+            mapKeys.add( getMapKeyPartitionKey(scope, key, bucket));
         }
 
-        executeBatch( batch );
+        Statement deleteMapKey;
+        Clause inKey = QueryBuilder.in("key", mapKeys);
+        deleteMapKey = QueryBuilder.delete().from(MAP_KEYS_TABLE)
+            .where(inKey);
+        session.execute(deleteMapKey);
+
+
     }
 
 
@@ -353,72 +335,38 @@ public class MapSerializationImpl implements MapSerialization {
     }
 
 
-    private Column<Boolean> getValue( MapScope scope, String key, final ConsistencyLevel consistencyLevel ) {
+    private ByteBuffer getValueCQL( MapScope scope, String key, final ConsistencyLevel consistencyLevel ) {
 
-        //add it to the entry
-        final ScopedRowKey<MapEntryKey> entryRowKey = MapEntryKey.fromKey( scope, key );
+        Clause in = QueryBuilder.in("key", getMapEntryPartitionKey(scope, key) );
+        Statement statement = QueryBuilder.select().all().from(MAP_ENTRIES_TABLE)
+            .where(in)
+            .setConsistencyLevel(consistencyLevel);
 
-        //now get all columns, including the "old row key value"
-        try {
-            final Column<Boolean> result =
-                keyspace.prepareQuery( MAP_ENTRIES ).setConsistencyLevel( consistencyLevel ).getKey( entryRowKey ).getColumn( true ).execute().getResult();
+        ResultSet resultSet = session.execute(statement);
+        com.datastax.driver.core.Row row = resultSet.one();
 
-            return result;
-        }
-        catch ( NotFoundException nfe ) {
-            //nothing to return
-            return null;
-        }
-        catch ( ConnectionException e ) {
-            throw new RuntimeException( "Unable to connect to cassandra", e );
-        }
+        return row != null ? row.getBytes("value") : null;
     }
 
 
-    /**
-     * Get multiple values, using the string builder
-     */
-    private <T> T getValues( final MapScope scope, final Collection<String> keys, final ResultsBuilder<T> builder ) {
-
 
-        final List<ScopedRowKey<MapEntryKey>> rowKeys = new ArrayList<>( keys.size() );
+    private <T> T getValuesCQL( final MapScope scope, final Collection<String> keys, final ResultsBuilderCQL<T> builder ) {
 
-        for ( final String key : keys ) {
-            //add it to the entry
-            final ScopedRowKey<MapEntryKey> entryRowKey = MapEntryKey.fromKey( scope, key );
+        final List<ByteBuffer> serializedKeys = new ArrayList<>();
 
-            rowKeys.add( entryRowKey );
-        }
+        keys.forEach(key -> serializedKeys.add(getMapEntryPartitionKey(scope,key)));
 
+        Clause in = QueryBuilder.in("key", serializedKeys );
+        Statement statement = QueryBuilder.select().all().from(MAP_ENTRIES_TABLE)
+            .where(in);
 
-        //now get all columns, including the "old row key value"
-        try {
-            final Rows<ScopedRowKey<MapEntryKey>, Boolean> rows =
-                keyspace.prepareQuery( MAP_ENTRIES ).setConsistencyLevel( cassandraConfig.getReadCL() ).getKeySlice(
-                    rowKeys ).withColumnSlice( true ).execute()
-                        .getResult();
 
+        ResultSet resultSet = session.execute(statement);
 
-            return builder.buildResults( rows );
-        }
-        catch ( NotFoundException nfe ) {
-            //nothing to return
-            return null;
-        }
-        catch ( ConnectionException e ) {
-            throw new RuntimeException( "Unable to connect to cassandra", e );
-        }
+        return builder.buildResultsCQL( resultSet );
     }
 
 
-    private void executeBatch( MutationBatch batch ) {
-        try {
-            batch.execute();
-        }
-        catch ( ConnectionException e ) {
-            throw new RuntimeException( "Unable to connect to cassandra", e );
-        }
-    }
 
 
     /**
@@ -491,37 +439,114 @@ public class MapSerializationImpl implements MapSerialization {
     }
 
 
+
     /**
      * Build the results from the row keys
      */
-    private static interface ResultsBuilder<T> {
 
-        public T buildResults( final Rows<ScopedRowKey<MapEntryKey>, Boolean> rows );
+    private interface ResultsBuilderCQL<T> {
+
+        T buildResultsCQL( final ResultSet resultSet );
     }
 
 
-    public static class StringResultsBuilder implements ResultsBuilder<Map<String, String>> {
+    public static class StringResultsBuilderCQL implements ResultsBuilderCQL<Map<String, String>> {
 
         @Override
-        public Map<String, String> buildResults( final Rows<ScopedRowKey<MapEntryKey>, Boolean> rows ) {
-            final int size = rows.size();
+        public Map<String, String> buildResultsCQL( final ResultSet resultSet ) {
 
-            final Map<String, String> results = new HashMap<>( size );
 
-            for ( int i = 0; i < size; i++ ) {
+            final Map<String, String> results = new HashMap<>();
 
-                final Row<ScopedRowKey<MapEntryKey>, Boolean> row = rows.getRowByIndex( i );
+            resultSet.all().forEach( row -> {
 
-                final String value = row.getColumns().getStringValue( true, null );
+                @SuppressWarnings("unchecked")
+                List<Object> keys = (List) deserializeMapEntryKey(row.getBytes("key"));
+                String value = (String)DataType.text().deserialize( row.getBytes("value"),
+                    ProtocolVersion.NEWEST_SUPPORTED );
 
-                if ( value == null ) {
-                    continue;
-                }
+                // the actual string key value is the last element
+                results.put((String)keys.get(keys.size() -1), value);
 
-                results.put( row.getKey().getKey().key, value );
-            }
+            });
 
             return results;
         }
     }
+
+    private static Object deserializeMapEntryKey(ByteBuffer bb){
+
+        List<Object> stuff = new ArrayList<>();
+        while(bb.hasRemaining()){
+            ByteBuffer data = CQLUtils.getWithShortLength(bb);
+            if(stuff.size() == 0){
+                stuff.add(DataType.uuid().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
+            }else{
+                stuff.add(DataType.text().deserialize(data.slice(), ProtocolVersion.NEWEST_SUPPORTED));
+            }
+            byte equality = bb.get(); // we don't use this but take the equality byte off the buffer
+
+        }
+
+        return stuff;
+
+    }
+
+    public static ByteBuffer serializeKeys(UUID ownerUUID, String ownerType, String mapName, String mapKey,
+                                           int bucketNumber ){
+
+        List<Object> keys = new ArrayList<>(4);
+        keys.add(0, ownerUUID);
+        keys.add(1, ownerType);
+        keys.add(2, mapName);
+        keys.add(3, mapKey);
+
+        if( bucketNumber > 0){
+            keys.add(4, bucketNumber);
+        }
+
+        // UUIDs are 16 bytes, allocate the buffer accordingly
+        int size = 16+ownerType.length()+mapName.length()+mapKey.length();
+        if(bucketNumber > 0 ){
+            // ints are 4 bytes
+            size += 4;
+        }
+
+        // we always need to add length for the 2 byte short and 1 byte equality
+        size += keys.size()*3;
+
+        ByteBuffer stuff = ByteBuffer.allocate(size);
+
+        for (Object key : keys) {
+
+            ByteBuffer kb = DataType.serializeValue(key, ProtocolVersion.NEWEST_SUPPORTED);
+            if (kb == null) {
+                kb = ByteBuffer.allocate(0);
+            }
+
+            stuff.putShort((short) kb.remaining());
+            stuff.put(kb.slice());
+            stuff.put((byte) 0);
+
+
+        }
+        stuff.flip();
+        return stuff.duplicate();
+
+    }
+
+
+    private ByteBuffer getMapEntryPartitionKey(MapScope scope, String key){
+
+        return serializeKeys(scope.getApplication().getUuid(),
+            scope.getApplication().getType(), scope.getName(), key, -1);
+
+    }
+
+    private ByteBuffer getMapKeyPartitionKey(MapScope scope, String key, int bucketNumber){
+
+        return serializeKeys(scope.getApplication().getUuid(),
+            scope.getApplication().getType(), scope.getName(), key, bucketNumber);
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/2203f433/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java b/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
index 41286ab..2a68247 100644
--- a/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
+++ b/stack/corepersistence/map/src/test/java/org/apache/usergrid/persistence/map/MapManagerTest.java
@@ -82,6 +82,22 @@ public class MapManagerTest {
         assertEquals( value, returned );
     }
 
+    @Test
+    public void writeReadStringWithLongKey() {
+        MapManager mm = mmf.createMapManager( this.scope );
+
+        final String key = "key1234567890123456789012345678901234567890123456789012345678901234567890" +
+            "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" +
+            "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
+        final String value = "value";
+
+        mm.putString( key, value );
+
+        final String returned = mm.getString( key );
+
+        assertEquals( value, returned );
+    }
+
 
     @Test
     public void multiReadNoKey() {


[20/38] usergrid git commit: Update Usergrid dependencies to 2.2.0-SNAPSHOT.

Posted by mr...@apache.org.
Update Usergrid dependencies to 2.2.0-SNAPSHOT.


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

Branch: refs/heads/master
Commit: c3566713b30cc99bb7541f0069bf396008c2fe50
Parents: 70ff8fd
Author: Michael Russo <mr...@apigee.com>
Authored: Sun May 1 14:32:05 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun May 1 14:32:05 2016 +0800

----------------------------------------------------------------------
 stack/core/pom.xml | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/c3566713/stack/core/pom.xml
----------------------------------------------------------------------
diff --git a/stack/core/pom.xml b/stack/core/pom.xml
index 75d6007..4b2252e 100644
--- a/stack/core/pom.xml
+++ b/stack/core/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.usergrid</groupId>
         <artifactId>usergrid</artifactId>
-        <version>2.1.1-SNAPSHOT</version>
+        <version>2.2.0-SNAPSHOT</version>
         <relativePath>../</relativePath>
     </parent>
 
@@ -362,7 +362,7 @@
         <dependency>
             <groupId>org.apache.usergrid</groupId>
             <artifactId>common</artifactId>
-            <version>2.1.1-SNAPSHOT</version>
+            <version>2.2.0-SNAPSHOT</version>
             <type>test-jar</type>
             <scope>test</scope>
         </dependency>
@@ -372,7 +372,7 @@
         <dependency>
             <groupId>org.apache.usergrid</groupId>
             <artifactId>collection</artifactId>
-            <version>2.1.1-SNAPSHOT</version>
+            <version>2.2.0-SNAPSHOT</version>
             <type>jar</type>
             <exclusions>
                 <exclusion>
@@ -390,34 +390,34 @@
         <dependency>
             <groupId>org.apache.usergrid</groupId>
             <artifactId>queryindex</artifactId>
-            <version>2.1.1-SNAPSHOT</version>
+            <version>2.2.0-SNAPSHOT</version>
             <type>jar</type>
         </dependency>
 
         <dependency>
             <groupId>org.apache.usergrid</groupId>
             <artifactId>graph</artifactId>
-            <version>2.1.1-SNAPSHOT</version>
+            <version>2.2.0-SNAPSHOT</version>
             <type>jar</type>
         </dependency>
 
         <dependency>
             <groupId>org.apache.usergrid</groupId>
             <artifactId>map</artifactId>
-            <version>2.1.1-SNAPSHOT</version>
+            <version>2.2.0-SNAPSHOT</version>
             <type>jar</type>
         </dependency>
 
         <dependency>
             <groupId>org.apache.usergrid</groupId>
             <artifactId>cache</artifactId>
-            <version>2.1.1-SNAPSHOT</version>
+            <version>2.2.0-SNAPSHOT</version>
         </dependency>
 
         <dependency>
             <groupId>org.apache.usergrid</groupId>
             <artifactId>queue</artifactId>
-            <version>2.1.1-SNAPSHOT</version>
+            <version>2.2.0-SNAPSHOT</version>
             <type>jar</type>
         </dependency>
 


[33/38] usergrid git commit: Fix issue with V1 impl of UniqueValue serialization from creating unecessarily large ByteBuffers.

Posted by mr...@apache.org.
Fix issue with V1 impl of UniqueValue serialization from creating unecessarily large ByteBuffers.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/324f94d4
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/324f94d4
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/324f94d4

Branch: refs/heads/master
Commit: 324f94d416617492775ce8608ccd7c822d193be7
Parents: 6efb5ba
Author: Michael Russo <mr...@apigee.com>
Authored: Sun May 8 23:49:30 2016 +0800
Committer: Michael Russo <mr...@apigee.com>
Committed: Sun May 8 23:49:30 2016 +0800

----------------------------------------------------------------------
 .../serialization/impl/UniqueValueSerializationStrategyV1Impl.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/324f94d4/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
index 6421869..d305044 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyV1Impl.java
@@ -202,7 +202,7 @@ public class UniqueValueSerializationStrategyV1Impl  extends UniqueValueSerializ
             fieldEntry.getField().getTypeName().name().length();
 
         // we always need to add length for the 2 byte comparator short,  2 byte length short and 1 byte equality
-        size += keys.size()*65;
+        size += keys.size()*5;
 
         // uuid type comparator is longest, ensure we allocate buffer using the max size to avoid overflow
         size += keys.size()*comparator.length();