blob: 436b0e4319e47095ad422c8b68b50e16c90241d1 [file] [log] [blame]
package io.prediction.commons.settings.mongodb
import io.prediction.commons.MongoUtils
import io.prediction.commons.settings.{ Engine, Engines }
import com.mongodb.casbah.Imports._
/** MongoDB implementation of Engines. */
class MongoEngines(db: MongoDB) extends Engines {
private val engineColl = db("engines")
private val seq = new MongoSequences(db)
private def dbObjToEngine(dbObj: DBObject) = {
/** Transparent upgrade. Remove in next minor version. */
dbObj.getAs[DBObject]("settings") map { settings =>
val e = Engine(
id = dbObj.as[Int]("_id"),
appid = dbObj.as[Int]("appid"),
name = dbObj.as[String]("name"),
infoid = dbObj.as[String]("infoid"),
itypes = dbObj.getAs[MongoDBList]("itypes") map { MongoUtils.mongoDbListToListOfString(_) },
params = MongoUtils.dbObjToMap(settings),
trainingdisabled = dbObj.getAs[Boolean]("trainingdisabled"),
trainingschedule = dbObj.getAs[String]("trainingschedule"))
update(e)
e
} getOrElse {
Engine(
id = dbObj.as[Int]("_id"),
appid = dbObj.as[Int]("appid"),
name = dbObj.as[String]("name"),
infoid = dbObj.as[String]("infoid"),
itypes = dbObj.getAs[MongoDBList]("itypes") map { MongoUtils.mongoDbListToListOfString(_) },
params = MongoUtils.dbObjToMap(dbObj.as[DBObject]("params")),
trainingdisabled = dbObj.getAs[Boolean]("trainingdisabled"),
trainingschedule = dbObj.getAs[String]("trainingschedule"))
}
}
class MongoEngineIterator(it: MongoCursor) extends Iterator[Engine] {
def next = dbObjToEngine(it.next)
def hasNext = it.hasNext
}
def insert(engine: Engine) = {
val id = seq.genNext("engineid")
// required fields
val obj = MongoDBObject(
"_id" -> id,
"appid" -> engine.appid,
"name" -> engine.name,
"infoid" -> engine.infoid,
"params" -> engine.params
)
// optional fields
val optObj = engine.itypes.map(x => MongoDBObject("itypes" -> x)).getOrElse(MongoUtils.emptyObj) ++
engine.trainingdisabled.map(x => MongoDBObject("trainingdisabled" -> x)).getOrElse(MongoUtils.emptyObj) ++
engine.trainingschedule.map(x => MongoDBObject("trainingschedule" -> x)).getOrElse(MongoUtils.emptyObj)
engineColl.insert(obj ++ optObj)
id
}
def get(id: Int) = engineColl.findOne(MongoDBObject("_id" -> id)) map { dbObjToEngine(_) }
def getAll() = new MongoEngineIterator(engineColl.find())
def getByAppid(appid: Int) = new MongoEngineIterator(engineColl.find(MongoDBObject("appid" -> appid)).sort(MongoDBObject("name" -> 1)))
def getByAppidAndName(appid: Int, name: String) = engineColl.findOne(MongoDBObject("appid" -> appid, "name" -> name)) map { dbObjToEngine(_) }
def getByIdAndAppid(id: Int, appid: Int): Option[Engine] = engineColl.findOne(MongoDBObject("_id" -> id, "appid" -> appid)) map { dbObjToEngine(_) }
def update(engine: Engine, upsert: Boolean = false) = {
val idObj = MongoDBObject("_id" -> engine.id)
val nameObj = MongoDBObject("name" -> engine.name)
val appidObj = MongoDBObject("appid" -> engine.appid)
val infoidObj = MongoDBObject("infoid" -> engine.infoid)
val itypesObj = engine.itypes.map(x => MongoDBObject("itypes" -> x)).getOrElse(MongoUtils.emptyObj)
val paramsObj = MongoDBObject("params" -> engine.params)
val trainingdisabledObj = engine.trainingdisabled.map(x => MongoDBObject("trainingdisabled" -> x)).getOrElse(MongoUtils.emptyObj)
val trainingscheduleObj = engine.trainingschedule.map(x => MongoDBObject("trainingschedule" -> x)).getOrElse(MongoUtils.emptyObj)
engineColl.update(
idObj,
idObj ++ appidObj ++ nameObj ++ infoidObj ++ itypesObj ++ paramsObj ++ trainingdisabledObj ++ trainingscheduleObj,
upsert
)
}
def deleteByIdAndAppid(id: Int, appid: Int) = engineColl.remove(MongoDBObject("_id" -> id, "appid" -> appid))
def existsByAppidAndName(appid: Int, name: String) = engineColl.findOne(MongoDBObject("name" -> name, "appid" -> appid)) map { _ => true } getOrElse false
}