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
