package ameba.db.dsl;
import ameba.i18n.Messages;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.misc.ParseCancellationException;
import java.util.List;
/**
* <p>QueryDSL class.</p>
*
* @author icode
*
*/
public class QueryDSL {
private static final DiagnosticErrorListener ERROR_LISTENER = new DiagnosticErrorListener();
private QueryDSL() {
}
/**
* <p>invoke.</p>
*
* @param expression a {@link java.lang.String} object.
* @param invoker a {@link ameba.db.dsl.QueryExprInvoker} object.
* @param exprApplier a {@link ameba.db.dsl.ExprApplier} object.
* @param <T> a T object.
*/
public static <T> void invoke(String expression,
QueryExprInvoker<T> invoker,
ExprApplier<T> exprApplier) {
QueryExprInvoker.invoke(parse(expression), invoker, exprApplier);
}
/**
* <p>parse.</p>
*
* @param expression a {@link java.lang.String} object.
* @return a {@link java.util.List} object.
*/
public static List<QueryExprMeta> parse(String expression) {
QueryParser parser = parser(tokens(expression));
try {
return parse(parser);
} catch (ParseCancellationException | RecognitionException e) {
RecognitionException err;
if (e instanceof ParseCancellationException) {
err = (RecognitionException) e.getCause();
} else {
err = (RecognitionException) e;
}
throw new QuerySyntaxException(
Messages.get("dsl.parse.err", err.getOffendingToken().getCharPositionInLine()),
e
);
}
}
/**
* <p>parse.</p>
*
* @param parser a {@link ameba.db.dsl.QueryParser} object.
* @return a {@link java.util.List} object.
*/
public static List<QueryExprMeta> parse(QueryParser parser) {
QueryExprListener listener = listener(parser);
parser.query();
return listener.getQueryExprMetaList();
}
/**
* <p>tokens.</p>
*
* @param expression a {@link java.lang.String} object.
* @return a {@link org.antlr.v4.runtime.CommonTokenStream} object.
*/
public static CommonTokenStream tokens(String expression) {
return tokens(lexer(expression));
}
/**
* <p>tokens.</p>
*
* @param lexer a {@link ameba.db.dsl.QueryLexer} object.
* @return a {@link org.antlr.v4.runtime.CommonTokenStream} object.
*/
public static CommonTokenStream tokens(QueryLexer lexer) {
return new CommonTokenStream(lexer);
}
/**
* <p>lexer.</p>
*
* @param expression a {@link java.lang.String} object.
* @return a {@link ameba.db.dsl.QueryLexer} object.
*/
public static QueryLexer lexer(String expression) {
QueryLexer lexer = new QueryLexer(input(expression));
lexer.removeErrorListeners();
lexer.addErrorListener(ERROR_LISTENER);
return lexer;
}
/**
* <p>input.</p>
*
* @param expression a {@link java.lang.String} object.
* @return a {@link org.antlr.v4.runtime.CharStream} object.
*/
public static CharStream input(String expression) {
ANTLRInputStream input;
if (expression == null) {
input = new ANTLRInputStream();
} else {
input = new ANTLRInputStream(expression);
}
return input;
}
/**
* <p>parser.</p>
*
* @param tokens a {@link org.antlr.v4.runtime.CommonTokenStream} object.
* @return a {@link ameba.db.dsl.QueryParser} object.
*/
public static QueryParser parser(CommonTokenStream tokens) {
QueryParser parser = new QueryParser(tokens);
parser.setErrorHandler(new BailErrorStrategy());
return parser;
}
/**
* <p>listener.</p>
*
* @return a {@link ameba.db.dsl.QueryExprListener} object.
*/
public static QueryExprListener listener() {
return new QueryExprListener();
}
/**
* <p>listener.</p>
*
* @param parser a {@link ameba.db.dsl.QueryParser} object.
* @return a {@link ameba.db.dsl.QueryExprListener} object.
*/
public static QueryExprListener listener(QueryParser parser) {
QueryExprListener listener = listener();
parser.addParseListener(listener);
return listener;
}
}