/MongoDbPoC/src/main/scala/svl/mongo/Db.scala

https://github.com/victorspivak/projects · Scala · 58 lines · 44 code · 12 blank · 2 comment · 0 complexity · aef16c32f5c7725bdd75aeeb7b17cd3f MD5 · raw file

  1. package svl.mongo
  2. import com.mongodb.casbah.{MongoCollection, MongoClient}
  3. import com.mongodb.casbah.commons.MongoDBObject
  4. import scala.collection.mutable
  5. import com.mongodb.{WriteConcern, DBObject}
  6. import com.mongodb.casbah.Imports._
  7. class Db (val host:String, val dbName:String) {
  8. val mongoClient = MongoClient(host)
  9. val mongoDb = mongoClient(dbName)
  10. def deleteCollection(name:String) = collection(name).remove(MongoDBObject.empty)
  11. def collection(name:String): MongoCollection = mongoDb(name)
  12. }
  13. object Db {
  14. def apply(host:String, dbName:String) = new Db(host, dbName)
  15. }
  16. trait AbstractEntity {
  17. def toDbObject:DBObject
  18. }
  19. class AbstractFilter {
  20. val constrains = new mutable.MutableList[(String, Any)]
  21. def filterEquals(key:String, value:Any) = add(key -> value)
  22. def filterGT(key:String, value:Any) = add(key -> MongoDBObject("$gt" -> value))
  23. def filterLT(key:String, value:Any) = add(key -> MongoDBObject("$lt" -> value))
  24. private def add(constrain:(String, Any)) = {
  25. constrains += constrain
  26. this
  27. }
  28. def toDbObject:DBObject = MongoDBObject(constrains.toList)
  29. }
  30. object AbstractFilter {
  31. def apply() = new AbstractFilter()
  32. }
  33. abstract class EntityActor[T <: AbstractEntity](val collectionName:String) (implicit val db:Db) {
  34. def convert(dbObj:DBObject):T
  35. val collection = db.collection(collectionName)
  36. implicit def toDbObject(t:T):DBObject = t.toDbObject
  37. def insert(obj:T) = collection.insert(obj.toDbObject, WriteConcern.SAFE)
  38. def insert(objects:T*) = {
  39. collection.insert(objects.map(_.toDbObject): _*)
  40. collection.lastError(WriteConcern.SAFE)
  41. }
  42. // def insert(objects:T*) = collection.insert(objects)
  43. // def insert(o1:T, o2:T) = collection.insert(List(o1, o2): _*)
  44. def query(filter:AbstractFilter) = collection.find(filter.toDbObject).map(convert(_))
  45. def count(filter:AbstractFilter) = collection.count(filter.toDbObject)
  46. }