|
@@ -1,7 +1,7 @@
|
|
|
package cn.cslg.pas.common.utils.parseQueryToTree;
|
|
|
|
|
|
import cn.cslg.pas.common.utils.StringUtils;
|
|
|
-import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
@@ -158,17 +158,16 @@ public class expressManager {
|
|
|
ArrayList<String> Tokens = GetTokens(strExpress);
|
|
|
Stack<Symbol> symbolStack = new Stack<Symbol>();
|
|
|
Stack<treeNode> valueStack = new Stack<treeNode>();
|
|
|
- List<String> middleKuoHaoStrs =new ArrayList<>();
|
|
|
- if(!isAnd){
|
|
|
- return ExpressTreeNode.Tokens2Node(Tokens,isAnd);
|
|
|
- }
|
|
|
- Boolean ifFindEndingMiddleKuoHaoStrs =false;
|
|
|
+ List<String> middleKuoHaoStrs = new ArrayList<>();
|
|
|
+ if (!isAnd) {
|
|
|
+ return ExpressTreeNode.Tokens2Node(Tokens, isAnd);
|
|
|
+ }
|
|
|
+ Boolean ifFindEndingMiddleKuoHaoStrs = false;
|
|
|
for (String strTem : Tokens) {
|
|
|
Symbol temSymbol = expressManager.getInstance().getSymbol(strTem);
|
|
|
- if(ifFindEndingMiddleKuoHaoStrs&&(temSymbol == null||!(temSymbol instanceof pairSymbol&&((pairSymbol) temSymbol).Code.equals("]")))){
|
|
|
+ if (ifFindEndingMiddleKuoHaoStrs && (temSymbol == null || !(temSymbol instanceof pairSymbol && ((pairSymbol) temSymbol).Code.equals("]")))) {
|
|
|
middleKuoHaoStrs.add(strTem);
|
|
|
- }
|
|
|
- else if (temSymbol != null) {
|
|
|
+ } else if (temSymbol != null) {
|
|
|
if (temSymbol instanceof operate) {
|
|
|
//#region 如果是操作符,从操作符堆栈中取出优先级大于等于该操作符的结合值堆栈生成节点后压入值堆栈,然后将该操作符压入堆栈
|
|
|
operate temOperate = (operate) temSymbol;
|
|
@@ -199,18 +198,15 @@ public class expressManager {
|
|
|
symbolStack.push(temSymbol);
|
|
|
//#endregion
|
|
|
} 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,",");
|
|
|
+ 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<>();
|
|
|
+ middleKuoHaoStrs = new ArrayList<>();
|
|
|
}
|
|
|
|
|
|
//#region 括号处理
|
|
@@ -250,13 +246,12 @@ public class expressManager {
|
|
|
//#endregion
|
|
|
}
|
|
|
} else {
|
|
|
- if(!ifFindEndingMiddleKuoHaoStrs) {
|
|
|
+ if (!ifFindEndingMiddleKuoHaoStrs) {
|
|
|
valueNode temNode = new valueNode();
|
|
|
temNode.value = strTem;
|
|
|
|
|
|
valueStack.push(temNode);
|
|
|
- }
|
|
|
- else {
|
|
|
+ } else {
|
|
|
middleKuoHaoStrs.add(strTem);
|
|
|
}
|
|
|
}
|
|
@@ -296,7 +291,7 @@ public class expressManager {
|
|
|
if (temNode instanceof valueNode) {
|
|
|
lstValues.add(temNode);
|
|
|
} else {
|
|
|
- throw new Exception("无效的检索式!");
|
|
|
+ throw new Exception("无效的检索式!");
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -343,29 +338,31 @@ public class expressManager {
|
|
|
|
|
|
String strTemToken = "";
|
|
|
Boolean isFindingEndYinHao = false;
|
|
|
- Boolean ifFindingEndMiddleKuoHao=false;
|
|
|
+ Boolean ifFindingEndMiddleKuoHao = false;
|
|
|
int step = -1;
|
|
|
for (int i = 0; i < strTem.length(); i++) {
|
|
|
char c = strTem.charAt(i);
|
|
|
|
|
|
switch (c) {
|
|
|
+ case '“':
|
|
|
+ case '”':
|
|
|
case '"':
|
|
|
- if (!isFindingEndYinHao) {
|
|
|
- isFindingEndYinHao = true;
|
|
|
+ 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);
|
|
|
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);
|
|
|
- step = i;
|
|
|
- isFindingEndYinHao = false;
|
|
|
- }
|
|
|
-
|
|
|
+ isFindingEndYinHao = false;
|
|
|
}
|
|
|
|
|
|
+ }
|
|
|
+
|
|
|
break;
|
|
|
case ' ':
|
|
|
if (!isFindingEndYinHao) {
|