Advertisement
Guest User

Untitled

a guest
May 20th, 2015
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.51 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.   def statementss = getStatements("'name' '==' 'Zandre'\n'age' '>' 21\n'shoesize' '<' 12\n'showsize' '>=' 22")
  52.   def q = getStatements("'name' '==' 'Zandre'\n'age' '>' 21\n'shoesize' '<' 12\n'showsize' '>=' 22") match {
  53.     case Some(list) => Some(list.map {
  54.       case Equals(f, v) => f $eq v
  55.       case GreaterOrEqual(f, v) => f $gte v
  56.       case GreaterThan(f, v) => f $gt v
  57.       case LessOrEqual(f, v) => f $lte v
  58.       case LessThan(f, v) => f $lt v
  59.       case NotEquals(f, v) => f $ne v
  60.     }.foldLeft(MongoDBObject())(_ ++ _))
  61.     case None => None
  62.   }
  63.  
  64.   println(statementss)
  65.   println(q)
  66.  
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement