Advertisement
Guest User

Untitled

a guest
Jun 27th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.40 KB | None | 0 0
  1. package com.ts.rules
  2.  
  3. case class Point () {
  4. val values:Map[String,Any] = Map[String,Any]("f1"->1.0,"f2"->"f2","f3"->3.0, "f4"->true,"f5"->"str","f6"->"str")
  5. def getByName[T](name:String) = values(name).asInstanceOf[T]
  6. }
  7.  
  8.  
  9. trait Expression[+T] {
  10. def eval():T
  11. def boolEval():Boolean = false
  12. }
  13.  
  14. trait BoolExpression extends Expression[Boolean] {
  15. override def boolEval(): Boolean = eval()
  16. }
  17.  
  18. case class ExtractExpression[T](p:Point, fieldStr:String) extends Expression[T] {
  19. override def eval(): T = p.getByName(fieldStr)
  20. }
  21.  
  22. case class ConstExpression[T](value:T) extends Expression[T] {
  23. override def eval(): T = value
  24.  
  25. override def boolEval(): Boolean = value match {
  26. case v:Boolean => v
  27. case d:Double => d > 0
  28. case i:Int => i > 0
  29. case _ => false
  30. }
  31. }
  32.  
  33. case class EqExpression[T](left:Expression[T],right:Expression[T]) extends BoolExpression {
  34. override def eval(): Boolean = left.eval() == right.eval()
  35.  
  36. }
  37.  
  38. case class GtExpression[T](left:Expression[T],right:Expression[T]) extends BoolExpression {
  39. override def eval(): Boolean = left.eval() match {
  40. case c1:Double => right.eval() match {
  41. case c2:Double=> c1 > c2
  42. case _ => false
  43. }
  44. case _ => false
  45. }
  46. }
  47.  
  48. case class OrExpression[T](expressions:Seq[Expression[T]]) extends BoolExpression {
  49. override def eval(): Boolean =
  50. expressions.exists(ex => ex.boolEval())
  51.  
  52. }
  53.  
  54. case class AndExpression[T](expressions:Seq[Expression[T]]) extends BoolExpression {
  55. override def eval(): Boolean =
  56. expressions.map(ex => ex.boolEval()).forall(v=>v)
  57. }
  58.  
  59.  
  60. object RulesApp extends App {
  61.  
  62. val p: Point = Point()
  63.  
  64. val ev1 = ExtractExpression(p, "f1")
  65. val ev2 = ConstExpression(1.0)
  66. val eq1 = EqExpression(ev1, ev2)
  67.  
  68. val ev3 = ExtractExpression(p, "f5")
  69. val ev4 = ExtractExpression(p, "f6")
  70. val eq2 = EqExpression(ev1, ev2)
  71.  
  72. val ev5 = ExtractExpression(p, "f3")
  73. val ev6 = ExtractExpression(p, "f1")
  74. val eq3 = GtExpression(ev5, ev6)
  75.  
  76. val eqFalse = GtExpression(ev6,ev5) // false
  77.  
  78. val and1 = AndExpression(Seq(eq2, eq1, eq3, ConstExpression(true)))
  79.  
  80. val or1 = OrExpression(Seq(eq2, eq1, eqFalse, ConstExpression(false)))
  81.  
  82. //and1 :
  83. // "AND" : {
  84. // EQ : {
  85. // "attr:f3, , attr:f1
  86. // }, //true
  87. // EQ : {
  88. // "attr:f1, , 1.0
  89. // }, //true
  90. // GT : {
  91. // "attr:f3, , attr:f1
  92. // }, //true
  93. // true
  94. // }
  95. // ALL True !
  96.  
  97. println(and1.eval() + " should be true")
  98.  
  99.  
  100. //or1 :
  101. // "OR" : {
  102. // EQ : {
  103. // "attr:f6, , attr:f5
  104. // }, //true
  105. // EQ : {
  106. // "attr:f1, , 1.0
  107. // }, //true
  108. // GT : {
  109. // "attr:f1, , attr:f3 // false
  110. // },
  111. // false
  112. //
  113. // Some True !
  114. println(or1.eval() + " should be true")
  115.  
  116.  
  117. //falseList :
  118. // "AND" : {
  119. // GT : {
  120. // "attr:f1, , attr:f3
  121. // }, //false
  122. // EQ : {
  123. // "attr:f5, , attr:f6
  124. // }, //true
  125. // EQ : {
  126. // "attr:f1, , 1.0
  127. // }, //true
  128. // GT : {
  129. // "attr:f3, , attr:f1
  130. // }, //true
  131. // true
  132. // }
  133. // One False -> False
  134.  
  135. val falseList = eqFalse :: and1.expressions.toList
  136. println(AndExpression(falseList).eval()+ " should be false")
  137.  
  138.  
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement