You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sf...@apache.org on 2014/10/10 17:50:09 UTC

[02/43] git commit: Fixed issue with UUID not being generated on write

Fixed issue with UUID not being generated on write


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

Branch: refs/heads/two-dot-o-events
Commit: 792b2b2c6fafb5c09ceb6c5c0786ac5572e09ff5
Parents: 150897d
Author: Todd Nine <to...@apache.org>
Authored: Tue Oct 7 17:56:32 2014 -0600
Committer: Todd Nine <to...@apache.org>
Committed: Tue Oct 7 17:56:32 2014 -0600

----------------------------------------------------------------------
 .../mvcc/entity/MvccValidationUtils.java        |  3 ++
 .../mvcc/stage/delete/MarkCommit.java           |  4 +-
 .../mvcc/stage/write/RollbackAction.java        |  4 +-
 .../mvcc/stage/write/WriteCommit.java           |  7 ++--
 .../collection/mvcc/stage/write/WriteStart.java |  9 +++--
 .../mvcc/stage/write/WriteUniqueVerify.java     | 19 ++++-----
 .../collection/serialization/UniqueValue.java   |  6 ---
 .../UniqueValueSerializationStrategy.java       |  6 +--
 .../impl/EntityVersionSerializer.java           | 16 ++++++--
 .../serialization/impl/FieldSerializer.java     | 23 ++++++-----
 .../serialization/impl/UniqueValueImpl.java     | 21 +++-------
 .../UniqueValueSerializationStrategyImpl.java   | 42 +++++++++++++-------
 .../collection/EntityCollectionManagerIT.java   |  2 +-
 ...niqueValueSerializationStrategyImplTest.java | 14 +++----
 .../stage/write/WriteOptimisticVerifyTest.java  | 14 +++----
 15 files changed, 102 insertions(+), 88 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccValidationUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccValidationUtils.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccValidationUtils.java
index e03def7..f40572a 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccValidationUtils.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccValidationUtils.java
@@ -28,6 +28,8 @@ import static org.apache.usergrid.persistence.core.util.ValidationUtils.verifyEn
 import static org.apache.usergrid.persistence.core.util.ValidationUtils.verifyIdentity;
 import static org.apache.usergrid.persistence.core.util.ValidationUtils.verifyString;
 import static org.apache.usergrid.persistence.core.util.ValidationUtils.verifyTimeUuid;
+import static org.apache.usergrid.persistence.core.util.ValidationUtils.verifyVersion;
+
 
 /**
  * Validation Utilities for collection
@@ -42,6 +44,7 @@ public class MvccValidationUtils {
 
 
         Preconditions.checkNotNull( entity.getEntity().isPresent(), "Entity is required" );
+        verifyVersion( entity.getVersion() );
         verifyMvccEntityOptionalEntity( entity );
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommit.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommit.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommit.java
index 61a2a36..1e01c02 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommit.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/delete/MarkCommit.java
@@ -158,9 +158,9 @@ public class MarkCommit implements Action1<CollectionIoEvent<MvccEntity>> {
                                             continue;
                                         }
 
-                                        final UniqueValue unique = new UniqueValueImpl( collectionScope, field, entityId, entityVersion );
+                                        final UniqueValue unique = new UniqueValueImpl( field, entityId, entityVersion );
 
-                                        final MutationBatch deleteMutation = uniqueValueStrat.delete( unique );
+                                        final MutationBatch deleteMutation = uniqueValueStrat.delete(collectionScope,  unique );
 
                                         batch.mergeShallow( deleteMutation );
                                     }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/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 dfccb34..8561708 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
@@ -83,9 +83,9 @@ public class RollbackAction implements Action1<Throwable> {
                     if ( field.isUnique() ) {
 
                         UniqueValue toDelete =
-                                new UniqueValueImpl( scope, field, entity.get().getId(), mvccEntity.getVersion() );
+                                new UniqueValueImpl( field, entity.get().getId(), mvccEntity.getVersion() );
 
-                        MutationBatch deleteMb = uniqueValueStrat.delete( toDelete );
+                        MutationBatch deleteMb = uniqueValueStrat.delete(scope,  toDelete );
 
                         if ( rollbackMb == null ) {
                             rollbackMb = deleteMb;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/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 49e967f..584d7f1 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
@@ -113,9 +113,10 @@ public class WriteCommit implements Func1<CollectionIoEvent<MvccEntity>, Entity>
 
             if ( field.isUnique() ) {
 
-                UniqueValue written  = new UniqueValueImpl( ioEvent.getEntityCollection(), field,
-                    mvccEntity.getEntity().get().getId(), mvccEntity.getEntity().get().getVersion());
-                MutationBatch mb = uniqueValueStrat.write( written );
+                UniqueValue written  = new UniqueValueImpl( field,
+                    entityId,version);
+
+                MutationBatch mb = uniqueValueStrat.write(collectionScope,  written );
 
                 LOG.debug("Finalizing {} unqiue value {}", field.getName(), field.getValue().toString());
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteStart.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteStart.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteStart.java
index ad335a0..20fad0e 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteStart.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/WriteStart.java
@@ -11,9 +11,11 @@ import org.apache.usergrid.persistence.collection.exception.WriteStartException;
 import org.apache.usergrid.persistence.collection.mvcc.MvccLogEntrySerializationStrategy;
 import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
 import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
 import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
 import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccLogEntryImpl;
 import org.apache.usergrid.persistence.collection.mvcc.stage.CollectionIoEvent;
+import org.apache.usergrid.persistence.collection.util.EntityUtils;
 import org.apache.usergrid.persistence.model.entity.Entity;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
@@ -63,12 +65,11 @@ public class WriteStart implements Func1<CollectionIoEvent<Entity>, CollectionIo
 
             //TODO update this when merged with George's changes
             final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version,
-                    org.apache.usergrid.persistence.collection.mvcc.entity.Stage.ACTIVE, MvccLogEntry.State.COMPLETE);
+                    Stage.ACTIVE, MvccLogEntry.State.COMPLETE);
 
             MutationBatch write = logStrategy.write( collectionScope, startEntry );
 
-            final MvccEntityImpl nextStage =
-                             new MvccEntityImpl( entityId, version, status, entity );
+            final MvccEntityImpl nextStage = new MvccEntityImpl( entityId, version, status, entity );
 
 
             try {
@@ -86,6 +87,8 @@ public class WriteStart implements Func1<CollectionIoEvent<Entity>, CollectionIo
             }
 
 
+            EntityUtils.setVersion(entity, version);
+
             //create the mvcc entity for the next stage
             //todo, we need to create a complete or partial update here (or sooner)
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/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 e6d37fc..6ca3445 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
@@ -49,7 +49,6 @@ import com.netflix.astyanax.Keyspace;
 import com.netflix.astyanax.MutationBatch;
 import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
 
-import rx.Observable;
 import rx.functions.Action1;
 
 
@@ -88,11 +87,13 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
 
         final MvccEntity mvccEntity = ioevent.getEvent();
 
-        final Entity entity = mvccEntity.getEntity().get();
+        final Id entityId = mvccEntity.getId();
+
+        final UUID entityVersion = mvccEntity.getVersion();
 
-        final Id entityId = entity.getId();
 
-        final UUID entityVersion = entity.getVersion();
+        final Entity entity = mvccEntity.getEntity().get();
+
 
         final CollectionScope scope = ioevent.getEntityCollection();
 
@@ -115,10 +116,10 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
 
 
                 // use write-first then read strategy
-                final UniqueValue written = new UniqueValueImpl( scope, field, entityId, entityVersion );
+                final UniqueValue written = new UniqueValueImpl( field, entityId, entityVersion );
 
                 // use TTL in case something goes wrong before entity is finally committed
-                final MutationBatch mb = uniqueValueStrat.write( written, serializationFig.getTimeout() );
+                final MutationBatch mb = uniqueValueStrat.write( scope, written, serializationFig.getTimeout() );
 
                 batch.mergeShallow( mb );
 
@@ -142,7 +143,6 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
         }
 
 
-
         //now get the set of fields back
         final UniqueValueSet uniqueValues;
 
@@ -154,7 +154,7 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
         }
 
 
-        final Map<String, Field> uniquenessViolations = new HashMap<>( uniqueFields.size());
+        final Map<String, Field> uniquenessViolations = new HashMap<>( uniqueFields.size() );
 
 
         //loop through each field that was unique
@@ -182,8 +182,5 @@ public class WriteUniqueVerify implements Action1<CollectionIoEvent<MvccEntity>>
         if ( !uniquenessViolations.isEmpty() ) {
             throw new WriteUniqueVerifyException( mvccEntity, ioevent.getEntityCollection(), uniquenessViolations );
         }
-
-
     }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValue.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValue.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValue.java
index 9749101..2ba927c 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValue.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/UniqueValue.java
@@ -30,12 +30,6 @@ import org.apache.usergrid.persistence.model.field.Field;
 public interface UniqueValue {
 
     /**
-     * The scope of this value
-     * @return
-     */
-    public CollectionScope getCollectionScope();
-
-    /**
      * The entity Id that owns this value
      * @return
      */

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/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 efcc60d..4ceb407 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
@@ -37,7 +37,7 @@ public interface UniqueValueSerializationStrategy {
      * @param uniqueValue Object to be written
      * @return MutatationBatch that encapsulates operation, caller may or may not execute.
      */
-    public MutationBatch write( UniqueValue uniqueValue );
+    public MutationBatch write( CollectionScope scope,  UniqueValue uniqueValue );
 
     /**
      * Write the specified UniqueValue to Cassandra with optional timeToLive in milliseconds.
@@ -46,7 +46,7 @@ public interface UniqueValueSerializationStrategy {
      * @param timeToLive How long object should live in seconds 
      * @return MutatationBatch that encapsulates operation, caller may or may not execute.
      */
-    public MutationBatch write( UniqueValue uniqueValue, Integer timeToLive );
+    public MutationBatch write( CollectionScope scope,  UniqueValue uniqueValue, Integer timeToLive );
 
     /**
      * Load UniqueValue that matches field from collection or null if that value does not exist.
@@ -64,5 +64,5 @@ public interface UniqueValueSerializationStrategy {
      * @param uniqueValue Object to be deleted.
      * @return MutatationBatch that encapsulates operation, caller may or may not execute.
      */
-    public MutationBatch delete( UniqueValue uniqueValue );
+    public MutationBatch delete( CollectionScope scope,  UniqueValue uniqueValue );
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/EntityVersionSerializer.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/EntityVersionSerializer.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/EntityVersionSerializer.java
index 810a1fc..dc4efde 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/EntityVersionSerializer.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/EntityVersionSerializer.java
@@ -24,6 +24,10 @@ import java.util.UUID;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccValidationUtils;
+import org.apache.usergrid.persistence.collection.util.EntityUtils;
+import org.apache.usergrid.persistence.core.util.ValidationUtils;
+import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.entity.SimpleId;
 
 import com.google.common.base.Preconditions;
@@ -44,11 +48,17 @@ public class EntityVersionSerializer extends AbstractSerializer<EntityVersion> {
     @Override
     public ByteBuffer toByteBuffer(final EntityVersion ev) {
 
+        final UUID entityVersion = ev.getEntityVersion();
+
+        final Id entityId = ev.getEntityId();
+        final UUID entityUuid = entityId.getUuid();
+        final String entityType = entityId.getType();
+
         CompositeBuilder builder = Composites.newDynamicCompositeBuilder();
 
-        builder.addTimeUUID( ev.getEntityVersion() );
-        builder.addTimeUUID( ev.getEntityId().getUuid() );
-        builder.addString( ev.getEntityId().getType() );
+        builder.addUUID( entityVersion );
+        builder.addUUID( entityUuid );
+        builder.addString(entityType );
 
         return builder.build();
     }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/FieldSerializer.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/FieldSerializer.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/FieldSerializer.java
index 7eb8216..1d28bf5 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/FieldSerializer.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/FieldSerializer.java
@@ -20,9 +20,6 @@ package org.apache.usergrid.persistence.collection.serialization.impl;
 
 import java.util.UUID;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.usergrid.persistence.core.astyanax.CompositeFieldSerializer;
 import org.apache.usergrid.persistence.model.field.BooleanField;
 import org.apache.usergrid.persistence.model.field.DoubleField;
@@ -51,12 +48,13 @@ public class FieldSerializer implements CompositeFieldSerializer<Field> {
     @Override
     public void toComposite( final CompositeBuilder builder, final Field field ) {
 
-        builder.addString( field.getName() );
-
-        builder.addString( field.getValue().toString() );
 
         final FieldTypeName fieldType = field.getTypeName();
 
+
+        /**
+         * Validation we only support a subset
+         */
         switch ( fieldType ) {
             case BOOLEAN:
             case DOUBLE:
@@ -67,19 +65,27 @@ public class FieldSerializer implements CompositeFieldSerializer<Field> {
                 break;
             default:
                 throw new RuntimeException(
-                        String.format( "Type %s is not a supported type for unique values", fieldType ));
+                        String.format( "Type %s is not a supported type for unique values", fieldType ) );
         }
 
+
         builder.addString( fieldType.name() );
+
+        builder.addString( field.getName() );
+
+        builder.addString( field.getValue().toString() );
     }
 
 
     @Override
     public Field fromComposite( final CompositeParser composite ) {
 
+        final String typeString = composite.readString();
+
         final String name = composite.readString();
+
         final String value = composite.readString();
-        final String typeString = composite.readString();
+
 
         final FieldTypeName fieldType = FieldTypeName.valueOf( typeString );
 
@@ -102,7 +108,6 @@ public class FieldSerializer implements CompositeFieldSerializer<Field> {
     }
 
 
-
     /**
      * Get the singleton serializer
      */

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueImpl.java
index 2fdae1a..862d8b1 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueImpl.java
@@ -31,29 +31,22 @@ import com.google.common.base.Preconditions;
  * Represents a Unique Value of a field within a collection.
  */
 public class UniqueValueImpl implements UniqueValue {
-    private final CollectionScope collectionScope;
     private final Field field;
     private final Id entityId;
     private final UUID entityVersion;
 
-    public UniqueValueImpl(
-            final CollectionScope scope, final Field field, Id entityId, final UUID version ) {
+    public UniqueValueImpl(final Field field, Id entityId, final UUID version ) {
 
-        Preconditions.checkNotNull( scope, "scope is required" );
         Preconditions.checkNotNull( field, "field is required" );
-//        Preconditions.checkNotNull( version, "version is required" );
+        Preconditions.checkNotNull( version, "version is required" );
         Preconditions.checkNotNull( entityId, "entityId is required" );
 
-        this.collectionScope = scope;
         this.field = field;
         this.entityVersion = version;
         this.entityId = entityId;
     }
 
-    @Override
-    public CollectionScope getCollectionScope() {
-        return collectionScope;
-    }
+
 
     @Override
     public Field getField() {
@@ -82,9 +75,7 @@ public class UniqueValueImpl implements UniqueValue {
 
         final UniqueValueImpl that = ( UniqueValueImpl ) o;
 
-        if ( !getCollectionScope().equals( that.getCollectionScope() ) ) {
-            return false;
-        }
+
 
         if ( !getField().equals( that.getField()) ) {
             return false;
@@ -104,8 +95,7 @@ public class UniqueValueImpl implements UniqueValue {
 
     @Override
     public int hashCode() {
-        int result = 31 * getCollectionScope().hashCode();
-        result = 31 * result + getField().hashCode();
+        int result = 31 * getField().hashCode();
         result = 31 * result + getEntityVersion().hashCode();
         result = 31 * result + getEntityId().hashCode();
         return result;
@@ -115,7 +105,6 @@ public class UniqueValueImpl implements UniqueValue {
     @Override
     public String toString() {
         return "UniqueValueImpl{" +
-                ", collectionScope =" + collectionScope.getName() +
                 ", field =" + field +
                 ", entityVersion=" + entityVersion +
                 ", entityId =" + entityId +

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/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 d480691..95c83f3 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
@@ -23,6 +23,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.UUID;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,6 +39,8 @@ import org.apache.usergrid.persistence.core.astyanax.MultiTennantColumnFamily;
 import org.apache.usergrid.persistence.core.astyanax.MultiTennantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.astyanax.ScopedRowKey;
 import org.apache.usergrid.persistence.core.migration.Migration;
+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;
@@ -46,6 +49,7 @@ 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.ColumnList;
 import com.netflix.astyanax.model.Row;
 import com.netflix.astyanax.util.RangeBuilder;
@@ -60,7 +64,7 @@ public class UniqueValueSerializationStrategyImpl implements UniqueValueSerializ
 
     // TODO: use "real" field serializer here instead once it is ready
     private static final CollectionScopedRowKeySerializer<Field> ROW_KEY_SER =
-            new CollectionScopedRowKeySerializer<Field>( FieldSerializer.get() );
+            new CollectionScopedRowKeySerializer<>( FieldSerializer.get() );
 
     private static final EntityVersionSerializer ENTITY_VERSION_SER = new EntityVersionSerializer();
 
@@ -83,7 +87,7 @@ public class UniqueValueSerializationStrategyImpl implements UniqueValueSerializ
 
 
     @Override
-    public java.util.Collection getColumnFamilies() {
+    public Collection<MultiTennantColumnFamilyDefinition> getColumnFamilies() {
 
         MultiTennantColumnFamilyDefinition cf =
                 new MultiTennantColumnFamilyDefinition( CF_UNIQUE_VALUES, BytesType.class.getSimpleName(),
@@ -94,19 +98,29 @@ public class UniqueValueSerializationStrategyImpl implements UniqueValueSerializ
     }
 
 
-    public MutationBatch write( UniqueValue uniqueValue ) {
-        return write( uniqueValue, Integer.MAX_VALUE );
+    public MutationBatch write(final CollectionScope scope,  UniqueValue uniqueValue ) {
+        return write( scope, uniqueValue, Integer.MAX_VALUE );
     }
 
 
     @Override
-    public MutationBatch write( UniqueValue value, Integer timeToLive ) {
+    public MutationBatch write(final CollectionScope scope,  UniqueValue value, Integer timeToLive ) {
 
         Preconditions.checkNotNull( value, "value is required" );
         Preconditions.checkNotNull( timeToLive, "timeToLive is required" );
 
+        final Field field = value.getField();
+
+
+
+        final Id entityId = value.getEntityId();
+        final UUID entityVersion = value.getEntityVersion();
+
+        ValidationUtils.verifyIdentity( entityId );
+              ValidationUtils.verifyVersion( entityVersion );
+
         log.debug( "Writing unique value scope={} id={} version={} name={} value={} ttl={} ", new Object[] {
-                value.getCollectionScope().getName(), value.getEntityId(), value.getEntityVersion(),
+               scope.getName(), entityId, entityVersion,
                 value.getField().getName(), value.getField().getValue(), timeToLive
         } );
 
@@ -120,7 +134,7 @@ public class UniqueValueSerializationStrategyImpl implements UniqueValueSerializ
             ttl = timeToLive;
         }
 
-        return doWrite( value.getCollectionScope(), value.getField(), new UniqueValueSerializationStrategyImpl.RowOp() {
+        return doWrite( scope, value.getField(), new UniqueValueSerializationStrategyImpl.RowOp() {
 
             @Override
             public void doOp( final ColumnListMutation<EntityVersion> colMutation ) {
@@ -131,13 +145,13 @@ public class UniqueValueSerializationStrategyImpl implements UniqueValueSerializ
 
 
     @Override
-    public MutationBatch delete( UniqueValue value ) {
+    public MutationBatch delete(final CollectionScope scope,  UniqueValue value ) {
 
         Preconditions.checkNotNull( value, "value is required" );
 
         final EntityVersion ev = new EntityVersion( value.getEntityId(), value.getEntityVersion() );
 
-        return doWrite( value.getCollectionScope(), value.getField(), new UniqueValueSerializationStrategyImpl.RowOp() {
+        return doWrite( scope, value.getField(), new UniqueValueSerializationStrategyImpl.RowOp() {
 
             @Override
             public void doOp( final ColumnListMutation<EntityVersion> colMutation ) {
@@ -160,7 +174,7 @@ public class UniqueValueSerializationStrategyImpl implements UniqueValueSerializ
 
 
     @Override
-    public UniqueValueSet load( final CollectionScope colScope, final Collection<Field> fields )
+    public UniqueValueSet load(final CollectionScope colScope, final Collection<Field> fields )
             throws ConnectionException {
 
         Preconditions.checkNotNull( fields, "fields are required" );
@@ -190,17 +204,17 @@ public class UniqueValueSerializationStrategyImpl implements UniqueValueSerializ
 
             final Field field = unique.getKey().getKey();
 
-            final ColumnList<EntityVersion> columnList = unique.getColumns();
+            final Iterator<Column<EntityVersion>> columnList = unique.getColumns().iterator();
 
             //sanity check, nothing to do, skip it
-            if ( columnList.size() < 1 ) {
+            if ( !columnList.hasNext()) {
                 continue;
             }
 
-            final EntityVersion entityVersion = columnList.getColumnByIndex( 0 ).getName();
+            final EntityVersion entityVersion = columnList.next().getName();
 
 
-            final UniqueValueImpl uniqueValue = new UniqueValueImpl( colScope, field, entityVersion.getEntityId(),
+            final UniqueValueImpl uniqueValue = new UniqueValueImpl(field, entityVersion.getEntityId(),
                     entityVersion.getEntityVersion() );
 
             uniqueValueSet.addValue( uniqueValue );

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/EntityCollectionManagerIT.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/EntityCollectionManagerIT.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/EntityCollectionManagerIT.java
index 1639d17..7a725a9 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/EntityCollectionManagerIT.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/EntityCollectionManagerIT.java
@@ -77,7 +77,7 @@ public class EntityCollectionManagerIT {
         Entity returned = observable.toBlocking().lastOrDefault( null );
 
         assertNotNull( "Returned has a uuid", returned.getId() );
-        assertNotNull( "Version exists" );
+        assertNotNull( "Version exists", returned.getVersion() );
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/UniqueValueSerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/UniqueValueSerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/UniqueValueSerializationStrategyImplTest.java
index f03baba..d5fee64 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/UniqueValueSerializationStrategyImplTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/write/UniqueValueSerializationStrategyImplTest.java
@@ -70,8 +70,8 @@ public class UniqueValueSerializationStrategyImplTest {
         IntegerField field = new IntegerField( "count", 5 );
         Id entityId = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
         UUID version = UUIDGenerator.newTimeUUID();
-        UniqueValue stored = new UniqueValueImpl( scope, field, entityId, version );
-        strategy.write( stored ).execute();
+        UniqueValue stored = new UniqueValueImpl( field, entityId, version );
+        strategy.write(scope,  stored ).execute();
 
         UniqueValueSet fields = strategy.load( scope, Collections.<Field>singleton( field ) );
 
@@ -91,8 +91,8 @@ public class UniqueValueSerializationStrategyImplTest {
         IntegerField field = new IntegerField( "count", 5 );
         Id entityId = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
         UUID version = UUIDGenerator.newTimeUUID();
-        UniqueValue stored = new UniqueValueImpl( scope, field, entityId, version );
-        strategy.write( stored, 2 ).execute();
+        UniqueValue stored = new UniqueValueImpl( field, entityId, version );
+        strategy.write(scope,  stored, 2 ).execute();
 
         Thread.sleep( 1000 );
 
@@ -123,10 +123,10 @@ public class UniqueValueSerializationStrategyImplTest {
         IntegerField field = new IntegerField( "count", 5 );
         Id entityId = new SimpleId( UUIDGenerator.newTimeUUID(), "entity" );
         UUID version = UUIDGenerator.newTimeUUID();
-        UniqueValue stored = new UniqueValueImpl( scope, field, entityId, version );
-        strategy.write( stored ).execute();
+        UniqueValue stored = new UniqueValueImpl( field, entityId, version );
+        strategy.write(scope,  stored ).execute();
 
-        strategy.delete( stored ).execute();
+        strategy.delete(scope,  stored ).execute();
 
         UniqueValueSet fields = strategy.load( scope, Collections.<Field>singleton( field ) );
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/792b2b2c/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 6f31412..c64fe23 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
@@ -136,13 +136,11 @@ public class WriteOptimisticVerifyTest extends AbstractMvccEntityStageTest {
 
         // mock up unique values interface
         UniqueValueSerializationStrategy uvstrat = mock( UniqueValueSerializationStrategy.class);
-        UniqueValue uv1 = new UniqueValueImpl(
-            scope, entity.getField("name"), entity.getId(), entity.getVersion());
-        UniqueValue uv2 = new UniqueValueImpl(
-            scope, entity.getField("identifier"), entity.getId(), entity.getVersion());
+        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(uv1) ).thenReturn(mb);
-        when( uvstrat.delete(uv2) ).thenReturn(mb);
+        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 );
@@ -162,8 +160,8 @@ public class WriteOptimisticVerifyTest extends AbstractMvccEntityStageTest {
         assertTrue( conflictDetected );
 
         // check that unique values were deleted
-        verify( uvstrat, times(1) ).delete( uv1 );
-        verify( uvstrat, times(1) ).delete( uv2 );
+        verify( uvstrat, times(1) ).delete(scope,  uv1 );
+        verify( uvstrat, times(1) ).delete(scope,  uv2 );
     }
 
 }