package er.neo4jadaptor.query.neo4j_eval.retrievers; import java.util.Iterator; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.PropertyContainer; import org.neo4j.graphdb.Relationship; import com.webobjects.eoaccess.EOAttribute; import com.webobjects.eoaccess.EOEntity; import com.webobjects.foundation.NSArray; import er.neo4jadaptor.ersatz.neo4j.Neo4JTranslator; import er.neo4jadaptor.query.neo4j_eval.Cost; import er.neo4jadaptor.storage.neo4j.RelationshipStore; import er.neo4jadaptor.utils.iteration.Iterators; /** * Retrieves object ID. * * @author Jedrzej Sobanski * * @param <T> */ public abstract class PrimaryKeyRetriever<T> implements Retriever<T, Number> { private final EOAttribute attribute; protected abstract long getId(T t); public PrimaryKeyRetriever(EOAttribute att) { this.attribute = att; } public Iterator<Number> retrieve(T t) { long id = getId(t); Number ret = (Number) Neo4JTranslator.instance.toNeutralValue(id, attribute); return Iterators.singleton(ret); } @Override public String toString() { return attribute.name(); } public Cost getCost() { return Cost.PRIMARY_KEY; } public static PrimaryKeyRetriever<? extends PropertyContainer> create(EOEntity entity) { NSArray<EOAttribute> pks = entity.primaryKeyAttributes(); EOAttribute pk = pks.get(0); if (RelationshipStore.shouldBeStoredAsRelationship(entity)) { return new PrimaryKeyRetriever<Relationship>(pk) { @Override protected long getId(Relationship t) { return t.getId(); } }; } else { return new PrimaryKeyRetriever<Node>(pk) { @Override protected long getId(Node t) { return t.getId(); } }; } } }