16 package emlab.gen.repository;
18 import java.util.Collections;
19 import java.util.List;
20 import java.util.NoSuchElementException;
21 import java.util.Random;
23 import javax.script.ScriptEngine;
25 import org.neo4j.graphdb.traversal.TraversalDescription;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
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;
32 import org.springframework.stereotype.Repository;
34 import com.tinkerpop.blueprints.pgm.Vertex;
35 import com.tinkerpop.blueprints.pgm.impls.neo4j.Neo4jGraph;
36 import com.tinkerpop.pipes.AbstractPipe;
37 import com.tinkerpop.pipes.Pipe;
38 import com.tinkerpop.pipes.util.Pipeline;
39 import com.tinkerpop.pipes.util.SingleIterator;
46 Logger logger = LoggerFactory.getLogger(GenericRepository.class);;
48 ScriptEngine engine = null;
51 Neo4jTemplate
template;
53 private <T extends NodeBacked> GraphRepository<T> finder(Class<T> clazz) {
54 return this.template.repositoryFor(clazz);
57 public <T extends NodeBacked> Iterable<T> findAllByPropertyValue(Class<T> clazz, String property, Object value) {
58 return finder(clazz).findAllByPropertyValue(property, value);
61 public <T extends NodeBacked> T findByPropertyValue(Class<T> clazz, String property, Object value) {
62 return finder(clazz).findByPropertyValue(property, value);
65 public <T extends NodeBacked> Iterable<T> findAll(Class<T> clazz) {
66 return finder(clazz).findAll();
69 public <T extends NodeBacked> Iterable<T> findAllAtRandom(Class<T> clazz) {
70 List<T> list = Utils.asList(findAll(clazz));
71 Collections.shuffle(list,
new Random());
75 public <T extends NodeBacked> T findOneAtRandom(Class<T> clazz) {
76 List<T> list = Utils.asList(findAll(clazz));
77 Collections.shuffle(list,
new Random());
81 public <T extends NodeBacked> T findFirst(Class<T> clazz) {
82 if (finder(clazz).findAll().iterator().hasNext()) {
83 return finder(clazz).findAll().iterator().next();
89 public <T extends NodeBacked> T findById(Class<T> clazz,
long id) {
90 return finder(clazz).findOne(id);
93 public <T extends NodeBacked, E extends NodeBacked> Iterable<T> findAllByTraversal(Class<T> clazz, E startNode,
94 TraversalDescription traversalDescription) {
95 return finder(clazz).findAllByTraversal(startNode, traversalDescription);
98 public <T extends NodeBacked, E extends NodeBacked> Iterable<T> findAllByPipe(Class<T> clazz, E startNode, Pipe<Vertex, Vertex> pipe) {
99 Vertex startVertex = getVertex(startNode);
100 Pipe<Vertex, T> typed =
new MappingPipe<T>(clazz);
101 Pipe<Vertex, T> emit =
new Pipeline<Vertex, T>(pipe, typed);
102 emit.setStarts(
new SingleIterator<Vertex>(startVertex));
106 public <T extends NodeBacked> Vertex getVertex(T e) {
107 return (
new Neo4jGraph(
template.getGraphDatabaseService())).getVertex(e.getNodeId());
110 class MappingPipe<T extends NodeBacked> extends AbstractPipe<Vertex, T> implements Pipe<Vertex, T> {
112 Class<T> genericClass;
114 public MappingPipe(Class<T> clazz) {
116 genericClass = clazz;
120 protected T processNextStart()
throws NoSuchElementException {
121 Vertex v = this.starts.next();
122 return findById(genericClass, (Long) v.getId());