Advertisement
Guest User

Untitled

a guest
May 22nd, 2015
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.92 KB | None | 0 0
  1.  
  2. case class Field[A](name: String) {
  3.   def ===(value: A): Tree = Equals(this, value)
  4.   def !==(value: A): Tree = NotEquals(this, value)
  5.   def <(value: A): Tree = LessThan(this, value)
  6.   def >(value: A): Tree = GreaterThan(this, value)
  7.   def >=(value: A): Tree = GreaterOrEqual(this, value)
  8.   def <=(value: A): Tree = LessOrEqual(this, value)
  9. }
  10.  
  11. sealed trait Tree { self =>
  12.   def &&(t: Tree): Tree = and(t)
  13.   def and(t: Tree): Tree = And(self, t)
  14.   def ||(t: Tree): Tree = or(t)
  15.   def or(t: Tree): Tree = Or(self, t)
  16. }
  17. sealed trait Operator extends Tree { def left: Tree; def right: Tree}
  18. case class Or(left: Tree, right: Tree) extends Operator
  19. case class And(left: Tree, right: Tree) extends Operator
  20. sealed trait Operand[+A] extends Tree { def field: Field[_]; def value: A }
  21. case class GreaterOrEqual[A](field: Field[A], value: A) extends Operand[A]
  22. case class GreaterThan[A](field: Field[A], value: A) extends Operand[A]
  23. case class LessOrEqual[A](field: Field[A], value: A) extends Operand[A]
  24. case class LessThan[A](field: Field[A], value: A) extends Operand[A]
  25. case class Equals[A](field: Field[A], value: A) extends Operand[A]
  26. case class NotEquals[A](field: Field[A], value: A) extends Operand[A]
  27.  
  28. object QueryObjects {
  29.   object Test {
  30.     object name extends Field[String]("name")
  31.     object age extends Field[Int]("age")
  32.     object shoesize extends Field[Int]("shoesize")
  33.     object showsize extends Field[Int]("showsize")
  34.   }
  35. }
  36.  
  37. object QueryApp extends App {
  38.   import QueryObjects._
  39.  
  40.   def query = (Test.name === "Zandre") and (Test.age > 21) or ((Test.shoesize < 12) and (Test.showsize >= 22))
  41.  
  42.   println(query)
  43.  
  44.   def interpreter(q: Tree): MongoDBObject = {
  45.     def loop(q: Tree, acc: MongoDBObject): Imports.DBObject = q match {
  46.       case Or(left, right) => acc ++ $or(loop(left, MongoDBObject()), loop(right, MongoDBObject()))
  47.       case And(left, right) => acc ++ $and(loop(left, MongoDBObject()), loop(right, MongoDBObject()))
  48.       case Equals(f, v: Int) => f.name $eq v
  49.       case Equals(f, v: String) => f.name $eq v
  50.       case GreaterOrEqual(f, v: Int) => f.name $gte v
  51.       case GreaterThan(f, v: Int) => f.name $gt v
  52.       case LessOrEqual(f, v: Int) => f.name $lte v
  53.       case LessThan(f, v: Int) => f.name $lt v
  54.       case NotEquals(f, v: Int) => f.name $ne v
  55.       case NotEquals(f, v: String) => f.name $ne v
  56.       case _ => throw new UnsupportedOperationException()
  57.     }
  58.     loop(q,MongoDBObject())
  59.   }
  60.  
  61.   println(interpreter(query))
  62.  
  63.   val q1 = Test.name === "tester"
  64.   println(q1)
  65.   println(interpreter(q1))
  66.  
  67. }
  68.  
  69.  
  70. // output -----
  71. ---------------
  72. Or(And(Equals(Field(name),Zandre),GreaterThan(Field(age),21)),And(LessThan(Field(shoesize),12),GreaterOrEqual(Field(showsize),22)))
  73.  
  74. { "$or" : [ { "$and" : [ { "name" : "Zandre"} , { "age" : { "$gt" : 21}}]} , { "$and" : [ { "shoesize" : { "$lt" : 12}} , { "showsize" : { "$gte" : 22}}]}]}
  75.  
  76. Equals(Field(name),tester)
  77.  
  78. { "name" : "tester"}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement