16 package emlab.gen.repository;
18 import java.lang.reflect.ParameterizedType;
19 import java.util.Collections;
20 import java.util.List;
21 import java.util.NoSuchElementException;
22 import java.util.Random;
24 import javax.script.ScriptEngine;
26 import org.apache.log4j.Logger;
27 import org.neo4j.graphdb.traversal.TraversalDescription;
28 import org.springframework.beans.factory.annotation.Autowired;
29 import org.springframework.data.neo4j.aspects.core.NodeBacked;
30 import org.springframework.data.neo4j.repository.GraphRepository;
31 import org.springframework.data.neo4j.support.Neo4jTemplate;
33 import com.tinkerpop.blueprints.pgm.Vertex;
34 import com.tinkerpop.blueprints.pgm.impls.neo4j.Neo4jGraph;
35 import com.tinkerpop.pipes.AbstractPipe;
36 import com.tinkerpop.pipes.Pipe;
37 import com.tinkerpop.pipes.util.Pipeline;
38 import com.tinkerpop.pipes.util.SingleIterator;
42 public abstract class AbstractRepository<T
extends NodeBacked> {
44 Logger logger = Logger.getLogger(AbstractRepository.class);
46 ScriptEngine engine = null;
49 private Neo4jTemplate
template;
51 private GraphRepository<T> finder() {
52 return this.template.repositoryFor(getActualType());
59 public Iterable<T> findAllByPropertyValue(String property, Object value) {
60 return finder().findAllByPropertyValue(property, value);
63 public T findByPropertyValue(String property, Object value) {
64 return finder().findByPropertyValue(property, value);
67 public Iterable<T> findAll() {
68 return finder().findAll();
71 public Iterable<T> findAllAtRandom() {
72 List<T> list = Utils.asList(findAll());
73 Collections.shuffle(list,
new Random());
77 public T findById(
long id) {
78 return finder().findOne(id);
82 return finder().count();
85 public <E extends NodeBacked> Iterable<T> findAllByTraversal(E startNode, TraversalDescription traversalDescription) {
86 return finder().findAllByTraversal(startNode, traversalDescription);
89 public <E extends NodeBacked> Iterable<T> findAllByPipe(E startNode, Pipe<Vertex, Vertex> pipe) {
90 Vertex startVertex = getVertex(startNode);
91 Pipe<Vertex, T> typed =
new MappingPipe();
92 Pipe<Vertex, T> emit =
new Pipeline<Vertex, T>(pipe, typed);
93 emit.setStarts(
new SingleIterator<Vertex>(startVertex));
97 @SuppressWarnings(
"unchecked")
98 public Class<T> getActualType() {
99 ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
100 return (Class<T>) parameterizedType.getActualTypeArguments()[0];
103 public <E extends NodeBacked> Vertex getVertex(E e) {
104 return (
new Neo4jGraph(
template.getGraphDatabaseService())).getVertex(e.getNodeId());
107 class MappingPipe extends AbstractPipe<Vertex, T> implements Pipe<Vertex, T> {
109 protected T processNextStart()
throws NoSuchElementException {
110 Vertex v = this.starts.next();
111 return finder().findOne((Long) v.getId());