blob: 44d0b73725621f2f70f085e9454a97c02f80137b [file] [log] [blame]
/*
*
* * 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.graph.serialization.impl;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition;
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;
import org.apache.usergrid.persistence.core.scope.ApplicationScope;
import org.apache.usergrid.persistence.graph.Edge;
import org.apache.usergrid.persistence.graph.SearchEdgeType;
import org.apache.usergrid.persistence.graph.SearchIdType;
import org.apache.usergrid.persistence.graph.serialization.EdgeMetadataSerialization;
import org.apache.usergrid.persistence.graph.serialization.impl.migration.GraphMigrationPlugin;
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 static final Logger logger = LoggerFactory.getLogger(EdgeMetadataSerializationProxyImpl.class);
private final Keyspace keyspace;
private final VersionedMigrationSet<EdgeMetadataSerialization> versions;
private final MigrationInfoCache migrationInfoCache;
/**
* Handles routing data to the right implementation, based on the current system migration version
*/
@Inject
public EdgeMetadataSerializationProxyImpl( final Keyspace keyspace,
final VersionedMigrationSet<EdgeMetadataSerialization> versions,
final MigrationInfoCache migrationInfoCache ) {
this.keyspace = keyspace;
this.versions = versions;
this.migrationInfoCache = migrationInfoCache;
}
@Override
public MutationBatch writeEdge( final ApplicationScope scope, final Edge edge ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
aggregateBatch.mergeShallow( migration.from.writeEdge( scope, edge ) );
aggregateBatch.mergeShallow( migration.to.writeEdge( scope, edge ) );
return aggregateBatch;
}
return migration.to.writeEdge( scope, edge );
}
@Override
public MutationBatch removeEdgeTypeFromSource( final ApplicationScope scope, final Edge edge ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
aggregateBatch.mergeShallow( migration.from.removeEdgeTypeFromSource( scope, edge ) );
aggregateBatch.mergeShallow( migration.to.removeEdgeTypeFromSource( scope, edge ) );
return aggregateBatch;
}
return migration.to.removeEdgeTypeFromSource( scope, edge );
}
@Override
public MutationBatch removeEdgeTypeFromSource( final ApplicationScope scope, final Id sourceNode, final String type,
final long timestamp ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
aggregateBatch.mergeShallow( migration.from.removeEdgeTypeFromSource( scope, sourceNode, type, timestamp ) );
aggregateBatch.mergeShallow( migration.to.removeEdgeTypeFromSource( scope, sourceNode, type, timestamp ) );
return aggregateBatch;
}
return migration.to.removeEdgeTypeFromSource( scope, sourceNode, type, timestamp );
}
@Override
public MutationBatch removeIdTypeFromSource( final ApplicationScope scope, final Edge edge ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
aggregateBatch.mergeShallow( migration.from.removeIdTypeFromSource( scope, edge ) );
aggregateBatch.mergeShallow( migration.to.removeIdTypeFromSource( scope, edge ) );
return aggregateBatch;
}
return migration.to.removeIdTypeFromSource( scope, edge );
}
@Override
public MutationBatch removeIdTypeFromSource( final ApplicationScope scope, final Id sourceNode, final String type,
final String idType, final long timestamp ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
aggregateBatch
.mergeShallow( migration.from.removeIdTypeFromSource( scope, sourceNode, type, idType, timestamp ) );
aggregateBatch.mergeShallow( migration.to.removeIdTypeFromSource( scope, sourceNode, type, idType, timestamp ) );
return aggregateBatch;
}
return migration.to.removeIdTypeFromSource( scope, sourceNode, type, idType, timestamp );
}
@Override
public MutationBatch removeEdgeTypeToTarget( final ApplicationScope scope, final Edge edge ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
aggregateBatch.mergeShallow( migration.from.removeEdgeTypeToTarget( scope, edge ) );
aggregateBatch.mergeShallow( migration.to.removeEdgeTypeToTarget( scope, edge ) );
return aggregateBatch;
}
return migration.to.removeEdgeTypeToTarget( scope, edge );
}
@Override
public MutationBatch removeEdgeTypeToTarget( final ApplicationScope scope, final Id targetNode, final String type,
final long timestamp ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
aggregateBatch.mergeShallow( migration.from.removeEdgeTypeToTarget( scope, targetNode, type, timestamp ) );
aggregateBatch.mergeShallow( migration.to.removeEdgeTypeToTarget( scope, targetNode, type, timestamp ) );
return aggregateBatch;
}
return migration.to.removeEdgeTypeToTarget( scope, targetNode, type, timestamp );
}
@Override
public MutationBatch removeIdTypeToTarget( final ApplicationScope scope, final Edge edge ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
aggregateBatch.mergeShallow( migration.from.removeIdTypeToTarget( scope, edge ) );
aggregateBatch.mergeShallow( migration.to.removeIdTypeToTarget( scope, edge ) );
return aggregateBatch;
}
return migration.to.removeIdTypeToTarget( scope, edge );
}
@Override
public MutationBatch removeIdTypeToTarget( final ApplicationScope scope, final Id targetNode, final String type,
final String idType, final long timestamp ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
final MutationBatch aggregateBatch = keyspace.prepareMutationBatch();
aggregateBatch.mergeShallow( migration.from.removeIdTypeToTarget( scope, targetNode, type, idType, timestamp ) );
aggregateBatch.mergeShallow( migration.to.removeIdTypeToTarget( scope, targetNode, type, idType, timestamp ) );
return aggregateBatch;
}
return migration.to.removeIdTypeToTarget( scope, targetNode, type, idType, timestamp );
}
@Override
public Iterator<String> getEdgeTypesFromSource( final ApplicationScope scope, final SearchEdgeType search ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
return migration.from.getEdgeTypesFromSource( scope, search );
}
return migration.to.getEdgeTypesFromSource( scope, search );
}
@Override
public Iterator<String> getIdTypesFromSource( final ApplicationScope scope, final SearchIdType search ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
return migration.from.getIdTypesFromSource( scope, search );
}
return migration.to.getIdTypesFromSource( scope, search );
}
@Override
public Iterator<String> getEdgeTypesToTarget( final ApplicationScope scope, final SearchEdgeType search ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
return migration.from.getEdgeTypesToTarget( scope, search );
}
return migration.to.getEdgeTypesToTarget( scope, search );
}
@Override
public Iterator<String> getIdTypesToTarget( final ApplicationScope scope, final SearchIdType search ) {
final MigrationRelationship<EdgeMetadataSerialization> migration = getMigrationRelationShip();
if ( migration.needsMigration() ) {
return migration.from.getIdTypesToTarget( scope, search );
}
return migration.to.getIdTypesToTarget( scope, search );
}
@Override
public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() {
return Collections.EMPTY_LIST;
}
/**
* Return true if we're on an old version
*/
private MigrationRelationship<EdgeMetadataSerialization> getMigrationRelationShip() {
return this.versions.getMigrationRelationship(
migrationInfoCache.getVersion( GraphMigrationPlugin.PLUGIN_NAME ) );
}
@Override
public int getImplementationVersion() {
throw new UnsupportedOperationException( "Proxies do not have an implementation version" );
}
}