package er.neo4jadaptor.query.neo4j_eval.retrievers;
import org.neo4j.graphdb.PropertyContainer;
import com.webobjects.eoaccess.EORelationship;
import er.neo4jadaptor.query.neo4j_eval.Cost;
import er.neo4jadaptor.storage.neo4j.RelationshipStore;
/**
* Retrieves EO relationship destination.
*
* @author Jedrzej Sobanski
*
* @param <Arg>
* @param <T>
*/
public abstract class RelationshipRetriever <Arg, T extends PropertyContainer> implements Retriever<Arg, T> {
public static RelationshipRetriever<? extends PropertyContainer, ? extends PropertyContainer> create(EORelationship rel) {
boolean isSourceStoredAsNode = ! RelationshipStore.shouldBeStoredAsRelationship(rel.entity());
boolean isDestinationStoredAsNode = ! RelationshipStore.shouldBeStoredAsRelationship(rel.destinationEntity());
if (rel.isFlattened()) {
throw new IllegalArgumentException("Flattened relationships are not supported by this method");
}
if (isSourceStoredAsNode) {
if (isDestinationStoredAsNode) {
return new NodeToNodeRetriever(rel);
} else {
return new NodeToJoinRelationshipRetriever(rel);
}
} else {
if (isDestinationStoredAsNode) {
return new RelationshipToNode(rel);
} else {
throw new UnsupportedOperationException();
}
}
}
public Cost getCost() {
return Cost.RELATIONSHIPS;
}
}