You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@s2graph.apache.org by st...@apache.org on 2017/07/31 01:05:19 UTC

[05/25] incubator-s2graph git commit: not even compiled.

not even compiled.


Project: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/commit/0594fd07
Tree: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/tree/0594fd07
Diff: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/diff/0594fd07

Branch: refs/heads/master
Commit: 0594fd0760f80d8e51dacd1b8e3549002328edac
Parents: 7ddc276
Author: DO YUNG YOON <st...@apache.org>
Authored: Wed Jul 12 11:56:00 2017 +0900
Committer: DO YUNG YOON <st...@apache.org>
Committed: Wed Jul 12 11:56:00 2017 +0900

----------------------------------------------------------------------
 .../io/tinkerpop/optimize/HasStepFolder.java    | 203 +++++++++++++++++++
 .../core/io/tinkerpop/optimize/S2GraphStep.java |   4 +-
 .../tinkerpop/optimize/S2GraphStepStrategy.java |  29 +--
 .../optimize/S2GraphTraversalUtil.java          |  41 ++++
 .../tinkerpop/optimize/S2GraphVertexStep.java   | 128 ++++++++++++
 .../s2graph/core/index/IndexProvider.scala      |  39 +++-
 .../s2graph/core/index/IndexProviderTest.scala  |   3 +-
 .../core/tinkerpop/S2GraphProvider.scala        |   1 +
 8 files changed, 422 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/0594fd07/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/HasStepFolder.java
----------------------------------------------------------------------
diff --git a/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/HasStepFolder.java b/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/HasStepFolder.java
new file mode 100644
index 0000000..116f95d
--- /dev/null
+++ b/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/HasStepFolder.java
@@ -0,0 +1,203 @@
+package org.apache.s2graph.core.io.tinkerpop.optimize;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Order;
+import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Ranging;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.NoOpBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ElementValueComparator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.AndP;
+import org.javatuples.Pair;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public interface HasStepFolder<S, E> extends Step<S, E> {
+
+    void addAll(Iterable<HasContainer> hasContainers);
+
+    void orderBy(String key, Order order);
+
+    void setLimit(int limit);
+
+    int getLimit();
+
+//    static boolean validJanusGraphHas(HasContainer has) {
+//        if (has.getPredicate() instanceof AndP) {
+//            final List<? extends P<?>> predicates = ((AndP<?>) has.getPredicate()).getPredicates();
+//            return !predicates.stream().filter(p->!validJanusGraphHas(new HasContainer(has.getKey(), p))).findAny().isPresent();
+//        } else {
+//            return JanusGraphPredicate.Converter.supports(has.getBiPredicate());
+//        }
+//    }
+
+//    static boolean validJanusGraphHas(Iterable<HasContainer> has) {
+//        for (HasContainer h : has) {
+//            if (!validJanusGraphHas(h)) return false;
+//        }
+//        return true;
+//    }
+
+//    static boolean validJanusGraphOrder(OrderGlobalStep ostep, Traversal rootTraversal,
+//                                        boolean isVertexOrder) {
+//        for (Pair<Traversal.Admin<Object, Comparable>, Comparator<Comparable>> comp : (List<Pair<Traversal.Admin<Object, Comparable>, Comparator<Comparable>>>) ostep.getComparators()) {
+//            if (!(comp.getValue1() instanceof ElementValueComparator)) return false;
+//            ElementValueComparator evc = (ElementValueComparator) comp.getValue1();
+//            if (!(evc.getValueComparator() instanceof Order)) return false;
+//
+//            JanusGraphTransaction tx = JanusGraphTraversalUtil.getTx(rootTraversal.asAdmin());
+//            String key = evc.getPropertyKey();
+//            PropertyKey pkey = tx.getPropertyKey(key);
+//            if (pkey == null || !(Comparable.class.isAssignableFrom(pkey.dataType()))) return false;
+//            if (isVertexOrder && pkey.cardinality() != Cardinality.SINGLE) return false;
+//        }
+//        return true;
+//    }
+
+    static void foldInIds(final HasStepFolder s2graphStep, final Traversal.Admin<?, ?> traversal) {
+        Step<?, ?> currentStep = s2graphStep.getNextStep();
+        while (true) {
+            if (currentStep instanceof HasContainerHolder) {
+                Set<Object> ids = new HashSet<>();
+                final GraphStep graphStep = (GraphStep) s2graphStep;
+                for (final HasContainer hasContainer : ((HasContainerHolder) currentStep).getHasContainers()) {
+                    if (GraphStep.processHasContainerIds(graphStep, hasContainer)) {
+                        currentStep.getLabels().forEach(s2graphStep::addLabel);
+                        if (!ids.isEmpty()) {
+                            // intersect ids (shouldn't this be handled in TP GraphStep.processHasContainerIds?)
+                            ids.stream().filter(id -> Arrays.stream(graphStep.getIds()).noneMatch(id::equals))
+                                    .collect(Collectors.toSet()).forEach(ids::remove);
+                            if (ids.isEmpty()) break;
+                        } else {
+                            Arrays.stream(graphStep.getIds()).forEach(ids::add);
+                        }
+                    }
+                    // clear ids to allow folding in ids from next HasContainer if relevant
+                    graphStep.clearIds();
+                }
+                graphStep.addIds(ids);
+                if (!ids.isEmpty()) traversal.removeStep(currentStep);
+            }
+            else if (currentStep instanceof IdentityStep) {
+                // do nothing, has no impact
+            } else if (currentStep instanceof NoOpBarrierStep) {
+                // do nothing, has no impact
+            } else {
+                break;
+            }
+            currentStep = currentStep.getNextStep();
+        }
+    }
+
+    static void foldInHasContainer(final HasStepFolder s2graphStep, final Traversal.Admin<?, ?> traversal) {
+        Step<?, ?> currentStep = s2graphStep.getNextStep();
+        while (true) {
+            if (currentStep instanceof HasContainerHolder) {
+                Iterable<HasContainer> containers = ((HasContainerHolder) currentStep).getHasContainers();
+//                if (validJanusGraphHas(containers)) {
+                    s2graphStep.addAll(containers);
+                    currentStep.getLabels().forEach(s2graphStep::addLabel);
+                    traversal.removeStep(currentStep);
+//                }
+            } else if (currentStep instanceof IdentityStep) {
+                // do nothing, has no impact
+            } else if (currentStep instanceof NoOpBarrierStep) {
+                // do nothing, has no impact
+            } else {
+                break;
+            }
+            currentStep = currentStep.getNextStep();
+        }
+    }
+
+//    public static boolean addLabeledStepAsIdentity(Step<?,?> currentStep, final Traversal.Admin<?, ?> traversal) {
+//        if (currentStep.getLabel().isPresent()) {
+//            final IdentityStep identityStep = new IdentityStep<>(traversal);
+//            identityStep.setLabel(currentStep.getLabel().get());
+//            TraversalHelper.insertAfterStep(identityStep, currentStep, traversal);
+//            return true;
+//        } else return false;
+//    }
+
+    static void foldInOrder(final HasStepFolder s2graphStep, final Traversal.Admin<?, ?> traversal,
+                            final Traversal<?, ?> rootTraversal, boolean isVertexOrder) {
+        Step<?, ?> currentStep = s2graphStep.getNextStep();
+        OrderGlobalStep<?, ?> lastOrder = null;
+        while (true) {
+            if (currentStep instanceof OrderGlobalStep) {
+                if (lastOrder != null) { //Previous orders are rendered irrelevant by next order (since re-ordered)
+                    lastOrder.getLabels().forEach(s2graphStep::addLabel);
+                    traversal.removeStep(lastOrder);
+                }
+                lastOrder = (OrderGlobalStep) currentStep;
+            } else if (currentStep instanceof IdentityStep) {
+                // do nothing, can be skipped
+            } else if (currentStep instanceof HasStep) {
+                // do nothing, can be skipped
+            } else if (currentStep instanceof NoOpBarrierStep) {
+                // do nothing, can be skipped
+            } else {
+                break;
+            }
+            currentStep = currentStep.getNextStep();
+        }
+
+        if (lastOrder != null && lastOrder instanceof OrderGlobalStep) {
+//            if (validJanusGraphOrder(lastOrder, rootTraversal, isVertexOrder)) {
+                //Add orders to HasStepFolder
+                for (Pair<Traversal.Admin<Object, Comparable>, Comparator<Comparable>> comp : (List<Pair<Traversal.Admin<Object, Comparable>, Comparator<Comparable>>>) ((OrderGlobalStep) lastOrder).getComparators()) {
+                    ElementValueComparator evc = (ElementValueComparator) comp.getValue1();
+                    s2graphStep.orderBy(evc.getPropertyKey(), (Order) evc.getValueComparator());
+                }
+                lastOrder.getLabels().forEach(s2graphStep::addLabel);
+                traversal.removeStep(lastOrder);
+//            }
+        }
+    }
+
+//    static void splitAndP(final List<HasContainer> hasContainers, final Iterable<HasContainer> has) {
+//        has.forEach(hasContainer -> {
+//            if (hasContainer.getPredicate() instanceof AndP) {
+//                for (final P<?> predicate : ((AndP<?>) hasContainer.getPredicate()).getPredicates()) {
+//                    hasContainers.add(new HasContainer(hasContainer.getKey(), predicate));
+//                }
+//            } else
+//                hasContainers.add(hasContainer);
+//        });
+//    }
+
+    class OrderEntry {
+
+        public final String key;
+        public final Order order;
+
+        public OrderEntry(String key, Order order) {
+            this.key = key;
+            this.order = order;
+        }
+    }
+
+//    static <E extends Ranging> void foldInRange(final HasStepFolder s2graphStep, final Traversal.Admin<?, ?> traversal) {
+//        Step<?, ?> nextStep = S2GraphTraversalUtil.getNextNonIdentityStep(s2graphStep);
+//
+//        if (nextStep instanceof RangeGlobalStep) {
+//            RangeGlobalStep range = (RangeGlobalStep) nextStep;
+//            int limit = 10;
+//            s2graphStep.setLimit(limit);
+//            if (range.getLowRange() == 0) { //Range can be removed since there is no offset
+//                nextStep.getLabels().forEach(s2graphStep::addLabel);
+//                traversal.removeStep(nextStep);
+//            }
+//        }
+//    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/0594fd07/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphStep.java
----------------------------------------------------------------------
diff --git a/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphStep.java b/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphStep.java
index 384a88b..d494995 100644
--- a/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphStep.java
+++ b/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphStep.java
@@ -65,8 +65,8 @@ public class S2GraphStep<S, E extends Element> extends GraphStep<S, E> {
             // full scan
 
             String queryString = IndexProvider$.MODULE$.buildQueryString(hasContainers);
-
-            List<String> ids = graph.indexProvider().fetchIds(queryString);
+            Boolean isVertex = Vertex.class.isAssignableFrom(this.returnClass);
+            List<String> ids = graph.indexProvider().fetchIds(queryString, isVertex);
             return (Iterator) (Vertex.class.isAssignableFrom(this.returnClass) ? graph.vertices(ids) : graph.edges(ids));
         });
     }

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/0594fd07/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphStepStrategy.java
----------------------------------------------------------------------
diff --git a/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphStepStrategy.java b/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphStepStrategy.java
index 15d7699..e30a502 100644
--- a/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphStepStrategy.java
+++ b/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphStepStrategy.java
@@ -6,6 +6,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+import java.util.Iterator;
 
 
 public class S2GraphStepStrategy extends AbstractTraversalStrategy<TraversalStrategy.ProviderOptimizationStrategy> implements TraversalStrategy.ProviderOptimizationStrategy {
@@ -27,21 +31,18 @@ public class S2GraphStepStrategy extends AbstractTraversalStrategy<TraversalStra
                 TraversalHelper.replaceStep(originalGraphStep, (Step) s2GraphStep, traversal);
 
 
-
             } else {
-                //Make sure that any provided "start" elements are instantiated in the current transaction
-//                Object[] ids = originalGraphStep.getIds();
-//                ElementUtils.verifyArgsMustBeEitherIdorElement(ids);
-//                if (ids[0] instanceof Element) {
-//                    //GraphStep constructor ensures that the entire array is elements
-//                    final Object[] elementIds = new Object[ids.length];
-//                    for (int i = 0; i < ids.length; i++) {
-//                        elementIds[i] = ((Element) ids[i]).id();
-//                    }
-//                    originalGraphStep.setIteratorSupplier(() -> (Iterator) (originalGraphStep.returnsVertex() ?
-//                            ((Graph) originalGraphStep.getTraversal().getGraph().get()).vertices(elementIds) :
-//                            ((Graph) originalGraphStep.getTraversal().getGraph().get()).edges(elementIds)));
-//                }
+                Object[] ids = originalGraphStep.getIds();
+                if (ids[0] instanceof Element) {
+                    //GraphStep constructor ensures that the entire array is elements
+                    final Object[] elementIds = new Object[ids.length];
+                    for (int i = 0; i < ids.length; i++) {
+                        elementIds[i] = ((Element) ids[i]).id();
+                    }
+                    originalGraphStep.setIteratorSupplier(() -> (Iterator) (originalGraphStep.returnsVertex() ?
+                            ((Graph) originalGraphStep.getTraversal().getGraph().get()).vertices(elementIds) :
+                            ((Graph) originalGraphStep.getTraversal().getGraph().get()).edges(elementIds)));
+                }
             }
         });
     }

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/0594fd07/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphTraversalUtil.java
----------------------------------------------------------------------
diff --git a/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphTraversalUtil.java b/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphTraversalUtil.java
new file mode 100644
index 0000000..72f6999
--- /dev/null
+++ b/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphTraversalUtil.java
@@ -0,0 +1,41 @@
+package org.apache.s2graph.core.io.tinkerpop.optimize;
+
+import org.apache.s2graph.core.S2Vertex;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.wrapped.WrappedVertex;
+
+import java.util.Optional;
+
+public class S2GraphTraversalUtil {
+
+    public static S2Vertex getS2Vertex(Element v) {
+        while (v instanceof WrappedVertex) {
+            v = ((WrappedVertex<Vertex>) v).getBaseVertex();
+        }
+        if (v instanceof S2Vertex) {
+            return (S2Vertex) v;
+        } else throw new IllegalArgumentException("Expected traverser of JanusGraph vertex but found: " + v);
+    }
+
+    public static S2Vertex getS2Vertex(Traverser<? extends Element> traverser) {
+        return getS2Vertex(traverser.get());
+    }
+
+
+    public static Step getNextNonIdentityStep(final Step start) {
+        Step currentStep = start.getNextStep();
+        //Skip over identity steps
+        while (currentStep instanceof IdentityStep) currentStep = currentStep.getNextStep();
+        return currentStep;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/0594fd07/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphVertexStep.java
----------------------------------------------------------------------
diff --git a/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphVertexStep.java b/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphVertexStep.java
new file mode 100644
index 0000000..a637617
--- /dev/null
+++ b/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphVertexStep.java
@@ -0,0 +1,128 @@
+package org.apache.s2graph.core.io.tinkerpop.optimize;
+
+
+import org.apache.s2graph.core.Query;
+import org.apache.s2graph.core.S2Vertex;
+import org.apache.tinkerpop.gremlin.process.traversal.Order;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+//public class S2GraphVertexStep<E extends Element> extends VertexStep<E> implements HasStepFolder<Vertex, E>, Profiling {
+//
+//    public S2GraphVertexStep(VertexStep<E> originalStep) {
+//        super(originalStep.getTraversal(), originalStep.getReturnClass(), originalStep.getDirection(), originalStep.getEdgeLabels());
+//        originalStep.getLabels().forEach(this::addLabel);
+//        this.hasContainers = new ArrayList<>();
+//        this.limit = Integer.MAX_VALUE;
+//    }
+//
+//    private boolean initialized = false;
+//    private Map<S2Vertex, Iterable<? extends Element>> multiQueryResults = null;
+//
+//
+//    public Query makeQuery(Query query) {
+//        query.labels(getEdgeLabels());
+//        query.direction(getDirection());
+//        for (HasContainer condition : hasContainers) {
+//            query.has(condition.getKey(), JanusGraphPredicate.Converter.convert(condition.getBiPredicate()), condition.getValue());
+//        }
+//        for (OrderEntry order : orders) query.orderBy(order.key, order.order);
+//        if (limit != BaseQuery.NO_LIMIT) query.limit(limit);
+//        ((BasicVertexCentricQueryBuilder) query).profiler(queryProfiler);
+//        return query;
+//    }
+//
+//    @SuppressWarnings("deprecation")
+//    private void initialize() {
+//        assert !initialized;
+//        initialized = true;
+//
+//        if (!starts.hasNext()) throw FastNoSuchElementException.instance();
+//        JanusGraphMultiVertexQuery mquery = JanusGraphTraversalUtil.getTx(traversal).multiQuery();
+//        List<Traverser.Admin<Vertex>> vertices = new ArrayList<>();
+//        starts.forEachRemaining(v -> {
+//            vertices.add(v);
+//            mquery.addVertex(v.get());
+//        });
+//        starts.add(vertices.iterator());
+//        assert vertices.size() > 0;
+//        makeQuery(mquery);
+//
+//        multiQueryResults = (Vertex.class.isAssignableFrom(getReturnClass())) ? mquery.vertices() : mquery.edges();
+//
+//    }
+//
+//    @Override
+//    protected Traverser.Admin<E> processNextStart() {
+//        if (!initialized) initialize();
+//        return super.processNextStart();
+//    }
+//
+//    @Override
+//    protected Iterator<E> flatMap(final Traverser.Admin<Vertex> traverser) {
+//        JanusGraphVertexQuery query = makeQuery((JanusGraphTraversalUtil.getJanusGraphVertex(traverser)).query());
+//        return (Vertex.class.isAssignableFrom(getReturnClass())) ? query.vertices().iterator() : query.edges().iterator();
+//    }
+//
+//    @Override
+//    public void reset() {
+//        super.reset();
+//        this.initialized = false;
+//    }
+//
+//    @Override
+//    public S2GraphVertexStep<E> clone() {
+//        final S2GraphVertexStep<E> clone = (S2GraphVertexStep<E>) super.clone();
+//        clone.initialized = false;
+//        return clone;
+//    }
+//
+//
+//    private final List<HasContainer> hasContainers;
+//    private int limit = Integer.MAX_VALUE;
+//    private List<OrderEntry> orders = new ArrayList<>();
+//
+//
+//    @Override
+//    public void addAll(Iterable<HasContainer> has) {
+//        HasStepFolder.splitAndP(hasContainers, has);
+//    }
+//
+//    @Override
+//    public void orderBy(String key, Order order) {
+//        orders.add(new OrderEntry(key, order));
+//    }
+//
+//    @Override
+//    public void setLimit(int limit) {
+//        this.limit = limit;
+//    }
+//
+//    @Override
+//    public int getLimit() {
+//        return this.limit;
+//    }
+//
+//    @Override
+//    public String toString() {
+//        return this.hasContainers.isEmpty() ? super.toString() : StringFactory.stepString(this, this.hasContainers);
+//    }
+//
+//    @Override
+//    public void setMetrics(MutableMetrics metrics) {
+////        queryProfiler = new TP3ProfileWrapper(metrics);
+//    }
+//}
+

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/0594fd07/s2core/src/main/scala/org/apache/s2graph/core/index/IndexProvider.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/index/IndexProvider.scala b/s2core/src/main/scala/org/apache/s2graph/core/index/IndexProvider.scala
index d3878af..c8b2ebb 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/index/IndexProvider.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/index/IndexProvider.scala
@@ -8,14 +8,16 @@ import org.apache.lucene.queryparser.classic.QueryParser
 import org.apache.lucene.search.IndexSearcher
 import org.apache.lucene.store.RAMDirectory
 import org.apache.s2graph.core.io.Conversions
-import org.apache.s2graph.core.{EdgeId, S2Edge}
+import org.apache.s2graph.core.{EdgeId, S2Edge, S2Vertex}
 import org.apache.s2graph.core.mysqls._
 import org.apache.s2graph.core.types.InnerValLike
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer
 import play.api.libs.json.Json
 
 object IndexProvider {
-  val edgeIdField = "_edgeId_"
+  val vidField = "_vid_"
+  val eidField = "_eid_"
+
   def apply(config: Config): IndexProvider = {
     val indexProviderType = "lucene"
 //      if (config.hasPath("index.provider")) config.getString("index.provider") else "lucene"
@@ -36,10 +38,12 @@ object IndexProvider {
 
 trait IndexProvider {
   //TODO: Seq nee do be changed into stream
-  def fetchIds(queryString: String): java.util.List[String]
+  def fetchIds(queryString: String, isVertex: Boolean = true): java.util.List[String]
 
-  def mutateEdges(edges: Seq[S2Edge]): Seq[Boolean]
+  def mutateVertices(vertices: Seq[S2Vertex]): Seq[Boolean]
 
+  def mutateEdges(edges: Seq[S2Edge]): Seq[Boolean]
+`
   def shutdown(): Unit
 }
 
@@ -51,11 +55,26 @@ class LuceneIndexProvider(config: Config) extends IndexProvider {
   val indexConfig = new IndexWriterConfig(analyzer)
   val writer = new IndexWriter(directory, indexConfig)
 
+  override def mutateVertices(vertices: Seq[S2Vertex]): Seq[Boolean] = {
+    vertices.map { vertex =>
+      val doc = new Document()
+      val id = vertex.id.toString()
+      doc.add(new StringField(vidField, id, Field.Store.YES))
+
+      vertex.properties.foreach { case (dim, value) =>
+        doc.add(new TextField(dim, value.toString, Field.Store.YES))
+      }
+      writer.addDocument(doc)
+    }
+    writer.commit()
+    vertices.map(_ => true)
+  }
+
   override def mutateEdges(edges: Seq[S2Edge]): Seq[Boolean] = {
     edges.map { edge =>
       val doc = new Document()
-      val edgeIdString = edge.edgeId.toString
-      doc.add(new StringField(edgeIdField, edgeIdString, Field.Store.YES))
+      val id = edge.edgeId.toString
+      doc.add(new StringField(eidField, id, Field.Store.YES))
 
       edge.properties.foreach { case (dim, value) =>
         doc.add(new TextField(dim, value.toString, Field.Store.YES))
@@ -66,9 +85,10 @@ class LuceneIndexProvider(config: Config) extends IndexProvider {
     edges.map(_ => true)
   }
 
-  override def fetchIds(queryString: String): java.util.List[String] = {
+  override def fetchIds(queryString: String, isVertex: Boolean = true): java.util.List[String] = {
+    val field = if (isVertex) vidField else eidField
     val ids = new java.util.ArrayList[String]
-    val q = new QueryParser(edgeIdField, analyzer).parse(queryString)
+    val q = new QueryParser(field, analyzer).parse(queryString)
     val hitsPerPage = 10
     val reader = DirectoryReader.open(directory)
     val searcher = new IndexSearcher(reader)
@@ -77,7 +97,7 @@ class LuceneIndexProvider(config: Config) extends IndexProvider {
 
     docs.scoreDocs.foreach { scoreDoc =>
       val document = searcher.doc(scoreDoc.doc)
-      ids.add(document.get(edgeIdField))
+      ids.add(document.get(field))
     }
 
     reader.close()
@@ -87,4 +107,5 @@ class LuceneIndexProvider(config: Config) extends IndexProvider {
   override def shutdown(): Unit = {
     writer.close()
   }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/0594fd07/s2core/src/test/scala/org/apache/s2graph/core/index/IndexProviderTest.scala
----------------------------------------------------------------------
diff --git a/s2core/src/test/scala/org/apache/s2graph/core/index/IndexProviderTest.scala b/s2core/src/test/scala/org/apache/s2graph/core/index/IndexProviderTest.scala
index 70f7c3c..e9150e9 100644
--- a/s2core/src/test/scala/org/apache/s2graph/core/index/IndexProviderTest.scala
+++ b/s2core/src/test/scala/org/apache/s2graph/core/index/IndexProviderTest.scala
@@ -25,7 +25,8 @@ class IndexProviderTest extends IntegrateCommon {
     edges.foreach(e => logger.debug(s"[Edge]: $e"))
     indexProvider.mutateEdges(edges)
 
-    val edgeIds = indexProvider.fetchIds("time: 10")
+    import scala.collection.JavaConversions._
+    val edgeIds = indexProvider.fetchIds("time: 10", isVertex = false)
 
     edgeIds.foreach { edgeId =>
       logger.debug(s"[EdgeId]: $edgeId")

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/0594fd07/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala
----------------------------------------------------------------------
diff --git a/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala
index 87eac0e..1d06e46 100644
--- a/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala
+++ b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala
@@ -37,6 +37,7 @@ import org.apache.tinkerpop.gremlin.{AbstractGraphProvider, LoadGraphWith}
 import scala.collection.JavaConverters._
 
 object S2GraphProvider {
+
   val Implementation: Set[Class[_]] = Set(
     classOf[S2Edge],
     classOf[S2Vertex],