PageRenderTime 43ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/commons/src/main/scala/io/prediction/commons/appdata/mongodb/MongoU2IActions.scala

https://github.com/eddieliu/PredictionIO
Scala | 66 lines | 53 code | 12 blank | 1 comment | 1 complexity | 7e7193804bd4f06501874deabdfc3768 MD5 | raw file
  1. package io.prediction.commons.appdata.mongodb
  2. import io.prediction.commons.MongoUtils._
  3. import io.prediction.commons.appdata.{ U2IAction, U2IActions }
  4. import com.mongodb.casbah.Imports._
  5. import com.mongodb.casbah.commons.conversions.scala._
  6. import com.github.nscala_time.time.Imports._
  7. /** MongoDB implementation of Items. */
  8. class MongoU2IActions(db: MongoDB) extends U2IActions {
  9. private val emptyObj = MongoDBObject()
  10. private val u2iActionColl = db("u2iActions")
  11. RegisterJodaTimeConversionHelpers()
  12. def insert(u2iAction: U2IAction) = {
  13. val appid = MongoDBObject("appid" -> u2iAction.appid)
  14. val action = MongoDBObject("action" -> u2iAction.action)
  15. val uid = MongoDBObject("uid" -> idWithAppid(u2iAction.appid, u2iAction.uid))
  16. val iid = MongoDBObject("iid" -> idWithAppid(u2iAction.appid, u2iAction.iid))
  17. val t = MongoDBObject("t" -> u2iAction.t)
  18. val lnglat = u2iAction.latlng map { l => MongoDBObject("lnglat" -> MongoDBList(l._2, l._1)) } getOrElse emptyObj
  19. val v = u2iAction.v map { v => MongoDBObject("v" -> v) } getOrElse emptyObj
  20. val price = u2iAction.price map { p => MongoDBObject("price" -> p) } getOrElse emptyObj
  21. u2iActionColl.insert(appid ++ action ++ uid ++ iid ++ t ++ lnglat ++ v ++ price)
  22. }
  23. def getAllByAppid(appid: Int) = new MongoU2IActionIterator(u2iActionColl.find(MongoDBObject("appid" -> appid)))
  24. def getAllByAppidAndUidAndIids(appid: Int, uid: String, iids: Seq[String]) = new MongoU2IActionIterator(
  25. u2iActionColl.find(MongoDBObject("appid" -> appid, "uid" -> idWithAppid(appid, uid), "iid" -> MongoDBObject("$in" -> iids.map(idWithAppid(appid, _)))))
  26. )
  27. def getAllByAppidAndIid(appid: Int, iid: String, sortedByUid: Boolean = true): Iterator[U2IAction] = {
  28. if (sortedByUid)
  29. new MongoU2IActionIterator(u2iActionColl.find(MongoDBObject("appid" -> appid, "iid" -> idWithAppid(appid, iid))).sort(MongoDBObject("uid" -> 1)))
  30. else
  31. new MongoU2IActionIterator(u2iActionColl.find(MongoDBObject("appid" -> appid, "iid" -> idWithAppid(appid, iid))))
  32. }
  33. def deleteByAppid(appid: Int): Unit = {
  34. u2iActionColl.remove(MongoDBObject("appid" -> appid))
  35. }
  36. def countByAppid(appid: Int): Long = u2iActionColl.count(MongoDBObject("appid" -> appid))
  37. private def dbObjToU2IAction(dbObj: DBObject) = {
  38. val appid = dbObj.as[Int]("appid")
  39. U2IAction(
  40. appid = appid,
  41. action = dbObj.as[String]("action"),
  42. uid = dbObj.as[String]("uid").drop(appid.toString.length + 1),
  43. iid = dbObj.as[String]("iid").drop(appid.toString.length + 1),
  44. t = dbObj.as[DateTime]("t"),
  45. latlng = dbObj.getAs[MongoDBList]("lnglat") map { lnglat => (lnglat(1).asInstanceOf[Double], lnglat(0).asInstanceOf[Double]) },
  46. v = dbObj.getAs[Int]("v"),
  47. price = dbObj.getAs[Double]("price")
  48. )
  49. }
  50. class MongoU2IActionIterator(it: MongoCursor) extends Iterator[U2IAction] {
  51. def next = dbObjToU2IAction(it.next)
  52. def hasNext = it.hasNext
  53. }
  54. }