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 <[email protected]> Authored: Tue Jul 11 13:54:52 2017 +0900 Committer: DO YUNG YOON <[email protected]> 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
