[ 
https://issues.apache.org/jira/browse/S2GRAPH-170?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16241588#comment-16241588
 ] 

DOYUNG YOON commented on S2GRAPH-170:
-------------------------------------

So far, I have removed SelfType on `S2EdgeLike/S2VertexLike` class(not yet 
started with S2GraphLike). works can be found on 
[here|https://github.com/SteamShon/incubator-s2graph/commits/S2GRAPH-170]. 

In summary following is how our interface looks like so far.

h4. S2VertexLike

{noformat}
trait S2VertexLike extends Vertex with GraphElement {
  val graph: S2Graph
  val id: VertexId
  val ts: Long
  val props: Props
  val op: Byte
  val belongLabelIds: Seq[Int]

  val innerId = id.innerId
  
  val innerIdVal = innerId.value

  val builder = new S2VertexBuilder(this)

  def label(): String = serviceColumn.columnName

  def schemaVer = serviceColumn.schemaVersion

  def serviceColumn = ServiceColumn.findById(id.colId)

  def columnName = serviceColumn.columnName

  lazy val service = Service.findById(serviceColumn.serviceId)

  lazy val (hbaseZkAddr, hbaseTableName) = (service.cluster, service.hTableName)

  def defaultProps: util.HashMap[String, S2VertexProperty[_]]

  def toLogString(): String

  def vertices(direction: Direction, edgeLabels: String*): util.Iterator[Vertex]

  def edges(direction: Direction, labelNames: String*): util.Iterator[Edge]
  
  def propertyInner[V](cardinality: Cardinality, key: String, value: V, 
objects: AnyRef*): VertexProperty[V]

  def property[V](cardinality: Cardinality, key: String, value: V, objects: 
AnyRef*): VertexProperty[V]

  def addEdge(labelName: String, vertex: Vertex, kvs: AnyRef*): Edge

  def property[V](key: String): VertexProperty[V] 

  def properties[V](keys: String*): util.Iterator[VertexProperty[V]]

  def remove(): Unit
}
{noformat}


h4. S2EdgeLike 
{noformat}
trait S2EdgeLike extends Edge with GraphElement {
  /* immutable variable */  
  val innerGraph: S2Graph
  val srcVertex: S2VertexLike
  var tgtVertex: S2VertexLike
  val innerLabel: Label
  val dir: Int

  /* mutable variable */
  var op: Byte
  var version: Long
  var tsInnerValOpt: Option[InnerValLike]

  val propsWithTs: Props = S2Edge.EmptyProps

  /* only internal usage variables */
  val parentEdges: Seq[EdgeWithScore] = Nil
  val originalEdgeOpt: Option[S2EdgeLike] = None
  val pendingEdgeOpt: Option[S2EdgeLike] = None
  val statusCode: Byte = 0
  val lockTs: Option[Long] = None

  lazy val ts: Long

  private lazy val operation: String
  private lazy val direction: String
  private lazy val tsInnerVal: Any

  /* getter/setter */
  def graph(): Graph

  lazy val edgeId: EdgeId

  def id(): AnyRef

  def label(): String

  def getLabelId(): Int

  def getDirection(): String

  def getOperation(): String

  def getTsInnerValValue(): Any

  def isDirected(): Boolean

  def getTs(): Long = ts
  
  def getOriginalEdgeOpt(): Option[S2EdgeLike]
  
  def getParentEdges(): Seq[EdgeWithScore]
  
  def getPendingEdgeOpt(): Option[S2EdgeLike]
  
  def getPropsWithTs(): Props
  
  def getLockTs(): Option[Long]
  
  def getStatusCode(): Byte
  
  def getDir(): Int
  
  def setTgtVertex(v: S2VertexLike): Unit
  
  def getOp(): Byte
  
  def setOp(newOp: Byte): Unit
  
  def getVersion(): Long
  
  def setVersion(newVersion: Long): Unit
  
  def getTsInnerValOpt(): Option[InnerValLike]
  
  def setTsInnerValOpt(newTsInnerValOpt: Option[InnerValLike]): Unit

  /* conversion helper used internal */
  def toSnapshotEdge: SnapshotEdge

  def toIndexEdge(labelIndexSeq: Byte): IndexEdge

  /* property related helper */
  def updatePropsWithTs(others: Props = S2Edge.EmptyProps): Props

  def propertyValue(key: String): Option[InnerValLikeWithTs]

  def propertyValueInner(labelMeta: LabelMeta): InnerValLikeWithTs

  def propertyValues(keys: Seq[String] = Nil): Map[LabelMeta, 
InnerValLikeWithTs]

  def propertyValuesInner(labelMetas: Seq[LabelMeta] = Nil): Map[LabelMeta, 
InnerValLikeWithTs]


  /* copy helper */
  def checkProperty(key: String): Boolean

  def copyEdgeWithState(state: State): S2EdgeLike

  def copyOp(newOp: Byte): S2EdgeLike

  def copyVersion(newVersion: Long): S2EdgeLike

  def copyParentEdges(parents: Seq[EdgeWithScore]): S2EdgeLike

  def copyOriginalEdgeOpt(newOriginalEdgeOpt: Option[S2EdgeLike]): S2EdgeLike

  def copyStatusCode(newStatusCode: Byte): S2EdgeLike

  def copyLockTs(newLockTs: Option[Long]): S2EdgeLike

  def copyTs(newTs: Long): S2EdgeLike

  def updateTgtVertex(id: InnerValLike): S2EdgeLike

  /* tinkerpop Edge interface */
  def vertices(direction: Direction): util.Iterator[structure.Vertex] 

  def properties[V](keys: String*): util.Iterator[Property[V]]

  def property[V](key: String): Property[V]

  def property[V](key: String, value: V): Property[V]

  def propertyInner[V](key: String, value: V, ts: Long): Property[V]

  def remove(): Unit

  /* GraphElement interface */
  def toLogString: String
}
{noformat}

There are many methods and variables that we can provide default 
implementation, for example, edgeId and all getter/setter etc. 

Even though SelfType can be removed, I hope more thought goes on what will be 
exposed on S2VertexLike/S2EdgeLike.

Please keep in mind that above is just an example so please give more thought.

> Create Interface for S2Edge/S2Vertex/S2Graph.
> ---------------------------------------------
>
>                 Key: S2GRAPH-170
>                 URL: https://issues.apache.org/jira/browse/S2GRAPH-170
>             Project: S2Graph
>          Issue Type: Improvement
>    Affects Versions: 0.2.1
>            Reporter: DOYUNG YOON
>             Fix For: 0.2.1
>
>   Original Estimate: 504h
>  Remaining Estimate: 504h
>
> h2. Problem Statement
> S2Graph’s entire code base is dependent on S2Edge/S2Vertex/S2Graph class. 
> Even though lots of code touch theses two class, there is no interface 
> defined currently. This means lots of code is interact with these class in 
> different way all by their own way, and this make extremely hard to make any 
> change on these two classes.
> For example, I was working on S2GRAPH-80 to provide java client, and there 
> are too many places to be changed since all theses places use concrete 
> implementation class S2Edge/S2Vertex/S2Graph, not the interfaces. Not just 
> for S2GRAPH-80, but any other issues that need to change theses classes would 
> benefit by communicating through interface.
> h2. Suggestion
> Define interface and change code base to communicate through theses 
> interfaces.
> # Create interface S2Edge/S2Vertex/S2Graph that implement Tinkerpop’s 
> Edge/Vertex/Graph interface 
> # Extract tinkerpop interface related implementations
> # Change caller of S2Edge/S2Vertex/S2Graph to call interface rather than 
> concrete implementation.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to