All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unipop.process.coalesce.UniGraphCoalesceStep Maven / Gradle / Ivy

package org.unipop.process.coalesce;

import com.google.common.collect.Lists;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalSideEffects;
import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
import org.unipop.process.UniBulkStep;
import org.unipop.process.traverser.UniGraphTraverserStep;
import org.unipop.structure.UniGraph;

import java.util.*;
import java.util.function.BinaryOperator;

/**
 * Created by sbarzilay on 3/15/16.
 */
public class UniGraphCoalesceStep extends UniBulkStep implements TraversalParent {
    private final List> coalesceTraversals;
    private Iterator> results = EmptyIterator.instance();

    @Override
    public Set getSelfAndChildRequirements(TraverserRequirement... selfRequirements) {
        return new HashSet() {{
            add(TraverserRequirement.SIDE_EFFECTS);
        }};
    }

    @Override
    public List> getGlobalChildren() {
        return coalesceTraversals;
    }

    public UniGraphCoalesceStep(Traversal.Admin traversal, UniGraph graph, List> coalesceTraversals) {
        super(traversal, graph);
        this.coalesceTraversals = coalesceTraversals;
        this.coalesceTraversals.forEach(t -> t.addStep(new UniGraphTraverserStep<>(t.asAdmin())));
        this.coalesceTraversals.forEach(this::integrateChild);
    }

    @Override
    protected Iterator> process(List> traversers) {
        List> coalesce = new ArrayList<>();
        List> traversersList = Lists.newArrayList(traversers);
        traversersList.forEach(t -> {
            t.setSideEffects(new DefaultTraversalSideEffects() {{
                register(t.toString(), () -> t, BinaryOperator.maxBy((o1, o2) -> 1));
                set(t.toString(), t);
            }});
        });
        coalesceTraversals.forEach(t -> {
            traversersList.forEach(t::addStart);
            while (t.hasNext()) {
                Traverser item = (Traverser) t.next();
                ((B_O_S_SE_SL_Traverser) item).getSideEffects().forEach((key, value) -> {
                    if (value != null && value instanceof Traverser)
                        traversersList.remove(value);
                });
                coalesce.add((item.asAdmin()));
            }
        });
        return coalesce.iterator();
    }

    @Override
    public Set getRequirements() {
        return this.getSelfAndChildRequirements();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy