Repository: incubator-s2graph
Updated Branches:
  refs/heads/master b91b8399b -> 26e4d43cf


http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/d05d8a49/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/indexedge/wide/IndexEdgeDeserializable.scala
----------------------------------------------------------------------
diff --git 
a/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/indexedge/wide/IndexEdgeDeserializable.scala
 
b/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/indexedge/wide/IndexEdgeDeserializable.scala
index 09d7f4c..6818c1d 100644
--- 
a/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/indexedge/wide/IndexEdgeDeserializable.scala
+++ 
b/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/indexedge/wide/IndexEdgeDeserializable.scala
@@ -65,8 +65,8 @@ class IndexEdgeDeserializable(graph: S2Graph,
            val degreeVal = bytesToLongFunc(kv.value, 0)
            val tgtVertexId = VertexId(ServiceColumn.Default, 
InnerVal.withStr("0", schemaVer))
 
-           edge.property(LabelMeta.timestamp.name, version, version)
-           edge.property(LabelMeta.degree.name, degreeVal, version)
+           edge.propertyInner(LabelMeta.timestamp.name, version, version)
+           edge.propertyInner(LabelMeta.degree.name, degreeVal, version)
            edge.tgtVertex = graph.newVertex(tgtVertexId, version)
            edge.op = GraphUtil.defaultOpByte
            edge.tsInnerValOpt = Option(InnerVal.withLong(tsVal, schemaVer))
@@ -95,9 +95,9 @@ class IndexEdgeDeserializable(graph: S2Graph,
              if (k == LabelMeta.timestamp) tsVal = 
v.value.asInstanceOf[BigDecimal].longValue()
 
              if (k == LabelMeta.degree) {
-               edge.property(LabelMeta.degree.name, v.value, version)
+               edge.propertyInner(LabelMeta.degree.name, v.value, version)
              } else {
-               edge.property(meta.name, v.value, version)
+               edge.propertyInner(meta.name, v.value, version)
              }
            }
 
@@ -105,13 +105,13 @@ class IndexEdgeDeserializable(graph: S2Graph,
            if (op == GraphUtil.operations("incrementCount")) {
              //        val countVal = Bytes.toLong(kv.value)
              val countVal = bytesToLongFunc(kv.value, 0)
-             edge.property(LabelMeta.count.name, countVal, version)
+             edge.propertyInner(LabelMeta.count.name, countVal, version)
            } else {
              val (props, endAt) = bytesToKeyValues(kv.value, 0, 
kv.value.length, schemaVer, label)
              props.foreach { case (k, v) =>
                if (k == LabelMeta.timestamp) tsVal = 
v.value.asInstanceOf[BigDecimal].longValue()
 
-               edge.property(k.name, v.value, version)
+               edge.propertyInner(k.name, v.value, version)
              }
            }
            /** process tgtVertexId */
@@ -121,7 +121,7 @@ class IndexEdgeDeserializable(graph: S2Graph,
                TargetVertexId(ServiceColumn.Default, vId.innerVal)
              } else tgtVertexIdRaw
 
-           edge.property(LabelMeta.timestamp.name, tsVal, version)
+           edge.propertyInner(LabelMeta.timestamp.name, tsVal, version)
            edge.tgtVertex = graph.newVertex(tgtVertexId, version)
            edge.op = op
            edge.tsInnerValOpt = Option(InnerVal.withLong(tsVal, schemaVer))

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/d05d8a49/s2core/src/main/scala/org/apache/s2graph/core/types/VertexId.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/types/VertexId.scala 
b/s2core/src/main/scala/org/apache/s2graph/core/types/VertexId.scala
index eb2d42a..9d3ea72 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/types/VertexId.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/types/VertexId.scala
@@ -20,7 +20,7 @@
 package org.apache.s2graph.core.types
 
 import org.apache.hadoop.hbase.util.Bytes
-import org.apache.s2graph.core.GraphUtil
+import org.apache.s2graph.core.{GraphUtil, S2Vertex}
 import org.apache.s2graph.core.mysqls.ServiceColumn
 import org.apache.s2graph.core.types.HBaseType._
 
@@ -67,8 +67,9 @@ class VertexId (val column: ServiceColumn, val innerId: 
InnerValLike) extends HB
   def bytes: Array[Byte] = Bytes.add(hashBytes, innerId.bytes, colIdBytes)
 
   override def toString(): String = {
-    column.id.get.toString() + "," + innerId.toString()
-//    s"VertexId($colId, $innerId)"
+    //    column.id.get.toString() + "," + innerId.toString()
+    val del = S2Vertex.VertexLabelDelimiter
+    s"${column.service.serviceName}${del}${column.columnName}${del}${innerId}"
   }
 
   override def hashCode(): Int = {
@@ -96,6 +97,7 @@ class VertexId (val column: ServiceColumn, val innerId: 
InnerValLike) extends HB
   def <=(other: VertexId): Boolean = compareTo(other) <= 0
   def >(other: VertexId): Boolean = compareTo(other) > 0
   def >=(other: VertexId): Boolean = compareTo(other) >= 0
+
 }
 
 object SourceVertexId extends HBaseDeserializable {

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/d05d8a49/s2core/src/main/scala/org/apache/s2graph/core/utils/SafeUpdateCache.scala
----------------------------------------------------------------------
diff --git 
a/s2core/src/main/scala/org/apache/s2graph/core/utils/SafeUpdateCache.scala 
b/s2core/src/main/scala/org/apache/s2graph/core/utils/SafeUpdateCache.scala
index 13eb1a3..c54dcde 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/utils/SafeUpdateCache.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/utils/SafeUpdateCache.scala
@@ -77,6 +77,8 @@ class SafeUpdateCache[T](prefix: String, maxSize: Int, ttl: 
Int)(implicit execut
     }
   }
 
+  def invalidateAll() = cache.invalidateAll()
+
   def getAllData() : List[(String, T)] = {
     cache.asMap().map { case (key, value) =>
       (key.key.substring(prefix.size + 1), value._1)

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/d05d8a49/s2core/src/test/scala/org/apache/s2graph/core/Integrate/tinkerpop/S2GraphTest.scala
----------------------------------------------------------------------
diff --git 
a/s2core/src/test/scala/org/apache/s2graph/core/Integrate/tinkerpop/S2GraphTest.scala
 
b/s2core/src/test/scala/org/apache/s2graph/core/Integrate/tinkerpop/S2GraphTest.scala
deleted file mode 100644
index 3eb04ff..0000000
--- 
a/s2core/src/test/scala/org/apache/s2graph/core/Integrate/tinkerpop/S2GraphTest.scala
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.s2graph.core.Integrate.tinkerpop
-
-import org.apache.s2graph.core.mysqls.Label
-import org.apache.s2graph.core.utils.logger
-import org.apache.s2graph.core.{S2Graph, TestCommonWithModels, S2Vertex}
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal
-import org.apache.tinkerpop.gremlin.structure.{Edge, Vertex, T}
-import org.scalatest.{FunSuite, Matchers}
-
-
-class S2GraphTest extends FunSuite with Matchers with TestCommonWithModels {
-
-  import scala.collection.JavaConversions._
-  import scala.concurrent.ExecutionContext.Implicits.global
-
-  initTests()
-
-  val g = new S2Graph(config)
-
-  def printEdges(edges: Seq[Edge]): Unit = {
-    edges.foreach { edge =>
-      logger.debug(s"[FetchedEdge]: $edge")
-    }
-  }
-
-  import scala.language.implicitConversions
-
-  def newVertexId(id: Any, label: Label = labelV2) = 
g.newVertexId(label.srcService, label.srcColumn, id)
-
-  def addVertex(id: AnyRef, label: Label = labelV2) =
-    g.addVertex(T.label, label.srcService.serviceName + 
S2Vertex.VertexLabelDelimiter + label.srcColumnName,
-      T.id, id).asInstanceOf[S2Vertex]
-
-  val srcId = Long.box(20)
-  val range = (100 until 110)
-  testData(srcId, range)
-
-  //  val testProps = Seq(
-  //    Prop("affinity_score", "0.0", DOUBLE),
-  //    Prop("is_blocked", "false", BOOLEAN),
-  //    Prop("time", "0", INT),
-  //    Prop("weight", "0", INT),
-  //    Prop("is_hidden", "true", BOOLEAN),
-  //    Prop("phone_number", "xxx-xxx-xxxx", STRING),
-  //    Prop("score", "0.1", FLOAT),
-  //    Prop("age", "10", INT)
-  //  )
-  def testData(srcId: AnyRef, range: Range, label: Label = labelV2) = {
-    val src = addVertex(srcId)
-
-    for {
-      i <- range
-    } {
-      val tgt = addVertex(Int.box(i))
-
-      src.addEdge(labelV2.label, tgt,
-        "age", Int.box(10), 
-        "affinity_score", Double.box(0.1), 
-        "is_blocked", Boolean.box(true),
-        "ts", Long.box(i))
-    }
-  }
-
-  test("test traversal.") {
-    val vertices = g.traversal().V(newVertexId(srcId)).out(labelV2.label).toSeq
-
-    vertices.size should be(range.size)
-    range.reverse.zip(vertices).foreach { case (tgtId, vertex) =>
-      val vertexId = g.newVertexId(labelV2.tgtService, labelV2.tgtColumn, 
tgtId)
-      val expectedId = g.newVertex(vertexId)
-      vertex.asInstanceOf[S2Vertex].innerId should be(expectedId.innerId)
-    }
-  }
-
-  test("test traversal. limit 1") {
-    val vertexIdParams = Seq(newVertexId(srcId))
-    val t: GraphTraversal[Vertex, Double] = g.traversal().V(vertexIdParams: 
_*).outE(labelV2.label).limit(1).values("affinity_score")
-    for {
-      affinityScore <- t
-    } {
-      logger.debug(s"$affinityScore")
-      affinityScore should be (0.1)
-    }
-  }
-  test("test traversal. 3") {
-
-    val l = label
-
-    val srcA = addVertex(Long.box(1), l)
-    val srcB = addVertex(Long.box(2), l)
-    val srcC = addVertex(Long.box(3), l)
-
-    val tgtA = addVertex(Long.box(101), l)
-    val tgtC = addVertex(Long.box(103), l)
-
-    srcA.addEdge(l.label, tgtA)
-    srcA.addEdge(l.label, tgtC)
-    tgtC.addEdge(l.label, srcB)
-    tgtA.addEdge(l.label, srcC)
-
-    val vertexIdParams = Seq(srcA.id)
-    val vertices = g.traversal().V(vertexIdParams: 
_*).out(l.label).out(l.label).toSeq
-    vertices.size should be(2)
-    vertices.foreach { v =>
-      val vertex = v.asInstanceOf[S2Vertex]
-      // TODO: we have too many id. this is ugly and confusing so fix me.
-      vertex.id.innerId == srcB.id.innerId || vertex.id.innerId == 
srcC.id.innerId should be(true)
-      logger.debug(s"[Vertex]: $v")
-    }
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/d05d8a49/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphData.scala
----------------------------------------------------------------------
diff --git 
a/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphData.scala 
b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphData.scala
new file mode 100644
index 0000000..b9af825
--- /dev/null
+++ b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphData.scala
@@ -0,0 +1,12 @@
+package org.apache.s2graph.core.tinkerpop
+
+import java.lang.annotation.Annotation
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith
+import org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData
+
+class S2GraphData extends LoadGraphWith {
+  override def value(): GraphData = ???
+
+  override def annotationType(): Class[_ <: Annotation] = 
classOf[LoadGraphWith]
+}

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/d05d8a49/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
new file mode 100644
index 0000000..5a997e8
--- /dev/null
+++ 
b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala
@@ -0,0 +1,220 @@
+package org.apache.s2graph.core.tinkerpop
+
+import java.io.File
+import java.util
+import java.util.concurrent.atomic.AtomicLong
+
+import org.apache.commons.configuration.Configuration
+import org.apache.s2graph.core.Management.JsonModel.Prop
+import org.apache.s2graph.core._
+import org.apache.s2graph.core.mysqls.{ColumnMeta, Label, ServiceColumn}
+import org.apache.s2graph.core.types.{HBaseType, InnerVal, VertexId}
+import org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData
+import org.apache.tinkerpop.gremlin.structure.{Element, Graph, T}
+import org.apache.tinkerpop.gremlin.{AbstractGraphProvider, LoadGraphWith}
+
+import scala.collection.JavaConverters._
+import scala.util.{Failure, Success, Try}
+import com.typesafe.config.ConfigFactory
+import org.apache.commons.io.FileUtils
+import org.apache.s2graph.core.utils.logger
+
+object S2GraphProvider {
+  val Implementation: Set[Class[_]] = Set(
+    classOf[S2Edge],
+    classOf[S2Vertex],
+    classOf[S2Property[_]],
+    classOf[S2VertexProperty[_]],
+    classOf[S2Graph]
+  )
+}
+class S2GraphProvider extends AbstractGraphProvider {
+
+  override def getBaseConfiguration(s: String, aClass: Class[_], s1: String, 
graphData: GraphData): util.Map[String, AnyRef] = {
+    val config = ConfigFactory.load()
+//    val dbUrl =
+//      if (config.hasPath("db.default.url")) 
config.getString("db.default.url")
+//      else "jdbc:mysql://localhost:3306/graph_dev"
+
+    val dbUrl = "jdbc:mysql://localhost:3306/graph_dev"
+    val m = new java.util.HashMap[String, AnyRef]()
+    m.put(Graph.GRAPH, classOf[S2Graph].getName)
+    m.put("db.default.url", dbUrl)
+    m.put("db.default.driver", "com.mysql.jdbc.Driver")
+    m
+  }
+
+  private val H2Prefix = "jdbc:h2:file:"
+
+  override def clear(graph: Graph, configuration: Configuration): Unit =
+    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)
+          }
+        }
+        s2Graph.shutdown(modelDataDelete = true)
+        logger.info("S2Graph Shutdown")
+      }
+    }
+
+  override def getImplementations: util.Set[Class[_]] = 
S2GraphProvider.Implementation.asJava
+
+  def initTestSchema(testClass: Class[_], testName: String) = {
+    val testClassName = testClass.getSimpleName
+    testClass.getSimpleName match {
+      case _ =>
+    }
+  }
+
+  override def loadGraphData(graph: Graph, loadGraphWith: LoadGraphWith, 
testClass: Class[_], testName: String): Unit = {
+    val s2Graph = graph.asInstanceOf[S2Graph]
+    val mnt = s2Graph.getManagement()
+    val defaultService = s2Graph.DefaultService
+    val defaultServiceColumn = s2Graph.DefaultColumn
+
+    initTestSchema(testClass, testName)
+
+    Management.deleteLabel("knows")
+
+    var knowsProp = Vector(
+      Prop("weight", "0.0", "double"),
+      Prop("data", "-", "string"),
+      Prop("year", "-1", "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")
+    )
+
+   // Change dataType for ColumnMeta('aKey') for PropertyFeatureSupportTest
+    if (testClass.getSimpleName == "PropertyFeatureSupportTest") {
+      knowsProp = knowsProp.filterNot(_.name == "aKey")
+
+      val dataType = if (testName.toLowerCase.contains("boolean")) {
+        knowsProp = knowsProp.filterNot(_.name == "aKey") :+ Prop("aKey", 
"false", "boolean")
+        "boolean"
+      } else if (testName.toLowerCase.contains("integer")) {
+        knowsProp = knowsProp.filterNot(_.name == "aKey") :+ Prop("aKey", "0", 
"integer")
+        "integer"
+      } else if (testName.toLowerCase.contains("long")) {
+        knowsProp = knowsProp.filterNot(_.name == "aKey") :+ Prop("aKey", "0", 
"long")
+        "long"
+      } else if (testName.toLowerCase.contains("double")) {
+        knowsProp = knowsProp.filterNot(_.name == "aKey") :+ Prop("aKey", 
"0.0", "double")
+        "double"
+      } else if (testName.toLowerCase.contains("float")) {
+        knowsProp = knowsProp.filterNot(_.name == "aKey") :+ Prop("aKey", 
"0.0", "float")
+        "float"
+      } else if (testName.toLowerCase.contains("string")) {
+        knowsProp = knowsProp.filterNot(_.name == "aKey") :+ Prop("aKey", "-", 
"string")
+        "string"
+      } else {
+        "string"
+      }
+
+      ColumnMeta.findByName(defaultServiceColumn.id.get, "aKey", useCache = 
false).foreach(cm => ColumnMeta.delete(cm.id.get))
+      ColumnMeta.findOrInsert(defaultServiceColumn.id.get, "aKey", dataType, 
useCache = false)
+    }
+
+    // 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": true}"""))
+    } else {
+      mnt.createLabel("knows", defaultService.serviceName, "person", 
"integer", defaultService.serviceName, "person", "integer",
+        true, defaultService.serviceName, Nil, knowsProp, "strong", None, 
None, options = Option("""{"skipReverse": true}"""))
+    }
+
+    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")))
+    val softwareColumn = 
Management.createServiceColumn(defaultService.serviceName, "software", 
"integer", Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", 
"string"), Prop("lang", "-", "string")))
+    val productColumn = 
Management.createServiceColumn(defaultService.serviceName, "product", 
"integer", Nil)
+    val dogColumn = Management.createServiceColumn(defaultService.serviceName, 
"dog", "integer", Nil)
+//    val vertexColumn = Management.createServiceColumn(service.serviceName, 
"vertex", "integer", Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", 
"-", "string"), Prop("age", "-1", "integer"), Prop("lang", "scala", "string")))
+
+    val created = mnt.createLabel("created", defaultService.serviceName, 
"person", "integer", defaultService.serviceName, "software", "integer",
+      true, defaultService.serviceName, Nil, Seq(Prop("weight", "0.0", 
"double")), "strong", None, None)
+
+    val bought = mnt.createLabel("bought", defaultService.serviceName, 
"person", "integer", defaultService.serviceName, "product", "integer",
+      true, defaultService.serviceName, Nil, Seq(Prop("x", "-", "string"), 
Prop("y", "-", "string")), "strong", None, None,
+      options = Option("""{"skipReverse": true}"""))
+
+    val test = mnt.createLabel("test", defaultService.serviceName, 
defaultServiceColumn.columnName, defaultServiceColumn.columnType, 
defaultService.serviceName, defaultServiceColumn.columnName, 
defaultServiceColumn.columnType,
+      true, defaultService.serviceName, Nil, Seq(Prop("xxx", "-", "string")), 
"weak", None, None,
+      options = Option("""{"skipReverse": true}"""))
+
+    val self = mnt.createLabel("self", defaultService.serviceName, 
defaultServiceColumn.columnName, defaultServiceColumn.columnType, 
defaultService.serviceName, defaultServiceColumn.columnName, 
defaultServiceColumn.columnType,
+      true, defaultService.serviceName, Nil, Nil, "weak", None, None,
+      options = Option("""{"skipReverse": true}"""))
+
+    val friends = mnt.createLabel("friends", defaultService.serviceName, 
defaultServiceColumn.columnName, defaultServiceColumn.columnType, 
defaultService.serviceName, defaultServiceColumn.columnName, 
defaultServiceColumn.columnType,
+      true, defaultService.serviceName, Nil, Nil,
+      "weak", None, None,
+      options = Option("""{"skipReverse": true}"""))
+
+    val friend = mnt.createLabel("friend", defaultService.serviceName, 
defaultServiceColumn.columnName, defaultServiceColumn.columnType, 
defaultService.serviceName, defaultServiceColumn.columnName, 
defaultServiceColumn.columnType,
+      true, defaultService.serviceName, Nil,
+      Seq(
+        Prop("name", "-", "string"),
+        Prop("location", "-", "string"),
+        Prop("status", "-", "string")
+      ),
+      "weak", None, None,
+      options = Option("""{"skipReverse": false}""")
+    )
+
+    val hate = mnt.createLabel("hate", 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 collaborator = mnt.createLabel("collaborator", 
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": true}""")
+    )
+
+    val test1 = mnt.createLabel("test1", 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 test2 = mnt.createLabel("test2", 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 test3 = mnt.createLabel("test3", 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)
+  }
+
+  override def convertId(id: scala.Any, c: Class[_ <: Element]): AnyRef = {
+    val isVertex = c.toString.contains("Vertex")
+    if (isVertex) {
+      VertexId(ServiceColumn.findAll().head, InnerVal.withStr(id.toString, 
HBaseType.DEFAULT_VERSION))
+    } else {
+      EdgeId(
+        InnerVal.withStr(id.toString, HBaseType.DEFAULT_VERSION),
+        InnerVal.withStr(id.toString, HBaseType.DEFAULT_VERSION),
+        "_s2graph",
+        "out",
+        System.currentTimeMillis()
+      )
+    }
+  }
+
+  override def convertLabel(label: String): String = {
+    label
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/d05d8a49/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphStructureIntegrateTest.scala
----------------------------------------------------------------------
diff --git 
a/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphStructureIntegrateTest.scala
 
b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphStructureIntegrateTest.scala
new file mode 100644
index 0000000..a909878
--- /dev/null
+++ 
b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphStructureIntegrateTest.scala
@@ -0,0 +1,13 @@
+package org.apache.s2graph.core.tinkerpop.structure
+
+import org.apache.s2graph.core.S2Graph
+import org.apache.s2graph.core.tinkerpop.S2GraphProvider
+import org.apache.tinkerpop.gremlin.GraphProviderClass
+import org.apache.tinkerpop.gremlin.structure.{StructureIntegrateSuite, 
StructureStandardSuite}
+import org.junit.runner.RunWith
+
+@RunWith(classOf[StructureIntegrateSuite])
+@GraphProviderClass(provider = classOf[S2GraphProvider], graph = 
classOf[S2Graph])
+class S2GraphStructureIntegrateTest {
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/d05d8a49/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphStructureStandardTest.scala
----------------------------------------------------------------------
diff --git 
a/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphStructureStandardTest.scala
 
b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphStructureStandardTest.scala
new file mode 100644
index 0000000..ed5a532
--- /dev/null
+++ 
b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphStructureStandardTest.scala
@@ -0,0 +1,16 @@
+package org.apache.s2graph.core.tinkerpop.structure
+
+import org.apache.s2graph.core.S2Graph
+import org.apache.s2graph.core.tinkerpop.S2GraphProvider
+import org.apache.tinkerpop.gremlin.structure.StructureStandardSuite
+import org.apache.tinkerpop.gremlin.{GraphProviderClass, LoadGraphWith}
+import org.junit.FixMethodOrder
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@RunWith(classOf[StructureStandardSuite])
+@GraphProviderClass(provider = classOf[S2GraphProvider], graph = 
classOf[S2Graph])
+class S2GraphStructureStandardTest {
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/d05d8a49/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
new file mode 100644
index 0000000..e69004c
--- /dev/null
+++ 
b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/structure/S2GraphTest.scala
@@ -0,0 +1,187 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.s2graph.core.tinkerpop.structure
+
+import org.apache.s2graph.core.Management.JsonModel.Prop
+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.scalatest.{FunSuite, Matchers}
+
+
+class S2GraphTest extends FunSuite with Matchers with TestCommonWithModels {
+
+  import scala.collection.JavaConversions._
+  import scala.concurrent.ExecutionContext.Implicits.global
+
+  initTests()
+
+  val g = new S2Graph(config)
+
+  def printEdges(edges: Seq[Edge]): Unit = {
+    edges.foreach { edge =>
+      logger.debug(s"[FetchedEdge]: $edge")
+    }
+  }
+
+  import scala.language.implicitConversions
+
+//  def newVertexId(id: Any, label: Label = labelV2) = 
g.newVertexId(label.srcService, label.srcColumn, id)
+//
+//  def addVertex(id: AnyRef, label: Label = labelV2) =
+//    g.addVertex(T.label, label.srcService.serviceName + 
S2Vertex.VertexLabelDelimiter + label.srcColumnName,
+//      T.id, id).asInstanceOf[S2Vertex]
+//
+//  val srcId = Long.box(20)
+//  val range = (100 until 110)
+//  testData(srcId, range)
+
+  //  val testProps = Seq(
+  //    Prop("affinity_score", "0.0", DOUBLE),
+  //    Prop("is_blocked", "false", BOOLEAN),
+  //    Prop("time", "0", INT),
+  //    Prop("weight", "0", INT),
+  //    Prop("is_hidden", "true", BOOLEAN),
+  //    Prop("phone_number", "xxx-xxx-xxxx", STRING),
+  //    Prop("score", "0.1", FLOAT),
+  //    Prop("age", "10", INT)
+  //  )
+//  def testData(srcId: AnyRef, range: Range, label: Label = labelV2) = {
+//    val src = addVertex(srcId)
+//
+//    for {
+//      i <- range
+//    } {
+//      val tgt = addVertex(Int.box(i))
+//
+//      src.addEdge(labelV2.label, tgt,
+//        "age", Int.box(10),
+//        "affinity_score", Double.box(0.1),
+//        "is_blocked", Boolean.box(true),
+//        "ts", Long.box(i))
+//    }
+//  }
+
+//  test("test traversal.") {
+//    val vertices = 
g.traversal().V(newVertexId(srcId)).out(labelV2.label).toSeq
+//
+//    vertices.size should be(range.size)
+//    range.reverse.zip(vertices).foreach { case (tgtId, vertex) =>
+//      val vertexId = g.newVertexId(labelV2.tgtService, labelV2.tgtColumn, 
tgtId)
+//      val expectedId = g.newVertex(vertexId)
+//      vertex.asInstanceOf[S2Vertex].innerId should be(expectedId.innerId)
+//    }
+//  }
+//
+//  test("test traversal. limit 1") {
+//    val vertexIdParams = Seq(newVertexId(srcId))
+//    val t: GraphTraversal[Vertex, Double] = g.traversal().V(vertexIdParams: 
_*).outE(labelV2.label).limit(1).values("affinity_score")
+//    for {
+//      affinityScore <- t
+//    } {
+//      logger.debug(s"$affinityScore")
+//      affinityScore should be (0.1)
+//    }
+//  }
+//  test("test traversal. 3") {
+//
+//    val l = label
+//
+//    val srcA = addVertex(Long.box(1), l)
+//    val srcB = addVertex(Long.box(2), l)
+//    val srcC = addVertex(Long.box(3), l)
+//
+//    val tgtA = addVertex(Long.box(101), l)
+//    val tgtC = addVertex(Long.box(103), l)
+//
+//    srcA.addEdge(l.label, tgtA)
+//    srcA.addEdge(l.label, tgtC)
+//    tgtC.addEdge(l.label, srcB)
+//    tgtA.addEdge(l.label, srcC)
+//
+//    val vertexIdParams = Seq(srcA.id)
+//    val vertices = g.traversal().V(vertexIdParams: 
_*).out(l.label).out(l.label).toSeq
+//    vertices.size should be(2)
+//    vertices.foreach { v =>
+//      val vertex = v.asInstanceOf[S2Vertex]
+//      // TODO: we have too many id. this is ugly and confusing so fix me.
+//      vertex.id.innerId == srcB.id.innerId || vertex.id.innerId == 
srcC.id.innerId should be(true)
+//      logger.debug(s"[Vertex]: $v")
+//    }
+//  }
+//  test("add vertex without params.") {
+//    val vertex = g.addVertex().asInstanceOf[S2Vertex]
+//    vertex.id.column.service.serviceName should 
be(g.DefaultService.serviceName)
+//    vertex.id.column.columnName should be(g.DefaultColumn.columnName)
+//  }
+//  val s2Graph = graph.asInstanceOf[S2Graph]
+//  val mnt = s2Graph.getManagement()
+//  override val service = s2Graph.DefaultService
+//
+//  val personColumn = Management.createServiceColumn(service.serviceName, 
"person", "integer", Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", 
"-", "string"), Prop("age", "0", "integer")))
+//  val softwareColumn = Management.createServiceColumn(service.serviceName, 
"software", "integer", Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", 
"-", "string"), Prop("lang", "-", "string")))
+//  //    val vertexColumn = 
Management.createServiceColumn(service.serviceName, "vertex", "integer", 
Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), 
Prop("age", "-1", "integer"), Prop("lang", "scala", "string")))
+//
+//  val created = mnt.createLabel("created", service.serviceName, "person", 
"integer", service.serviceName, "software", "integer",
+//    true, service.serviceName, Nil, Seq(Prop("weight", "0.0", "float")), 
"strong", None, None)
+//
+//  val knows = mnt.createLabel("knows", service.serviceName, "person", 
"integer", service.serviceName, "person", "integer",
+//    true, service.serviceName, Nil, Seq(Prop("weight", "0.0", "float")), 
"strong", None, None)
+//
+
+  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)
+  }
+
+  test("addVertex with empty parameter") {
+
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/d05d8a49/s2counter_core/src/test/scala/org/apache/s2graph/counter/core/RankingCounterSpec.scala
----------------------------------------------------------------------
diff --git 
a/s2counter_core/src/test/scala/org/apache/s2graph/counter/core/RankingCounterSpec.scala
 
b/s2counter_core/src/test/scala/org/apache/s2graph/counter/core/RankingCounterSpec.scala
index 62174ad..2ab4823 100644
--- 
a/s2counter_core/src/test/scala/org/apache/s2graph/counter/core/RankingCounterSpec.scala
+++ 
b/s2counter_core/src/test/scala/org/apache/s2graph/counter/core/RankingCounterSpec.scala
@@ -21,7 +21,7 @@ package org.apache.s2graph.counter.core
 
 import com.typesafe.config.ConfigFactory
 import org.apache.s2graph.core.mysqls.Label
-import org.apache.s2graph.core.{S2Graph$, Management}
+import org.apache.s2graph.core.{Management, S2Graph, S2Graph$}
 import org.apache.s2graph.counter.config.S2CounterConfig
 import org.apache.s2graph.counter.core.TimedQualifier.IntervalUnit
 import org.apache.s2graph.counter.core.v2.{GraphOperation, RankingStorageGraph}

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/d05d8a49/scalastyle-config.xml
----------------------------------------------------------------------
diff --git a/scalastyle-config.xml b/scalastyle-config.xml
deleted file mode 100644
index 7e3596f..0000000
--- a/scalastyle-config.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-<scalastyle>
- <name>Scalastyle standard configuration</name>
- <check level="warning" class="org.scalastyle.file.FileTabChecker" 
enabled="true"></check>
- <check level="warning" class="org.scalastyle.file.FileLengthChecker" 
enabled="true">
-  <parameters>
-   <parameter name="maxFileLength"><![CDATA[800]]></parameter>
-  </parameters>
- </check>
- <check level="warning" class="org.scalastyle.file.HeaderMatchesChecker" 
enabled="true">
-  <parameters>
-   <parameter name="header"><![CDATA[// Copyright (C) 2011-2012 the original 
author or authors.
-// See the LICENCE.txt file distributed with this work for additional
-// information regarding copyright ownership.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.]]></parameter>
-  </parameters>
- </check>
- <check level="warning" 
class="org.scalastyle.scalariform.SpacesAfterPlusChecker" 
enabled="true"></check>
- <check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" 
enabled="true"></check>
- <check level="warning" 
class="org.scalastyle.scalariform.SpacesBeforePlusChecker" 
enabled="true"></check>
- <check level="warning" class="org.scalastyle.file.FileLineLengthChecker" 
enabled="true">
-  <parameters>
-   <parameter name="maxLineLength"><![CDATA[160]]></parameter>
-   <parameter name="tabSize"><![CDATA[4]]></parameter>
-  </parameters>
- </check>
- <check level="warning" class="org.scalastyle.scalariform.ClassNamesChecker" 
enabled="true">
-  <parameters>
-   <parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
-  </parameters>
- </check>
- <check level="warning" class="org.scalastyle.scalariform.ObjectNamesChecker" 
enabled="true">
-  <parameters>
-   <parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
-  </parameters>
- </check>
- <check level="warning" 
class="org.scalastyle.scalariform.PackageObjectNamesChecker" enabled="true">
-  <parameters>
-   <parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter>
-  </parameters>
- </check>
- <check level="warning" 
class="org.scalastyle.scalariform.EqualsHashCodeChecker" enabled="true"></check>
- <check level="warning" 
class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="true">
-  <parameters>
-   <parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter>
-  </parameters>
- </check>
- <check level="warning" 
class="org.scalastyle.scalariform.ParameterNumberChecker" enabled="true">
-  <parameters>
-   <parameter name="maxParameters"><![CDATA[8]]></parameter>
-  </parameters>
- </check>
- <check level="warning" class="org.scalastyle.scalariform.MagicNumberChecker" 
enabled="true">
-  <parameters>
-   <parameter name="ignore"><![CDATA[-1,0,1,2,3]]></parameter>
-  </parameters>
- </check>
- <check level="warning" 
class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" 
enabled="true"></check>
- <check level="warning" 
class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" 
enabled="true"></check>
- <check level="warning" class="org.scalastyle.scalariform.ReturnChecker" 
enabled="true"></check>
- <check level="warning" class="org.scalastyle.scalariform.NullChecker" 
enabled="true"></check>
- <check level="warning" class="org.scalastyle.scalariform.NoCloneChecker" 
enabled="true"></check>
- <check level="warning" class="org.scalastyle.scalariform.NoFinalizeChecker" 
enabled="true"></check>
- <check level="warning" 
class="org.scalastyle.scalariform.CovariantEqualsChecker" 
enabled="true"></check>
- <check level="warning" 
class="org.scalastyle.scalariform.StructuralTypeChecker" enabled="true"></check>
- <check level="warning" class="org.scalastyle.file.RegexChecker" 
enabled="true">
-  <parameters>
-   <parameter name="regex"><![CDATA[println]]></parameter>
-  </parameters>
- </check>
- <check level="warning" 
class="org.scalastyle.scalariform.NumberOfTypesChecker" enabled="true">
-  <parameters>
-   <parameter name="maxTypes"><![CDATA[30]]></parameter>
-  </parameters>
- </check>
- <check level="warning" 
class="org.scalastyle.scalariform.CyclomaticComplexityChecker" enabled="true">
-  <parameters>
-   <parameter name="maximum"><![CDATA[10]]></parameter>
-  </parameters>
- </check>
- <check level="warning" class="org.scalastyle.scalariform.UppercaseLChecker" 
enabled="true"></check>
- <check level="warning" 
class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" 
enabled="true"></check>
- <check level="warning" class="org.scalastyle.scalariform.IfBraceChecker" 
enabled="true">
-  <parameters>
-   <parameter name="singleLineAllowed"><![CDATA[true]]></parameter>
-   <parameter name="doubleLineAllowed"><![CDATA[false]]></parameter>
-  </parameters>
- </check>
- <check level="warning" class="org.scalastyle.scalariform.MethodLengthChecker" 
enabled="true">
-  <parameters>
-   <parameter name="maxLength"><![CDATA[50]]></parameter>
-  </parameters>
- </check>
- <check level="warning" class="org.scalastyle.scalariform.MethodNamesChecker" 
enabled="true">
-  <parameters>
-   <parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*$]]></parameter>
-  </parameters>
- </check>
- <check level="warning" 
class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" enabled="true">
-  <parameters>
-   <parameter name="maxMethods"><![CDATA[30]]></parameter>
-  </parameters>
- </check>
- <check level="warning" 
class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" 
enabled="true"></check>
- <check level="warning" class="org.scalastyle.file.NewLineAtEofChecker" 
enabled="true"></check>
- <check level="warning" class="org.scalastyle.file.NoNewLineAtEofChecker" 
enabled="false"></check>
-</scalastyle>
\ No newline at end of file


Reply via email to