blob: 0467f7d72b3e56c6ffa862ff3d1e1503c8365d65 [file] [log] [blame]
/*
* 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
import org.apache.commons.configuration.Configuration
import org.apache.s2graph.core.GraphExceptions.LabelNotExistException
import org.apache.s2graph.core.Management.JsonModel.Prop
import org.apache.s2graph.core.S2Graph.{DefaultColumnName, DefaultServiceName}
import org.apache.s2graph.core._
import org.apache.s2graph.core.schema._
import org.apache.s2graph.core.types.{HBaseType, InnerVal, VertexId}
import org.apache.s2graph.core.utils.logger
import org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData
import org.apache.tinkerpop.gremlin.structure.{Element, Graph, T}
import org.apache.tinkerpop.gremlin.{AbstractGraphProvider, LoadGraphWith}
import java.util
import scala.collection.JavaConverters._
object S2GraphProvider {
val Implementation: Set[Class[_]] = Set(
classOf[S2EdgeLike],
classOf[S2Edge],
classOf[S2Vertex],
classOf[S2VertexLike],
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 m = new java.util.HashMap[String, AnyRef]()
m.put(Graph.GRAPH, classOf[S2Graph].getName)
// m.put("db.default.url", "jdbc:h2:mem:db1;MODE=MYSQL")
m
}
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)
S2GraphFactory.cleanupDefaultSchema
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 openTestGraph(config: Configuration): Graph = new S2Graph(config)(ExecutionContext.global)
override def loadGraphData(graph: Graph, loadGraphWith: LoadGraphWith, testClass: Class[_], testName: String): Unit = {
val s2Graph = graph.asInstanceOf[S2Graph]
val mnt = s2Graph.management
S2GraphFactory.cleanupDefaultSchema
initTestSchema(testClass, testName)
S2GraphFactory.initDefaultSchema(s2Graph)
val defaultService = Service.findByName(S2Graph.DefaultServiceName).getOrElse(throw new IllegalStateException("default service is not initialized."))
val defaultServiceColumn = ServiceColumn.find(defaultService.id.get, S2Graph.DefaultColumnName).getOrElse(throw new IllegalStateException("default column is not initialized."))
val allProps = scala.collection.mutable.Set.empty[Prop]
var knowsProp = Vector(
Prop("weight", "0.0", "double"),
Prop("data", "-", "string"),
Prop("year", "0", "integer"),
Prop("boolean", "false", "boolean"),
Prop("float", "0.0", "float"),
Prop("double", "0.0", "double"),
Prop("long", "0.0", "long"),
Prop("string", "-", "string"),
Prop("integer", "0", "integer"),
Prop("aKey", "-", "string"),
Prop("stars", "0", "integer"),
Prop("since", "0", "integer"),
Prop("myEdgeId", "0", "integer"),
Prop("data", "-", "string"),
Prop("name", "-", "string")
)
allProps ++= knowsProp
// Change dataType for ColumnMeta('aKey') for PropertyFeatureSupportTest
if (testClass.getSimpleName == "PropertyFeatureSupportTest") {
knowsProp = knowsProp.filterNot(_.name == "aKey")
val (dataType, defaultValue) = if (testName.toLowerCase.contains("boolean")) {
knowsProp = knowsProp.filterNot(_.name == "aKey") :+ Prop("aKey", "false", "boolean")
("boolean", "false")
} else if (testName.toLowerCase.contains("integer")) {
knowsProp = knowsProp.filterNot(_.name == "aKey") :+ Prop("aKey", "0", "integer")
("integer", "0")
} else if (testName.toLowerCase.contains("long")) {
knowsProp = knowsProp.filterNot(_.name == "aKey") :+ Prop("aKey", "0", "long")
("long", "0")
} else if (testName.toLowerCase.contains("double")) {
knowsProp = knowsProp.filterNot(_.name == "aKey") :+ Prop("aKey", "0.0", "double")
("double", "0.0")
} else if (testName.toLowerCase.contains("float")) {
knowsProp = knowsProp.filterNot(_.name == "aKey") :+ Prop("aKey", "0.0", "float")
("float", "0.0")
} 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, defaultValue, storeInGlobalIndex = true, useCache = false)
}
if (loadGraphWith != null && loadGraphWith.value() == GraphData.MODERN) {
mnt.createLabel("knows", defaultService.serviceName, "person", "integer", defaultService.serviceName, "person", "integer",
true, defaultService.serviceName, Nil, knowsProp, "strong", None, None, options = Option("""{"skipReverse": false}"""))
} else {
mnt.createLabel("knows", defaultService.serviceName, "vertex", "integer", defaultService.serviceName, "vertex", "integer",
true, defaultService.serviceName, Nil, knowsProp, "strong", None, None, options = Option("""{"skipReverse": false}"""))
}
// columns
val personProps = Seq(Prop("name", "-", "string"), Prop("age", "0", "integer"), Prop("location", "-", "string"))
allProps ++= personProps
val personColumn = Management.createServiceColumn(defaultService.serviceName, "person", "integer", personProps)
val softwareProps = Seq(Prop("name", "-", "string"), Prop("lang", "-", "string"), Prop("temp", "-", "string"))
allProps ++= softwareProps
val softwareColumn = Management.createServiceColumn(defaultService.serviceName, "software", "integer", softwareProps)
val productProps = Nil
val productColumn = Management.createServiceColumn(defaultService.serviceName, "product", "integer", productProps)
val dogProps = Nil
val dogColumn = Management.createServiceColumn(defaultService.serviceName, "dog", "integer", dogProps)
val animalProps = Seq(Prop("age", "0", "integer"), Prop("name", "-", "string"))
allProps ++= animalProps
val animalColumn = Management.createServiceColumn(defaultService.serviceName, "animal", "integer", animalProps)
val songProps = Seq(Prop("name", "-", "string"), Prop("songType", "-", "string"), Prop("performances", "0", "integer"))
allProps ++= songProps
val songColumn = Management.createServiceColumn(defaultService.serviceName, "song", "integer", songProps)
val artistProps = Seq(Prop("name", "-", "string"))
allProps ++= artistProps
val artistColumn = Management.createServiceColumn(defaultService.serviceName, "artist", "integer", artistProps)
val stephenProps = Seq(Prop("name", "-", "string"))
allProps ++= stephenProps
val stephenColumn = Management.createServiceColumn(defaultService.serviceName, "STEPHEN", "integer", stephenProps)
// labels
val createdProps = Seq(Prop("weight", "0.0", "double"), Prop("name", "-", "string"))
allProps ++= createdProps
val created =
if (loadGraphWith != null && loadGraphWith.value() == GraphData.MODERN) {
mnt.createLabel("created",
defaultService.serviceName, "person", "integer",
defaultService.serviceName, "software", "integer",
true, defaultService.serviceName, Nil, createdProps, "strong", None, None)
} else {
mnt.createLabel("created",
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, createdProps, "strong", None, None)
}
val boughtProps = Seq(Prop("x", "-", "string"), Prop("y", "-", "string"))
allProps ++= boughtProps
val bought = mnt.createLabel("bought", defaultService.serviceName, "person", "integer", defaultService.serviceName, "product", "integer",
true, defaultService.serviceName, Nil, boughtProps, "strong", None, None,
options = Option("""{"skipReverse": true}"""))
val testProps = Seq(Prop("xxx", "-", "string"))
allProps ++= testProps
val test = mnt.createLabel("test", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, testProps, "weak", None, None,
options = Option("""{"skipReverse": true}"""))
val selfProps = Seq(Prop("__id", "-", "string"), Prop("acl", "-", "string"),
Prop("test", "-", "string"), Prop("name", "-", "string"), Prop("some", "-", "string"))
allProps ++= selfProps
val self =
if (loadGraphWith != null && loadGraphWith.value() == GraphData.CLASSIC) {
mnt.createLabel("self",
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, selfProps, "strong", None, None,
options = Option("""{"skipReverse": true}"""))
} else {
mnt.createLabel("self", defaultService.serviceName, "person", "integer",
defaultService.serviceName, "person", "integer",
true, defaultService.serviceName, Nil, selfProps, "strong", None, None,
options = Option("""{"skipReverse": false}"""))
}
val friendsProps = Seq(Prop("weight", "0.0", "double"))
allProps ++= friendsProps
val friends =
if (testClass.getSimpleName == "IoVertexTest") {
mnt.createLabel("friends",
defaultService.serviceName, "person", "integer",
defaultService.serviceName, "person", "integer",
true, defaultService.serviceName, Nil, friendsProps,
"strong", None, None,
options = Option("""{"skipReverse": false}"""))
} else {
mnt.createLabel("friends", defaultService.serviceName, defaultServiceColumn.columnName,
defaultServiceColumn.columnType, defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, Nil,
"strong", None, None,
options = Option("""{"skipReverse": false}"""))
}
val friendProps = Seq(
Prop("name", "-", "string"),
Prop("location", "-", "string"),
Prop("status", "-", "string"),
Prop("weight", "0.0", "double"),
Prop("acl", "-", "string")
)
allProps ++= friendProps
val friend =
if (testClass.getSimpleName == "IoEdgeTest") {
mnt.createLabel("friend",
defaultService.serviceName, "person", "integer",
defaultService.serviceName, "person", "integer",
true, defaultService.serviceName, Nil,
friendProps, "strong", None, None,
options = Option("""{"skipReverse": false}"""))
} else {
mnt.createLabel("friend",
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil,
friendProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
}
val hateProps = Nil
val hate = mnt.createLabel("hate", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, hateProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val collaboratorProps = Seq(Prop("location", "-", "string"))
allProps ++= collaboratorProps
val collaborator = mnt.createLabel("collaborator", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil,
collaboratorProps, "strong", None, None,
options = Option("""{"skipReverse": true}""")
)
val test1Props = Nil
val test1 = mnt.createLabel("test1", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, test1Props, "weak", None, None,
options = Option("""{"skipReverse": false}""")
)
val test2Props = Nil
val test2 = mnt.createLabel("test2", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, test2Props, "weak", None, None,
options = Option("""{"skipReverse": false}""")
)
val test3Props = Nil
val test3 = mnt.createLabel("test3", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, test3Props, "weak", None, None,
options = Option("""{"skipReverse": false}""")
)
val petsProps = Nil
val pets = mnt.createLabel("pets", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, petsProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val walksProps = Seq(Prop("location", "-", "string"))
allProps ++= walksProps
val walks = mnt.createLabel("walks", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil,
walksProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val livesWithProps = Nil
val livesWith = mnt.createLabel("livesWith", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, livesWithProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val hatesProps = Nil
val hates = mnt.createLabel("hates", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, hatesProps, "weak", None, None,
options = Option("""{"skipReverse": false}""")
)
val linkProps = Nil
val link = mnt.createLabel("link", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, linkProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val codeveloperProps = Seq( Prop("year", "0", "integer"))
allProps ++= codeveloperProps
val codeveloper = mnt.createLabel("codeveloper",
defaultService.serviceName, "person", "integer",
defaultService.serviceName, "person", "integer",
true, defaultService.serviceName, Nil,
codeveloperProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val createdByProps = Seq(
Prop("weight", "0.0", "double"),
Prop("year", "0", "integer"),
Prop("acl", "-", "string")
)
allProps ++= createdByProps
val createdBy = mnt.createLabel("createdBy",
defaultService.serviceName, "software", "integer",
defaultService.serviceName, "person", "integer",
true, defaultService.serviceName, Nil,
createdByProps, "strong", None, None)
val existsWithProps = Seq(Prop("time", "-", "string"))
allProps ++= existsWithProps
val existsWith = mnt.createLabel("existsWith",
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
true, defaultService.serviceName, Nil, existsWithProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val followedByProps = Seq(Prop("weight", "0.0", "double"))
allProps ++= followedByProps
val followedBy = mnt.createLabel("followedBy",
defaultService.serviceName, "song", "integer",
defaultService.serviceName, "song", "integer",
true, defaultService.serviceName, Nil, followedByProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val writtenByProps = Seq(Prop("weight", "0.0", "double"))
allProps ++= writtenByProps
val writtenBy = mnt.createLabel("writtenBy",
defaultService.serviceName, "song", "integer",
defaultService.serviceName, "artist", "integer",
true, defaultService.serviceName, Nil, writtenByProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val sungByProps = Seq(Prop("weight", "0.0", "double"))
allProps ++= sungByProps
val sungBy = mnt.createLabel("sungBy",
defaultService.serviceName, "song", "integer",
defaultService.serviceName, "artist", "integer",
true, defaultService.serviceName, Nil, sungByProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val usesProps = Nil
val uses = mnt.createLabel("uses",
defaultService.serviceName, "person", "integer",
defaultService.serviceName, "software", "integer",
true, defaultService.serviceName, Nil, usesProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val likesProps = Seq(Prop("year", "0", "integer"))
allProps ++= likesProps
val likes = mnt.createLabel("likes",
defaultService.serviceName, "person", "integer",
defaultService.serviceName, "person", "integer",
true, defaultService.serviceName, Nil,
likesProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val fooProps = Seq(Prop("year", "0", "integer"))
allProps ++= fooProps
val foo = mnt.createLabel("foo",
defaultService.serviceName, "person", "integer",
defaultService.serviceName, "person", "integer",
true, defaultService.serviceName, Nil,
fooProps, "strong", None, None,
options = Option("""{"skipReverse": false}""")
)
val barProps = Seq(Prop("year", "0", "integer"))
allProps ++= barProps
val bar = mnt.createLabel("bar",
defaultService.serviceName, "person", "integer",
defaultService.serviceName, "person", "integer",
true, defaultService.serviceName, Nil,
barProps, "strong", 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 {
val label = Label.findByName("_s2graph").getOrElse(throw new LabelNotExistException("_s2graph"))
EdgeId(
VertexId(label.srcColumn, InnerVal.withStr(id.toString, HBaseType.DEFAULT_VERSION)),
VertexId(label.tgtColumn, InnerVal.withStr(id.toString, HBaseType.DEFAULT_VERSION)),
"_s2graph",
"out",
System.currentTimeMillis()
)
}
}
override def convertLabel(label: String): String = {
label match {
case "blah1" => S2Graph.DefaultLabelName
case "blah2" => S2Graph.DefaultLabelName
case _ => label
}
}
}