/** * <p>Create an Elasticsearch query for the given search string but does * not apply the {@link ElasticsearchQueryOptimizer} to it.</p> * @param search the search string * @return the Elasticsearch query (may be null) */ protected JsonObject compileQueryNoOptimize(String search) { if (search == null || search.isEmpty()) { // match everything by default return matchAllQuery(); } // parse query QueryLexer lexer = new QueryLexer(new ANTLRInputStream(search.trim())); CommonTokenStream tokens = new CommonTokenStream(lexer); QueryParser parser = new QueryParser(tokens); QueryContext ctx = parser.query(); // compile query to QueryBuilder QueryCompilerListener listener = new QueryCompilerListener(); ParseTreeWalker.DEFAULT.walk(listener, ctx); if (listener.result.isEmpty()) { return matchAllQuery(); } return listener.result.pop(); }
@Override public void enterString(StringContext ctx) { String str = ctx.getText(); if (currentKeyvalue != null) { if (currentKeyvalue.containsKey("key")) { currentKeyvalue.put("value", str); } else { currentKeyvalue.put("key", str); } } else { StringQueryPart sqp = new StringQueryPart(str); JsonObject q = makeQuery(sqp); if (!combine(q)) { result.push(q); } } }
@Override public void enterNot(NotContext ctx) { enterLogical(Logical.NOT); }
@Override public void enterAnd(AndContext ctx) { enterLogical(Logical.AND); }
@Override public void exitAnd(AndContext ctx) { exitLogical(); }
@Override public void enterOr(OrContext ctx) { enterLogical(Logical.OR); }
@Override public void exitNot(NotContext ctx) { exitLogical(); }
@Override public void exitOr(OrContext ctx) { exitLogical(); }
@Override public void exitKeyvalue(KeyvalueContext ctx) { KeyValueQueryPart kvqp = new KeyValueQueryPart( currentKeyvalue.getString("key"), currentKeyvalue.getString("value"), ComparisonOperator.valueOf(currentKeyvalue.getString("comp"))); JsonObject q = makeQuery(kvqp); if (!combine(q)) { result.push(q); } currentKeyvalue = null; }
/** * Enter a logical expression * @param l the logical operation */ private void enterLogical(Logical l) { JsonObject bqb = boolQuery(1); combine(bqb); result.push(bqb); currentLogical.push(l); }