package com.midea.cloudSearch.druid.prase; import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.SQLExistsExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLNotExpr; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.Token; import java.util.List; public class ElasticSqlExprParser extends MySqlExprParser { public ElasticSqlExprParser(Lexer lexer) { super(lexer); } public ElasticSqlExprParser(String sql) { this(new ElasticLexer(sql)); this.lexer.nextToken(); } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public void parseHints(List hints) { while (lexer.token() == Token.HINT) { hints.add(new SQLCommentHint(lexer.stringVal())); lexer.nextToken(); } } @Override public SQLExpr primary() { if(lexer.token() == Token.LBRACE){ lexer.nextToken(); boolean foundRBrace = false; if(lexer.stringVal().equals("ts")){ String current = lexer.stringVal(); do { if(current.equals(lexer.token().RBRACE.name())){ foundRBrace = true; break; } lexer.nextToken(); current = lexer.token().name(); }while(!foundRBrace && !current.trim().equals("")); if(foundRBrace){ SQLOdbcExpr sdle = new SQLOdbcExpr(lexer.stringVal()); accept(Token.RBRACE); return sdle; }else{ throw new ParserException("Error. Unable to find closing RBRACE"); } }else{ throw new ParserException("Error. Unable to parse ODBC Literal Timestamp"); } } else if(lexer.token() == Token.LBRACKET){ StringBuilder identifier = new StringBuilder(); lexer.nextToken(); String prefix = ""; while(lexer.token()!=Token.RBRACKET){ if(lexer.token() != Token.IDENTIFIER && lexer.token()!=Token.INDEX && lexer.token()!=Token.LITERAL_CHARS){ throw new ParserException("All items between Brackets should be identifiers , got:" +lexer.token()); } identifier.append(prefix); identifier.append(lexer.stringVal()); prefix = " "; lexer.nextToken(); } accept(Token.RBRACKET); return new SQLIdentifierExpr(identifier.toString()); } else if (lexer.token() == Token.NOT) { lexer.nextToken(); SQLExpr sqlExpr; if (lexer.token() == Token.EXISTS) { lexer.nextToken(); accept(Token.LPAREN); sqlExpr = new SQLExistsExpr(createSelectParser().select(), true); accept(Token.RPAREN); } else if (lexer.token() == Token.LPAREN) { lexer.nextToken(); SQLExpr notTarget = expr(); accept(Token.RPAREN); sqlExpr = new SQLNotExpr(notTarget); return primaryRest(sqlExpr); } else { SQLExpr restExpr = relational(); sqlExpr = new SQLNotExpr(restExpr); } return sqlExpr; } boolean parenWrapped = lexer.token() == Token.LPAREN; SQLExpr expr = super.primary(); // keep track of if the identifier is wrapped in parens if (parenWrapped && expr instanceof SQLIdentifierExpr) { expr = new SQLParensIdentifierExpr((SQLIdentifierExpr) expr); } return expr; } }