PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/tools/migration/0.5/appdata/src/main/scala/io/prediction/tools/migration/Appdata.scala

https://github.com/eddieliu/PredictionIO
Scala | 135 lines | 97 code | 32 blank | 6 comment | 5 complexity | 7ec309769fa1a9d1185f1714f68551b9 MD5 | raw file
  1. package io.prediction.tools.migration
  2. //import com.typesafe.config._
  3. import io.prediction.commons.{Config}
  4. import com.mongodb.casbah.query.Imports._
  5. import com.mongodb.casbah.Imports.{MongoConnection}
  6. import com.mongodb.WriteResult
  7. object Appdata {
  8. //val config = ConfigFactory.load()
  9. val config = new Config()
  10. val appdataDbName = config.appdataDbName
  11. val appdataTrainingDbName = config.appdataTrainingDbName
  12. val appdataValidationDbName = config.appdataValidationDbName
  13. val appdataTestDbName = config.appdataTestDbName
  14. val appdataDb = config.appdataMongoDb.get
  15. val trainingDb = config.appdataTrainingMongoDb.get
  16. val validationDb = config.appdataValidationMongoDb.get
  17. val testDb = config.appdataTestMongoDb.get
  18. val dbSeq = Seq(
  19. appdataDbName -> appdataDb,
  20. appdataTrainingDbName -> trainingDb,
  21. appdataValidationDbName -> validationDb,
  22. appdataTestDbName -> testDb )
  23. def main(args: Array[String]) {
  24. println("PredictionIO 0.4 to 0.5 appdata Migration")
  25. println()
  26. println()
  27. val emptyObj = MongoDBObject()
  28. for ( (name, db) <- dbSeq ) {
  29. println(s"\nChecking ${name} DB...")
  30. val usersColl = db("users")
  31. val itemsColl = db("items")
  32. val u2iActionsColl = db("u2iActions")
  33. // users
  34. print("Updating user records with custom attributes...")
  35. val usersWithAttributes = usersColl.find(MongoDBObject("attributes" -> MongoDBObject("$exists" -> true)))
  36. var userCount = 0
  37. while (usersWithAttributes.hasNext) {
  38. val dbObj = usersWithAttributes.next
  39. userCount += 1
  40. val attributes = dbObj.getAs[DBObject]("attributes") map { dbObjToMap(_) }
  41. val flattenedObj = attributes map { a => attributesToMongoDBObject(a) } getOrElse emptyObj
  42. usersColl.update(MongoDBObject("_id" -> dbObj.as[String]("_id")), MongoDBObject("$set" -> flattenedObj, "$unset" -> MongoDBObject("attributes" -> 1)))
  43. }
  44. println(s"${userCount} users were updated.")
  45. // items
  46. print("Updating item records with custom attributes...")
  47. val itemsWithAttributes = itemsColl.find(MongoDBObject("attributes" -> MongoDBObject("$exists" -> true)))
  48. var itemCount = 0
  49. while (itemsWithAttributes.hasNext) {
  50. val dbObj = itemsWithAttributes.next
  51. itemCount += 1
  52. val attributes = dbObj.getAs[DBObject]("attributes") map { dbObjToMap(_) }
  53. val flattenedObj = attributes map { a => attributesToMongoDBObject(a) } getOrElse emptyObj
  54. itemsColl.update(MongoDBObject("_id" -> dbObj.as[String]("_id")), MongoDBObject("$set" -> flattenedObj, "$unset" -> MongoDBObject("attributes" -> 1)))
  55. }
  56. println(s"${itemCount} items were updated.")
  57. // u2iActions
  58. val rate: Int = 0
  59. val likeDislike: Int = 1 //(v==1 => like, v==0 => dislike)
  60. val view: Int = 2
  61. val viewDetails: Int = 3
  62. val conversion: Int = 4
  63. def checkWriteResult(wr: WriteResult) = {
  64. if (wr.getLastError().ok()) {
  65. println(s"${wr.getN} records were updated.")
  66. } else {
  67. wr.getLastError().throwOnError()
  68. }
  69. }
  70. print("Updating rate actions to new action name (may take a while)...")
  71. val rateResult = u2iActionsColl.update(MongoDBObject("action" -> rate), MongoDBObject("$set" -> MongoDBObject("action" -> "rate")), false, true)
  72. checkWriteResult(rateResult)
  73. print("Updating like actions to new action name (may take a while)...")
  74. val likeResult = u2iActionsColl.update(MongoDBObject("action" -> likeDislike, "v" -> 1), MongoDBObject("$set" -> MongoDBObject("action" -> "like"), "$unset" -> MongoDBObject("v" -> 1)), false, true)
  75. checkWriteResult(likeResult)
  76. print("Updating dislike actions to new action name (may take a while)...")
  77. val dislikeResult = u2iActionsColl.update(MongoDBObject("action" -> likeDislike, "v" -> 0), MongoDBObject("$set" -> MongoDBObject("action" -> "dislike"), "$unset" -> MongoDBObject("v" -> 1)), false, true)
  78. checkWriteResult(dislikeResult)
  79. print("Updating view actions to new action name (may take a while)...")
  80. val viewResult = u2iActionsColl.update(MongoDBObject("action" -> view), MongoDBObject("$set" -> MongoDBObject("action" -> "view")), false, true)
  81. checkWriteResult(viewResult)
  82. print("Updating viewDetails actions to new action name (may take a while)...")
  83. val viewDetailsResult = u2iActionsColl.update(MongoDBObject("action" -> viewDetails), MongoDBObject("$set" -> MongoDBObject("action" -> "viewDetails")), false, true)
  84. checkWriteResult(viewDetailsResult)
  85. print("Updating conversion actions to new action name (may take a while)...")
  86. val conversionResult = u2iActionsColl.update(MongoDBObject("action" -> conversion), MongoDBObject("$set" -> MongoDBObject("action" -> "conversion")), false, true)
  87. checkWriteResult(conversionResult)
  88. }
  89. println("Done.")
  90. }
  91. /** Modified from Salat. */
  92. def dbObjToMap(dbObj: DBObject): Map[String, Any] = {
  93. val builder = Map.newBuilder[String, Any]
  94. dbObj foreach {
  95. case (field, value) =>
  96. builder += field -> value
  97. }
  98. builder.result()
  99. }
  100. def attributesToMongoDBObject(attributes: Map[String, Any]) = {
  101. MongoDBObject( (attributes map { case (k, v) => ("ca_" + k, v) }).toList )
  102. }
  103. }