blob: e005d008cfffb658b4afe5e37a6997a4458b3e1f [file] [log] [blame]
package io.prediction.commons.appdata.mongodb
import io.prediction.commons.MongoUtils.{ emptyObj, mongoDbListToListOfString, idWithAppid }
import io.prediction.commons.MongoUtils.{ attributesToMongoDBObject, getAttributesFromDBObject }
import io.prediction.commons.appdata.{ User, Users }
import com.mongodb.casbah.Imports._
import com.mongodb.casbah.commons.conversions.scala._
import com.github.nscala_time.time.Imports._
/** MongoDB implementation of Users. */
class MongoUsers(db: MongoDB) extends Users {
private val emptyObj = MongoDBObject()
private val userColl = db("users")
RegisterJodaTimeConversionHelpers()
def insert(user: User) = {
val id = MongoDBObject("_id" -> idWithAppid(user.appid, user.id))
val appid = MongoDBObject("appid" -> user.appid)
val ct = MongoDBObject("ct" -> user.ct)
val lnglat = user.latlng map { l => MongoDBObject("lnglat" -> MongoDBList(l._2, l._1)) } getOrElse emptyObj
val inactive = user.inactive map { i => MongoDBObject("inactive" -> i) } getOrElse emptyObj
//val attributes = user.attributes map { a => MongoDBObject("attributes" -> a) } getOrElse emptyObj
// add "ca_" prefix for custom attributes
val attributes = user.attributes map { a => attributesToMongoDBObject(a) } getOrElse emptyObj
userColl.save(id ++ appid ++ ct ++ lnglat ++ inactive ++ attributes)
}
def get(appid: Int, id: String) = userColl.findOne(MongoDBObject("_id" -> idWithAppid(appid, id))) map { dbObjToUser(_) }
def getByAppid(appid: Int) = new MongoUsersIterator(userColl.find(MongoDBObject("appid" -> appid)))
def update(user: User) = {
val id = MongoDBObject("_id" -> idWithAppid(user.appid, user.id))
val appid = MongoDBObject("appid" -> user.appid)
val ct = MongoDBObject("ct" -> user.ct)
val lnglat = user.latlng map { l => MongoDBObject("lnglat" -> MongoDBList(l._2, l._1)) } getOrElse emptyObj
val inactive = user.inactive map { i => MongoDBObject("inactive" -> i) } getOrElse emptyObj
//val attributes = user.attributes map { a => MongoDBObject("attributes" -> a) } getOrElse emptyObj
val attributes = user.attributes map { a => attributesToMongoDBObject(a) } getOrElse emptyObj
userColl.update(id, id ++ appid ++ ct ++ lnglat ++ inactive ++ attributes)
}
def delete(appid: Int, id: String) = userColl.remove(MongoDBObject("_id" -> idWithAppid(appid, id)))
def delete(user: User) = delete(user.appid, user.id)
def deleteByAppid(appid: Int): Unit = {
userColl.remove(MongoDBObject("appid" -> appid))
}
def countByAppid(appid: Int): Long = userColl.count(MongoDBObject("appid" -> appid))
private def dbObjToUser(dbObj: DBObject) = {
val appid = dbObj.as[Int]("appid")
User(
id = dbObj.as[String]("_id").drop(appid.toString.length + 1),
appid = appid,
ct = dbObj.as[DateTime]("ct"),
latlng = dbObj.getAs[MongoDBList]("lnglat") map { lnglat => (lnglat(1).asInstanceOf[Double], lnglat(0).asInstanceOf[Double]) },
inactive = dbObj.getAs[Boolean]("inactive"),
//attributes = dbObj.getAs[DBObject]("attributes") map { dbObjToMap(_) }
attributes = Option(getAttributesFromDBObject(dbObj)).filter(!_.isEmpty)
)
}
class MongoUsersIterator(it: MongoCursor) extends Iterator[User] {
def next = dbObjToUser(it.next)
def hasNext = it.hasNext
}
}