blob: 0c69d5d0281d02e9bc670f9e06e41d2db601127f [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.tinkerpop.gremlin;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgePropertyFeatures;
import org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexPropertyFeatures;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.List;
import static org.apache.tinkerpop.gremlin.structure.Graph.Features.DataTypeFeatures.FEATURE_BOOLEAN_VALUES;
import static org.apache.tinkerpop.gremlin.structure.Graph.Features.DataTypeFeatures.FEATURE_DOUBLE_VALUES;
import static org.apache.tinkerpop.gremlin.structure.Graph.Features.DataTypeFeatures.FEATURE_FLOAT_VALUES;
import static org.apache.tinkerpop.gremlin.structure.Graph.Features.DataTypeFeatures.FEATURE_INTEGER_VALUES;
import static org.apache.tinkerpop.gremlin.structure.Graph.Features.DataTypeFeatures.FEATURE_STRING_VALUES;
import static org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES;
import static org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES;
/**
* Annotations to define a graph example to load from test resources prior to test execution. This annotation is
* for use only with test that extend from {@link AbstractGremlinTest}.
* <p/>
* Note that the annotation assumes that the @{link GraphData} referenced by the annotation can be made available
* to the graph in the test. In other words, even a graph that has "read-only" features, should have some method of
* getting the data available to it. That said, graphs must minimally support the data types that the sample
* data contains for the test to be executed.
* <p/>
* If a graph implementation is "read-only", it can override the
* {@link GraphProvider#loadGraphData(org.apache.tinkerpop.gremlin.structure.Graph, LoadGraphWith, Class, String)} method
* to provide some other mechanism for making that data available to the graph in time for the test. See the
* hadoop-gremlin implementation for more details.
*
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface LoadGraphWith {
public enum GraphData {
/**
* Loads the "classic" TinkerPop toy graph.
*/
CLASSIC,
/**
* Loads the "modern" TinkerPop toy graph which is like "classic", but with the "weight" value on edges stored
* as double and labels added for vertices. This should be the most commonly used graph instance for testing
* as graphs that support string, double and int should comprise the largest number of implementations.
*/
MODERN,
/**
* Load "The Crew" TinkerPop3 toy graph which includes {@link VertexProperty} data.
*/
CREW,
/**
* Loads the "grateful dead" graph which is a "large" graph which provides for the construction of more
* complex traversals.
*/
GRATEFUL,
/**
* Loads a test graph which contains disconnected subgraphs specialized for testing purposes (e.g. a subgraph
* with a self-loop).
*/
SINK;
private static final List<FeatureRequirement> featuresRequiredByClassic = new ArrayList<FeatureRequirement>() {{
add(FeatureRequirement.Factory.create(FEATURE_STRING_VALUES, VertexPropertyFeatures.class));
add(FeatureRequirement.Factory.create(FEATURE_INTEGER_VALUES, VertexPropertyFeatures.class));
add(FeatureRequirement.Factory.create(FEATURE_FLOAT_VALUES, EdgePropertyFeatures.class));
}};
private static final List<FeatureRequirement> featuresRequiredByCrew = new ArrayList<FeatureRequirement>() {{
add(FeatureRequirement.Factory.create(FEATURE_STRING_VALUES, VertexPropertyFeatures.class));
add(FeatureRequirement.Factory.create(FEATURE_INTEGER_VALUES, VertexPropertyFeatures.class));
add(FeatureRequirement.Factory.create(FEATURE_BOOLEAN_VALUES, VertexPropertyFeatures.class));
add(FeatureRequirement.Factory.create(FEATURE_META_PROPERTIES, Graph.Features.VertexFeatures.class));
add(FeatureRequirement.Factory.create(FEATURE_MULTI_PROPERTIES, Graph.Features.VertexFeatures.class));
}};
private static final List<FeatureRequirement> featuresRequiredByModern = new ArrayList<FeatureRequirement>() {{
add(FeatureRequirement.Factory.create(FEATURE_STRING_VALUES, VertexPropertyFeatures.class));
add(FeatureRequirement.Factory.create(FEATURE_INTEGER_VALUES, VertexPropertyFeatures.class));
add(FeatureRequirement.Factory.create(FEATURE_DOUBLE_VALUES, EdgePropertyFeatures.class));
}};
private static final List<FeatureRequirement> featuresRequiredByGrateful = new ArrayList<FeatureRequirement>() {{
add(FeatureRequirement.Factory.create(FEATURE_STRING_VALUES, VertexPropertyFeatures.class));
add(FeatureRequirement.Factory.create(FEATURE_INTEGER_VALUES, VertexPropertyFeatures.class));
}};
private static final List<FeatureRequirement> featuresRequiredBySink = new ArrayList<FeatureRequirement>() {{
add(FeatureRequirement.Factory.create(FEATURE_STRING_VALUES, VertexPropertyFeatures.class));
}};
public String location() {
switch (this) {
case CLASSIC:
return RESOURCE_PATH_PREFIX + "tinkerpop-classic-v3d0.kryo";
case CREW:
return RESOURCE_PATH_PREFIX + "tinkerpop-crew-v3d0.kryo";
case MODERN:
return RESOURCE_PATH_PREFIX + "tinkerpop-modern-v3d0.kryo";
case GRATEFUL:
return RESOURCE_PATH_PREFIX + "grateful-dead-v3d0.kryo";
case SINK:
return RESOURCE_PATH_PREFIX + "tinkerpop-sink-v3d0.kryo";
}
throw new RuntimeException("No file for this GraphData type");
}
public List<FeatureRequirement> featuresRequired() {
switch (this) {
case CLASSIC:
return featuresRequiredByClassic;
case CREW:
return featuresRequiredByCrew;
case MODERN:
return featuresRequiredByModern;
case GRATEFUL:
return featuresRequiredByGrateful;
case SINK:
return featuresRequiredBySink;
}
throw new RuntimeException("No features for this GraphData type");
}
}
public static final String RESOURCE_PATH_PREFIX = "/org/apache/tinkerpop/gremlin/structure/io/gryo/";
/**
* The name of the resource to load with full path.
*/
public GraphData value() default GraphData.CLASSIC;
}