2017-06-02 67 views
0

我想以字符串的形式解析java中的SQL查询(等于,大于,小于AND运算符)。我有一个类解析java中的字符串

class QueryBuilder() 
{ 
Expression parse(String query) 
{ 
    String[] token = query.split("\\s+"); 
    String field = token[0]; 
    String value = token[1]; 
    String operator = token[2]; 

    switch (operator) 
    case "EQ" (equals): 
    return new BinaryExpression(field, Operator.EQ, value); 
    case "LT" (less than): 
    return new BinaryExpression(field, Operator.LT, value); 
    case "GT" (greater than): 
    return new BinaryExpression(field, Operator.GT, value); 
    default (In condition): 
    return new BinaryExpression(field, Operator.IN, value); 
} 
} 
} 

//当我调用这个类:

QueryBuilder ob= new QueryBuilder(); 
ob.parse("eid EQ 2"); ///This will give results with eid =2 records 

Similarly ob.parse("eid GT 2"); //This will give results eid>2 records. 

Now I want to add Logical Expression like AND: 

For Ex: ob.parse("eid EQ 2 AND deptname foo");// it should give both eid=2 AND 

deptname="foo" 

有人可以帮我如何分析与AND条件的STRING?

+0

现在你有两类运营商,你会像下面这样使用它。考虑使用递归下降。 –

回答

0

现在你有两类操作符。考虑使用递归下降。

您将有规则:

表达:: = BinaryExpression(BooleanOperator BinaryExpression)*

BooleanOperator :: = “或” | “和”

BinaryExpression :: =名称BinaryOperator值

BinaryOperator :: = “EQ” | “LT” | “GT” | “IN”

因此,这里是一个非常简单的实现:

public class QueryBuilder { 
    final String[] token; 
    int i = 0; 

    public static Expression parse(String query) { 
     return new QueryBuilder(query).expression(); 
    } 

    private QueryBuilder(String query) { 
     token = query.split("\\s+"); 
    } 

    private Expression expression() { 
     Expression expr = binaryExpression(); 
     while (i < token.length) { 
      String operator = token[i++]; 
      Expression right = binaryExpression(); 
      switch (operator) { 
       case "AND": 
        expr = new BooleanExpression(expr, Operator.AND, right); 
        break; 
       default: 
        expr = new BooleanExpression(expr, Operator.OR, right); 
        break; 
      } 
     } 
     return expr; 
    } 

    private Expression binaryExpression() { 
     String field = token[i++]; 
     String operator = token[i++]; 
     String value = token[i++]; 

     switch (operator) { 
      case "EQ": 
       return new BinaryExpression(field, Operator.EQ, value); 
      case "LT": 
       return new BinaryExpression(field, Operator.LT, value); 
      case "GT": 
       return new BinaryExpression(field, Operator.GT, value); 
      default: 
       return new BinaryExpression(field, Operator.IN, value); 
     } 
    } 
} 

正如你所看到的,QueryBuilder现在有一个状态。

public static void main(String args[]) { 
    Expression expr = QueryBuilder.parse("eid EQ 2 AND deptname EQ foo"); 
    System.out.println(expr); 
} 

UPDATE

我为测试定义这些类:

abstract class Expression { 
} 

enum Operator { 
    EQ, LT, GT, IN, AND, OR; 
} 

class BinaryExpression extends Expression { 

    private final String field; 
    private final Operator op; 
    private final String value; 

    BinaryExpression(String field, Operator op, String value) { 
     this.field = field; 
     this.op = op; 
     this.value = value; 
    } 

    @Override 
    public String toString() { 
     return "(" + field + " " + op + " " + value + ")"; 
    } 
} 

class BooleanExpression extends Expression { 

    private final Expression left; 
    private final Operator op; 
    private final Expression right; 

    BooleanExpression(Expression left, Operator op, Expression right) { 
     this.left = left; 
     this.op = op; 
     this.right = right; 
    } 

    @Override 
    public String toString() { 
     return "(" + left + " " + op + " " + right + ")"; 
    } 
} 
+0

对不起,我已经忘记了休息时间,表情是从右到左建造的 –

+0

:感谢您的回复,它为我工作。能否请您解释一下代码,即从左至右的部分? – chinkrishna

-2
  1. 检查输入(字符串查询)是否包含“AND”。
  2. 如果包含“AND”,则分割(“AND”)
  3. 然后,您将原始逻辑递归地将分割项目调用为输入。
  4. 最后,您将递归地合并每个分割输入的结果。