[VertexTest]: passed except shouldHaveExceptionConsistencyWhenAssigningSameIdOnEdge.
Project: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/commit/9ce28472 Tree: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/tree/9ce28472 Diff: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/diff/9ce28472 Branch: refs/heads/master Commit: 9ce284729348ada3a6b2146844f97806159e2433 Parents: 20b51ce Author: DO YUNG YOON <[email protected]> Authored: Wed Apr 5 22:54:25 2017 +0900 Committer: DO YUNG YOON <[email protected]> Committed: Wed Apr 5 22:54:25 2017 +0900 ---------------------------------------------------------------------- .../org/apache/s2graph/core/QueryParam.scala | 2 +- .../scala/org/apache/s2graph/core/S2Graph.scala | 56 ++++++++++++++--- .../org/apache/s2graph/core/S2Vertex.scala | 44 +++++++++++-- .../core/features/S2ElementFeatures.scala | 4 +- .../features/S2VertexPropertyFeatures.scala | 2 +- .../core/tinkerpop/S2GraphProvider.scala | 65 ++++++++++++++++---- .../core/tinkerpop/structure/S2GraphTest.scala | 56 ++++++++++++++++- 7 files changed, 195 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/9ce28472/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala ---------------------------------------------------------------------- diff --git a/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala b/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala index eb36258..0228b3b 100644 --- a/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala +++ b/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala @@ -270,7 +270,7 @@ case class QueryParam(labelName: String, limit: Int = 100, sample: Int = -1, maxAttempt: Int = 2, - rpcTimeout: Int = 1000, + rpcTimeout: Int = 60000, cacheTTLInMillis: Long = -1L, indexName: String = LabelIndex.DefaultName, where: Try[Where] = Success(WhereParser.success), http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/9ce28472/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 182b8ed..1d1150e 100644 --- a/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala +++ b/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala @@ -597,7 +597,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph val MaxSize = config.getInt("future.cache.max.size") val ExpireAfterWrite = config.getInt("future.cache.expire.after.write") val ExpireAfterAccess = config.getInt("future.cache.expire.after.access") - val WaitTimeout = Duration(60, TimeUnit.SECONDS) + val WaitTimeout = Duration(300, TimeUnit.SECONDS) val scheduledEx = ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor()) val management = new Management(this) @@ -654,7 +654,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph } logger.info(s"[Initialized]: $k, ${this.config.getAnyRef(k)}") /* TODO */ - val DefaultService = management.createService("_s2graph", "localhost", "s2graph", 0, None).get + val DefaultService = management.createService("", "localhost", "s2graph", 0, None).get val DefaultColumn = ServiceColumn.findOrInsert(DefaultService.id.get, "vertex", Some("string"), HBaseType.DEFAULT_VERSION, useCache = false) val DefaultColumnMetas = { ColumnMeta.findOrInsert(DefaultColumn.id.get, "test", "string", useCache = false) @@ -672,11 +672,16 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph ColumnMeta.findOrInsert(DefaultColumn.id.get, "double", "double", useCache = false) ColumnMeta.findOrInsert(DefaultColumn.id.get, "integer", "integer", useCache = false) ColumnMeta.findOrInsert(DefaultColumn.id.get, "aKey", "string", useCache = false) + ColumnMeta.findOrInsert(DefaultColumn.id.get, "x", "integer", useCache = false) + ColumnMeta.findOrInsert(DefaultColumn.id.get, "y", "integer", useCache = false) + ColumnMeta.findOrInsert(DefaultColumn.id.get, "location", "string", useCache = false) + ColumnMeta.findOrInsert(DefaultColumn.id.get, "status", "string", useCache = false) + ColumnMeta.findOrInsert(DefaultColumn.id.get, "myId", "integer", useCache = false) } val DefaultLabel = management.createLabel("_s2graph", DefaultService.serviceName, DefaultColumn.columnName, DefaultColumn.columnType, DefaultService.serviceName, DefaultColumn.columnName, DefaultColumn.columnType, true, DefaultService.serviceName, Nil, Nil, "weak", None, None, - options = Option("""{"skipReverse": true}""") + options = Option("""{"skipReverse": false}""") ) def getStorage(service: Service): Storage[_, _] = { @@ -909,6 +914,20 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph } } +// def deleteAllAdjacentEdges(vertex: S2Vertex, +// labels: Seq[Label], +// ts: Long = System.currentTimeMillis()): Future[Boolean] = { +// val indexEdges = labels.flatMap { label => +// val propsPlusTs = Map(LabelMeta.timestamp.name -> ts) +// val propsWithTs = label.propsToInnerValsWithTs(propsPlusTs, ts) +// val edge = newEdge(vertex, vertex, label, +// GraphUtil.directions("out"), +// GraphUtil.operations("delete"), propsWithTs = propsWithTs) +// edge.relatedEdges.flatMap(e => e.edgesWithIndexValid) +// } +// val kvs = indexEdges.flatMap(ie => defaultStorage.indexEdgeSerializer(ie).toKeyValues) +// defaultStorage.writeToStorage(vertex.hbaseZkAddr, kvs, withWait = true) +// } /** mutate */ def deleteAllAdjacentEdges(srcVertices: Seq[S2Vertex], labels: Seq[Label], @@ -947,7 +966,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph stepInnerResultLs <- Future.sequence(queries.map(getEdgesStepInner(_, true))) (allDeleted, ret) <- deleteAllFetchedEdgesLs(stepInnerResultLs, requestTs) } yield { - // logger.debug(s"fetchAndDeleteAll: ${allDeleted}, ${ret}") + logger.debug(s"fetchAndDeleteAll: ${allDeleted}, ${ret}") (allDeleted, ret) } @@ -993,7 +1012,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph } ret } - + logger.error(s"[FutureSize]: ${futures.size}") if (futures.isEmpty) { // all deleted. Future.successful(true -> true) @@ -1008,6 +1027,8 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph } if (filtered.isEmpty) StepResult.Empty else { + logger.error(s"[buildEdgesToDelete]: ${filtered.size}") + val head = filtered.head val label = head.edge.innerLabel val edgeWithScoreLs = filtered.map { edgeWithScore => @@ -1035,7 +1056,8 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph // edgeWithScore.edge.copy(op = newOp, version = newVersion, propsWithTs = newPropsWithTs) val edgeToDelete = edgeWithScore.copy(edge = copiedEdge) - // logger.debug(s"delete edge from deleteAll: ${edgeToDelete.edge.toLogString}") + logger.error(s"delete edge from deleteAll: ${edgeToDelete.edge.toLogString}") + logger.error(s"delete edge from deleteAll edge: ${edge.toLogString}") edgeToDelete } //Degree edge? @@ -1234,11 +1256,14 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph operation: String = "insert"): S2Edge = { val label = Label.findByName(labelName).getOrElse(throw new LabelNotExistException(labelName)) - val srcVertexIdInnerVal = toInnerVal(srcId, label.srcColumn.columnType, label.schemaVersion) - val tgtVertexIdInnerVal = toInnerVal(tgtId, label.tgtColumn.columnType, label.schemaVersion) + val srcColumn = if (direction == "out") label.srcColumn else label.tgtColumn + val tgtColumn = if (direction == "out") label.tgtColumn else label.srcColumn - val srcVertex = newVertex(SourceVertexId(label.srcColumn, srcVertexIdInnerVal), System.currentTimeMillis()) - val tgtVertex = newVertex(TargetVertexId(label.tgtColumn, tgtVertexIdInnerVal), System.currentTimeMillis()) + val srcVertexIdInnerVal = toInnerVal(srcId, srcColumn.columnType, label.schemaVersion) + val tgtVertexIdInnerVal = toInnerVal(tgtId, tgtColumn.columnType, label.schemaVersion) + + val srcVertex = newVertex(SourceVertexId(srcColumn, srcVertexIdInnerVal), System.currentTimeMillis()) + val tgtVertex = newVertex(TargetVertexId(tgtColumn, tgtVertexIdInnerVal), System.currentTimeMillis()) val dir = GraphUtil.toDir(direction).getOrElse(throw new RuntimeException(s"$direction is not supported.")) val propsPlusTs = props ++ Map(LabelMeta.timestamp.name -> ts) @@ -1551,11 +1576,22 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph override def configuration(): Configuration = apacheConfiguration + override def addVertex(label: String): Vertex = { + if (label == null) throw Element.Exceptions.labelCanNotBeNull + if (label.isEmpty) throw Element.Exceptions.labelCanNotBeEmpty + + addVertex(Seq(T.label, label): _*) + } + override def addVertex(kvs: AnyRef*): structure.Vertex = { if (!features().vertex().supportsUserSuppliedIds() && kvs.contains(T.id)) { throw Vertex.Exceptions.userSuppliedIdsNotSupported } + val kvsMap = S2Property.kvsToProps(kvs) + if (kvsMap.contains(T.label.name()) && kvsMap(T.label.name).toString.isEmpty) + throw Element.Exceptions.labelCanNotBeEmpty + val id = kvsMap.getOrElse(T.id.toString, Random.nextLong) val serviceColumnNames = kvsMap.getOrElse(T.label.toString, DefaultColumn.columnName).toString http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/9ce28472/s2core/src/main/scala/org/apache/s2graph/core/S2Vertex.scala ---------------------------------------------------------------------- diff --git a/s2core/src/main/scala/org/apache/s2graph/core/S2Vertex.scala b/s2core/src/main/scala/org/apache/s2graph/core/S2Vertex.scala index 643b469..797ed98 100644 --- a/s2core/src/main/scala/org/apache/s2graph/core/S2Vertex.scala +++ b/s2core/src/main/scala/org/apache/s2graph/core/S2Vertex.scala @@ -33,6 +33,7 @@ import org.apache.tinkerpop.gremlin.structure.{Direction, Edge, Property, T, Ver import play.api.libs.json.Json import scala.collection.JavaConverters._ +import scala.concurrent.Await case class S2Vertex(graph: S2Graph, id: VertexId, @@ -181,22 +182,32 @@ case class S2Vertex(graph: S2Graph, } } - override def addEdge(label: String, vertex: Vertex, kvs: AnyRef*): Edge = { + override def addEdge(labelName: String, vertex: Vertex, kvs: AnyRef*): Edge = { + val containsId = kvs.contains(T.id) vertex match { case otherV: S2Vertex => - if (!graph.features().edge().supportsUserSuppliedIds() && kvs.contains(T.id)) { + if (!graph.features().edge().supportsUserSuppliedIds() && containsId) { throw Exceptions.userSuppliedIdsNotSupported() } val props = S2Property.kvsToProps(kvs) //TODO: direction, operation, _timestamp need to be reserved property key. - val direction = props.get("direction").getOrElse("out").toString - val ts = props.get(LabelMeta.timestamp.name).map(_.toString.toLong).getOrElse(System.currentTimeMillis()) - val operation = props.get("operation").map(_.toString).getOrElse("insert") try { - graph.addEdgeInner(this, otherV, label, direction, props, ts, operation) + val direction = props.get("direction").getOrElse("out").toString + val ts = props.get(LabelMeta.timestamp.name).map(_.toString.toLong).getOrElse(System.currentTimeMillis()) + val operation = props.get("operation").map(_.toString).getOrElse("insert") + val label = Label.findByName(labelName).getOrElse(throw new LabelNotExistException(labelName)) + val dir = GraphUtil.toDir(direction).getOrElse(throw new RuntimeException(s"$direction is not supported.")) + val propsPlusTs = props ++ Map(LabelMeta.timestamp.name -> ts) + val propsWithTs = label.propsToInnerValsWithTs(propsPlusTs, ts) + val op = GraphUtil.toOp(operation).getOrElse(throw new RuntimeException(s"$operation is not supported.")) + + val edge = graph.newEdge(this, otherV, label, dir, op = op, version = ts, propsWithTs = propsWithTs) + val future = graph.mutateEdges(edge.relatedEdges, withWait = true) + Await.ready(future, graph.WaitTimeout) + edge } catch { case e: LabelNotExistException => throw new java.lang.IllegalArgumentException } @@ -239,6 +250,27 @@ case class S2Vertex(graph: S2Graph, override def remove(): Unit = { if (graph.features().vertex().supportsRemoveVertices()) { // remove edge + // TODO: remove related edges also. + implicit val ec = graph.ec + val ts = System.currentTimeMillis() + val outLabels = Label.findBySrcColumnId(id.colId) + val inLabels = Label.findByTgtColumnId(id.colId) + val verticesToDelete = Seq(this.copy(op = GraphUtil.operations("delete"))) + val outFuture = graph.deleteAllAdjacentEdges(verticesToDelete, outLabels, GraphUtil.directions("out"), ts) + val inFuture = graph.deleteAllAdjacentEdges(verticesToDelete, inLabels, GraphUtil.directions("in"), ts) + val vertexFuture = graph.mutateVertices(verticesToDelete, withWait = true) + val future = for { + outSuccess <- outFuture + inSuccess <- inFuture + vertexSuccess <- vertexFuture + } yield { + if (!outSuccess) throw new RuntimeException("Vertex.remove out direction edge delete failed.") + if (!inSuccess) throw new RuntimeException("Vertex.remove in direction edge delete failed.") + if (!vertexSuccess.forall(identity)) throw new RuntimeException("Vertex.remove vertex delete failed.") + true + } + Await.result(future, graph.WaitTimeout) + } else { throw Vertex.Exceptions.vertexRemovalNotSupported() } http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/9ce28472/s2core/src/main/scala/org/apache/s2graph/core/features/S2ElementFeatures.scala ---------------------------------------------------------------------- diff --git a/s2core/src/main/scala/org/apache/s2graph/core/features/S2ElementFeatures.scala b/s2core/src/main/scala/org/apache/s2graph/core/features/S2ElementFeatures.scala index 06f1c68..7e66c62 100644 --- a/s2core/src/main/scala/org/apache/s2graph/core/features/S2ElementFeatures.scala +++ b/s2core/src/main/scala/org/apache/s2graph/core/features/S2ElementFeatures.scala @@ -3,7 +3,7 @@ package org.apache.s2graph.core.features import org.apache.tinkerpop.gremlin.structure.Graph.Features abstract class S2ElementFeatures extends Features.ElementFeatures { - override def supportsStringIds(): Boolean = true + override def supportsStringIds(): Boolean = false override def supportsCustomIds(): Boolean = true @@ -15,7 +15,7 @@ abstract class S2ElementFeatures extends Features.ElementFeatures { override def supportsUserSuppliedIds(): Boolean = true - override def supportsAnyIds(): Boolean = true + override def supportsAnyIds(): Boolean = false override def supportsNumericIds(): Boolean = false http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/9ce28472/s2core/src/main/scala/org/apache/s2graph/core/features/S2VertexPropertyFeatures.scala ---------------------------------------------------------------------- diff --git a/s2core/src/main/scala/org/apache/s2graph/core/features/S2VertexPropertyFeatures.scala b/s2core/src/main/scala/org/apache/s2graph/core/features/S2VertexPropertyFeatures.scala index 592cc0b..fe74c85 100644 --- a/s2core/src/main/scala/org/apache/s2graph/core/features/S2VertexPropertyFeatures.scala +++ b/s2core/src/main/scala/org/apache/s2graph/core/features/S2VertexPropertyFeatures.scala @@ -18,7 +18,7 @@ class S2VertexPropertyFeatures extends S2PropertyFeatures with Features.VertexPr override def supportsUuidIds(): Boolean = false - override def supportsCustomIds(): Boolean = false + override def supportsCustomIds(): Boolean = true override def supportsAnyIds(): Boolean = false } http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/9ce28472/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala ---------------------------------------------------------------------- diff --git a/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala index 741be06..e0fc765 100644 --- a/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala +++ b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala @@ -41,12 +41,14 @@ class S2GraphProvider extends AbstractGraphProvider { if (graph != null) { val s2Graph = graph.asInstanceOf[S2Graph] if (s2Graph.isRunning) { - val labels = Label.findAll() - labels.groupBy(_.hbaseTableName).values.foreach { labelsWithSameTable => - labelsWithSameTable.headOption.foreach { label => - s2Graph.management.truncateStorage(label.label) - } - } +// val labels = Label.findAll() +// labels.groupBy(_.hbaseTableName).values.foreach { labelsWithSameTable => +// labelsWithSameTable.headOption.foreach { label => +// s2Graph.management.truncateStorage(label.label) +// } +// } +// s2Graph.shutdown(modelDataDelete = true) + cleanupSchema(graph) s2Graph.shutdown(modelDataDelete = true) logger.info("S2Graph Shutdown") } @@ -61,6 +63,24 @@ class S2GraphProvider extends AbstractGraphProvider { } } + private def cleanupSchema(graph: Graph): Unit = { + val s2Graph = graph.asInstanceOf[S2Graph] + val mnt = s2Graph.getManagement() + val defaultService = s2Graph.DefaultService + val defaultServiceColumn = s2Graph.DefaultColumn + + val columnNames = Set(defaultServiceColumn.columnName, "person", "software", "product", "dog") + val labelNames = Set("knows", "created", "bought", "test", "self", "friends", "friend", "hate", "collaborator", "test1", "test2", "test3", "pets", "walks", "knows") + + Management.deleteService(defaultService.serviceName) + columnNames.foreach { columnName => + Management.deleteColumn(defaultServiceColumn.service.serviceName, columnName) + } + labelNames.foreach { labelName => + Management.deleteLabel(labelName) + } + } + override def loadGraphData(graph: Graph, loadGraphWith: LoadGraphWith, testClass: Class[_], testName: String): Unit = { val s2Graph = graph.asInstanceOf[S2Graph] val mnt = s2Graph.getManagement() @@ -74,14 +94,17 @@ class S2GraphProvider extends AbstractGraphProvider { var knowsProp = Vector( Prop("weight", "0.0", "double"), Prop("data", "-", "string"), - Prop("year", "-1", "integer"), + Prop("year", "0", "integer"), Prop("boolean", "false", "boolean"), Prop("float", "0.0", "float"), Prop("double", "0.0", "double"), Prop("long", "0.0", "long"), Prop("string", "-", "string"), - Prop("integer", "-", "integer"), - Prop("aKey", "-", "string") + Prop("integer", "0", "integer"), + Prop("aKey", "-", "string"), + Prop("stars", "0", "integer"), + Prop("since", "0", "integer"), + Prop("myEdgeId", "0", "integer") ) // Change dataType for ColumnMeta('aKey') for PropertyFeatureSupportTest @@ -115,12 +138,15 @@ class S2GraphProvider extends AbstractGraphProvider { } // knows props - if (testClass.getSimpleName == "EdgeTest" && testName == "shouldAutotypeDoubleProperties") { +// mnt.createLabel("knows", defaultService.serviceName, "vertex", "string", defaultService.serviceName, "vertex", "string", +// true, defaultService.serviceName, Nil, knowsProp, "strong", None, None, options = Option("""{"skipReverse": false}""")) + + if (testClass.getSimpleName.contains("VertexTest") || (testClass.getSimpleName == "EdgeTest" && testName == "shouldAutotypeDoubleProperties")) { mnt.createLabel("knows", defaultService.serviceName, "vertex", "string", defaultService.serviceName, "vertex", "string", - true, defaultService.serviceName, Nil, knowsProp, "strong", None, None, options = Option("""{"skipReverse": true}""")) + true, defaultService.serviceName, Nil, knowsProp, "strong", None, None, options = Option("""{"skipReverse": false}""")) } else { mnt.createLabel("knows", defaultService.serviceName, "person", "integer", defaultService.serviceName, "person", "integer", - true, defaultService.serviceName, Nil, knowsProp, "strong", None, None, options = Option("""{"skipReverse": true}""")) + true, defaultService.serviceName, Nil, knowsProp, "strong", None, None, options = Option("""{"skipReverse": false}""")) } val personColumn = Management.createServiceColumn(defaultService.serviceName, "person", "integer", Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), Prop("age", "0", "integer"), Prop("location", "-", "string"))) @@ -186,6 +212,21 @@ class S2GraphProvider extends AbstractGraphProvider { true, defaultService.serviceName, Nil, Nil, "weak", None, None, options = Option("""{"skipReverse": false}""") ) + val pets = mnt.createLabel("pets", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, + true, defaultService.serviceName, Nil, Nil, "weak", None, None, + options = Option("""{"skipReverse": false}""") + ) + val walks = mnt.createLabel("walks", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, + true, defaultService.serviceName, Nil, + Seq( + Prop("location", "-", "string") + ), "weak", None, None, + options = Option("""{"skipReverse": false}""") + ) + val livesWith = mnt.createLabel("livesWith", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, + true, defaultService.serviceName, Nil, Nil, "weak", None, None, + options = Option("""{"skipReverse": false}""") + ) super.loadGraphData(graph, loadGraphWith, testClass, testName) } http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/9ce28472/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 e69004c..28a16d3 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 @@ -24,7 +24,7 @@ import org.apache.s2graph.core.mysqls.Label import org.apache.s2graph.core.utils.logger import org.apache.s2graph.core.{Management, S2Graph, S2Vertex, TestCommonWithModels} import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal -import org.apache.tinkerpop.gremlin.structure.{Edge, T, Vertex} +import org.apache.tinkerpop.gremlin.structure.{Direction, Edge, T, Vertex} import org.scalatest.{FunSuite, Matchers} @@ -181,7 +181,59 @@ class S2GraphTest extends FunSuite with Matchers with TestCommonWithModels { // logger.error(x) } - test("addVertex with empty parameter") { +// test("addVertex with empty parameter") { +// +// } + test("aaa") { + val mnt = graph.management + val defaultService = graph.DefaultService + val defaultServiceColumn = graph.DefaultColumn + val columnNames = Set(defaultServiceColumn.columnName, "person", "software", "product", "dog") + val labelNames = Set("knows", "created", "bought", "test", "self", "friends", "friend", "hate", "collaborator", "test1", "test2", "test3", "pets", "walks", "knows") + + Management.deleteService(defaultService.serviceName) + columnNames.foreach { columnName => + Management.deleteColumn(defaultServiceColumn.service.serviceName, columnName) + } + labelNames.foreach { labelName => + Management.deleteLabel(labelName) + } + + val knows = mnt.createLabel("knows", + defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, + defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, + true, defaultService.serviceName, Nil, Seq(Prop("since", "0", "integer")), "strong", None, None, + options = Option("""{"skipReverse": false}""")) + + val pets = mnt.createLabel("pets", + defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, + defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, + true, defaultService.serviceName, Nil, Nil, "strong", None, None, + options = Option("""{"skipReverse": false}""")) + + val walks = mnt.createLabel("walks", + defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, + defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, + true, defaultService.serviceName, Nil, Seq(Prop("location", "-", "string")), "strong", None, None, + options = Option("""{"skipReverse": false}""")) + + val livesWith = mnt.createLabel("livesWith", + defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, + defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, + true, defaultService.serviceName, Nil, Nil, "strong", None, None, + options = Option("""{"skipReverse": false}""")) + + (0 until 2).foreach(i => graph.addVertex("myId", Int.box(i))) + + graph.vertices().foreach(v => + graph.vertices().foreach(u => v.addEdge("knows", u, "myEdgeId", Int.box(12))) + ) + + val v = graph.vertices().toSeq.head + v.remove() + graph.edges().foreach(e => + logger.error(s"[Edge]: $e") + ) } } \ No newline at end of file
