blob: 66d981f9d32e094d9c11bb7b41f36f2c8237fea8 [file] [log] [blame]
package io.prediction.commons.settings.mongodb
import io.prediction.commons.MongoUtils
import io.prediction.commons.settings.{ OfflineEvalMetric, OfflineEvalMetrics }
import com.mongodb.casbah.Imports._
class MongoOfflineEvalMetrics(db: MongoDB) extends OfflineEvalMetrics {
private val emptyObj = MongoDBObject()
private val offlineEvalMetricsColl = db("offlineEvalMetrics")
private val seq = new MongoSequences(db)
private def genNextId = seq.genNext("offlineEvalMetricid")
private val getFields = MongoDBObject( // fields to be read
"infoid" -> 1,
"evalid" -> 1,
"params" -> 1
)
class MongoOfflineEvalMetricIterator(it: MongoCursor) extends Iterator[OfflineEvalMetric] {
def next = dbObjToOfflineEvalMetric(it.next)
def hasNext = it.hasNext
}
/** create OfflineEvalMetric object from DBObject */
private def dbObjToOfflineEvalMetric(dbObj: DBObject) = {
OfflineEvalMetric(
id = dbObj.as[Int]("_id"),
infoid = dbObj.as[String]("infoid"),
evalid = dbObj.as[Int]("evalid"),
params = MongoUtils.dbObjToMap(dbObj.as[DBObject]("params"))
)
}
/** Insert a metric and return id */
def insert(metric: OfflineEvalMetric): Int = {
val id = genNextId
offlineEvalMetricsColl.insert(MongoDBObject(
"_id" -> id,
"infoid" -> metric.infoid,
"evalid" -> metric.evalid,
"params" -> metric.params
))
id
}
/** Get a metric by its ID */
def get(id: Int): Option[OfflineEvalMetric] = {
offlineEvalMetricsColl.findOne(MongoDBObject("_id" -> id), getFields) map { dbObjToOfflineEvalMetric(_) }
}
def getAll() = new MongoOfflineEvalMetricIterator(offlineEvalMetricsColl.find())
/** Get metrics by OfflineEval id */
def getByEvalid(evalid: Int): Iterator[OfflineEvalMetric] = new MongoOfflineEvalMetricIterator(
offlineEvalMetricsColl.find(MongoDBObject("evalid" -> evalid), getFields).sort(MongoDBObject("infoid" -> 1))
)
/** Update metric */
def update(metric: OfflineEvalMetric, upsert: Boolean = false) = {
offlineEvalMetricsColl.update(MongoDBObject("_id" -> metric.id), MongoDBObject(
"_id" -> metric.id,
"infoid" -> metric.infoid,
"evalid" -> metric.evalid,
"params" -> metric.params
), upsert)
}
/** Delete metric by its ID */
def delete(id: Int) = {
offlineEvalMetricsColl.remove(MongoDBObject("_id" -> id))
}
}