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

org.unipop.process.group.UniGraphGroupStepStrategy Maven / Gradle / Ivy

//package org.unipop.process.group;
//
//import org.apache.tinkerpop.gremlin.process.traversal.Step;
//import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
//import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
//import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal;
//import org.apache.tinkerpop.gremlin.process.traversal.lambda.TokenTraversal;
//import org.apache.tinkerpop.gremlin.process.traversal.step.map.*;
//import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
//import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
//import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
//import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
//import org.apache.tinkerpop.gremlin.structure.*;
//import org.unipop.process.predicate.UniGraphPredicatesStrategy;
//import org.unipop.process.group.traversal.SemanticKeyTraversal;
//import org.unipop.process.group.traversal.SemanticReducerTraversal;
//import org.unipop.process.group.traversal.SemanticValuesTraversal;
//import org.unipop.process.start.UniGraphStartStep;
//import org.unipop.process.vertex.UniGraphVertexStep;
//import org.unipop.structure.UniGraph;
//
//import java.util.HashSet;
//import java.util.List;
//import java.util.Optional;
//import java.util.Set;
//
///**
// * Created by Gilad on 03/11/2015.
// */
//public class UniGraphGroupStepStrategy extends AbstractTraversalStrategy implements TraversalStrategy.ProviderOptimizationStrategy {
//    //region AbstractTraversalStrategy Implementation
//    @Override
//    public Set> applyPrior() {
//        Set> priorStrategies = new HashSet<>();
//        priorStrategies.add(UniGraphPredicatesStrategy.class);
//        priorStrategies.add(UniGraphGroupCountStepStrategy.class);
//        return priorStrategies;
//    }
//
//    @Override
//    public void apply(Traversal.Admin traversal) {
//        if(traversal.getEngine().isComputer()) return;
//
//        Graph graph = traversal.getGraph().getValue();
//        if(!(graph instanceof UniGraph)) return;
//
//        UniGraph elasticGraph = (UniGraph) graph;
//
//        TraversalHelper.getStepsOfAssignableClassRecursively(GroupStep.class, traversal).forEach(step -> {
//            GroupStep groupStep = (GroupStep) step;
//
//            UniGraphGroupStep elasticGroupStep = null;
//            if (UniGraphVertexStep.class.isAssignableFrom(step.getPreviousStep().getClass()) &&
//                    Edge.class.isAssignableFrom(((UniGraphVertexStep) step.getPreviousStep()).getReturnClass())) {
//                UniGraphVertexStep elasticVertexStep = (UniGraphVertexStep) step.getPreviousStep();
//                elasticGroupStep = new UniGraphGroupStep(
//                        traversal,
//                        elasticVertexStep.getReturnClass(),
//                        elasticVertexStep.getPredicates(),
//                        new Object[0],
//                        elasticVertexStep.getEdgeLabels(),
//                        Optional.of(elasticVertexStep.getDirection()), elasticGraph.getControllerManager());
//
//            } else if (UniGraphStartStep.class.isAssignableFrom(step.getPreviousStep().getClass())) {
//                UniGraphStartStep elasticGraphStep = (UniGraphStartStep) step.getPreviousStep();
//                elasticGroupStep = new UniGraphGroupStep(
//                        traversal,
//                        elasticGraphStep.getReturnClass(),
//                        elasticGraphStep.getPredicates(),
//                        elasticGraphStep.getIds(),
//                        new String[0],
//                        Optional.empty(), elasticGraph.getControllerManager());
//            }
//
//            if (elasticGroupStep != null) {
//                List groupTraversals = groupStep.getLocalChildren();
//
//                //add conditions here
//                Traversal keyTraversal = groupTraversals.size() > 0 ? groupTraversals.getValue(0) : null;
//                Traversal valuesTraversal = groupTraversals.size() > 1 ? groupTraversals.getValue(1) : null;
//                Traversal reducerTraversal = groupTraversals.size() > 2 ? groupTraversals.getValue(2) : null;
//
//                SemanticKeyTraversal semanticKeyTraversal = translateKeyTraversal(keyTraversal);
//                SemanticValuesTraversal semanticValuesTraversal = translateValuesTraversal(valuesTraversal);
//                SemanticReducerTraversal semanticReducerTraversal = translateReducerTraversal(reducerTraversal, semanticValuesTraversal);
//
//                boolean semanticKeyTranslationSuccess = keyTraversal != null && semanticKeyTraversal != null;
//                boolean semanticValuesTranslationSuccess = valuesTraversal != null && semanticValuesTraversal != null;
//                boolean semanticReducerTranslationSuccess = reducerTraversal != null && semanticReducerTraversal != null;
//
//                if (semanticKeyTranslationSuccess && semanticValuesTranslationSuccess && semanticReducerTranslationSuccess) {
//                    elasticGroupStep.setKeyTraversal(semanticKeyTraversal);
//                    elasticGroupStep.setValuesTraversal(semanticValuesTraversal);
//                    elasticGroupStep.setReducerTraversal(semanticReducerTraversal);
//
//                    TraversalHelper.replaceStep(step.getPreviousStep(), elasticGroupStep, traversal);
//                    traversal.removeStep(step);
//
//                    insertStartStepWhenTraversalIsInternal(traversal, elasticGroupStep);
//                }
//            }
//        });
//    }
//
//
//    private SemanticKeyTraversal translateKeyTraversal(Traversal keyTraversal) {
//        if (ElementValueTraversal.class.isAssignableFrom(keyTraversal.getClass())) {
//            ElementValueTraversal elementValueTraversal = (ElementValueTraversal)keyTraversal;
//            return new SemanticKeyTraversal(SemanticKeyTraversal.Type.property, elementValueTraversal.getPropertyKey());
//        }
//
//        if (TokenTraversal.class.isAssignableFrom(keyTraversal.getClass())) {
//            TokenTraversal tokenTraversal = (TokenTraversal)keyTraversal;
//            switch (tokenTraversal.getToken()) {
//                case id:
//                    //not supported for elastic but cold be supported for other stores.
//                    return null;
//
//                case label:
//                    return new SemanticKeyTraversal(SemanticKeyTraversal.Type.property, T.label.toString());
//            }
//        }
//
//        if (Traversal.Admin.class.isAssignableFrom(keyTraversal.getClass())) {
//            Traversal.Admin adminTraversal = (Traversal.Admin)keyTraversal;
//            if (adminTraversal.getSteps().size() != 1 ||
//                    !isTraversalStepAssignableFrom(adminTraversal, 0, PropertiesStep.class)) {
//                return null;
//            }
//
//            PropertiesStep propertiesStep = (PropertiesStep)adminTraversal.getSteps().getValue(0);
//            if (propertiesStep.getReturnType() != PropertyType.VALUE ||
//                    propertiesStep.getPropertyKeys() == null ||
//                    propertiesStep.getPropertyKeys().length != 1) {
//                return null;
//            }
//
//            return new SemanticKeyTraversal(SemanticKeyTraversal.Type.property, propertiesStep.getPropertyKeys()[0]);
//        }
//
//        return null;
//    }
//
//    private SemanticValuesTraversal translateValuesTraversal(Traversal valuesTraversal) {
//        if (valuesTraversal == null) {
//            return null;
//        }
//
//        if (ElementValueTraversal.class.isAssignableFrom(valuesTraversal.getClass())) {
//            ElementValueTraversal elementValueTraversal = (ElementValueTraversal)valuesTraversal;
//            return new SemanticValuesTraversal(SemanticValuesTraversal.Type.property, elementValueTraversal.getPropertyKey());
//        } else if (TokenTraversal.class.isAssignableFrom(valuesTraversal.getClass())) {
//            TokenTraversal tokenTraversal = (TokenTraversal)valuesTraversal;
//            switch (tokenTraversal.getToken()) {
//                case id:
//                    //not supported for elastic but cold be supported for other stores.
//                    return null;
//
//                case label:
//                    return new SemanticValuesTraversal(SemanticValuesTraversal.Type.property, T.label.toString());
//            }
//        }
//
//        if (Traversal.Admin.class.isAssignableFrom(valuesTraversal.getClass())) {
//            Traversal.Admin adminTraversal = (Traversal.Admin)valuesTraversal;
//            if (adminTraversal.getSteps().size() != 1 ||
//                    !isTraversalStepAssignableFrom(adminTraversal, 0, PropertiesStep.class)) {
//                return null;
//            }
//
//            PropertiesStep propertiesStep = (PropertiesStep)adminTraversal.getSteps().getValue(0);
//            if (propertiesStep.getReturnType() != PropertyType.VALUE ||
//                    propertiesStep.getPropertyKeys() == null ||
//                    propertiesStep.getPropertyKeys().length != 1) {
//                return null;
//            }
//
//            return new SemanticValuesTraversal(SemanticValuesTraversal.Type.property, propertiesStep.getPropertyKeys()[0]);
//        }
//
//        return null;
//    }
//
//    private SemanticReducerTraversal translateReducerTraversal(Traversal reducerTraversal, SemanticValuesTraversal semanticValuesTraversal) {
//        if (semanticValuesTraversal == null || reducerTraversal == null) {
//            return null;
//        }
//
//        if (Traversal.Admin.class.isAssignableFrom(reducerTraversal.getClass())) {
//            Traversal.Admin adminTraversal = (Traversal.Admin)reducerTraversal;
//            if (adminTraversal.getSteps().size() == 1 &&
//                    isTraversalStepAssignableFrom(adminTraversal, 0, CountLocalStep.class)) {
//                return new SemanticReducerTraversal(SemanticReducerTraversal.Type.count, semanticValuesTraversal.getKey());
//            }
//
//            if (adminTraversal.getSteps().size() == 1 &&
//                    isTraversalStepAssignableFrom(adminTraversal, 0, MaxLocalStep.class)) {
//                return new SemanticReducerTraversal(SemanticReducerTraversal.Type.max, semanticValuesTraversal.getKey());
//            }
//
//            if (adminTraversal.getSteps().size() == 1 &&
//                    isTraversalStepAssignableFrom(adminTraversal, 0, MinLocalStep.class)) {
//                return new SemanticReducerTraversal(SemanticReducerTraversal.Type.min, semanticValuesTraversal.getKey());
//            }
//
//            if (adminTraversal.getSteps().size() == 2 &&
//                    isTraversalStepAssignableFrom(adminTraversal, 0, DedupLocalStep.class) &&
//                    isTraversalStepAssignableFrom(adminTraversal, 1, CountLocalStep.class)) {
//                return new SemanticReducerTraversal(SemanticReducerTraversal.Type.cardinality, semanticValuesTraversal.getKey());
//            }
//        }
//
//        return null;
//    }
//
//    private boolean isTraversalStepAssignableFrom(Traversal.Admin adminTraversal, int stepNumber, Class stepClass) {
//        return stepClass.isAssignableFrom(adminTraversal.getSteps().getValue(stepNumber).getClass());
//    }
//
//    //endregion
//
//    //region Private Methods
//    private void insertStartStepWhenTraversalIsInternal(final Traversal.Admin traversal, Step step) {
//        if (!traversal.getParent().equals(EmptyStep.instance())) {
//            StartStep startStep = new StartStep(traversal);
//            TraversalHelper.insertBeforeStep(startStep, step, traversal);
//        }
//    }
//    //endregion
//}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy