Package com.tinkerpop.blueprints.impls.neo4j

Source Code of com.tinkerpop.blueprints.impls.neo4j.Neo4jEdgeIterable

package com.tinkerpop.blueprints.impls.neo4j;


import com.tinkerpop.blueprints.CloseableIterable;
import com.tinkerpop.blueprints.Edge;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.index.IndexHits;

import java.util.Iterator;

/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public class Neo4jEdgeIterable<T extends Edge> implements CloseableIterable<Neo4jEdge> {

    private final Iterable<Relationship> relationships;
    private final Neo4jGraph graph;
    private final boolean checkTransaction;
    private static final String DUMMY_PROPERTY = "a";

    public Neo4jEdgeIterable(final Iterable<Relationship> relationships, final Neo4jGraph graph, final boolean checkTransaction) {
        this.relationships = relationships;
        this.graph = graph;
        this.checkTransaction = checkTransaction;
    }

    public Neo4jEdgeIterable(final Iterable<Relationship> relationships, final Neo4jGraph graph) {
        this(relationships, graph, false);
    }

    public Iterator<Neo4jEdge> iterator() {
        return new Iterator<Neo4jEdge>() {
            private final Iterator<Relationship> itty = relationships.iterator();
            private Relationship nextRelationship = null;

            public void remove() {
                this.itty.remove();
            }

            public Neo4jEdge next() {
                if (!checkTransaction) {
                    return new Neo4jEdge(this.itty.next(), graph);
                } else {
                    if (null != this.nextRelationship) {
                        final Relationship temp = this.nextRelationship;
                        this.nextRelationship = null;
                        return new Neo4jEdge(temp, graph);
                    } else {
                        while (true) {
                            final Relationship relationship = this.itty.next();
                            try {
                                relationship.hasProperty(DUMMY_PROPERTY);
                                return new Neo4jEdge(relationship, graph);
                            } catch (final IllegalStateException e) {
                                // tried to access a relationship not available to the transaction
                            }
                        }
                    }
                }
            }

            public boolean hasNext() {
                if (!checkTransaction)
                    return this.itty.hasNext();
                else {
                    if (null != this.nextRelationship)
                        return true;
                    else {
                        while (this.itty.hasNext()) {
                            final Relationship relationship = this.itty.next();
                            try {
                                relationship.hasProperty(DUMMY_PROPERTY);
                                this.nextRelationship = relationship;
                                return true;
                            } catch (final IllegalStateException e) {
                            }
                        }
                        return false;
                    }

                }
            }
        };
    }

    public void close() {
        if (this.relationships instanceof IndexHits) {
            ((IndexHits) this.relationships).close();
        }
    }
}
TOP

Related Classes of com.tinkerpop.blueprints.impls.neo4j.Neo4jEdgeIterable

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.