blob: 8655c2061650666685598160deff3fd48e69c729 [file] [log] [blame]
package io.prediction.commons.settings.mongodb
import io.prediction.commons.MongoUtils
import io.prediction.commons.settings.{ EngineInfo, EngineInfos }
import com.mongodb.casbah.Imports._
/** MongoDB implementation of EngineInfos. */
class MongoEngineInfos(db: MongoDB) extends EngineInfos {
private val coll = db("engineInfos")
private def dbObjToEngineInfo(dbObj: DBObject) = EngineInfo(
id = dbObj.as[String]("_id"),
name = dbObj.as[String]("name"),
description = dbObj.getAs[String]("description"),
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(_) },
defaultalgoinfoid = dbObj.as[String]("defaultalgoinfoid"),
defaultofflineevalmetricinfoid = dbObj.as[String]("defaultofflineevalmetricinfoid"),
defaultofflineevalsplitterinfoid = dbObj.as[String]("defaultofflineevalsplitterinfoid"))
def insert(engineInfo: EngineInfo) = {
// required fields
val obj = MongoDBObject(
"_id" -> engineInfo.id,
"name" -> engineInfo.name,
"params" -> (engineInfo.params mapValues { MongoParam.paramToDBObj(_) }),
"paramsections" -> (engineInfo.paramsections map { MongoParam.paramSectionToDBObj(_) }),
"defaultalgoinfoid" -> engineInfo.defaultalgoinfoid,
"defaultofflineevalmetricinfoid" -> engineInfo.defaultofflineevalmetricinfoid,
"defaultofflineevalsplitterinfoid" -> engineInfo.defaultofflineevalsplitterinfoid)
// optional fields
val optObj = engineInfo.description.map { d => MongoDBObject("description" -> d) } getOrElse MongoUtils.emptyObj
coll.insert(obj ++ optObj)
}
def get(id: String) = coll.findOne(MongoDBObject("_id" -> id)) map { dbObjToEngineInfo(_) }
def getAll() = coll.find().toSeq map { dbObjToEngineInfo(_) }
def update(engineInfo: EngineInfo, upsert: Boolean = false) = {
val idObj = MongoDBObject("_id" -> engineInfo.id)
val requiredObj = MongoDBObject(
"name" -> engineInfo.name,
"params" -> (engineInfo.params mapValues { MongoParam.paramToDBObj(_) }),
"paramsections" -> (engineInfo.paramsections map { MongoParam.paramSectionToDBObj(_) }),
"defaultalgoinfoid" -> engineInfo.defaultalgoinfoid,
"defaultofflineevalmetricinfoid" -> engineInfo.defaultofflineevalmetricinfoid,
"defaultofflineevalsplitterinfoid" -> engineInfo.defaultofflineevalsplitterinfoid)
val descriptionObj = engineInfo.description.map { d => MongoDBObject("description" -> d) } getOrElse MongoUtils.emptyObj
coll.update(idObj, idObj ++ requiredObj ++ descriptionObj, upsert)
}
def delete(id: String) = coll.remove(MongoDBObject("_id" -> id))
}