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/11/19 02:28:57 UTC

[14/23] incubator-s2graph git commit: remove SelfType bidirectional dependencies on S2VertexLike.

remove SelfType bidirectional dependencies on S2VertexLike.


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

Branch: refs/heads/master
Commit: 5f2d4ffc161abac372a7a1d4cbadc89cce45a84b
Parents: 3514060
Author: DO YUNG YOON <st...@apache.org>
Authored: Tue Nov 7 11:41:42 2017 +0900
Committer: DO YUNG YOON <st...@apache.org>
Committed: Tue Nov 7 11:41:42 2017 +0900

----------------------------------------------------------------------
 .../org/apache/s2graph/core/PostProcess.scala   |  6 +-
 .../scala/org/apache/s2graph/core/S2Graph.scala | 25 +++++++-
 .../apache/s2graph/core/S2VertexBuilder.scala   | 35 +++++++++++
 .../org/apache/s2graph/core/S2VertexLike.scala  | 63 ++++----------------
 4 files changed, 74 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/5f2d4ffc/s2core/src/main/scala/org/apache/s2graph/core/PostProcess.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/PostProcess.scala b/s2core/src/main/scala/org/apache/s2graph/core/PostProcess.scala
index 900bbbd..7047214 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/PostProcess.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/PostProcess.scala
@@ -147,9 +147,9 @@ object PostProcess {
 
   def s2VertexToJson(s2Vertex: S2VertexLike): Option[JsValue] = {
     val props = for {
-      (k, v) <- s2Vertex.properties
-      jsVal <- anyValToJsValue(v)
-    } yield k -> jsVal
+      (_, property) <- s2Vertex.props
+      jsVal <- anyValToJsValue(property.value)
+    } yield property.columnMeta.name -> jsVal
 
     for {
       id <- anyValToJsValue(s2Vertex.innerIdVal)

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/5f2d4ffc/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 3270e84..fc1205d 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala
@@ -33,7 +33,7 @@ import org.apache.s2graph.core.storage.{MutateResponse, Storage}
 import org.apache.s2graph.core.types._
 import org.apache.s2graph.core.utils.{DeferCache, Extensions, logger}
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies
-import org.apache.tinkerpop.gremlin.structure.{Edge, Graph}
+import org.apache.tinkerpop.gremlin.structure.{Direction, Edge, Graph}
 
 import scala.collection.JavaConversions._
 import scala.collection.mutable
@@ -733,6 +733,29 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends S2Grap
     }
   }
 
+  def edgesAsync(vertex: S2VertexLike, direction: Direction, labelNames: String*): Future[util.Iterator[Edge]] = {
+    val labelNameWithDirs =
+      if (labelNames.isEmpty) {
+        // TODO: Let's clarify direction
+        if (direction == Direction.BOTH) {
+          Label.findBySrcColumnId(vertex.id.colId).map(l => l.label -> Direction.OUT.name) ++
+            Label.findByTgtColumnId(vertex.id.colId).map(l => l.label -> Direction.IN.name)
+        } else if (direction == Direction.IN) {
+          Label.findByTgtColumnId(vertex.id.colId).map(l => l.label -> direction.name)
+        } else {
+          Label.findBySrcColumnId(vertex.id.colId).map(l => l.label -> direction.name)
+        }
+      } else {
+        direction match {
+          case Direction.BOTH =>
+            Seq(Direction.OUT, Direction.IN).flatMap { dir => labelNames.map(_ -> dir.name()) }
+          case _ => labelNames.map(_ -> direction.name())
+        }
+      }
+
+    fetchEdgesAsync(vertex, labelNameWithDirs.distinct)
+  }
+
   /** mutate */
   def deleteAllAdjacentEdges(srcVertices: Seq[S2VertexLike],
                              labels: Seq[Label],

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/5f2d4ffc/s2core/src/main/scala/org/apache/s2graph/core/S2VertexBuilder.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/S2VertexBuilder.scala b/s2core/src/main/scala/org/apache/s2graph/core/S2VertexBuilder.scala
new file mode 100644
index 0000000..4a75036
--- /dev/null
+++ b/s2core/src/main/scala/org/apache/s2graph/core/S2VertexBuilder.scala
@@ -0,0 +1,35 @@
+package org.apache.s2graph.core
+
+import java.util
+import java.util.function.BiConsumer
+
+import org.apache.s2graph.core.S2Vertex.Props
+import org.apache.s2graph.core.mysqls.ColumnMeta
+import org.apache.s2graph.core.types.VertexId
+
+class S2VertexBuilder(vertex: S2VertexLike) {
+  def defaultProps: util.HashMap[String, S2VertexProperty[_]] = {
+    val default = S2Vertex.EmptyProps
+    val newProps = new S2VertexProperty(vertex, ColumnMeta.lastModifiedAtColumn, ColumnMeta.lastModifiedAtColumn.name, vertex.ts)
+    default.put(ColumnMeta.lastModifiedAtColumn.name, newProps)
+    default
+  }
+
+  def copyVertex(graph: S2Graph = vertex.graph,
+                 id: VertexId = vertex.id,
+                 ts: Long = vertex.ts,
+                 props: Props = vertex.props,
+                 op: Byte = vertex.op,
+                 belongLabelIds: Seq[Int] = vertex.belongLabelIds): S2VertexLike = {
+    val newProps = S2Vertex.EmptyProps
+    val v = new S2Vertex(graph, id, ts, newProps, op, belongLabelIds)
+
+    props.forEach(new BiConsumer[String, S2VertexProperty[_]] {
+      override def accept(t: String, u: S2VertexProperty[_]) = {
+        v.property(t, u)
+      }
+    })
+
+    v
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/5f2d4ffc/s2core/src/main/scala/org/apache/s2graph/core/S2VertexLike.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/S2VertexLike.scala b/s2core/src/main/scala/org/apache/s2graph/core/S2VertexLike.scala
index 9ec2ab0..29db49d 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/S2VertexLike.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/S2VertexLike.scala
@@ -9,12 +9,10 @@ import org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality
 import org.apache.tinkerpop.gremlin.structure.{Direction, Edge, T, Vertex, VertexProperty}
 import play.api.libs.json.Json
 
-import scala.concurrent.{Await, Future}
 import scala.collection.JavaConverters._
+import scala.concurrent.Await
 
 trait S2VertexLike extends Vertex with GraphElement {
-  this: S2Vertex =>
-
   val graph: S2Graph
   val id: VertexId
   val ts: Long
@@ -23,12 +21,12 @@ trait S2VertexLike extends Vertex with GraphElement {
   val belongLabelIds: Seq[Int]
 
   val innerId = id.innerId
+  
   val innerIdVal = innerId.value
 
+  val builder = new S2VertexBuilder(this)
 
-  lazy val properties = for {
-    (k, v) <- props.asScala
-  } yield v.columnMeta.name -> v.value
+  def label(): String = serviceColumn.columnName
 
   def schemaVer = serviceColumn.schemaVersion
 
@@ -37,20 +35,16 @@ trait S2VertexLike extends Vertex with GraphElement {
   def columnName = serviceColumn.columnName
 
   lazy val service = Service.findById(serviceColumn.serviceId)
-  lazy val (hbaseZkAddr, hbaseTableName) = (service.cluster, service.hTableName)
 
-  def defaultProps = {
-    val default = S2Vertex.EmptyProps
-    val newProps = new S2VertexProperty(this, ColumnMeta.lastModifiedAtColumn, ColumnMeta.lastModifiedAtColumn.name, ts)
-    default.put(ColumnMeta.lastModifiedAtColumn.name, newProps)
-    default
-  }
+  lazy val (hbaseZkAddr, hbaseTableName) = (service.cluster, service.hTableName)
 
-  def propsWithName = for {
-    (k, v) <- props.asScala
-  } yield (v.columnMeta.name -> v.value.toString)
+  def defaultProps: util.HashMap[String, S2VertexProperty[_]] = builder.defaultProps
 
   def toLogString(): String = {
+    val propsWithName = for {
+      (k, v) <- props.asScala
+    } yield (v.columnMeta.name -> v.value.toString)
+
     val (serviceName, columnName) =
       if (!id.storeColId) ("", "")
       else (serviceColumn.service.serviceName, serviceColumn.columnName)
@@ -61,12 +55,6 @@ trait S2VertexLike extends Vertex with GraphElement {
       Seq(ts, GraphUtil.fromOp(op), "v", id.innerId, serviceName, columnName).mkString("\t")
   }
 
-  def copyVertexWithState(props: Props): S2VertexLike = {
-    val newVertex = copy(props = S2Vertex.EmptyProps)
-    S2Vertex.fillPropsWithTs(newVertex, props)
-    newVertex
-  }
-
   def vertices(direction: Direction, edgeLabels: String*): util.Iterator[Vertex] = {
     val arr = new util.ArrayList[Vertex]()
     edges(direction, edgeLabels: _*).forEachRemaining(new Consumer[Edge] {
@@ -166,23 +154,19 @@ trait S2VertexLike extends Vertex with GraphElement {
     ls.iterator
   }
 
-  def label(): String = {
-    serviceColumn.columnName
-  }
-
   def remove(): Unit = {
     if (graph.features().vertex().supportsRemoveVertices()) {
       // remove edge
       // TODO: remove related edges also.
       implicit val ec = graph.ec
 
-      val verticesToDelete = Seq(this.copy(op = GraphUtil.operations("delete")))
+      val verticesToDelete = Seq(builder.copyVertex(op = GraphUtil.operations("delete")))
 
       val vertexFuture = graph.mutateVertices(verticesToDelete, withWait = true)
 
       val future = for {
         vertexSuccess <- vertexFuture
-        edges <- edgesAsync(Direction.BOTH)
+        edges <- graph.edgesAsync(this, Direction.BOTH)
       } yield {
         edges.asScala.toSeq.foreach { edge => edge.remove() }
         if (!vertexSuccess.forall(_.isSuccess)) throw new RuntimeException("Vertex.remove vertex delete failed.")
@@ -195,27 +179,4 @@ trait S2VertexLike extends Vertex with GraphElement {
       throw Vertex.Exceptions.vertexRemovalNotSupported()
     }
   }
-
-  private def edgesAsync(direction: Direction, labelNames: String*): Future[util.Iterator[Edge]] = {
-    val labelNameWithDirs =
-      if (labelNames.isEmpty) {
-        // TODO: Let's clarify direction
-        if (direction == Direction.BOTH) {
-          Label.findBySrcColumnId(id.colId).map(l => l.label -> Direction.OUT.name) ++
-            Label.findByTgtColumnId(id.colId).map(l => l.label -> Direction.IN.name)
-        } else if (direction == Direction.IN) {
-          Label.findByTgtColumnId(id.colId).map(l => l.label -> direction.name)
-        } else {
-          Label.findBySrcColumnId(id.colId).map(l => l.label -> direction.name)
-        }
-      } else {
-        direction match {
-          case Direction.BOTH =>
-            Seq(Direction.OUT, Direction.IN).flatMap { dir => labelNames.map(_ -> dir.name()) }
-          case _ => labelNames.map(_ -> direction.name())
-        }
-      }
-
-    graph.fetchEdgesAsync(this, labelNameWithDirs.distinct)
-  }
 }