Skip to content

Instantly share code, notes, and snippets.

@jorgeortiz85
Created May 17, 2011 06:01
Show Gist options
  • Save jorgeortiz85/976025 to your computer and use it in GitHub Desktop.
Save jorgeortiz85/976025 to your computer and use it in GitHub Desktop.
Proof-of-concept MongoDynamic
import com.mongodb._
import org.bson.types.ObjectId
trait MongoDynamic extends Dynamic {
def applyDynamic(name: String)(args: Any*): MongoDynamic
def expand[A : Manifest]: Option[A]
}
object EmptyMongoDynamic extends MongoDynamic {
override def applyDynamic(name: String)(args: Any*): MongoDynamic = EmptyMongoDynamic
override def expand[A : Manifest]: Option[A] = None
}
case class ValueMongoDynamic[V : Manifest](value: V) extends MongoDynamic {
override def applyDynamic(name: String)(args: Any*): MongoDynamic = EmptyMongoDynamic
override def expand[A : Manifest]: Option[A] =
if (manifest[V] == manifest[A])
Some(value.asInstanceOf[A])
else
None
}
class DynamicDBObject(underlying: DBObject) extends MongoDynamic {
override def applyDynamic(name: String)(args: Any*): MongoDynamic = {
underlying.get(name).asInstanceOf[Any] match {
case null => EmptyMongoDynamic
case b: Byte => ValueMongoDynamic(b)
case s: Short => ValueMongoDynamic(s)
case i: Int => ValueMongoDynamic(i)
case l: Long => ValueMongoDynamic(l)
case f: Float => ValueMongoDynamic(f)
case d: Double => ValueMongoDynamic(d)
case b: Boolean => ValueMongoDynamic(b)
case s: String => ValueMongoDynamic(s)
case oid: ObjectId => ValueMongoDynamic(oid)
case dbo: DBObject => new DynamicDBObject(dbo)
}
}
override def expand[A : Manifest]: Option[A] =
if (manifest[A] == manifest[DBObject])
Some(underlying.asInstanceOf[A])
else
None
}
val dbo =
(BasicDBObjectBuilder.start
.add("_id", new ObjectId)
.add("name", "Jorge")
.push("address")
.add("street", "36 Cooper Sq")
.add("city", "New York")
.add("state", "NY")
.pop
.add("age", 26)
.get)
val d = new DynamicDBObject(dbo)
d.name.expand[String]
// res0: Option[String] = Some(Jorge)
d.name.expand[Int]
// res1: Option[Int] = None
d.address.city.expand[String]
// res2: Option[String] = Some(New York)
d.age.expand[Int]
// res3: Option[Int] = Some(26)
d.age.expand[String]
// res4: Option[String] = None
d._id.expand[ObjectId]
// res5: Option[org.bson.types.ObjectId] = Some(4dd20e58b3150b8279bf339d)
d._id.expand[DBObject]
// res6: Option[com.mongodb.DBObject] = None
d.address.expand[DBObject]
// res7: Option[com.mongodb.DBObject] = Some({ "street" : "1st Ave" , "city" : "New York" , "state" : "NY"})
d.foo.bar.baz.bang.more.stuff.that.dont.exist.expand[String]
// res8: Option[String] = None
@yesil
Copy link

yesil commented May 18, 2011

Thank you. Me too :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment