2017-06-02 68 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. 最後,您將遞歸地合併每個分割輸入的結果。