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:17 UTC

[03/25] incubator-s2graph git commit: start to add optimize.

start to add optimize.


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

Branch: refs/heads/master
Commit: e3472de8de46fe4f838a6807f7c6b40ffa1f1df2
Parents: 6065c87
Author: DO YUNG YOON <st...@apache.org>
Authored: Tue Jul 11 13:54:52 2017 +0900
Committer: DO YUNG YOON <st...@apache.org>
Committed: Tue Jul 11 13:54:52 2017 +0900

----------------------------------------------------------------------
 .../core/io/tinkerpop/optimize/S2GraphStep.java |  33 ++++
 .../tinkerpop/optimize/S2GraphStepStrategy.java |  50 ++++++
 .../scala/org/apache/s2graph/core/S2Graph.scala |   5 +
 .../s2graph/core/index/IndexProvider.scala      |  26 +--
 .../core/mysqls/ServiceColumnIndex.scala        |  34 ++--
 .../core/tinkerpop/optimize/S2GraphStep.scala   |  12 ++
 .../optimize/S2GraphStepStrategy.scala          |  43 +++++
 .../core/Integrate/IntegrateCommon.scala        |   8 +-
 .../s2graph/core/index/IndexProviderTest.scala  |  34 ++++
 .../core/tinkerpop/structure/S2GraphTest.scala  | 176 +++++++++----------
 10 files changed, 295 insertions(+), 126 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/e3472de8/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
new file mode 100644
index 0000000..4d6568b
--- /dev/null
+++ b/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphStep.java
@@ -0,0 +1,33 @@
+package org.apache.s2graph.core.io.tinkerpop.optimize;
+
+import org.apache.s2graph.core.utils.logger;
+import org.apache.tinkerpop.gremlin.process.traversal.Order;
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+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.StringFactory;
+
+import java.util.*;
+
+public class S2GraphStep<S, E extends Element> extends GraphStep<S, E> {
+    private final List<HasContainer> hasContainers = new ArrayList<>();
+
+
+    public S2GraphStep(final GraphStep<S, E> originalStep) {
+        super(originalStep.getTraversal(), originalStep.getReturnClass(), originalStep.isStartStep(), originalStep.getIds());
+        originalStep.getLabels().forEach(this::addLabel);
+        System.err.println("[[S2GraphStep]]");
+    }
+
+    @Override
+    public String toString() {
+        return this.hasContainers.isEmpty() ?
+                super.toString() : StringFactory.stepString(this, Arrays.toString(this.ids), this.hasContainers);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/e3472de8/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
new file mode 100644
index 0000000..ea9ad7e
--- /dev/null
+++ b/s2core/src/main/java/org/apache/s2graph/core/io/tinkerpop/optimize/S2GraphStepStrategy.java
@@ -0,0 +1,50 @@
+package org.apache.s2graph.core.io.tinkerpop.optimize;
+
+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.step.map.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+
+public class S2GraphStepStrategy extends AbstractTraversalStrategy<TraversalStrategy.ProviderOptimizationStrategy> implements TraversalStrategy.ProviderOptimizationStrategy {
+
+    private static final S2GraphStepStrategy INSTANCE = new S2GraphStepStrategy();
+
+    private S2GraphStepStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (TraversalHelper.onGraphComputer(traversal))
+            return;
+
+        TraversalHelper.getStepsOfClass(GraphStep.class, traversal).forEach(originalGraphStep -> {
+            if (originalGraphStep.getIds() == null || originalGraphStep.getIds().length == 0) {
+                //Try to optimize for index calls
+                final S2GraphStep<?, ?> s2GraphStep = new S2GraphStep<>(originalGraphStep);
+                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)));
+//                }
+            }
+        });
+    }
+
+    public static S2GraphStepStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/e3472de8/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala b/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala
index a154419..8a53335 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala
@@ -29,12 +29,14 @@ import org.apache.s2graph.core.GraphExceptions.{FetchTimeoutException, LabelNotE
 import org.apache.s2graph.core.JSONParser._
 import org.apache.s2graph.core.features.S2GraphVariables
 import org.apache.s2graph.core.index.{IndexProvider, LuceneIndexProvider}
+import org.apache.s2graph.core.io.tinkerpop.optimize.S2GraphStepStrategy
 import org.apache.s2graph.core.mysqls._
 import org.apache.s2graph.core.storage.hbase.AsynchbaseStorage
 import org.apache.s2graph.core.storage.{SKeyValue, Storage}
 import org.apache.s2graph.core.types._
 import org.apache.s2graph.core.utils.{DeferCache, Extensions, logger}
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies
 import org.apache.tinkerpop.gremlin.structure
 import org.apache.tinkerpop.gremlin.structure.Edge.Exceptions
 import org.apache.tinkerpop.gremlin.structure.Graph.{Features, Variables}
@@ -104,6 +106,9 @@ object S2Graph {
   val DefaultColumnName = "vertex"
   val DefaultLabelName = "_s2graph"
 
+  val graphStrategies: TraversalStrategies =
+    TraversalStrategies.GlobalCache.getStrategies(classOf[Graph]).addStrategies(S2GraphStepStrategy.instance)
+
   def toTypeSafeConfig(configuration: Configuration): Config = {
     val m = new mutable.HashMap[String, AnyRef]()
     for {

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/e3472de8/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 a1c8c40..baf05d4 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,16 +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.mysqls.ColumnMeta
 import org.apache.s2graph.core.{EdgeId, S2Edge}
+import org.apache.s2graph.core.mysqls._
 import org.apache.s2graph.core.types.InnerValLike
 import play.api.libs.json.Json
 
 object IndexProvider {
   val edgeIdField = "_edgeId_"
   def apply(config: Config): IndexProvider = {
-    val indexProviderType =
-      if (config.hasPath("index.provider")) config.getString("index.provider") else "lucene"
+    val indexProviderType = "lucene"
+//      if (config.hasPath("index.provider")) config.getString("index.provider") else "lucene"
 
     indexProviderType match {
       case "lucene" => new LuceneIndexProvider(config)
@@ -27,7 +27,7 @@ object IndexProvider {
 
 trait IndexProvider {
   //TODO: Seq nee do be changed into stream
-  def fetchEdges(indexProps: Seq[(ColumnMeta, InnerValLike)]): Seq[EdgeId]
+  def fetchEdges(indexProps: Seq[(String, InnerValLike)]): Seq[EdgeId]
 
   def mutateEdges(edges: Seq[S2Edge]): Seq[Boolean]
 
@@ -40,7 +40,6 @@ class LuceneIndexProvider(config: Config) extends IndexProvider {
   val analyzer = new StandardAnalyzer()
   val directory = new RAMDirectory()
   val indexConfig = new IndexWriterConfig(analyzer)
-  val reader = DirectoryReader.open(directory)
   val writer = new IndexWriter(directory, indexConfig)
 
   override def mutateEdges(edges: Seq[S2Edge]): Seq[Boolean] = {
@@ -54,28 +53,31 @@ class LuceneIndexProvider(config: Config) extends IndexProvider {
       }
       writer.addDocument(doc)
     }
-
+    writer.commit()
     edges.map(_ => true)
   }
 
-  override def fetchEdges(indexProps: Seq[(ColumnMeta, InnerValLike)]): Seq[EdgeId] = {
-    val queryStr = indexProps.map { case (columnMeta, value) =>
-       columnMeta.name + ": " + value.toString()
-    }.mkString(" ")
+  override def fetchEdges(indexProps: Seq[(String, InnerValLike)]): Seq[EdgeId] = {
+    val queryStr = indexProps.map { case (name, value) =>
+      name + ": " + value.toString()
+    }.mkString(" AND ")
 
     val q = new QueryParser(edgeIdField, analyzer).parse(queryStr)
     val hitsPerPage = 10
+    val reader = DirectoryReader.open(directory)
     val searcher = new IndexSearcher(reader)
 
     val docs = searcher.search(q, hitsPerPage)
-    docs.scoreDocs.map { scoreDoc =>
+    val ls = docs.scoreDocs.map { scoreDoc =>
       val document = searcher.doc(scoreDoc.doc)
       Conversions.s2EdgeIdReads.reads(Json.parse(document.get(edgeIdField))).get
     }
+
+    reader.close()
+    ls
   }
 
   override def shutdown(): Unit = {
     writer.close()
-    reader.close()
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/e3472de8/s2core/src/main/scala/org/apache/s2graph/core/mysqls/ServiceColumnIndex.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/mysqls/ServiceColumnIndex.scala b/s2core/src/main/scala/org/apache/s2graph/core/mysqls/ServiceColumnIndex.scala
index 00204f1..38e1761 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/mysqls/ServiceColumnIndex.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/mysqls/ServiceColumnIndex.scala
@@ -144,23 +144,23 @@ object ServiceColumnIndex extends Model[ServiceColumnIndex] {
     }
   }
 
-  def findAll()(implicit session: DBSession = AutoSession) = {
-    val ls = sql"""select * from $dbTableName""".map { rs => ServiceColumnIndex(rs) }.list.apply
-    val singles = ls.flatMap { x =>
-      val cacheKeys = toCacheKeys(x.id.get, x.serviceId, x.serviceColumnId, x.seq, x.metaSeqs).dropRight(1)
-      cacheKeys.map { cacheKey =>
-        cacheKey -> x
-      }
-    }
-    val multies = ls.groupBy(x => (x.serviceId, x.serviceColumnId)).map { case ((serviceId, serviceColumnId), ls) =>
-      val cacheKey = s"serviceId=$serviceId:serviceColumnId=$serviceColumnId"
-      cacheKey -> ls
-    }.toList
-
-    putsToCache(singles)
-    putsToCaches(multies)
-
-  }
+//  def findAll()(implicit session: DBSession = AutoSession) = {
+//    val ls = sql"""select * from $dbTableName""".map { rs => ServiceColumnIndex(rs) }.list.apply
+//    val singles = ls.flatMap { x =>
+//      val cacheKeys = toCacheKeys(x.id.get, x.serviceId, x.serviceColumnId, x.seq, x.metaSeqs).dropRight(1)
+//      cacheKeys.map { cacheKey =>
+//        cacheKey -> x
+//      }
+//    }
+//    val multies = ls.groupBy(x => (x.serviceId, x.serviceColumnId)).map { case ((serviceId, serviceColumnId), ls) =>
+//      val cacheKey = s"serviceId=$serviceId:serviceColumnId=$serviceColumnId"
+//      cacheKey -> ls
+//    }.toList
+//
+//    putsToCache(singles)
+//    putsToCaches(multies)
+//
+//  }
 }
 
 case class ServiceColumnIndex(id: Option[Int],

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/e3472de8/s2core/src/main/scala/org/apache/s2graph/core/tinkerpop/optimize/S2GraphStep.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/tinkerpop/optimize/S2GraphStep.scala b/s2core/src/main/scala/org/apache/s2graph/core/tinkerpop/optimize/S2GraphStep.scala
new file mode 100644
index 0000000..2bef368
--- /dev/null
+++ b/s2core/src/main/scala/org/apache/s2graph/core/tinkerpop/optimize/S2GraphStep.scala
@@ -0,0 +1,12 @@
+//package org.apache.s2graph.core.tinkerpop.optimize
+//
+//import org.apache.s2graph.core.utils.logger
+//import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep
+//import org.apache.tinkerpop.gremlin.structure.Element
+//
+//class S2GraphStep[S, E <: Element](originalStep: GraphStep[S, E])
+//  extends GraphStep[S, E](originalStep.getTraversal(), originalStep.getReturnClass(), originalStep.isStartStep(), originalStep.getIds()) {
+//
+//
+//  logger.error(s"[[S2GraphStep]]")
+//}

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/e3472de8/s2core/src/main/scala/org/apache/s2graph/core/tinkerpop/optimize/S2GraphStepStrategy.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/tinkerpop/optimize/S2GraphStepStrategy.scala b/s2core/src/main/scala/org/apache/s2graph/core/tinkerpop/optimize/S2GraphStepStrategy.scala
new file mode 100644
index 0000000..525d354
--- /dev/null
+++ b/s2core/src/main/scala/org/apache/s2graph/core/tinkerpop/optimize/S2GraphStepStrategy.scala
@@ -0,0 +1,43 @@
+//package org.apache.s2graph.core.tinkerpop.optimize
+//
+//import org.apache.s2graph.core.utils.logger
+//import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep
+//import org.apache.tinkerpop.gremlin.process.traversal.{Step, Traversal, TraversalStrategy}
+//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
+//
+//object S2GraphStepStrategy {
+//  val INSTANCE = new S2GraphStepStrategy()
+//  def instance = INSTANCE
+//}
+//class S2GraphStepStrategy extends AbstractTraversalStrategy[TraversalStrategy.ProviderOptimizationStrategy] with TraversalStrategy.ProviderOptimizationStrategy {
+//  import scala.collection.JavaConversions._
+//  override def apply(traversal: Traversal.Admin[_, _]): Unit = {
+//    TraversalHelper.getStepsOfClass(classOf[GraphStep[_, Element]], traversal).foreach { originalGraphStep =>
+//      if (originalGraphStep.getIds() == null || originalGraphStep.getIds().length == 0) {
+//        //Try to optimize for index calls
+//
+//        val s2GraphStep = new S2GraphStep(originalGraphStep)
+//        TraversalHelper.replaceStep(originalGraphStep, s2GraphStep.asInstanceOf[Step[_ <: Any, _ <: Any]], traversal)
+//        logger.error(s"[[Ids is empty]]")
+//      } 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)));
+////        }
+//        logger.error(s"[[Ids is not empty]]")
+//      }
+//    }
+//
+//  }
+//}

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/e3472de8/s2core/src/test/scala/org/apache/s2graph/core/Integrate/IntegrateCommon.scala
----------------------------------------------------------------------
diff --git a/s2core/src/test/scala/org/apache/s2graph/core/Integrate/IntegrateCommon.scala b/s2core/src/test/scala/org/apache/s2graph/core/Integrate/IntegrateCommon.scala
index 7e65b0c..3d72432 100644
--- a/s2core/src/test/scala/org/apache/s2graph/core/Integrate/IntegrateCommon.scala
+++ b/s2core/src/test/scala/org/apache/s2graph/core/Integrate/IntegrateCommon.scala
@@ -55,7 +55,7 @@ trait IntegrateCommon extends FunSuite with Matchers with BeforeAndAfterAll {
    * Make Service, Label, Vertex for integrate test
    */
   def initTestData() = {
-    println("[init start]: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
+    logger.info("[init start]: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
     Management.deleteService(testServiceName)
 
     // 1. createService
@@ -65,7 +65,7 @@ trait IntegrateCommon extends FunSuite with Matchers with BeforeAndAfterAll {
 
     val tryRes =
       management.createService(serviceName, cluster, tableName, preSplitSize, ttl, compressionAlgorithm)
-    println(s">> Service created : $createService, $tryRes")
+    logger.info(s">> Service created : $createService, $tryRes")
 
     val labelNames = Map(testLabelName -> testLabelNameCreate,
       testLabelName2 -> testLabelName2Create,
@@ -89,7 +89,7 @@ trait IntegrateCommon extends FunSuite with Matchers with BeforeAndAfterAll {
 
           tryRes.get
         case Some(label) =>
-          println(s">> Label already exist: $create, $label")
+          logger.info(s">> Label already exist: $create, $label")
       }
     }
 
@@ -99,7 +99,7 @@ trait IntegrateCommon extends FunSuite with Matchers with BeforeAndAfterAll {
       Management.addVertexProp(testServiceName, testColumnName, key, keyType)
     }
 
-    println("[init end]: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
+    logger.info("[init end]: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
   }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/e3472de8/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
new file mode 100644
index 0000000..8f484ad
--- /dev/null
+++ b/s2core/src/test/scala/org/apache/s2graph/core/index/IndexProviderTest.scala
@@ -0,0 +1,34 @@
+package org.apache.s2graph.core.index
+
+import org.apache.s2graph.core.Integrate.IntegrateCommon
+import org.apache.s2graph.core.mysqls._
+import org.apache.s2graph.core.types.{InnerVal, InnerValLikeWithTs}
+import org.apache.s2graph.core.utils.logger
+
+class IndexProviderTest extends IntegrateCommon {
+  val indexProvider = IndexProvider(config)
+
+  test("test write/query ") {
+    import TestUtil._
+    val testLabelName = TestUtil.testLabelName
+    val testLabel = Label.findByName(testLabelName).getOrElse(throw new IllegalArgumentException)
+    val vertexId = graph.newVertexId(testServiceName)(testColumnName)(1L)
+    val vertex = graph.newVertex(vertexId)
+    val propsWithTs = Map(
+      LabelMeta.timestamp -> InnerValLikeWithTs.withLong(1L, 1L, "v4"),
+      testLabel.metaPropsInvMap("time") -> InnerValLikeWithTs.withLong(10L, 1L, "v4")
+    )
+    val edge = graph.newEdge(vertex, vertex, testLabel, 0, propsWithTs = propsWithTs)
+    val edges = Seq(edge)
+
+    logger.error(s"[# of edges]: ${edges.size}")
+    edges.foreach(e => logger.debug(s"[Edge]: $e"))
+    indexProvider.mutateEdges(edges)
+
+    val edgeIds = indexProvider.fetchEdges(Seq("time" -> InnerVal.withLong(10, "v4")))
+
+    edgeIds.foreach { edgeId =>
+      logger.debug(s"[EdgeId]: $edgeId")
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/e3472de8/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphTest.scala
----------------------------------------------------------------------
diff --git a/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphTest.scala b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphTest.scala
index 92c63b9..d9aa3bc 100644
--- a/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphTest.scala
+++ b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphTest.scala
@@ -154,36 +154,31 @@ class S2GraphTest extends FunSuite with Matchers with TestCommonWithModels {
 //
 
   test("tinkerpop class graph test.") {
-//    val marko = graph.addVertex(T.label, "person", T.id, Int.box(1))
-//    marko.property("name", "marko")
-//    marko.property("age", Int.box(29))
-//    val vadas = graph.addVertex(T.label, "person", T.id, Int.box(2))
-//    vadas.property("name", "vadas", "age", Int.box(27))
-//    val lop = graph.addVertex(T.label, "software", T.id, Int.box(3), "name", "lop", "lang", "java")
-//    val josh = graph.addVertex(T.label, "person", T.id, Int.box(4), "name", "josh", "age", Int.box(32))
-//    val ripple = graph.addVertex(T.label, "software", T.id, Int.box(5), "name", "ripple", "lang", "java")
-//    val peter = graph.addVertex(T.label, "person", T.id, Int.box(6), "name", "peter", "age", Int.box(35))
-//
-//    marko.addEdge("knows", vadas, T.id, Int.box(7), "weight", Float.box(0.5f))
-//    marko.addEdge("knows", josh, T.id, Int.box(8), "weight", Float.box(1.0f))
-//    marko.addEdge("created", lop, T.id, Int.box(9), "weight", Float.box(0.4f))
-//    josh.addEdge("created", ripple, T.id, Int.box(10), "weight", Float.box(1.0f))
-//    josh.addEdge("created", lop, T.id, Int.box(11), "weight", Float.box(0.4f))
-//    peter.addEdge("created", lop, T.id, Int.box(12), "weight", Float.box(0.2f))
-//    graph.tx().commit()
-//
-//    graph.traversal().V().inV()
-//    val verticees = s2Graph.traversal().V().asAdmin().toSeq
-//
-//
-//    val vs = verticees.toList
-//    val edgeId = graph.traversal().V().has("name", "marko").outE("knows").as("e").inV().has("name", "vadas").select[Edge]("e").toList.head.id()
-//    val edges = graph.traversal().E(edgeId).toList()
-////    .as("e").inV().has("name", "vadas").select[Edge]("e").asAdmin().toSeq
-////    graph.traversal.V.has("name", outVertexName).outE(edgeLabel).as("e").inV.has("name", inVertexName).select[Edge]("e").next.id
-//    logger.error(edgeId.toString)
-//    val x = edges.mkString("\n")
-//    logger.error(x)
+    val marko = graph.addVertex(T.label, "person", T.id, Int.box(1))
+    marko.property("name", "marko")
+    marko.property("age", Int.box(29))
+    val vadas = graph.addVertex(T.label, "person", T.id, Int.box(2))
+    vadas.property("name", "vadas", "age", Int.box(27))
+    val lop = graph.addVertex(T.label, "software", T.id, Int.box(3), "name", "lop", "lang", "java")
+    val josh = graph.addVertex(T.label, "person", T.id, Int.box(4), "name", "josh", "age", Int.box(32))
+    val ripple = graph.addVertex(T.label, "software", T.id, Int.box(5), "name", "ripple", "lang", "java")
+    val peter = graph.addVertex(T.label, "person", T.id, Int.box(6), "name", "peter", "age", Int.box(35))
+
+    marko.addEdge("knows", vadas, T.id, Int.box(7), "weight", Float.box(0.5f))
+    marko.addEdge("knows", josh, T.id, Int.box(8), "weight", Float.box(1.0f))
+    marko.addEdge("created", lop, T.id, Int.box(9), "weight", Float.box(0.4f))
+    josh.addEdge("created", ripple, T.id, Int.box(10), "weight", Float.box(1.0f))
+    josh.addEdge("created", lop, T.id, Int.box(11), "weight", Float.box(0.4f))
+    peter.addEdge("created", lop, T.id, Int.box(12), "weight", Float.box(0.2f))
+    graph.tx().commit()
+
+    graph.traversal().V().inV()
+    val verticees = graph.traversal().V().asAdmin()
+
+
+    val vs = verticees.toList
+
+
   }
 
 //  test("addVertex with empty parameter") {
@@ -421,67 +416,62 @@ class S2GraphTest extends FunSuite with Matchers with TestCommonWithModels {
 ////      }
 ////    }
 //  }
-//  test("Modern") {
-//    val mnt = graph.management
-//    S2GraphProvider.cleanupSchema
-//    S2GraphProvider.initDefaultSchema(graph)
-//
-//    val softwareColumn = Management.createServiceColumn(S2Graph.DefaultServiceName, "software", "integer", Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), Prop("lang", "-", "string")))
-//    val personColumn = Management.createServiceColumn(S2Graph.DefaultServiceName, "person", "integer",
-//      Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), Prop("age", "0", "integer"), Prop("location", "-", "string")))
-//
-//    val knows = mnt.createLabel("knows",
-//      S2Graph.DefaultServiceName, "person", "integer",
-//      S2Graph.DefaultServiceName, "person", "integer",
-//      true, S2Graph.DefaultServiceName, Nil, Seq(Prop("since", "0", "integer"), Prop("year", "0", "integer")), consistencyLevel = "strong", None, None)
-//
-//    val created = mnt.createLabel("created",
-//      S2Graph.DefaultServiceName, "person", "integer",
-//      S2Graph.DefaultServiceName, "person", "integer",
-//      true, S2Graph.DefaultServiceName, Nil, Seq(Prop("weight", "0.0", "double")), "strong", None, None)
-//
-//    val g = graph.traversal()
-//    val v1 = graph.addVertex(T.label, "person", T.id, Int.box(1), "name", "marko", "age", Int.box(29))
-//    val v2 = graph.addVertex(T.label, "person", T.id, Int.box(2), "name", "vadas", "age", Int.box(27))
-//    val v3 = graph.addVertex(T.label, "software", T.id, Int.box(3), "name", "lop", "lang", "java")
-//    val v4 = graph.addVertex(T.label, "person", T.id, Int.box(4), "name", "josh", "josh", Int.box(32))
-//    val v5 = graph.addVertex(T.label, "software", T.id, Int.box(5), "name", "ripple", "lang", "java")
-//    val v6 = graph.addVertex(T.label, "person", T.id, Int.box(6), "name", "peter", "age", Int.box(35))
-//
-//    val e1 = v1.addEdge("created", v3, "weight", Double.box(0.4))
-//
-//    val e2 = v1.addEdge("knows", v2, "weight", Double.box(0.5))
-//    val e3 = v1.addEdge("knows", v4, "weight", Double.box(1.0))
-//
-//
-//    val e4 = v2.addEdge("knows", v1, "weight", Double.box(0.5))
-//
-//    val e5 = v3.addEdge("created", v1, "weight", Double.box(0.4))
-//    val e6 = v3.addEdge("created", v4, "weight", Double.box(0.4))
-//    val e7 = v3.addEdge("created", v6, "weight", Double.box(0.2))
-//
-//    val e8 = v4.addEdge("knows", v1, "weight", Double.box(1.0))
-//    val e9 = v4.addEdge("created", v5, "weight", Double.box(1.0))
-//    val e10 = v4.addEdge("created", v3, "weight", Double.box(0.4))
-//
-//    val e11 = v5.addEdge("created", v4, "weight", Double.box(1.0))
-//
-//    val e12 = v6.addEdge("created", v3, "weight", Double.box(0.2))
-//
-//    val ls = graph.traversal().V().choose(new Predicate[Vertex] {
-//      override def test(t: Vertex): Boolean =
-//        t.label().equals("person")
-//    }, out("knows"), in("created")).values("name").asAdmin()
-//
-//    val l = ls.toList
-//    logger.error(s"[Size]: ${l.size}")
-//    logger.error(l.toArray.toSeq.mkString("\n"))
-//    println(ls.toList)
-//    ls
-////    val traversal = g.V().out().as("x").in().as("y").select("x", "y").by("name").fold()
-////      .dedup(Scope.local, "x", "y").unfold();
-//
-////    val ls = traversal.toList
-////    ls
-//  }
+  test("Modern") {
+    val mnt = graph.management
+    S2GraphProvider.cleanupSchema
+    S2GraphProvider.initDefaultSchema(graph)
+
+    val softwareColumn = Management.createServiceColumn(S2Graph.DefaultServiceName, "software", "integer", Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), Prop("lang", "-", "string")))
+    val personColumn = Management.createServiceColumn(S2Graph.DefaultServiceName, "person", "integer",
+      Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), Prop("age", "0", "integer"), Prop("location", "-", "string")))
+
+    val knows = mnt.createLabel("knows",
+      S2Graph.DefaultServiceName, "person", "integer",
+      S2Graph.DefaultServiceName, "person", "integer",
+      true, S2Graph.DefaultServiceName, Nil, Seq(Prop("since", "0", "integer"), Prop("year", "0", "integer")), consistencyLevel = "strong", None, None)
+
+    val created = mnt.createLabel("created",
+      S2Graph.DefaultServiceName, "person", "integer",
+      S2Graph.DefaultServiceName, "person", "integer",
+      true, S2Graph.DefaultServiceName, Nil, Seq(Prop("weight", "0.0", "double")), "strong", None, None)
+
+    val g = graph.traversal()
+    val v1 = graph.addVertex(T.label, "person", T.id, Int.box(1), "name", "marko", "age", Int.box(29))
+    val v2 = graph.addVertex(T.label, "person", T.id, Int.box(2), "name", "vadas", "age", Int.box(27))
+    val v3 = graph.addVertex(T.label, "software", T.id, Int.box(3), "name", "lop", "lang", "java")
+    val v4 = graph.addVertex(T.label, "person", T.id, Int.box(4), "name", "josh", "josh", Int.box(32))
+    val v5 = graph.addVertex(T.label, "software", T.id, Int.box(5), "name", "ripple", "lang", "java")
+    val v6 = graph.addVertex(T.label, "person", T.id, Int.box(6), "name", "peter", "age", Int.box(35))
+
+    val e1 = v1.addEdge("created", v3, "weight", Double.box(0.4))
+
+    val e2 = v1.addEdge("knows", v2, "weight", Double.box(0.5))
+    val e3 = v1.addEdge("knows", v4, "weight", Double.box(1.0))
+
+
+    val e4 = v2.addEdge("knows", v1, "weight", Double.box(0.5))
+
+    val e5 = v3.addEdge("created", v1, "weight", Double.box(0.4))
+    val e6 = v3.addEdge("created", v4, "weight", Double.box(0.4))
+    val e7 = v3.addEdge("created", v6, "weight", Double.box(0.2))
+
+    val e8 = v4.addEdge("knows", v1, "weight", Double.box(1.0))
+    val e9 = v4.addEdge("created", v5, "weight", Double.box(1.0))
+    val e10 = v4.addEdge("created", v3, "weight", Double.box(0.4))
+
+    val e11 = v5.addEdge("created", v4, "weight", Double.box(1.0))
+
+    val e12 = v6.addEdge("created", v3, "weight", Double.box(0.2))
+
+    val ls = graph.traversal().V().choose(new Predicate[Vertex] {
+      override def test(t: Vertex): Boolean =
+        t.label().equals("person")
+    }, out("knows"), in("created")).values("name").asAdmin()
+
+    val l = ls.toList
+    logger.error(s"[Size]: ${l.size}")
+    logger.error(l.toArray.toSeq.mkString("\n"))
+    println(ls.toList)
+    ls
+  }
 }
\ No newline at end of file