Advertisement
Guest User

Untitled

a guest
May 20th, 2015
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.76 KB | None | 0 0
  1. package com.fullfacing.dsl
  2.  
  3. import com.mongodb.casbah.Imports._
  4. import scala.util.parsing.combinator.syntactical.StandardTokenParsers
  5.  
  6. /**
  7.  * Project: com.fullfacing.dsl
  8.  * Created on 2015/05/19.
  9.  * ryno aka lemonxah -
  10.  * https://github.com/lemonxah
  11.  * http://stackoverflow.com/users/2919672/lemon-xah
  12.  */
  13.  
  14. sealed trait Statement
  15. case class GreaterOrEqual(field: String, value: String) extends Statement
  16. case class GreaterThan(field: String, value: String) extends Statement
  17. case class LessOrEqual(field: String, value: String) extends Statement
  18. case class LessThan(field: String, value: String) extends Statement
  19. case class Equals(field: String, value: String) extends Statement
  20. case class NotEquals(field: String, value: String) extends Statement
  21.  
  22. sealed trait Literal[A] { val v: A }
  23. case class Field(v: String) extends Literal[String]
  24. case class StringValue(v: String) extends Literal[String]
  25. case class IntValue(v: Int) extends Literal[Int]
  26. case class LongValue(v: Long) extends Literal[Long]
  27. case class Operation(v: String) extends Literal[String]
  28.  
  29. object Interpreter extends StandardTokenParsers with App {
  30.   def result(s: String) = phrase(program)(new lexical.Scanner(s.split("&&").reduceLeft(_ + '\n' + _)))
  31.   def program = stmt+
  32.   def stmt = field ~ op ~ value ^^ {
  33.    case field ~ o ~ value => (o.v match {
  34.      case "==" => Equals
  35.      case "!=" => NotEquals
  36.      case "<" => LessThan
  37.      case ">" => GreaterThan
  38.      case ">=" => GreaterOrEqual
  39.      case "<=" => LessOrEqual
  40.    })(field.v, value.v.toString)
  41.   }
  42.   def field = stringLit ^^ {case s => Field(s) }
  43.   def value = stringLit ^^ {case s => StringValue(s)} | numericLit ^^ {case s => IntValue(s.toInt)}
  44.   def op = stringLit ^^ { case s => Operation(s)}
  45.   def getStatements(s: String): Option[List[Statement]] = result(s) match {
  46.     case Success(tree, _) => Some(tree)
  47.     case e: NoSuccess =>
  48.       println(e)
  49.       None
  50.   }
  51.   object QueryLanguage {
  52.     sealed trait QueryTrait {
  53.       self: Query =>
  54.       def and(q: Query): Query = Query(s"$self && $q")
  55.       override def toString = self.q
  56.     }
  57.     case class Query(q: String) extends QueryTrait
  58.  
  59.     sealed trait Field[E] {
  60.       val cn: String
  61.       def ===(value: E): Query = combine("==", value)
  62.       def !==(value: E): Query = combine("!=", value)
  63.       def <(value: E): Query = combine("<", value)
  64.       def >(value: E): Query = combine(">", value)
  65.       def >=(value: E): Query = combine(">=", value)
  66.       def <=(value: E): Query = combine("<=", value)
  67.       def combine(op: String, value: E): Query = Query(s"'$cn' '$op' $value")
  68.     }
  69.     sealed trait StringField extends Field[String] {
  70.       override def combine(op: String, value: String): Query = Query(s"'$cn' '$op' '$value'")
  71.     }
  72.  
  73.     object Test {
  74.       object name extends StringField { override val cn = "name"}
  75.       object age extends Field[Int] { override val cn = "age"}
  76.       object shoesize extends Field[Int] { override val cn = "shoesize"}
  77.       object showsize extends Field[Int] { override val cn = "showsize"}
  78.     }
  79.  
  80.   }
  81.   import QueryLanguage._
  82.  
  83.   def statement = "'name' '==' 'Zandre' && 'age' '>' 21 && 'shoesize' '<' 12 && 'showsize' '>=' 22"
  84.  
  85.   def query = (Test.name === "Zandre") and (Test.age > 21) and (Test.shoesize < 12) and (Test.showsize >= 22)
  86.  
  87.   println(statement)
  88.   println(query.q)
  89.  
  90.   def q = getStatements(query.q) match {
  91.     case Some(list) => Some(list.map {
  92.       case Equals(f, v) => f $eq v
  93.       case GreaterOrEqual(f, v) => f $gte v
  94.       case GreaterThan(f, v) => f $gt v
  95.       case LessOrEqual(f, v) => f $lte v
  96.       case LessThan(f, v) => f $lt v
  97.       case NotEquals(f, v) => f $ne v
  98.     }.foldLeft(MongoDBObject())(_ ++ _))
  99.     case None => None
  100.   }
  101.  
  102.   println(getStatements(statement))
  103.   println(q)
  104.  
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement