blob: 274962a95a9d0f03b9557938a23af88dbdef9a2c [file] [log] [blame]
package io.prediction.commons.settings.mongodb
import io.prediction.commons.MongoUtils
import io.prediction.commons.settings.{ OfflineEvalSplitterInfo, OfflineEvalSplitterInfos }
import com.mongodb.casbah.Imports._
/** MongoDB implementation of OfflineEvalSplitterInfos. */
class MongoOfflineEvalSplitterInfos(db: MongoDB) extends OfflineEvalSplitterInfos {
private val coll = db("offlineEvalSplitterInfos")
private def dbObjToOfflineEvalSplitterInfo(dbObj: DBObject) = {
OfflineEvalSplitterInfo(
id = dbObj.as[String]("_id"),
name = dbObj.as[String]("name"),
description = dbObj.getAs[String]("description"),
engineinfoids = MongoUtils.mongoDbListToListOfString(dbObj.as[MongoDBList]("engineinfoids")),
commands = dbObj.getAs[MongoDBList]("commands") map { MongoUtils.mongoDbListToListOfString(_) },
params = (dbObj.as[DBObject]("params") map { p => (p._1, MongoParam.dbObjToParam(p._1, p._2.asInstanceOf[DBObject])) }).toMap,
paramsections = dbObj.as[Seq[DBObject]]("paramsections") map { MongoParam.dbObjToParamSection(_) },
paramorder = MongoUtils.mongoDbListToListOfString(dbObj.as[MongoDBList]("paramorder")))
}
def insert(offlineEvalSplitterInfo: OfflineEvalSplitterInfo) = {
// required fields
val obj = MongoDBObject(
"_id" -> offlineEvalSplitterInfo.id,
"name" -> offlineEvalSplitterInfo.name,
"engineinfoids" -> offlineEvalSplitterInfo.engineinfoids,
"params" -> offlineEvalSplitterInfo.params.mapValues { MongoParam.paramToDBObj(_) },
"paramsections" -> offlineEvalSplitterInfo.paramsections.map { MongoParam.paramSectionToDBObj(_) },
"paramorder" -> offlineEvalSplitterInfo.paramorder)
// optional fields
val descriptionObj = offlineEvalSplitterInfo.description.map { d => MongoDBObject("description" -> d) } getOrElse MongoUtils.emptyObj
val commandsObj = offlineEvalSplitterInfo.commands.map { c => MongoDBObject("commands" -> c) } getOrElse MongoUtils.emptyObj
coll.insert(obj ++ descriptionObj ++ commandsObj)
}
def get(id: String) = coll.findOne(MongoDBObject("_id" -> id)) map { dbObjToOfflineEvalSplitterInfo(_) }
def getAll() = coll.find().toSeq map { dbObjToOfflineEvalSplitterInfo(_) }
def getByEngineinfoid(engineinfoid: String): Seq[OfflineEvalSplitterInfo] = {
coll.find(MongoDBObject("engineinfoids" -> MongoDBObject("$in" -> Seq(engineinfoid)))).toSeq map { dbObjToOfflineEvalSplitterInfo(_) }
}
def update(offlineEvalSplitterInfo: OfflineEvalSplitterInfo, upsert: Boolean = false) = {
val idObj = MongoDBObject("_id" -> offlineEvalSplitterInfo.id)
val requiredObj = MongoDBObject(
"name" -> offlineEvalSplitterInfo.name,
"engineinfoids" -> offlineEvalSplitterInfo.engineinfoids,
"params" -> offlineEvalSplitterInfo.params.mapValues { MongoParam.paramToDBObj(_) },
"paramsections" -> offlineEvalSplitterInfo.paramsections.map { MongoParam.paramSectionToDBObj(_) },
"paramorder" -> offlineEvalSplitterInfo.paramorder)
val descriptionObj = offlineEvalSplitterInfo.description.map { d => MongoDBObject("description" -> d) } getOrElse MongoUtils.emptyObj
val commandsObj = offlineEvalSplitterInfo.commands.map { c => MongoDBObject("commands" -> c) } getOrElse MongoUtils.emptyObj
coll.update(idObj, idObj ++ requiredObj ++ descriptionObj ++ commandsObj, upsert)
}
def delete(id: String) = coll.remove(MongoDBObject("_id" -> id))
}