Package com.tinkerpop.gremlin.java

Source Code of com.tinkerpop.gremlin.java.GremlinFluentUtility

package com.tinkerpop.gremlin.java;

import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.pipes.IdentityPipe;
import com.tinkerpop.pipes.Pipe;
import com.tinkerpop.pipes.filter.IntervalFilterPipe;
import com.tinkerpop.pipes.filter.PropertyFilterPipe;
import com.tinkerpop.pipes.filter.RangeFilterPipe;
import com.tinkerpop.pipes.transform.EdgesVerticesPipe;
import com.tinkerpop.pipes.transform.GraphQueryPipe;
import com.tinkerpop.pipes.transform.QueryPipe;
import com.tinkerpop.pipes.transform.VertexQueryPipe;
import com.tinkerpop.pipes.transform.VerticesEdgesPipe;
import com.tinkerpop.pipes.transform.VerticesVerticesPipe;
import com.tinkerpop.pipes.util.FluentUtility;

/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public class GremlinFluentUtility extends FluentUtility {

    public static GremlinPipeline optimizePipelineForQuery(final GremlinPipeline pipeline, final Pipe pipe) {
        if (!optimizePipelineForGraphQuery(pipeline, pipe))
            if (!optimizePipelineForVertexQuery(pipeline, pipe))
                pipeline.addPipe(pipe);
        return pipeline;
    }

    public static boolean optimizePipelineForVertexQuery(final GremlinPipeline pipeline, final Pipe pipe) {
        VertexQueryPipe queryPipe = null;
        for (int i = pipeline.size() - 1; i > 0; i--) {
            final Pipe temp = pipeline.get(i);
            if (temp instanceof VertexQueryPipe) {
                queryPipe = (VertexQueryPipe) temp;
                break;
            } else if (!(temp instanceof IdentityPipe))
                break;
        }

        if (null != queryPipe) {
            if (pipe instanceof EdgesVerticesPipe) {
                if (queryPipe.getResultElementClass().equals(Vertex.class))
                    return false;
                queryPipe.setResultingElementClass(Vertex.class);
            } else if (pipe instanceof VerticesVerticesPipe) {
                if (queryPipe.getResultElementClass().equals(Vertex.class))
                    return false;
                queryPipe.setDirection(((VerticesVerticesPipe) pipe).getDirection());
                queryPipe.setLabels(((VerticesVerticesPipe) pipe).getLabels());
                queryPipe.setBranchFactor(((VerticesVerticesPipe) pipe).getBranchFactor());
            } else if (pipe instanceof VerticesEdgesPipe) {
                if (queryPipe.getResultElementClass().equals(Vertex.class))
                    return false;
                queryPipe.setResultingElementClass(Edge.class);
                queryPipe.setDirection(((VerticesEdgesPipe) pipe).getDirection());
                queryPipe.setLabels(((VerticesEdgesPipe) pipe).getLabels());
                queryPipe.setBranchFactor(((VerticesEdgesPipe) pipe).getBranchFactor());
            } else if (pipe instanceof PropertyFilterPipe) {
                if (queryPipe.getResultElementClass().equals(Vertex.class))
                    return false;
                final PropertyFilterPipe temp = (PropertyFilterPipe) pipe;
                queryPipe.addHasContainer(new QueryPipe.HasContainer(temp.getKey(), temp.getPredicate(), temp.getValue()));
            } else if (pipe instanceof IntervalFilterPipe) {
                if (queryPipe.getResultElementClass().equals(Vertex.class))
                    return false;
                final IntervalFilterPipe temp = (IntervalFilterPipe) pipe;
                queryPipe.addIntervalContainer(new QueryPipe.IntervalContainer(temp.getKey(), temp.getStartValue(), temp.getEndValue()));
            } else if (pipe instanceof RangeFilterPipe) {
                queryPipe.setLowRange(((RangeFilterPipe) pipe).getLowRange());
                queryPipe.setHighRange(((RangeFilterPipe) pipe).getHighRange());
            }
            pipeline.addPipe(new IdentityPipe());
            return true;
        } else {
            return false;
        }
    }

    private static boolean optimizePipelineForGraphQuery(final GremlinPipeline pipeline, final Pipe pipe) {
        GraphQueryPipe queryPipe = null;
        for (int i = pipeline.size() - 1; i > 0; i--) {
            final Pipe temp = pipeline.get(i);
            if (temp instanceof GraphQueryPipe) {
                queryPipe = (GraphQueryPipe) temp;
                break;
            } else if (!(temp instanceof IdentityPipe))
                break;
        }

        if (null != queryPipe) {
            if (pipe instanceof PropertyFilterPipe) {
                final PropertyFilterPipe temp = (PropertyFilterPipe) pipe;
                queryPipe.addHasContainer(new QueryPipe.HasContainer(temp.getKey(), temp.getPredicate(), temp.getValue()));
            } else if (pipe instanceof IntervalFilterPipe) {
                final IntervalFilterPipe temp = (IntervalFilterPipe) pipe;
                queryPipe.addIntervalContainer(new QueryPipe.IntervalContainer(temp.getKey(), temp.getStartValue(), temp.getEndValue()));
            } else if (pipe instanceof RangeFilterPipe) {
                queryPipe.setLowRange(((RangeFilterPipe) pipe).getLowRange());
                queryPipe.setHighRange(((RangeFilterPipe) pipe).getHighRange());
            }
            pipeline.addPipe(new IdentityPipe());
            return true;
        } else {
            return false;
        }
    }
}
TOP

Related Classes of com.tinkerpop.gremlin.java.GremlinFluentUtility

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.