in s2core/src/main/scala/org/apache/s2graph/core/schema/Label.scala [175:243]
def insertAll(labelName: String, srcServiceName: String, srcColumnName: String, srcColumnType: String,
tgtServiceName: String, tgtColumnName: String, tgtColumnType: String,
isDirected: Boolean = true,
serviceName: String,
indices: Seq[Index],
metaProps: Seq[Prop],
consistencyLevel: String,
hTableName: Option[String],
hTableTTL: Option[Int],
schemaVersion: String,
isAsync: Boolean,
compressionAlgorithm: String,
options: Option[String])(implicit session: DBSession = AutoSession): Label = {
val srcServiceOpt = Service.findByName(srcServiceName, useCache = false)
val tgtServiceOpt = Service.findByName(tgtServiceName, useCache = false)
val serviceOpt = Service.findByName(serviceName, useCache = false)
if (srcServiceOpt.isEmpty) throw new RuntimeException(s"source service $srcServiceName is not created.")
if (tgtServiceOpt.isEmpty) throw new RuntimeException(s"target service $tgtServiceName is not created.")
if (serviceOpt.isEmpty) throw new RuntimeException(s"service $serviceName is not created.")
val newLabel = for {
srcService <- srcServiceOpt
tgtService <- tgtServiceOpt
service <- serviceOpt
} yield {
val srcServiceId = srcService.id.get
val tgtServiceId = tgtService.id.get
val serviceId = service.id.get
/** insert serviceColumn */
val srcCol = ServiceColumn.findOrInsert(srcServiceId, srcColumnName, Some(srcColumnType), schemaVersion, None)
val tgtCol = ServiceColumn.findOrInsert(tgtServiceId, tgtColumnName, Some(tgtColumnType), schemaVersion, None)
if (srcCol.columnType != srcColumnType) throw new RuntimeException(s"source service column type not matched ${srcCol.columnType} != ${srcColumnType}")
if (tgtCol.columnType != tgtColumnType) throw new RuntimeException(s"target service column type not matched ${tgtCol.columnType} != ${tgtColumnType}")
/* create label */
Label.findByName(labelName, useCache = false).getOrElse {
val createdId = insert(labelName, srcServiceId, srcColumnName, srcColumnType,
tgtServiceId, tgtColumnName, tgtColumnType, isDirected, serviceName, serviceId, consistencyLevel,
hTableName.getOrElse(service.hTableName), hTableTTL.orElse(service.hTableTTL), schemaVersion, isAsync,
compressionAlgorithm, options).toInt
val labelMetaMap = metaProps.map { case Prop(propName, defaultValue, dataType, storeInGlobalIndex) =>
val labelMeta = LabelMeta.findOrInsert(createdId, propName, defaultValue, dataType, storeInGlobalIndex)
(propName -> labelMeta.seq)
}.toMap ++ LabelMeta.reservedMetas.map (labelMeta => labelMeta.name -> labelMeta.seq).toMap
if (indices.isEmpty) {
// make default index with _PK, _timestamp, 0
LabelIndex.findOrInsert(createdId, LabelIndex.DefaultName, LabelIndex.DefaultMetaSeqs.toList, "none", None, None)
} else {
indices.foreach { index =>
val metaSeq = index.propNames.map { name => labelMetaMap(name) }
LabelIndex.findOrInsert(createdId, index.name, metaSeq.toList, "none", index.direction, index.options)
}
}
val cacheKeys = List(s"id=$createdId", s"label=$labelName")
val ret = findByName(labelName, useCache = false).get
putsToCacheOption(cacheKeys.map(k => className + k -> ret))
ret
}
}
newLabel.getOrElse(throw new RuntimeException("failed to create label"))
}