📄 newexpressionbuilder.java
字号:
package queries;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class NewExpressionBuilder implements IExpression {
private QueryCreator creator;
/**
* the followings are the priority of the operator
* including "#","OR","AND","NOT","("
*/
private static final int SHAR_PRIORITY = 0;
private static final int PAREN_PRIORITY_R = 1;
private static final int OR_PRIORITY = 2;
private static final int AND_PRIORITY = 3;
private static final int NOT_PRIORITY = 3;
private static final int PAREN_PRIORITY_W = 4;
private static final int UNEXPECT = -1;
public NewExpressionBuilder(){
}
public Query buildExpression(String exp) {
exp = format(exp);
StringTokenizer tokenizer = new StringTokenizer(exp);
Deque<String> operatorStack = new ArrayDeque<String>();
Deque<Query> operandStack = new ArrayDeque<Query>();
operatorStack.push("#");
while(tokenizer.hasMoreTokens()){
String token = tokenizer.nextToken().toLowerCase();
if(isOperator(token)){
int stackPriority = getStackPriority(operatorStack.peek());
int operatorPriority = getPriority(token);
if(operatorPriority > stackPriority){
operatorStack.push(token);
}
else{
while(operatorPriority <= stackPriority && ! operatorStack.isEmpty()){
String stackOperator = operatorStack.pop();
if(isComposite(stackOperator)){
creator = CompositeQueryCreator.getInstance(operandStack);
Query compositeQuery = creator.buildQuery(stackOperator);
operandStack.push(compositeQuery);
}
if(token.equals(")") && stackOperator.equals("(")){
break;
}
if(!operatorStack.isEmpty()){
stackPriority = getStackPriority(operatorStack.peek());
}
}
if(!token.equals(")")){
operatorStack.push(token);
}
}
}
else{
Query query = null;
if(isRangeQuery(token)){
creator = RangeQueryCreator.getInstance();
query = creator.buildQuery(token);
}else{
creator = ConcreteQueryCreator.getInstance();
query = creator.buildQuery(token);
}
operandStack.push(query);
}
}
return operandStack.pop();
}
/**
* @param operator
* @return
* return the priority of the opreator on the top of operation stack
*/
private int getStackPriority(String operator) {
if(operator.equals("(")){
return PAREN_PRIORITY_R;
}
else if(operator.equals("#")){
return SHAR_PRIORITY;
}
else{
return getPriority(operator);
}
}
/**
* @param operator
* @return
* get the priority of the operator
*/
private int getPriority(String operator){
if(operator.equals("or")){
return OR_PRIORITY;
}
else if(operator.equals("and")){
return AND_PRIORITY;
}
else if(operator.equals("not")){
return NOT_PRIORITY;
}
else if(operator.equals("(")){
return PAREN_PRIORITY_W;
}
else if(operator.equals(")")){
return PAREN_PRIORITY_R;
}
else if(operator.equals("#")){
return SHAR_PRIORITY;
}
else{
return UNEXPECT;
}
}
/**
* @param operator
* @return
* return true if it is an operator
*/
private boolean isOperator(String operator){
if(isComposite(operator) || operator.equals("(")
|| operator.equals(")") || operator.equals("#")){
return true;
}
return false;
}
private boolean isComposite(String operator){
if(operator.equals("and") || operator.equals("or")
|| operator.equals("not")){
return true;
}
return false;
}
/**
* @param exp
* @return
* return true if it is a range query
*/
private boolean isRangeQuery(String exp){
String[] flags = {"{","}","[","]"};
for(int i = 0;i < flags.length;i++){
if(exp.contains(flags[i])){
return true;
}
}
return false;
}
/**
* @param exp
* @return
* format the expression to add spaces between the '(' and ')'
*/
private String format(String exp){
String[] array = exp.split("\\(");
StringBuffer buffer1 = new StringBuffer();
for(int i = 0;i < array.length; i++){
buffer1.append(" ( " + array[i]);
}
array = buffer1.toString().split("\\)");
StringBuffer buffer2 = new StringBuffer();
for(int i = 0;i < array.length; i++){
buffer2.append(array[i] + " ) ");
}
//String result = buffer2.toString().toLowerCase() + " #";
String result = buffer2.toString() + " #";
char[] characters = result.toCharArray();
boolean flag = false;
for(int i = 0;i < characters.length;i++){
if(characters[i] == '\"'){
flag = !flag;
}
if(characters[i] == ' ' && flag == true){
characters[i] = '+';
}
}
result = new String(characters);
return result;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -