|
@@ -1,5 +1,6 @@
|
|
package cn.cslg.pas.common.utils.parseQueryToTree;
|
|
package cn.cslg.pas.common.utils.parseQueryToTree;
|
|
|
|
|
|
|
|
+import cn.cslg.pas.common.utils.StringUtils;
|
|
import org.springframework.util.CollectionUtils;
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
@@ -157,9 +158,17 @@ public class expressManager {
|
|
ArrayList<String> Tokens = GetTokens(strExpress);
|
|
ArrayList<String> Tokens = GetTokens(strExpress);
|
|
Stack<Symbol> symbolStack = new Stack<Symbol>();
|
|
Stack<Symbol> symbolStack = new Stack<Symbol>();
|
|
Stack<treeNode> valueStack = new Stack<treeNode>();
|
|
Stack<treeNode> valueStack = new Stack<treeNode>();
|
|
|
|
+ List<String> middleKuoHaoStrs =new ArrayList<>();
|
|
|
|
+ if(!isAnd){
|
|
|
|
+ return ExpressTreeNode.Tokens2Node(Tokens,isAnd);
|
|
|
|
+ }
|
|
|
|
+ Boolean ifFindEndingMiddleKuoHaoStrs =false;
|
|
for (String strTem : Tokens) {
|
|
for (String strTem : Tokens) {
|
|
Symbol temSymbol = expressManager.getInstance().getSymbol(strTem);
|
|
Symbol temSymbol = expressManager.getInstance().getSymbol(strTem);
|
|
- if (temSymbol != null) {
|
|
|
|
|
|
+ if(ifFindEndingMiddleKuoHaoStrs&&(temSymbol == null||!(temSymbol instanceof pairSymbol&&((pairSymbol) temSymbol).Code.equals("]")))){
|
|
|
|
+ middleKuoHaoStrs.add(strTem);
|
|
|
|
+ }
|
|
|
|
+ else if (temSymbol != null) {
|
|
if (temSymbol instanceof operate) {
|
|
if (temSymbol instanceof operate) {
|
|
//#region 如果是操作符,从操作符堆栈中取出优先级大于等于该操作符的结合值堆栈生成节点后压入值堆栈,然后将该操作符压入堆栈
|
|
//#region 如果是操作符,从操作符堆栈中取出优先级大于等于该操作符的结合值堆栈生成节点后压入值堆栈,然后将该操作符压入堆栈
|
|
operate temOperate = (operate) temSymbol;
|
|
operate temOperate = (operate) temSymbol;
|
|
@@ -190,8 +199,22 @@ public class expressManager {
|
|
symbolStack.push(temSymbol);
|
|
symbolStack.push(temSymbol);
|
|
//#endregion
|
|
//#endregion
|
|
} else {
|
|
} else {
|
|
|
|
+ if(temSymbol instanceof pairSymbol&&((pairSymbol) temSymbol).Code.equals("["))
|
|
|
|
+ {
|
|
|
|
+ ifFindEndingMiddleKuoHaoStrs=true;
|
|
|
|
+ }
|
|
|
|
+ else if(temSymbol instanceof pairSymbol&&((pairSymbol) temSymbol).Code.equals("]"))
|
|
|
|
+ {
|
|
|
|
+ ifFindEndingMiddleKuoHaoStrs=false;
|
|
|
|
+ String temp= StringUtils.join(middleKuoHaoStrs,",");
|
|
|
|
+ valueNode temNode = new valueNode();
|
|
|
|
+ temNode.value = temp;
|
|
|
|
+ valueStack.push(temNode);
|
|
|
|
+ middleKuoHaoStrs=new ArrayList<>();
|
|
|
|
+ }
|
|
|
|
+
|
|
//#region 括号处理
|
|
//#region 括号处理
|
|
- if (temSymbol instanceof pairSymbol && ((pairSymbol) temSymbol).isEndSymbol) {
|
|
|
|
|
|
+ else if (temSymbol instanceof pairSymbol && ((pairSymbol) temSymbol).isEndSymbol) {
|
|
Symbol lastSymbol = symbolStack.peek();
|
|
Symbol lastSymbol = symbolStack.peek();
|
|
|
|
|
|
if (lastSymbol == null) {
|
|
if (lastSymbol == null) {
|
|
@@ -227,10 +250,15 @@ public class expressManager {
|
|
//#endregion
|
|
//#endregion
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- valueNode temNode = new valueNode();
|
|
|
|
- temNode.value = strTem;
|
|
|
|
|
|
+ if(!ifFindEndingMiddleKuoHaoStrs) {
|
|
|
|
+ valueNode temNode = new valueNode();
|
|
|
|
+ temNode.value = strTem;
|
|
|
|
|
|
- valueStack.push(temNode);
|
|
|
|
|
|
+ valueStack.push(temNode);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ middleKuoHaoStrs.add(strTem);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -315,27 +343,29 @@ public class expressManager {
|
|
|
|
|
|
String strTemToken = "";
|
|
String strTemToken = "";
|
|
Boolean isFindingEndYinHao = false;
|
|
Boolean isFindingEndYinHao = false;
|
|
|
|
+ Boolean ifFindingEndMiddleKuoHao=false;
|
|
int step = -1;
|
|
int step = -1;
|
|
for (int i = 0; i < strTem.length(); i++) {
|
|
for (int i = 0; i < strTem.length(); i++) {
|
|
char c = strTem.charAt(i);
|
|
char c = strTem.charAt(i);
|
|
|
|
|
|
switch (c) {
|
|
switch (c) {
|
|
case '"':
|
|
case '"':
|
|
- if (!isFindingEndYinHao) {
|
|
|
|
- isFindingEndYinHao = true;
|
|
|
|
- step = i;
|
|
|
|
- } else {
|
|
|
|
- if ((i < strTem.length() - 1 && strTem.charAt(i + 1) == ' ')
|
|
|
|
- || (i < strTem.length() - 1 && strTem.charAt(i + 1) == ')')
|
|
|
|
- || (i < strTem.length() - 1 && strTem.charAt(i + 1) == ']')
|
|
|
|
- || i == strTem.length() - 1) {
|
|
|
|
- strTemToken = strTem.substring(step + 1, i);
|
|
|
|
- Tokens.add(strTemToken);
|
|
|
|
|
|
+ if (!isFindingEndYinHao) {
|
|
|
|
+ isFindingEndYinHao = true;
|
|
step = i;
|
|
step = i;
|
|
- isFindingEndYinHao = false;
|
|
|
|
|
|
+ } else {
|
|
|
|
+ if ((i < strTem.length() - 1 && strTem.charAt(i + 1) == ' ')
|
|
|
|
+ || (i < strTem.length() - 1 && strTem.charAt(i + 1) == ')')
|
|
|
|
+ || (i < strTem.length() - 1 && strTem.charAt(i + 1) == ']')
|
|
|
|
+ || i == strTem.length() - 1) {
|
|
|
|
+ strTemToken = strTem.substring(step + 1, i);
|
|
|
|
+ Tokens.add(strTemToken);
|
|
|
|
+ step = i;
|
|
|
|
+ isFindingEndYinHao = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
- }
|
|
|
|
break;
|
|
break;
|
|
case ' ':
|
|
case ' ':
|
|
if (!isFindingEndYinHao) {
|
|
if (!isFindingEndYinHao) {
|