blob: c27afc7c8a0e318676192f9724f920a966964e75 [file] [log] [blame]
package com.daumkakao.s2graph.core
import scalikejdbc._
import HBaseElement._
import play.api.libs.json.Json
object LabelIndex extends LocalCache[LabelIndex] {
val timestamp = LabelIndex(None, 0, 0.toByte, List(0), "")
// val withTsSeq = 0.toByte
val defaultSeq = 1.toByte
val maxOrderSeq = 7
def apply(rs: WrappedResultSet): LabelIndex = {
LabelIndex(rs.intOpt("id"), rs.int("label_id"), rs.byte("seq"),
rs.string("meta_seqs").split(",").filter(_ != "").map(s => s.toByte).toList match {
// case metaSeqsList => if (metaSeqsList.isEmpty) List[Byte](timestamp.seq) else metaSeqsList
case metaSeqsList => metaSeqsList
},
rs.string("formulars"))
}
def findById(id: Int) = {
val cacheKey = s"id=$id"
withCache(cacheKey) {
sql"""select * from label_indices where id = ${id}""".map { rs => LabelIndex(rs) }.single.apply
}.get
}
def findByLabelIdAll(labelId: Int, useCache: Boolean = true) = {
val cacheKey = s"labelId=$labelId"
if (useCache) {
withCaches(cacheKey)(sql"""
select * from label_indices where label_id = ${labelId} and seq > 0
""".map { rs => LabelIndex(rs) }.list.apply)
} else {
sql"""
select * from label_indices where label_id = ${labelId} and seq > 0
""".map { rs => LabelIndex(rs) }.list.apply
}
}
def insert(labelId: Int, seq: Byte, metaSeqs: List[Byte], formulars: String): Long = {
sql"""
insert into label_indices(label_id, seq, meta_seqs, formulars)
values (${labelId}, ${seq}, ${metaSeqs.mkString(",")}, ${formulars})
"""
.updateAndReturnGeneratedKey.apply()
}
def findByLabelIdAndSeq(labelId: Int, seq: Byte, useCache: Boolean = true): Option[LabelIndex] = {
val cacheKey = s"labelId=$labelId:seq=$seq"
if (useCache) {
withCache(cacheKey)(sql"""
select * from label_indices where label_id = ${labelId} and seq = ${seq}
""".map { rs => LabelIndex(rs) }.single.apply)
} else {
sql"""
select * from label_indices where label_id = ${labelId} and seq = ${seq}
""".map { rs => LabelIndex(rs) }.single.apply
}
}
def findOrInsert(labelId: Int, seq: Byte, metaSeqs: List[Byte], formulars: String): LabelIndex = {
// kgraph.Logger.debug(s"findOrInsert: $labelId, $seq, $metaSeqs, $formulars")
findByLabelIdAndSeq(labelId, seq) match {
case Some(s) => s
case None =>
insert(labelId, seq, metaSeqs, formulars)
val cacheKey = s"labelId=$labelId:seq=$seq"
expireCache(cacheKey)
findByLabelIdAndSeq(labelId, seq, false).get // forcely find label information form label_indices table, add false(don't use cache) option
}
}
def findOrInsert(labelId: Int, metaSeqs: List[Byte], formulars: String): LabelIndex = {
// Logger.debug(s"findOrInsert: $labelId, $seq, $metaSeqs, $formulars")
findByLabeIdAndSeqs(labelId, metaSeqs) match {
case Some(s) => s
case None =>
val orders = findByLabelIdAll(labelId, false)
val seq = (orders.size + 1).toByte
assert(seq <= maxOrderSeq)
insert(labelId, seq, metaSeqs, formulars)
findByLabelIdAndSeq(labelId, seq).get
}
}
def findByLabeIdAndSeqs(labelId: Int, seqs: List[Byte]): Option[LabelIndex] = {
// val seqsStr = seqs.sortBy(x => x).mkString(",")
val cacheKey = s"labelId=$labelId:seqs=${seqs.mkString(",")}"
withCache(cacheKey) {
sql"""
select * from label_indices where label_id = ${labelId} and meta_seqs = ${seqs.mkString(",")}
""".map { rs => LabelIndex(rs) }.single.apply
}
}
def delete(id: Int) = {
val labelIndex = findById(id)
val seqs = labelIndex.metaSeqs.mkString(",")
val (labelId, seq) = (labelIndex.labelId, labelIndex.seq)
sql"""delete from label_indices where id = ${id}""".execute.apply()
val cacheKeys = List(s"id=$id", s"labelId=$labelId", s"labelId=$labelId:seq=$seq", s"labelId=$labelId:seqs=$seqs")
cacheKeys.foreach(expireCache(_))
}
}
/**
* formular
* ex1): w1, w2, w3
* ex2): 1.5 * w1^2 + 3.4 * (w1 * w2), w2, w1
*/
case class LabelIndex(id: Option[Int], labelId: Int, seq: Byte, metaSeqs: List[Byte], formulars: String) {
lazy val label = Label.findById(labelId)
lazy val metas = label.metaPropsMap
lazy val sortKeyTypes = metaSeqs.map(metaSeq => label.metaPropsMap.get(metaSeq)).flatten
lazy val sortKeyTypeDefaultVals = sortKeyTypes.map(x => x.defaultInnerVal)
lazy val toJson = Json.obj("indexProps" -> sortKeyTypes.map(x => x.name))
}