package org.krakenapps.logdb.query.parser; import static org.krakenapps.bnf.Syntax.*; import org.krakenapps.bnf.Binding; import org.krakenapps.bnf.Syntax; import org.krakenapps.logdb.LogQueryParser; import org.krakenapps.logdb.query.StringPlaceholder; import org.krakenapps.logdb.query.command.Term; import org.krakenapps.logdb.query.command.Term.Operator; public class TermParser implements LogQueryParser { @Override public void addSyntax(Syntax syntax) { // @formatter:off syntax.add("term", this, new StringPlaceholder(), choice(rule(choice(k("=="), k("!="), k(">="), k("<="), k(">"), k("<"), k("contain"), k("regexp"), k("in")), new StringPlaceholder()), rule(choice(k("is null"), k("not null"))))); // @formatter:on } @Override public Object parse(Binding b) { Binding[] v = b.getChildren(); Term term = new Term(); String lh = v[0].getValue().toString(); term.setLh(lh); if (lh.startsWith("\"") && lh.endsWith("\"")) { term.setLhString(true); term.setLh(lh.substring(1, lh.length() - 1)); } Object oper = v[1].getValue(); if (oper == null) oper = v[1].getChildren()[0].getValue(); term.setOperator(Operator.find(oper.toString())); if (term.getOperator() != Operator.IsNull && term.getOperator() != Operator.NotNull) { String rh = v[1].getChildren()[1].getValue().toString(); term.setRh(rh); if (rh.startsWith("\"") && rh.endsWith("\"")) { term.setRhString(true); term.setRh(rh.substring(1, rh.length() - 1)); } } return term; } }