Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- case class Field[A](name: String) {
- def ===(value: A): Tree[A] = Equals(this, value)
- def !==(value: A): Tree[A] = NotEquals(this, value)
- def <(value: A): Tree[A] = LessThan(this, value)
- def >(value: A): Tree[A] = GreaterThan(this, value)
- def >=(value: A): Tree[A] = GreaterOrEqual(this, value)
- def <=(value: A): Tree[A] = LessOrEqual(this, value)
- }
- sealed trait Tree[+A] {
- self =>
- def &&(t: Tree[_]): Tree[_] = and(t)
- def and(t: Tree[_]): Tree[_] = And(self, t)
- def ||(t: Tree[_]): Tree[_] = or(t)
- def or(t: Tree[_]): Tree[_] = Or(self, t)
- }
- sealed trait Leaf[+A] extends Tree[A] { def field: Field[_]; def value: A }
- sealed trait Node[+A] extends Tree[A] { def left: Tree[_]; def right: Tree[_]}
- case class Or[+A](left: Tree[_], right: Tree[_]) extends Node[A]
- case class And[+A](left: Tree[_], right: Tree[_]) extends Node[A]
- case class GreaterOrEqual[A](field: Field[A], value: A) extends Leaf[A]
- case class GreaterThan[A](field: Field[A], value: A) extends Leaf[A]
- case class LessOrEqual[A](field: Field[A], value: A) extends Leaf[A]
- case class LessThan[A](field: Field[A], value: A) extends Leaf[A]
- case class Equals[A](field: Field[A], value: A) extends Leaf[A]
- case class NotEquals[A](field: Field[A], value: A) extends Leaf[A]
- object QueryObjects {
- object Test {
- object name extends Field[String]("name")
- object age extends Field[Int]("age")
- object shoesize extends Field[Int]("shoesize")
- object showsize extends Field[Int]("showsize")
- }
- }
- (Test.name === "Zandre") and (Test.age > 21) or ((Test.shoesize < 12) and (Test.showsize >= 22))
- ===
- Or(And(Equals(Field(name),Zandre),GreaterThan(Field(age),21)),And(LessThan(Field(shoesize),12),GreaterOrEqual(Field(showsize),22)))
- and Test.name === 3 // gives design time error / compile time error
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement