表达式解析
import org.junit.Testimport scala.collection.mutableclass ExprTestCase {private val orderSource = "source_1"private val saleChannel = "saleChannel"val datas = new mutable.HashMap[String, String]();datas.put("source_1", "source_1");datas.put("saleChannel", "saleChannel");datas.put("orderSource", "orderSource");val expr = s"orderSource:source_1 & ( saleChannel:saleChannel | orderSource:orderSource )"private val tokens: Array[String] = expr.split("\\s+")private val optStack = new mutable.ArrayStack[String]()private val memberStatck = new mutable.ArrayStack[String]()private var flag = false;def matchFiled(fieldName: String): String = {fieldName match {case "orderSource" => orderSourcecase "saleChannel" => saleChannelcase _ => throw new IllegalArgumentException(s"unknown filed name: ${fieldName}, it's can only be 'orderSource' or 'saleChannel'")}}@Testdef expParseTestCase() = {var opt = ""def exprProcess = {if (opt == "" || opt == "(") opt = optStack.pop()while (opt != null && opt != "(" && memberStatck.nonEmpty) {opt match {case "|" => {if(memberStatck.size > 1) {val m1 = memberStatck.pop().split(":")val m2 = memberStatck.pop().split(":")flag = datas.getOrElse(m2(1), "N").eq(matchFiled(m2(0))) || datas.getOrElse(m1(1), "N").eq(matchFiled(m1(0)))println(s"""[&]: ${datas.getOrElse(m2(1), "N")}.eq("${matchFiled(m2(0))}") || ${datas.getOrElse(m1(1), "N")}.eq("${matchFiled(m1(0))}")""")} else {val m1 = memberStatck.pop().split(":")flag = flag || datas.getOrElse(m1(1), "N").eq(matchFiled(m1(0)))println(s"""[&]: ${flag} || ${datas.getOrElse(m1(1), "N")}.eq("${matchFiled(m1(0))}""")}}case "&" => {if (memberStatck.size > 1) {val m1 = memberStatck.pop().split(":")val m2 = memberStatck.pop().split(":")flag = datas.getOrElse(m1(1), "N").equals(matchFiled(m1(0))) && datas.getOrElse(m2(1), "N").equals(matchFiled(m2(0)))println(s"""[&]: ${datas.getOrElse(m1(1), "N")}.eq("${matchFiled(m1(0))}") && ${datas.getOrElse(m2(1), "N")}.eq("${matchFiled(m2(0))}")""")} else {val m1 = memberStatck.pop().split(":")flag = flag && datas.getOrElse(m1(1), "N").equals(matchFiled(m1(0)))println(s"""[&]: ${false} && ${datas.get(m1(1))}.eq("$saleChannel")}.eq("${matchFiled(m1(0))}")""")}}}if (optStack.nonEmpty) opt = optStack.pop()}}tokens.foreach {case ")" => {exprProcess}case token@("|" | "&" | "(") => {optStack.push(token)}case token => {memberStatck.push(token)}}println("expr match complete :) ")if(memberStatck.nonEmpty) {exprProcess}println(flag)println(optStack)println(memberStatck)}}
输出
[&]: saleChannel.eq("saleChannel") || orderSource.eq("source_1")expr match complete :) [&]: false && Some(source_1).eq("saleChannel")}.eq("source_1")true
ArrayStack()
ArrayStack()