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

git commit: Cleaned up some code. Need to remove Jukito or disable auto proxying. Incorrect proxy wiring is causing NPE

Repository: incubator-usergrid
Updated Branches:
  refs/heads/key-row-sharding 84c33176e -> 09151ea0e (forced update)


Cleaned up some code.  Need to remove Jukito or disable auto proxying.  Incorrect proxy wiring is causing NPE


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

Branch: refs/heads/key-row-sharding
Commit: 09151ea0e9dd1f33dceddd6f33ada54389c42fd6
Parents: dfed6a0
Author: Todd Nine <tn...@apigee.com>
Authored: Wed Oct 29 14:33:34 2014 -0600
Committer: Todd Nine <tn...@apigee.com>
Committed: Wed Oct 29 14:34:28 2014 -0600

----------------------------------------------------------------------
 .../persistence/core/guice/CommonModule.java    |  14 +-
 .../migration/data/DataMigrationManager.java    |   6 +
 .../data/DataMigrationManagerImpl.java          |  65 ++++++--
 .../persistence/graph/guice/GraphModule.java    |  40 ++---
 .../graph/impl/GraphManagerImpl.java            |   9 +-
 .../EdgeMetadataSerializationProxyImpl.java     | 165 +++++++++++++++++--
 6 files changed, 229 insertions(+), 70 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/09151ea0/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 3503178..e37067f 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
@@ -59,6 +59,13 @@ public class CommonModule extends AbstractModule {
         // bind our migration manager
         bind( MigrationManager.class ).to( MigrationManagerImpl.class );
 
+
+
+        //do multibindings for migrations
+        Multibinder<Migration> migrationBinding = Multibinder.newSetBinder( binder(), Migration.class );
+        migrationBinding.addBinding().to( Key.get( MigrationInfoSerialization.class ) );
+
+
         bind( TimeService.class ).to( TimeServiceImpl.class );
 
         bind( CassandraConfig.class ).to( CassandraConfigImpl.class );
@@ -71,8 +78,11 @@ public class CommonModule extends AbstractModule {
 
         bind( DataMigrationManager.class ).to( DataMigrationManagerImpl.class );
 
+
+
         //do multibindings for migrations
-        Multibinder<Migration> migrationBinding = Multibinder.newSetBinder( binder(), Migration.class );
-        migrationBinding.addBinding().to( Key.get( MigrationInfoSerialization.class ) );
+        Multibinder<DataMigrationManager> dataMigrationManagerMultibinder = Multibinder.newSetBinder( binder(), DataMigrationManager.class );
+//        migrationBinding.addBinding().to( Key.get( MigrationInfoSerialization.class ) );
+
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/09151ea0/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/DataMigrationManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/DataMigrationManager.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/DataMigrationManager.java
index 1d7ccec..3357ed4 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/DataMigrationManager.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/DataMigrationManager.java
@@ -41,6 +41,12 @@ public interface DataMigrationManager {
      */
     public boolean isRunning();
 
+    /**
+     * Get the current version of the schema
+     * @return
+     */
+    public int getCurrentVersion();
+
 
     /**
      * Return that last status of the migration

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/09151ea0/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/DataMigrationManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/DataMigrationManagerImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/DataMigrationManagerImpl.java
index ee579ee..4cc98df 100644
--- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/DataMigrationManagerImpl.java
+++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/migration/data/DataMigrationManagerImpl.java
@@ -27,12 +27,18 @@ import java.io.StringWriter;
 import java.util.NavigableMap;
 import java.util.Set;
 import java.util.TreeMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.usergrid.persistence.core.migration.schema.MigrationException;
 
+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;
 
@@ -46,14 +52,33 @@ public class DataMigrationManagerImpl implements DataMigrationManager {
 
     private final MigrationInfoSerialization migrationInfoSerialization;
 
+    /**
+     * Cache to cache versions temporarily
+     */
+    private final LoadingCache<String, Integer> versionCache = CacheBuilder.newBuilder()
+            //cache the local value for 1 minute
+            .expireAfterWrite( 1, TimeUnit.MINUTES ).build( new CacheLoader<String, Integer>() {
+                @Override
+                public Integer load( final String key ) throws Exception {
+                    return migrationInfoSerialization.getVersion();
+                }
+            } );
+
 
     @Inject
     public DataMigrationManagerImpl( final MigrationInfoSerialization migrationInfoSerialization,
                                      final Set<DataMigration> migrations ) {
+        Preconditions.checkNotNull( migrationInfoSerialization, "migrationInfoSerialization must not be null" );
+        Preconditions.checkNotNull( migrations, "migrations must not be null" );
+
         this.migrationInfoSerialization = migrationInfoSerialization;
 
+
+
         for ( DataMigration migration : migrations ) {
 
+            Preconditions.checkNotNull( migration, "A migration instance in the set of migrations was null.  This is not allowed" );
+
             final int version = migration.getVersion();
 
             final DataMigration existing = migrationTreeMap.get( version );
@@ -103,7 +128,7 @@ public class DataMigrationManagerImpl implements DataMigrationManager {
 
             LOG.info( "Running migration version {}", migrationVersion );
 
-            observer.update( migrationVersion,  "Starting migration" );
+            observer.update( migrationVersion, "Starting migration" );
 
 
             //perform this migration, if it fails, short circuit
@@ -119,7 +144,7 @@ public class DataMigrationManagerImpl implements DataMigrationManager {
             }
 
             //we had an unhandled exception or the migration failed, short circuit
-            if(observer.failed){
+            if ( observer.failed ) {
                 return;
             }
 
@@ -128,13 +153,9 @@ public class DataMigrationManagerImpl implements DataMigrationManager {
 
             //update the observer for progress so other nodes can see it
             observer.update( migrationVersion, "Completed successfully" );
-
-
         }
 
         migrationInfoSerialization.setStatusCode( StatusCode.COMPLETE.status );
-
-
     }
 
 
@@ -145,6 +166,17 @@ public class DataMigrationManagerImpl implements DataMigrationManager {
 
 
     @Override
+    public int getCurrentVersion() {
+        try {
+            return versionCache.get( "currentVersion" );
+        }
+        catch ( ExecutionException e ) {
+            throw new DataMigrationException( "Unable to get current version", e );
+        }
+    }
+
+
+    @Override
     public String getLastStatus() {
         return migrationInfoSerialization.getStatusMessage();
     }
@@ -153,10 +185,10 @@ public class DataMigrationManagerImpl implements DataMigrationManager {
     /**
      * Different status enums
      */
-    public enum StatusCode{
-        COMPLETE(1),
-        RUNNING(2),
-        ERROR(3);
+    public enum StatusCode {
+        COMPLETE( 1 ),
+        RUNNING( 2 ),
+        ERROR( 3 );
 
         public final int status;
 
@@ -170,14 +202,13 @@ public class DataMigrationManagerImpl implements DataMigrationManager {
         private boolean failed = false;
 
 
-
         @Override
         public void failed( final int migrationVersion, final String reason ) {
 
-            final String storedMessage = String.format( "Failed to migrate, reason is appended.  Error '%s'", reason);
+            final String storedMessage = String.format( "Failed to migrate, reason is appended.  Error '%s'", reason );
 
 
-            update(migrationVersion,  storedMessage );
+            update( migrationVersion, storedMessage );
 
             LOG.error( storedMessage );
 
@@ -193,9 +224,10 @@ public class DataMigrationManagerImpl implements DataMigrationManager {
             throwable.printStackTrace( new PrintWriter( stackTrace ) );
 
 
-            final String storedMessage = String.format( "Failed to migrate, reason is appended.  Error '%s' %s", reason, stackTrace.toString() );
+            final String storedMessage = String.format( "Failed to migrate, reason is appended.  Error '%s' %s", reason,
+                    stackTrace.toString() );
 
-            update(migrationVersion,  storedMessage );
+            update( migrationVersion, storedMessage );
 
 
             LOG.error( "Unable to migrate version {} due to reason {}.", migrationVersion, reason, throwable );
@@ -208,7 +240,7 @@ public class DataMigrationManagerImpl implements DataMigrationManager {
 
         @Override
         public void update( final int migrationVersion, final String message ) {
-            final String error = String.format( "Migration version %d.  %s", migrationVersion, message);
+            final String error = String.format( "Migration version %d.  %s", migrationVersion, message );
 
             migrationInfoSerialization.setStatusMessage( error );
         }
@@ -216,7 +248,6 @@ public class DataMigrationManagerImpl implements DataMigrationManager {
 
         /**
          * Return true if we failed
-         * @return
          */
         public boolean isFailed() {
             return failed;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/09151ea0/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/guice/GraphModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/guice/GraphModule.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/guice/GraphModule.java
index 6f15e88..dee53d4 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/guice/GraphModule.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/guice/GraphModule.java
@@ -27,6 +27,7 @@ import org.apache.usergrid.persistence.core.consistency.TimeServiceImpl;
 import org.apache.usergrid.persistence.core.guice.CurrentImpl;
 import org.apache.usergrid.persistence.core.guice.PreviousImpl;
 import org.apache.usergrid.persistence.core.guice.ProxyImpl;
+import org.apache.usergrid.persistence.core.migration.data.DataMigrationManager;
 import org.apache.usergrid.persistence.core.migration.schema.Migration;
 import org.apache.usergrid.persistence.core.task.NamedTaskExecutorImpl;
 import org.apache.usergrid.persistence.core.task.TaskExecutor;
@@ -157,6 +158,15 @@ public class GraphModule extends AbstractModule {
         //Get the old version and the new one
         migrationBinding.addBinding().to( Key.get( EdgeMetadataSerialization.class, PreviousImpl.class) );
         migrationBinding.addBinding().to( Key.get( EdgeMetadataSerialization.class, CurrentImpl.class  ) );
+
+
+        /**
+         * Migrations of our edge meta serialization
+         */
+
+        bind(EdgeMetadataSerialization.class).annotatedWith( PreviousImpl.class ).to( EdgeMetadataSerializationV1Impl.class  );
+        bind(EdgeMetadataSerialization.class).annotatedWith( CurrentImpl.class ).to( EdgeMetadataSerializationV2Impl.class  );
+        bind(EdgeMetadataSerialization.class).annotatedWith( ProxyImpl.class ).to( EdgeMetadataSerializationProxyImpl.class  );
     }
 
 
@@ -170,36 +180,6 @@ public class GraphModule extends AbstractModule {
     }
 
 
-    @Inject
-    @Singleton
-    @Provides
-    @PreviousImpl
-    public EdgeMetadataSerialization getPreviousEdgeMetaSerialization( final Keyspace keyspace,
-                                                                       final CassandraConfig cassandraConfig,
-                                                                       final GraphFig graphFig ) {
-        return new EdgeMetadataSerializationV1Impl( keyspace, cassandraConfig, graphFig );
-    }
-
-
-    @Inject
-    @Singleton
-    @Provides
-    @CurrentImpl
-    public EdgeMetadataSerialization getCurrentEdgeMetaSerialization( final Keyspace keyspace,
-                                                                      final CassandraConfig cassandraConfig,
-                                                                      final GraphFig graphFig ) {
-        return new EdgeMetadataSerializationV2Impl( keyspace, cassandraConfig, graphFig );
-    }
-
-
-    @Inject
-    @Singleton
-    @Provides
-    @ProxyImpl
-    public EdgeMetadataSerialization getCurrentEdgeMetaSerialization( @PreviousImpl final EdgeMetadataSerialization previous,
-                                                   @CurrentImpl final EdgeMetadataSerialization current ) {
-       return new EdgeMetadataSerializationProxyImpl( previous, current );
-    }
 }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/09151ea0/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/GraphManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/GraphManagerImpl.java b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/GraphManagerImpl.java
index 564dc5b..df10816 100644
--- a/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/GraphManagerImpl.java
+++ b/stack/corepersistence/graph/src/main/java/org/apache/usergrid/persistence/graph/impl/GraphManagerImpl.java
@@ -92,9 +92,11 @@ public class GraphManagerImpl implements GraphManager {
     @Inject
     public GraphManagerImpl( @ProxyImpl final EdgeMetadataSerialization edgeMetadataSerialization,
                              final EdgeSerialization storageEdgeSerialization,
-                             final NodeSerialization nodeSerialization, final GraphFig graphFig,
-                             @Assisted final ApplicationScope scope, final EdgeDeleteListener edgeDeleteListener,
-                             final NodeDeleteListener nodeDeleteListener ) {
+                             final NodeSerialization nodeSerialization,
+                             final GraphFig graphFig,
+                             final EdgeDeleteListener edgeDeleteListener,
+                             final NodeDeleteListener nodeDeleteListener,
+                             @Assisted final ApplicationScope scope) {
 
 
         ValidationUtils.validateApplicationScope( scope );
@@ -103,6 +105,7 @@ public class GraphManagerImpl implements GraphManager {
         Preconditions.checkNotNull( nodeSerialization, "nodeSerialization must not be null" );
         Preconditions.checkNotNull( graphFig, "consistencyFig must not be null" );
         Preconditions.checkNotNull( scope, "scope must not be null" );
+        Preconditions.checkNotNull( nodeDeleteListener, "nodeDeleteListener must not be null" );
 
         this.scope = scope;
         this.edgeMetadataSerialization = edgeMetadataSerialization;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/09151ea0/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 4fbe801..cc51349 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
@@ -23,11 +23,13 @@ package org.apache.usergrid.persistence.graph.serialization.impl;
 
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 
 import org.apache.usergrid.persistence.core.astyanax.MultiTennantColumnFamilyDefinition;
 import org.apache.usergrid.persistence.core.guice.CurrentImpl;
 import org.apache.usergrid.persistence.core.guice.PreviousImpl;
+import org.apache.usergrid.persistence.core.migration.data.DataMigrationManager;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.graph.Edge;
 import org.apache.usergrid.persistence.graph.SearchEdgeType;
@@ -37,22 +39,30 @@ import org.apache.usergrid.persistence.model.entity.Id;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
+import com.netflix.astyanax.Keyspace;
 import com.netflix.astyanax.MutationBatch;
 
 
 @Singleton
 public class EdgeMetadataSerializationProxyImpl implements EdgeMetadataSerialization {
 
-    private EdgeMetadataSerialization previous;
-    private EdgeMetadataSerialization current;
+    private static final int MIGRATION_VERSION = 1;
+
+    private final DataMigrationManager dataMigrationManager;
+    private final Keyspace keyspace;
+    private final EdgeMetadataSerialization previous;
+    private final EdgeMetadataSerialization current;
 
 
     /**
-     * TODO fin
+     * Handles routing data to the right implementation, based on the current system migration version
      */
     @Inject
-    public EdgeMetadataSerializationProxyImpl( @PreviousImpl final EdgeMetadataSerialization previous,
+    public EdgeMetadataSerializationProxyImpl( final DataMigrationManager dataMigrationManager, final Keyspace keyspace,
+                                               @PreviousImpl final EdgeMetadataSerialization previous,
                                                @CurrentImpl final EdgeMetadataSerialization current ) {
+        this.dataMigrationManager = dataMigrationManager;
+        this.keyspace = keyspace;
         this.previous = previous;
         this.current = current;
     }
@@ -60,88 +70,207 @@ public class EdgeMetadataSerializationProxyImpl implements EdgeMetadataSerializa
 
     @Override
     public MutationBatch writeEdge( final ApplicationScope scope, final Edge edge ) {
-        return null;
+
+
+        if ( isOldVersion() ) {
+            final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
+
+            aggregateBatch.mergeShallow( previous.writeEdge( scope, edge ) );
+            aggregateBatch.mergeShallow( current.writeEdge( scope, edge ) );
+
+            return aggregateBatch;
+        }
+
+        return current.writeEdge( scope, edge );
     }
 
 
     @Override
     public MutationBatch removeEdgeTypeFromSource( final ApplicationScope scope, final Edge edge ) {
-        return null;
+
+        if ( isOldVersion() ) {
+            final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
+
+            aggregateBatch.mergeShallow( previous.removeEdgeTypeFromSource( scope, edge ) );
+            aggregateBatch.mergeShallow( current.removeEdgeTypeFromSource( scope, edge ) );
+
+            return aggregateBatch;
+        }
+
+        return current.removeEdgeTypeFromSource( scope, edge );
     }
 
 
     @Override
     public MutationBatch removeEdgeTypeFromSource( final ApplicationScope scope, final Id sourceNode, final String type,
                                                    final long timestamp ) {
-        return null;
+
+
+        if ( isOldVersion() ) {
+            final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
+
+            aggregateBatch.mergeShallow( previous.removeEdgeTypeFromSource( scope, sourceNode, type, timestamp ) );
+            aggregateBatch.mergeShallow( current.removeEdgeTypeFromSource( scope, sourceNode, type, timestamp ) );
+
+            return aggregateBatch;
+        }
+
+        return current.removeEdgeTypeFromSource( scope, sourceNode, type, timestamp );
     }
 
 
     @Override
     public MutationBatch removeIdTypeFromSource( final ApplicationScope scope, final Edge edge ) {
-        return null;
+
+        if ( isOldVersion() ) {
+            final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
+
+            aggregateBatch.mergeShallow( previous.removeIdTypeFromSource( scope, edge ) );
+            aggregateBatch.mergeShallow( current.removeIdTypeFromSource( scope, edge ) );
+
+            return aggregateBatch;
+        }
+
+        return current.removeIdTypeFromSource( scope, edge );
     }
 
 
     @Override
     public MutationBatch removeIdTypeFromSource( final ApplicationScope scope, final Id sourceNode, final String type,
                                                  final String idType, final long timestamp ) {
-        return null;
+
+        if ( isOldVersion() ) {
+            final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
+
+            aggregateBatch
+                    .mergeShallow( previous.removeIdTypeFromSource( scope, sourceNode, type, idType, timestamp ) );
+            aggregateBatch.mergeShallow( current.removeIdTypeFromSource( scope, sourceNode, type, idType, timestamp ) );
+
+            return aggregateBatch;
+        }
+
+        return current.removeIdTypeFromSource( scope, sourceNode, type, idType, timestamp );
     }
 
 
     @Override
     public MutationBatch removeEdgeTypeToTarget( final ApplicationScope scope, final Edge edge ) {
-        return null;
+
+
+        if ( isOldVersion() ) {
+            final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
+
+            aggregateBatch.mergeShallow( previous.removeEdgeTypeToTarget( scope, edge ) );
+            aggregateBatch.mergeShallow( current.removeEdgeTypeToTarget( scope, edge ) );
+
+            return aggregateBatch;
+        }
+
+        return current.removeEdgeTypeToTarget( scope, edge );
     }
 
 
     @Override
     public MutationBatch removeEdgeTypeToTarget( final ApplicationScope scope, final Id targetNode, final String type,
                                                  final long timestamp ) {
-        return null;
+
+        if ( isOldVersion() ) {
+            final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
+
+            aggregateBatch.mergeShallow( previous.removeEdgeTypeToTarget( scope, targetNode, type, timestamp ) );
+            aggregateBatch.mergeShallow( current.removeEdgeTypeToTarget( scope, targetNode, type, timestamp ) );
+
+            return aggregateBatch;
+        }
+
+        return current.removeEdgeTypeToTarget( scope, targetNode, type, timestamp );
     }
 
 
     @Override
     public MutationBatch removeIdTypeToTarget( final ApplicationScope scope, final Edge edge ) {
-        return null;
+
+        if ( isOldVersion() ) {
+            final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
+
+            aggregateBatch.mergeShallow( previous.removeIdTypeFromSource( scope, edge ) );
+            aggregateBatch.mergeShallow( current.removeIdTypeFromSource( scope, edge ) );
+
+            return aggregateBatch;
+        }
+
+        return current.removeIdTypeFromSource( scope, edge );
     }
 
 
     @Override
     public MutationBatch removeIdTypeToTarget( final ApplicationScope scope, final Id targetNode, final String type,
                                                final String idType, final long timestamp ) {
-        return null;
+
+
+        if ( isOldVersion() ) {
+            final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
+
+            aggregateBatch.mergeShallow( previous.removeIdTypeToTarget( scope, targetNode, type, idType, timestamp ) );
+            aggregateBatch.mergeShallow( current.removeIdTypeToTarget( scope, targetNode, type, idType, timestamp ) );
+
+            return aggregateBatch;
+        }
+
+        return current.removeIdTypeToTarget( scope, targetNode, type, idType, timestamp );
     }
 
 
     @Override
     public Iterator<String> getEdgeTypesFromSource( final ApplicationScope scope, final SearchEdgeType search ) {
-        return null;
+        if ( isOldVersion() ) {
+            return previous.getEdgeTypesFromSource( scope, search );
+        }
+
+        return current.getEdgeTypesFromSource( scope, search );
     }
 
 
     @Override
     public Iterator<String> getIdTypesFromSource( final ApplicationScope scope, final SearchIdType search ) {
-        return null;
+        if ( isOldVersion() ) {
+            return previous.getIdTypesFromSource( scope, search );
+        }
+
+        return current.getIdTypesFromSource( scope, search );
     }
 
 
     @Override
     public Iterator<String> getEdgeTypesToTarget( final ApplicationScope scope, final SearchEdgeType search ) {
-        return null;
+        if ( isOldVersion() ) {
+            return previous.getEdgeTypesToTarget( scope, search );
+        }
+
+        return current.getEdgeTypesToTarget( scope, search );
     }
 
 
     @Override
     public Iterator<String> getIdTypesToTarget( final ApplicationScope scope, final SearchIdType search ) {
-        return null;
+        if ( isOldVersion() ) {
+            return previous.getIdTypesToTarget( scope, search );
+        }
+
+        return current.getIdTypesToTarget( scope, search );
     }
 
 
     @Override
     public Collection<MultiTennantColumnFamilyDefinition> getColumnFamilies() {
-        return null;
+        return Collections.EMPTY_LIST;
+    }
+
+
+    /**
+     * Return true if we're on an old version
+     */
+    private boolean isOldVersion() {
+        return dataMigrationManager.getCurrentVersion() < MIGRATION_VERSION;
     }
 }