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