/* * * * 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.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; 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.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; import org.apache.usergrid.persistence.graph.serialization.impl.shard.RowKey; import org.apache.usergrid.persistence.graph.serialization.impl.shard.RowKeyType; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.serialize.EdgeRowKeySerializer; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.serialize.EdgeSerializer; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.serialize.RowSerializer; import org.apache.usergrid.persistence.graph.serialization.impl.shard.impl.serialize.RowTypeSerializer; import com.netflix.astyanax.serializers.LongSerializer; import static org.apache.usergrid.persistence.core.astyanax.ColumnTypes.LONG_TYPE_REVERSED; import static org.apache.usergrid.persistence.core.astyanax.ColumnTypes.UUID_TYPE_REVERSED; /** * Implementation of size based column family */ public class SizebasedEdgeColumnFamilies implements EdgeColumnFamilies { //Row key with no type private static final RowSerializer ROW_SERIALIZER = new RowSerializer(); //row key with target id type private static final RowTypeSerializer ROW_TYPE_SERIALIZER = new RowTypeSerializer(); private static final EdgeRowKeySerializer EDGE_ROW_KEY_SERIALIZER = new EdgeRowKeySerializer(); //Edge serializers private static final EdgeSerializer EDGE_SERIALIZER = new EdgeSerializer(); private static final LongSerializer LONG_SERIALIZER = LongSerializer.get(); private static final String EDGE_DYNAMIC_COMPOSITE_TYPE = //we purposefully associate lower case "l" and "u" with reversed types. This way we can use //the default serialization in Astayanax, but get reverse order in cassandra DynamicCompositeType.class.getSimpleName() + "(s=>UTF8Type,l=>" + LONG_TYPE_REVERSED + ",u=>" + UUID_TYPE_REVERSED + ")"; //initialize the CF's from our implementation private static final MultiTenantColumnFamily<ScopedRowKey<RowKey>, DirectedEdge> SOURCE_NODE_EDGES = new MultiTenantColumnFamily<>( "Graph_Source_Node_Edges", new ScopedRowKeySerializer<>( ROW_SERIALIZER ), EDGE_SERIALIZER ); private static final MultiTenantColumnFamily<ScopedRowKey<RowKey>, DirectedEdge> TARGET_NODE_EDGES = new MultiTenantColumnFamily<>( "Graph_Target_Node_Edges", new ScopedRowKeySerializer<>( ROW_SERIALIZER ), EDGE_SERIALIZER ); private static final MultiTenantColumnFamily<ScopedRowKey<RowKeyType>, DirectedEdge> SOURCE_NODE_TARGET_TYPE = new MultiTenantColumnFamily<>( "Graph_Source_Node_Target_Type", new ScopedRowKeySerializer<>( ROW_TYPE_SERIALIZER ), EDGE_SERIALIZER ); /** * The edges that are to the target node with the source type. The target node is the row key */ private static final MultiTenantColumnFamily<ScopedRowKey<RowKeyType>, DirectedEdge> TARGET_NODE_SOURCE_TYPE = new MultiTenantColumnFamily<>( "Graph_Target_Node_Source_Type", new ScopedRowKeySerializer<>( ROW_TYPE_SERIALIZER ), EDGE_SERIALIZER ); private static final MultiTenantColumnFamily<ScopedRowKey<EdgeRowKey>, Long> EDGE_VERSIONS = new MultiTenantColumnFamily<>( "Graph_Edge_Versions", new ScopedRowKeySerializer<>( EDGE_ROW_KEY_SERIALIZER ), LONG_SERIALIZER ); @Override public MultiTenantColumnFamily<ScopedRowKey<RowKey>, DirectedEdge> getSourceNodeCfName() { return SOURCE_NODE_EDGES; } @Override public MultiTenantColumnFamily<ScopedRowKey<RowKey>, DirectedEdge> getTargetNodeCfName() { return TARGET_NODE_EDGES; } @Override public MultiTenantColumnFamily<ScopedRowKey<RowKeyType>, DirectedEdge> getSourceNodeTargetTypeCfName() { return SOURCE_NODE_TARGET_TYPE; } @Override public MultiTenantColumnFamily<ScopedRowKey<RowKeyType>, DirectedEdge> getTargetNodeSourceTypeCfName() { return TARGET_NODE_SOURCE_TYPE; } @Override public MultiTenantColumnFamily<ScopedRowKey<EdgeRowKey>, Long> getGraphEdgeVersions() { return EDGE_VERSIONS; } @Override public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() { return Arrays .asList( graphCf( SOURCE_NODE_EDGES ), graphCf( TARGET_NODE_EDGES ), graphCf( SOURCE_NODE_TARGET_TYPE ), graphCf( TARGET_NODE_SOURCE_TYPE ), new MultiTenantColumnFamilyDefinition( EDGE_VERSIONS, BytesType.class.getSimpleName(), ColumnTypes.LONG_TYPE_REVERSED, BytesType.class.getSimpleName(), MultiTenantColumnFamilyDefinition.CacheOption.ALL ) ); } @Override public Collection<TableDefinition> getTables() { return Collections.emptyList(); } /** * Helper to generate an edge definition by the type */ private MultiTenantColumnFamilyDefinition graphCf(MultiTenantColumnFamily cf ) { return new MultiTenantColumnFamilyDefinition( cf, BytesType.class.getSimpleName(), EDGE_DYNAMIC_COMPOSITE_TYPE, BytesType.class.getSimpleName(), MultiTenantColumnFamilyDefinition.CacheOption.ALL ); } }