From 49d3cc91e43bbf1d8eb1d1d427be77d8d35c3dd2 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Wed, 13 Jul 2016 14:07:59 +1200 Subject: [PATCH] EQL - parsing select clause with distinct option --- .../server/grammer/EqlAdapter.java | 11 +- .../server/grammer/antlr/EQL.tokens | 110 +-- .../server/grammer/antlr/EQLBaseListener.java | 12 + .../server/grammer/antlr/EQLLexer.java | 300 ++++---- .../server/grammer/antlr/EQLLexer.tokens | 110 +-- .../server/grammer/antlr/EQLListener.java | 10 + .../server/grammer/antlr/EQLParser.java | 715 ++++++++++-------- .../server/grammer/EqlParserTest.java | 12 +- src/test/resources/EQL.g4 | 6 +- 9 files changed, 695 insertions(+), 591 deletions(-) diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/EqlAdapter.java b/src/main/java/com/avaje/ebeaninternal/server/grammer/EqlAdapter.java index a677d05d4..5d615cb29 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/EqlAdapter.java +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/EqlAdapter.java @@ -20,6 +20,8 @@ class EqlAdapter extends EQLBaseListener { private static final OperatorMapping operatorMapping = new OperatorMapping(); + private static final String DISTINCT = "distinct"; + private final SpiQuery query; private final EqlAdapterHelper helper; @@ -91,9 +93,14 @@ class EqlAdapter extends EQLBaseListener { @Override public void enterSelect_clause(EQLParser.Select_clauseContext ctx) { + checkChildren(ctx, 4); - String selectProperties = child(ctx, 2); - query.select(selectProperties); + if (DISTINCT.equals(child(ctx, 1))) { + query.setDistinct(true); + query.select(child(ctx, 3)); + } else { + query.select(child(ctx, 2)); + } } @Override diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQL.tokens b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQL.tokens index 482b47e62..dfb70e020 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQL.tokens +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQL.tokens @@ -45,60 +45,62 @@ T__43=44 T__44=45 T__45=46 T__46=47 -INPUT_VARIABLE=48 -PATH_VARIABLE=49 -BOOLEAN_LITERAL=50 -NUMBER_LITERAL=51 -DOUBLE=52 -INT=53 -ZERO=54 -STRING_LITERAL=55 -WS=56 +T__47=48 +INPUT_VARIABLE=49 +PATH_VARIABLE=50 +BOOLEAN_LITERAL=51 +NUMBER_LITERAL=52 +DOUBLE=53 +INT=54 +ZERO=55 +STRING_LITERAL=56 +WS=57 'select'=1 '('=2 ')'=3 -'where'=4 -'fetch'=5 -','=6 -'+'=7 -'query'=8 -'lazy'=9 -'or'=10 -'and'=11 -'not'=12 -'in'=13 -'between'=14 -'is'=15 -'null'=16 -'isNull'=17 -'isNotNull'=18 -'notNull'=19 -'empty'=20 -'isEmpty'=21 -'isNotEmpty'=22 -'notEmpty'=23 -'like'=24 -'ilike'=25 -'contains'=26 -'icontains'=27 -'startsWith'=28 -'istartsWith'=29 -'endsWith'=30 -'iendsWith'=31 -'='=32 -'eq'=33 -'>'=34 -'gt'=35 -'>='=36 -'ge'=37 -'gte'=38 -'<'=39 -'lt'=40 -'<='=41 -'le'=42 -'lte'=43 -'<>'=44 -'!='=45 -'ne'=46 -'ieq'=47 -'0'=54 +'distinct'=4 +'where'=5 +'fetch'=6 +','=7 +'+'=8 +'query'=9 +'lazy'=10 +'or'=11 +'and'=12 +'not'=13 +'in'=14 +'between'=15 +'is'=16 +'null'=17 +'isNull'=18 +'isNotNull'=19 +'notNull'=20 +'empty'=21 +'isEmpty'=22 +'isNotEmpty'=23 +'notEmpty'=24 +'like'=25 +'ilike'=26 +'contains'=27 +'icontains'=28 +'startsWith'=29 +'istartsWith'=30 +'endsWith'=31 +'iendsWith'=32 +'='=33 +'eq'=34 +'>'=35 +'gt'=36 +'>='=37 +'ge'=38 +'gte'=39 +'<'=40 +'lt'=41 +'<='=42 +'le'=43 +'lte'=44 +'<>'=45 +'!='=46 +'ne'=47 +'ieq'=48 +'0'=55 diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLBaseListener.java b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLBaseListener.java index 77aa4d7dd..045853ac6 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLBaseListener.java +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLBaseListener.java @@ -35,6 +35,18 @@ public class EQLBaseListener implements EQLListener { *

The default implementation does nothing.

*/ @Override public void exitSelect_clause(EQLParser.Select_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDistinct(EQLParser.DistinctContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDistinct(EQLParser.DistinctContext ctx) { } /** * {@inheritDoc} * diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLLexer.java b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLLexer.java index 28142b44e..fe9718727 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLLexer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLLexer.java @@ -23,8 +23,8 @@ public class EQLLexer extends Lexer { T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31, T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38, T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45, - T__45=46, T__46=47, INPUT_VARIABLE=48, PATH_VARIABLE=49, BOOLEAN_LITERAL=50, - NUMBER_LITERAL=51, DOUBLE=52, INT=53, ZERO=54, STRING_LITERAL=55, WS=56; + T__45=46, T__46=47, T__47=48, INPUT_VARIABLE=49, PATH_VARIABLE=50, BOOLEAN_LITERAL=51, + NUMBER_LITERAL=52, DOUBLE=53, INT=54, ZERO=55, STRING_LITERAL=56, WS=57; public static String[] modeNames = { "DEFAULT_MODE" }; @@ -35,26 +35,27 @@ public class EQLLexer extends Lexer { "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40", - "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "INPUT_VARIABLE", + "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "INPUT_VARIABLE", "PATH_VARIABLE", "BOOLEAN_LITERAL", "NUMBER_LITERAL", "DOUBLE", "INT", "ZERO", "STRING_LITERAL", "WS" }; private static final String[] _LITERAL_NAMES = { - null, "'select'", "'('", "')'", "'where'", "'fetch'", "','", "'+'", "'query'", - "'lazy'", "'or'", "'and'", "'not'", "'in'", "'between'", "'is'", "'null'", - "'isNull'", "'isNotNull'", "'notNull'", "'empty'", "'isEmpty'", "'isNotEmpty'", - "'notEmpty'", "'like'", "'ilike'", "'contains'", "'icontains'", "'startsWith'", - "'istartsWith'", "'endsWith'", "'iendsWith'", "'='", "'eq'", "'>'", "'gt'", - "'>='", "'ge'", "'gte'", "'<'", "'lt'", "'<='", "'le'", "'lte'", "'<>'", - "'!='", "'ne'", "'ieq'", null, null, null, null, null, null, "'0'" + null, "'select'", "'('", "')'", "'distinct'", "'where'", "'fetch'", "','", + "'+'", "'query'", "'lazy'", "'or'", "'and'", "'not'", "'in'", "'between'", + "'is'", "'null'", "'isNull'", "'isNotNull'", "'notNull'", "'empty'", "'isEmpty'", + "'isNotEmpty'", "'notEmpty'", "'like'", "'ilike'", "'contains'", "'icontains'", + "'startsWith'", "'istartsWith'", "'endsWith'", "'iendsWith'", "'='", "'eq'", + "'>'", "'gt'", "'>='", "'ge'", "'gte'", "'<'", "'lt'", "'<='", "'le'", + "'lte'", "'<>'", "'!='", "'ne'", "'ieq'", null, null, null, null, null, + null, "'0'" }; private static final String[] _SYMBOLIC_NAMES = { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - "INPUT_VARIABLE", "PATH_VARIABLE", "BOOLEAN_LITERAL", "NUMBER_LITERAL", + null, "INPUT_VARIABLE", "PATH_VARIABLE", "BOOLEAN_LITERAL", "NUMBER_LITERAL", "DOUBLE", "INT", "ZERO", "STRING_LITERAL", "WS" }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); @@ -112,149 +113,152 @@ public class EQLLexer extends Lexer { public ATN getATN() { return _ATN; } public static final String _serializedATN = - "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2:\u01b3\b\1\4\2\t"+ + "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2;\u01be\b\1\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ - "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\3\2\3\2\3\2\3\2\3\2\3\2"+ - "\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3"+ - "\7\3\7\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3"+ - "\13\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17"+ - "\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\22\3\22"+ - "\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23"+ - "\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25"+ - "\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27"+ - "\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+ - "\3\30\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33"+ - "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+ - "\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+ - "\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37"+ - "\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3"+ - "!\3\"\3\"\3\"\3#\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3\'\3(\3(\3"+ - ")\3)\3)\3*\3*\3*\3+\3+\3+\3,\3,\3,\3,\3-\3-\3-\3.\3.\3.\3/\3/\3/\3\60"+ - "\3\60\3\60\3\60\3\61\3\61\3\61\7\61\u016e\n\61\f\61\16\61\u0171\13\61"+ - "\3\62\3\62\7\62\u0175\n\62\f\62\16\62\u0178\13\62\3\63\3\63\3\63\3\63"+ - "\3\63\3\63\3\63\3\63\3\63\5\63\u0183\n\63\3\64\5\64\u0186\n\64\3\64\3"+ - "\64\5\64\u018a\n\64\3\64\3\64\5\64\u018e\n\64\3\65\6\65\u0191\n\65\r\65"+ - "\16\65\u0192\3\65\3\65\7\65\u0197\n\65\f\65\16\65\u019a\13\65\3\66\3\66"+ - "\7\66\u019e\n\66\f\66\16\66\u01a1\13\66\3\67\3\67\38\38\38\38\78\u01a9"+ - "\n8\f8\168\u01ac\138\38\38\39\39\39\39\2\2:\3\3\5\4\7\5\t\6\13\7\r\b\17"+ - "\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+"+ - "\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+"+ - "U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:\3\2\t\5\2C\\aac|\6\2\62"+ - ";C\\aac|\7\2\60\60\62;C\\aac|\3\2\62;\3\2\63;\3\2))\5\2\13\f\17\17\"\""+ - "\u01be\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2"+ - "\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3"+ - "\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2"+ - "\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2"+ - "/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2"+ - "\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2"+ - "G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3"+ - "\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2"+ - "\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2"+ - "m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\3s\3\2\2\2\5z\3\2\2\2\7|\3\2\2\2\t~\3"+ - "\2\2\2\13\u0084\3\2\2\2\r\u008a\3\2\2\2\17\u008c\3\2\2\2\21\u008e\3\2"+ - "\2\2\23\u0094\3\2\2\2\25\u0099\3\2\2\2\27\u009c\3\2\2\2\31\u00a0\3\2\2"+ - "\2\33\u00a4\3\2\2\2\35\u00a7\3\2\2\2\37\u00af\3\2\2\2!\u00b2\3\2\2\2#"+ - "\u00b7\3\2\2\2%\u00be\3\2\2\2\'\u00c8\3\2\2\2)\u00d0\3\2\2\2+\u00d6\3"+ - "\2\2\2-\u00de\3\2\2\2/\u00e9\3\2\2\2\61\u00f2\3\2\2\2\63\u00f7\3\2\2\2"+ - "\65\u00fd\3\2\2\2\67\u0106\3\2\2\29\u0110\3\2\2\2;\u011b\3\2\2\2=\u0127"+ - "\3\2\2\2?\u0130\3\2\2\2A\u013a\3\2\2\2C\u013c\3\2\2\2E\u013f\3\2\2\2G"+ - "\u0141\3\2\2\2I\u0144\3\2\2\2K\u0147\3\2\2\2M\u014a\3\2\2\2O\u014e\3\2"+ - "\2\2Q\u0150\3\2\2\2S\u0153\3\2\2\2U\u0156\3\2\2\2W\u0159\3\2\2\2Y\u015d"+ - "\3\2\2\2[\u0160\3\2\2\2]\u0163\3\2\2\2_\u0166\3\2\2\2a\u016a\3\2\2\2c"+ - "\u0172\3\2\2\2e\u0182\3\2\2\2g\u018d\3\2\2\2i\u0190\3\2\2\2k\u019b\3\2"+ - "\2\2m\u01a2\3\2\2\2o\u01a4\3\2\2\2q\u01af\3\2\2\2st\7u\2\2tu\7g\2\2uv"+ - "\7n\2\2vw\7g\2\2wx\7e\2\2xy\7v\2\2y\4\3\2\2\2z{\7*\2\2{\6\3\2\2\2|}\7"+ - "+\2\2}\b\3\2\2\2~\177\7y\2\2\177\u0080\7j\2\2\u0080\u0081\7g\2\2\u0081"+ - "\u0082\7t\2\2\u0082\u0083\7g\2\2\u0083\n\3\2\2\2\u0084\u0085\7h\2\2\u0085"+ - "\u0086\7g\2\2\u0086\u0087\7v\2\2\u0087\u0088\7e\2\2\u0088\u0089\7j\2\2"+ - "\u0089\f\3\2\2\2\u008a\u008b\7.\2\2\u008b\16\3\2\2\2\u008c\u008d\7-\2"+ - "\2\u008d\20\3\2\2\2\u008e\u008f\7s\2\2\u008f\u0090\7w\2\2\u0090\u0091"+ - "\7g\2\2\u0091\u0092\7t\2\2\u0092\u0093\7{\2\2\u0093\22\3\2\2\2\u0094\u0095"+ - "\7n\2\2\u0095\u0096\7c\2\2\u0096\u0097\7|\2\2\u0097\u0098\7{\2\2\u0098"+ - "\24\3\2\2\2\u0099\u009a\7q\2\2\u009a\u009b\7t\2\2\u009b\26\3\2\2\2\u009c"+ - "\u009d\7c\2\2\u009d\u009e\7p\2\2\u009e\u009f\7f\2\2\u009f\30\3\2\2\2\u00a0"+ - "\u00a1\7p\2\2\u00a1\u00a2\7q\2\2\u00a2\u00a3\7v\2\2\u00a3\32\3\2\2\2\u00a4"+ - "\u00a5\7k\2\2\u00a5\u00a6\7p\2\2\u00a6\34\3\2\2\2\u00a7\u00a8\7d\2\2\u00a8"+ - "\u00a9\7g\2\2\u00a9\u00aa\7v\2\2\u00aa\u00ab\7y\2\2\u00ab\u00ac\7g\2\2"+ - "\u00ac\u00ad\7g\2\2\u00ad\u00ae\7p\2\2\u00ae\36\3\2\2\2\u00af\u00b0\7"+ - "k\2\2\u00b0\u00b1\7u\2\2\u00b1 \3\2\2\2\u00b2\u00b3\7p\2\2\u00b3\u00b4"+ - "\7w\2\2\u00b4\u00b5\7n\2\2\u00b5\u00b6\7n\2\2\u00b6\"\3\2\2\2\u00b7\u00b8"+ - "\7k\2\2\u00b8\u00b9\7u\2\2\u00b9\u00ba\7P\2\2\u00ba\u00bb\7w\2\2\u00bb"+ - "\u00bc\7n\2\2\u00bc\u00bd\7n\2\2\u00bd$\3\2\2\2\u00be\u00bf\7k\2\2\u00bf"+ - "\u00c0\7u\2\2\u00c0\u00c1\7P\2\2\u00c1\u00c2\7q\2\2\u00c2\u00c3\7v\2\2"+ - "\u00c3\u00c4\7P\2\2\u00c4\u00c5\7w\2\2\u00c5\u00c6\7n\2\2\u00c6\u00c7"+ - "\7n\2\2\u00c7&\3\2\2\2\u00c8\u00c9\7p\2\2\u00c9\u00ca\7q\2\2\u00ca\u00cb"+ - "\7v\2\2\u00cb\u00cc\7P\2\2\u00cc\u00cd\7w\2\2\u00cd\u00ce\7n\2\2\u00ce"+ - "\u00cf\7n\2\2\u00cf(\3\2\2\2\u00d0\u00d1\7g\2\2\u00d1\u00d2\7o\2\2\u00d2"+ - "\u00d3\7r\2\2\u00d3\u00d4\7v\2\2\u00d4\u00d5\7{\2\2\u00d5*\3\2\2\2\u00d6"+ - "\u00d7\7k\2\2\u00d7\u00d8\7u\2\2\u00d8\u00d9\7G\2\2\u00d9\u00da\7o\2\2"+ - "\u00da\u00db\7r\2\2\u00db\u00dc\7v\2\2\u00dc\u00dd\7{\2\2\u00dd,\3\2\2"+ - "\2\u00de\u00df\7k\2\2\u00df\u00e0\7u\2\2\u00e0\u00e1\7P\2\2\u00e1\u00e2"+ - "\7q\2\2\u00e2\u00e3\7v\2\2\u00e3\u00e4\7G\2\2\u00e4\u00e5\7o\2\2\u00e5"+ - "\u00e6\7r\2\2\u00e6\u00e7\7v\2\2\u00e7\u00e8\7{\2\2\u00e8.\3\2\2\2\u00e9"+ - "\u00ea\7p\2\2\u00ea\u00eb\7q\2\2\u00eb\u00ec\7v\2\2\u00ec\u00ed\7G\2\2"+ - "\u00ed\u00ee\7o\2\2\u00ee\u00ef\7r\2\2\u00ef\u00f0\7v\2\2\u00f0\u00f1"+ - "\7{\2\2\u00f1\60\3\2\2\2\u00f2\u00f3\7n\2\2\u00f3\u00f4\7k\2\2\u00f4\u00f5"+ - "\7m\2\2\u00f5\u00f6\7g\2\2\u00f6\62\3\2\2\2\u00f7\u00f8\7k\2\2\u00f8\u00f9"+ - "\7n\2\2\u00f9\u00fa\7k\2\2\u00fa\u00fb\7m\2\2\u00fb\u00fc\7g\2\2\u00fc"+ - "\64\3\2\2\2\u00fd\u00fe\7e\2\2\u00fe\u00ff\7q\2\2\u00ff\u0100\7p\2\2\u0100"+ - "\u0101\7v\2\2\u0101\u0102\7c\2\2\u0102\u0103\7k\2\2\u0103\u0104\7p\2\2"+ - "\u0104\u0105\7u\2\2\u0105\66\3\2\2\2\u0106\u0107\7k\2\2\u0107\u0108\7"+ - "e\2\2\u0108\u0109\7q\2\2\u0109\u010a\7p\2\2\u010a\u010b\7v\2\2\u010b\u010c"+ - "\7c\2\2\u010c\u010d\7k\2\2\u010d\u010e\7p\2\2\u010e\u010f\7u\2\2\u010f"+ - "8\3\2\2\2\u0110\u0111\7u\2\2\u0111\u0112\7v\2\2\u0112\u0113\7c\2\2\u0113"+ - "\u0114\7t\2\2\u0114\u0115\7v\2\2\u0115\u0116\7u\2\2\u0116\u0117\7Y\2\2"+ - "\u0117\u0118\7k\2\2\u0118\u0119\7v\2\2\u0119\u011a\7j\2\2\u011a:\3\2\2"+ - "\2\u011b\u011c\7k\2\2\u011c\u011d\7u\2\2\u011d\u011e\7v\2\2\u011e\u011f"+ - "\7c\2\2\u011f\u0120\7t\2\2\u0120\u0121\7v\2\2\u0121\u0122\7u\2\2\u0122"+ - "\u0123\7Y\2\2\u0123\u0124\7k\2\2\u0124\u0125\7v\2\2\u0125\u0126\7j\2\2"+ - "\u0126<\3\2\2\2\u0127\u0128\7g\2\2\u0128\u0129\7p\2\2\u0129\u012a\7f\2"+ - "\2\u012a\u012b\7u\2\2\u012b\u012c\7Y\2\2\u012c\u012d\7k\2\2\u012d\u012e"+ - "\7v\2\2\u012e\u012f\7j\2\2\u012f>\3\2\2\2\u0130\u0131\7k\2\2\u0131\u0132"+ - "\7g\2\2\u0132\u0133\7p\2\2\u0133\u0134\7f\2\2\u0134\u0135\7u\2\2\u0135"+ - "\u0136\7Y\2\2\u0136\u0137\7k\2\2\u0137\u0138\7v\2\2\u0138\u0139\7j\2\2"+ - "\u0139@\3\2\2\2\u013a\u013b\7?\2\2\u013bB\3\2\2\2\u013c\u013d\7g\2\2\u013d"+ - "\u013e\7s\2\2\u013eD\3\2\2\2\u013f\u0140\7@\2\2\u0140F\3\2\2\2\u0141\u0142"+ - "\7i\2\2\u0142\u0143\7v\2\2\u0143H\3\2\2\2\u0144\u0145\7@\2\2\u0145\u0146"+ - "\7?\2\2\u0146J\3\2\2\2\u0147\u0148\7i\2\2\u0148\u0149\7g\2\2\u0149L\3"+ - "\2\2\2\u014a\u014b\7i\2\2\u014b\u014c\7v\2\2\u014c\u014d\7g\2\2\u014d"+ - "N\3\2\2\2\u014e\u014f\7>\2\2\u014fP\3\2\2\2\u0150\u0151\7n\2\2\u0151\u0152"+ - "\7v\2\2\u0152R\3\2\2\2\u0153\u0154\7>\2\2\u0154\u0155\7?\2\2\u0155T\3"+ - "\2\2\2\u0156\u0157\7n\2\2\u0157\u0158\7g\2\2\u0158V\3\2\2\2\u0159\u015a"+ - "\7n\2\2\u015a\u015b\7v\2\2\u015b\u015c\7g\2\2\u015cX\3\2\2\2\u015d\u015e"+ - "\7>\2\2\u015e\u015f\7@\2\2\u015fZ\3\2\2\2\u0160\u0161\7#\2\2\u0161\u0162"+ - "\7?\2\2\u0162\\\3\2\2\2\u0163\u0164\7p\2\2\u0164\u0165\7g\2\2\u0165^\3"+ - "\2\2\2\u0166\u0167\7k\2\2\u0167\u0168\7g\2\2\u0168\u0169\7s\2\2\u0169"+ - "`\3\2\2\2\u016a\u016b\7<\2\2\u016b\u016f\t\2\2\2\u016c\u016e\t\3\2\2\u016d"+ - "\u016c\3\2\2\2\u016e\u0171\3\2\2\2\u016f\u016d\3\2\2\2\u016f\u0170\3\2"+ - "\2\2\u0170b\3\2\2\2\u0171\u016f\3\2\2\2\u0172\u0176\t\2\2\2\u0173\u0175"+ - "\t\4\2\2\u0174\u0173\3\2\2\2\u0175\u0178\3\2\2\2\u0176\u0174\3\2\2\2\u0176"+ - "\u0177\3\2\2\2\u0177d\3\2\2\2\u0178\u0176\3\2\2\2\u0179\u017a\7v\2\2\u017a"+ - "\u017b\7t\2\2\u017b\u017c\7w\2\2\u017c\u0183\7g\2\2\u017d\u017e\7h\2\2"+ - "\u017e\u017f\7c\2\2\u017f\u0180\7n\2\2\u0180\u0181\7u\2\2\u0181\u0183"+ - "\7g\2\2\u0182\u0179\3\2\2\2\u0182\u017d\3\2\2\2\u0183f\3\2\2\2\u0184\u0186"+ - "\7/\2\2\u0185\u0184\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0187\3\2\2\2\u0187"+ - "\u018e\5i\65\2\u0188\u018a\7/\2\2\u0189\u0188\3\2\2\2\u0189\u018a\3\2"+ - "\2\2\u018a\u018b\3\2\2\2\u018b\u018e\5k\66\2\u018c\u018e\5m\67\2\u018d"+ - "\u0185\3\2\2\2\u018d\u0189\3\2\2\2\u018d\u018c\3\2\2\2\u018eh\3\2\2\2"+ - "\u018f\u0191\t\5\2\2\u0190\u018f\3\2\2\2\u0191\u0192\3\2\2\2\u0192\u0190"+ - "\3\2\2\2\u0192\u0193\3\2\2\2\u0193\u0194\3\2\2\2\u0194\u0198\7\60\2\2"+ - "\u0195\u0197\t\5\2\2\u0196\u0195\3\2\2\2\u0197\u019a\3\2\2\2\u0198\u0196"+ - "\3\2\2\2\u0198\u0199\3\2\2\2\u0199j\3\2\2\2\u019a\u0198\3\2\2\2\u019b"+ - "\u019f\t\6\2\2\u019c\u019e\t\5\2\2\u019d\u019c\3\2\2\2\u019e\u01a1\3\2"+ - "\2\2\u019f\u019d\3\2\2\2\u019f\u01a0\3\2\2\2\u01a0l\3\2\2\2\u01a1\u019f"+ - "\3\2\2\2\u01a2\u01a3\7\62\2\2\u01a3n\3\2\2\2\u01a4\u01aa\7)\2\2\u01a5"+ - "\u01a9\n\7\2\2\u01a6\u01a7\7)\2\2\u01a7\u01a9\7)\2\2\u01a8\u01a5\3\2\2"+ - "\2\u01a8\u01a6\3\2\2\2\u01a9\u01ac\3\2\2\2\u01aa\u01a8\3\2\2\2\u01aa\u01ab"+ - "\3\2\2\2\u01ab\u01ad\3\2\2\2\u01ac\u01aa\3\2\2\2\u01ad\u01ae\7)\2\2\u01ae"+ - "p\3\2\2\2\u01af\u01b0\t\b\2\2\u01b0\u01b1\3\2\2\2\u01b1\u01b2\b9\2\2\u01b2"+ - "r\3\2\2\2\16\2\u016f\u0176\u0182\u0185\u0189\u018d\u0192\u0198\u019f\u01a8"+ - "\u01aa\3\b\2\2"; + "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\3\2\3\2\3\2\3\2\3"+ + "\2\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6"+ + "\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3"+ + "\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\16\3"+ + "\16\3\16\3\16\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3"+ + "\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3"+ + "\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3"+ + "\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3"+ + "\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3"+ + "\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3"+ + "\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3"+ + "\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3"+ + "\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3"+ + "\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3"+ + "!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3#\3#\3#\3$\3$\3%\3%\3%\3&\3&\3&\3\'"+ + "\3\'\3\'\3(\3(\3(\3(\3)\3)\3*\3*\3*\3+\3+\3+\3,\3,\3,\3-\3-\3-\3-\3.\3"+ + ".\3.\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\62\3\62\3\62\7\62\u0179"+ + "\n\62\f\62\16\62\u017c\13\62\3\63\3\63\7\63\u0180\n\63\f\63\16\63\u0183"+ + "\13\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\5\64\u018e\n\64\3"+ + "\65\5\65\u0191\n\65\3\65\3\65\5\65\u0195\n\65\3\65\3\65\5\65\u0199\n\65"+ + "\3\66\6\66\u019c\n\66\r\66\16\66\u019d\3\66\3\66\7\66\u01a2\n\66\f\66"+ + "\16\66\u01a5\13\66\3\67\3\67\7\67\u01a9\n\67\f\67\16\67\u01ac\13\67\3"+ + "8\38\39\39\39\39\79\u01b4\n9\f9\169\u01b7\139\39\39\3:\3:\3:\3:\2\2;\3"+ + "\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37"+ + "\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37="+ + " ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9"+ + "q:s;\3\2\t\5\2C\\aac|\6\2\62;C\\aac|\7\2\60\60\62;C\\aac|\3\2\62;\3\2"+ + "\63;\3\2))\5\2\13\f\17\17\"\"\u01c9\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2"+ + "\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23"+ + "\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2"+ + "\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2"+ + "\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3"+ + "\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2"+ + "\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2"+ + "\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2["+ + "\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2"+ + "\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2"+ + "\3u\3\2\2\2\5|\3\2\2\2\7~\3\2\2\2\t\u0080\3\2\2\2\13\u0089\3\2\2\2\r\u008f"+ + "\3\2\2\2\17\u0095\3\2\2\2\21\u0097\3\2\2\2\23\u0099\3\2\2\2\25\u009f\3"+ + "\2\2\2\27\u00a4\3\2\2\2\31\u00a7\3\2\2\2\33\u00ab\3\2\2\2\35\u00af\3\2"+ + "\2\2\37\u00b2\3\2\2\2!\u00ba\3\2\2\2#\u00bd\3\2\2\2%\u00c2\3\2\2\2\'\u00c9"+ + "\3\2\2\2)\u00d3\3\2\2\2+\u00db\3\2\2\2-\u00e1\3\2\2\2/\u00e9\3\2\2\2\61"+ + "\u00f4\3\2\2\2\63\u00fd\3\2\2\2\65\u0102\3\2\2\2\67\u0108\3\2\2\29\u0111"+ + "\3\2\2\2;\u011b\3\2\2\2=\u0126\3\2\2\2?\u0132\3\2\2\2A\u013b\3\2\2\2C"+ + "\u0145\3\2\2\2E\u0147\3\2\2\2G\u014a\3\2\2\2I\u014c\3\2\2\2K\u014f\3\2"+ + "\2\2M\u0152\3\2\2\2O\u0155\3\2\2\2Q\u0159\3\2\2\2S\u015b\3\2\2\2U\u015e"+ + "\3\2\2\2W\u0161\3\2\2\2Y\u0164\3\2\2\2[\u0168\3\2\2\2]\u016b\3\2\2\2_"+ + "\u016e\3\2\2\2a\u0171\3\2\2\2c\u0175\3\2\2\2e\u017d\3\2\2\2g\u018d\3\2"+ + "\2\2i\u0198\3\2\2\2k\u019b\3\2\2\2m\u01a6\3\2\2\2o\u01ad\3\2\2\2q\u01af"+ + "\3\2\2\2s\u01ba\3\2\2\2uv\7u\2\2vw\7g\2\2wx\7n\2\2xy\7g\2\2yz\7e\2\2z"+ + "{\7v\2\2{\4\3\2\2\2|}\7*\2\2}\6\3\2\2\2~\177\7+\2\2\177\b\3\2\2\2\u0080"+ + "\u0081\7f\2\2\u0081\u0082\7k\2\2\u0082\u0083\7u\2\2\u0083\u0084\7v\2\2"+ + "\u0084\u0085\7k\2\2\u0085\u0086\7p\2\2\u0086\u0087\7e\2\2\u0087\u0088"+ + "\7v\2\2\u0088\n\3\2\2\2\u0089\u008a\7y\2\2\u008a\u008b\7j\2\2\u008b\u008c"+ + "\7g\2\2\u008c\u008d\7t\2\2\u008d\u008e\7g\2\2\u008e\f\3\2\2\2\u008f\u0090"+ + "\7h\2\2\u0090\u0091\7g\2\2\u0091\u0092\7v\2\2\u0092\u0093\7e\2\2\u0093"+ + "\u0094\7j\2\2\u0094\16\3\2\2\2\u0095\u0096\7.\2\2\u0096\20\3\2\2\2\u0097"+ + "\u0098\7-\2\2\u0098\22\3\2\2\2\u0099\u009a\7s\2\2\u009a\u009b\7w\2\2\u009b"+ + "\u009c\7g\2\2\u009c\u009d\7t\2\2\u009d\u009e\7{\2\2\u009e\24\3\2\2\2\u009f"+ + "\u00a0\7n\2\2\u00a0\u00a1\7c\2\2\u00a1\u00a2\7|\2\2\u00a2\u00a3\7{\2\2"+ + "\u00a3\26\3\2\2\2\u00a4\u00a5\7q\2\2\u00a5\u00a6\7t\2\2\u00a6\30\3\2\2"+ + "\2\u00a7\u00a8\7c\2\2\u00a8\u00a9\7p\2\2\u00a9\u00aa\7f\2\2\u00aa\32\3"+ + "\2\2\2\u00ab\u00ac\7p\2\2\u00ac\u00ad\7q\2\2\u00ad\u00ae\7v\2\2\u00ae"+ + "\34\3\2\2\2\u00af\u00b0\7k\2\2\u00b0\u00b1\7p\2\2\u00b1\36\3\2\2\2\u00b2"+ + "\u00b3\7d\2\2\u00b3\u00b4\7g\2\2\u00b4\u00b5\7v\2\2\u00b5\u00b6\7y\2\2"+ + "\u00b6\u00b7\7g\2\2\u00b7\u00b8\7g\2\2\u00b8\u00b9\7p\2\2\u00b9 \3\2\2"+ + "\2\u00ba\u00bb\7k\2\2\u00bb\u00bc\7u\2\2\u00bc\"\3\2\2\2\u00bd\u00be\7"+ + "p\2\2\u00be\u00bf\7w\2\2\u00bf\u00c0\7n\2\2\u00c0\u00c1\7n\2\2\u00c1$"+ + "\3\2\2\2\u00c2\u00c3\7k\2\2\u00c3\u00c4\7u\2\2\u00c4\u00c5\7P\2\2\u00c5"+ + "\u00c6\7w\2\2\u00c6\u00c7\7n\2\2\u00c7\u00c8\7n\2\2\u00c8&\3\2\2\2\u00c9"+ + "\u00ca\7k\2\2\u00ca\u00cb\7u\2\2\u00cb\u00cc\7P\2\2\u00cc\u00cd\7q\2\2"+ + "\u00cd\u00ce\7v\2\2\u00ce\u00cf\7P\2\2\u00cf\u00d0\7w\2\2\u00d0\u00d1"+ + "\7n\2\2\u00d1\u00d2\7n\2\2\u00d2(\3\2\2\2\u00d3\u00d4\7p\2\2\u00d4\u00d5"+ + "\7q\2\2\u00d5\u00d6\7v\2\2\u00d6\u00d7\7P\2\2\u00d7\u00d8\7w\2\2\u00d8"+ + "\u00d9\7n\2\2\u00d9\u00da\7n\2\2\u00da*\3\2\2\2\u00db\u00dc\7g\2\2\u00dc"+ + "\u00dd\7o\2\2\u00dd\u00de\7r\2\2\u00de\u00df\7v\2\2\u00df\u00e0\7{\2\2"+ + "\u00e0,\3\2\2\2\u00e1\u00e2\7k\2\2\u00e2\u00e3\7u\2\2\u00e3\u00e4\7G\2"+ + "\2\u00e4\u00e5\7o\2\2\u00e5\u00e6\7r\2\2\u00e6\u00e7\7v\2\2\u00e7\u00e8"+ + "\7{\2\2\u00e8.\3\2\2\2\u00e9\u00ea\7k\2\2\u00ea\u00eb\7u\2\2\u00eb\u00ec"+ + "\7P\2\2\u00ec\u00ed\7q\2\2\u00ed\u00ee\7v\2\2\u00ee\u00ef\7G\2\2\u00ef"+ + "\u00f0\7o\2\2\u00f0\u00f1\7r\2\2\u00f1\u00f2\7v\2\2\u00f2\u00f3\7{\2\2"+ + "\u00f3\60\3\2\2\2\u00f4\u00f5\7p\2\2\u00f5\u00f6\7q\2\2\u00f6\u00f7\7"+ + "v\2\2\u00f7\u00f8\7G\2\2\u00f8\u00f9\7o\2\2\u00f9\u00fa\7r\2\2\u00fa\u00fb"+ + "\7v\2\2\u00fb\u00fc\7{\2\2\u00fc\62\3\2\2\2\u00fd\u00fe\7n\2\2\u00fe\u00ff"+ + "\7k\2\2\u00ff\u0100\7m\2\2\u0100\u0101\7g\2\2\u0101\64\3\2\2\2\u0102\u0103"+ + "\7k\2\2\u0103\u0104\7n\2\2\u0104\u0105\7k\2\2\u0105\u0106\7m\2\2\u0106"+ + "\u0107\7g\2\2\u0107\66\3\2\2\2\u0108\u0109\7e\2\2\u0109\u010a\7q\2\2\u010a"+ + "\u010b\7p\2\2\u010b\u010c\7v\2\2\u010c\u010d\7c\2\2\u010d\u010e\7k\2\2"+ + "\u010e\u010f\7p\2\2\u010f\u0110\7u\2\2\u01108\3\2\2\2\u0111\u0112\7k\2"+ + "\2\u0112\u0113\7e\2\2\u0113\u0114\7q\2\2\u0114\u0115\7p\2\2\u0115\u0116"+ + "\7v\2\2\u0116\u0117\7c\2\2\u0117\u0118\7k\2\2\u0118\u0119\7p\2\2\u0119"+ + "\u011a\7u\2\2\u011a:\3\2\2\2\u011b\u011c\7u\2\2\u011c\u011d\7v\2\2\u011d"+ + "\u011e\7c\2\2\u011e\u011f\7t\2\2\u011f\u0120\7v\2\2\u0120\u0121\7u\2\2"+ + "\u0121\u0122\7Y\2\2\u0122\u0123\7k\2\2\u0123\u0124\7v\2\2\u0124\u0125"+ + "\7j\2\2\u0125<\3\2\2\2\u0126\u0127\7k\2\2\u0127\u0128\7u\2\2\u0128\u0129"+ + "\7v\2\2\u0129\u012a\7c\2\2\u012a\u012b\7t\2\2\u012b\u012c\7v\2\2\u012c"+ + "\u012d\7u\2\2\u012d\u012e\7Y\2\2\u012e\u012f\7k\2\2\u012f\u0130\7v\2\2"+ + "\u0130\u0131\7j\2\2\u0131>\3\2\2\2\u0132\u0133\7g\2\2\u0133\u0134\7p\2"+ + "\2\u0134\u0135\7f\2\2\u0135\u0136\7u\2\2\u0136\u0137\7Y\2\2\u0137\u0138"+ + "\7k\2\2\u0138\u0139\7v\2\2\u0139\u013a\7j\2\2\u013a@\3\2\2\2\u013b\u013c"+ + "\7k\2\2\u013c\u013d\7g\2\2\u013d\u013e\7p\2\2\u013e\u013f\7f\2\2\u013f"+ + "\u0140\7u\2\2\u0140\u0141\7Y\2\2\u0141\u0142\7k\2\2\u0142\u0143\7v\2\2"+ + "\u0143\u0144\7j\2\2\u0144B\3\2\2\2\u0145\u0146\7?\2\2\u0146D\3\2\2\2\u0147"+ + "\u0148\7g\2\2\u0148\u0149\7s\2\2\u0149F\3\2\2\2\u014a\u014b\7@\2\2\u014b"+ + "H\3\2\2\2\u014c\u014d\7i\2\2\u014d\u014e\7v\2\2\u014eJ\3\2\2\2\u014f\u0150"+ + "\7@\2\2\u0150\u0151\7?\2\2\u0151L\3\2\2\2\u0152\u0153\7i\2\2\u0153\u0154"+ + "\7g\2\2\u0154N\3\2\2\2\u0155\u0156\7i\2\2\u0156\u0157\7v\2\2\u0157\u0158"+ + "\7g\2\2\u0158P\3\2\2\2\u0159\u015a\7>\2\2\u015aR\3\2\2\2\u015b\u015c\7"+ + "n\2\2\u015c\u015d\7v\2\2\u015dT\3\2\2\2\u015e\u015f\7>\2\2\u015f\u0160"+ + "\7?\2\2\u0160V\3\2\2\2\u0161\u0162\7n\2\2\u0162\u0163\7g\2\2\u0163X\3"+ + "\2\2\2\u0164\u0165\7n\2\2\u0165\u0166\7v\2\2\u0166\u0167\7g\2\2\u0167"+ + "Z\3\2\2\2\u0168\u0169\7>\2\2\u0169\u016a\7@\2\2\u016a\\\3\2\2\2\u016b"+ + "\u016c\7#\2\2\u016c\u016d\7?\2\2\u016d^\3\2\2\2\u016e\u016f\7p\2\2\u016f"+ + "\u0170\7g\2\2\u0170`\3\2\2\2\u0171\u0172\7k\2\2\u0172\u0173\7g\2\2\u0173"+ + "\u0174\7s\2\2\u0174b\3\2\2\2\u0175\u0176\7<\2\2\u0176\u017a\t\2\2\2\u0177"+ + "\u0179\t\3\2\2\u0178\u0177\3\2\2\2\u0179\u017c\3\2\2\2\u017a\u0178\3\2"+ + "\2\2\u017a\u017b\3\2\2\2\u017bd\3\2\2\2\u017c\u017a\3\2\2\2\u017d\u0181"+ + "\t\2\2\2\u017e\u0180\t\4\2\2\u017f\u017e\3\2\2\2\u0180\u0183\3\2\2\2\u0181"+ + "\u017f\3\2\2\2\u0181\u0182\3\2\2\2\u0182f\3\2\2\2\u0183\u0181\3\2\2\2"+ + "\u0184\u0185\7v\2\2\u0185\u0186\7t\2\2\u0186\u0187\7w\2\2\u0187\u018e"+ + "\7g\2\2\u0188\u0189\7h\2\2\u0189\u018a\7c\2\2\u018a\u018b\7n\2\2\u018b"+ + "\u018c\7u\2\2\u018c\u018e\7g\2\2\u018d\u0184\3\2\2\2\u018d\u0188\3\2\2"+ + "\2\u018eh\3\2\2\2\u018f\u0191\7/\2\2\u0190\u018f\3\2\2\2\u0190\u0191\3"+ + "\2\2\2\u0191\u0192\3\2\2\2\u0192\u0199\5k\66\2\u0193\u0195\7/\2\2\u0194"+ + "\u0193\3\2\2\2\u0194\u0195\3\2\2\2\u0195\u0196\3\2\2\2\u0196\u0199\5m"+ + "\67\2\u0197\u0199\5o8\2\u0198\u0190\3\2\2\2\u0198\u0194\3\2\2\2\u0198"+ + "\u0197\3\2\2\2\u0199j\3\2\2\2\u019a\u019c\t\5\2\2\u019b\u019a\3\2\2\2"+ + "\u019c\u019d\3\2\2\2\u019d\u019b\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u019f"+ + "\3\2\2\2\u019f\u01a3\7\60\2\2\u01a0\u01a2\t\5\2\2\u01a1\u01a0\3\2\2\2"+ + "\u01a2\u01a5\3\2\2\2\u01a3\u01a1\3\2\2\2\u01a3\u01a4\3\2\2\2\u01a4l\3"+ + "\2\2\2\u01a5\u01a3\3\2\2\2\u01a6\u01aa\t\6\2\2\u01a7\u01a9\t\5\2\2\u01a8"+ + "\u01a7\3\2\2\2\u01a9\u01ac\3\2\2\2\u01aa\u01a8\3\2\2\2\u01aa\u01ab\3\2"+ + "\2\2\u01abn\3\2\2\2\u01ac\u01aa\3\2\2\2\u01ad\u01ae\7\62\2\2\u01aep\3"+ + "\2\2\2\u01af\u01b5\7)\2\2\u01b0\u01b4\n\7\2\2\u01b1\u01b2\7)\2\2\u01b2"+ + "\u01b4\7)\2\2\u01b3\u01b0\3\2\2\2\u01b3\u01b1\3\2\2\2\u01b4\u01b7\3\2"+ + "\2\2\u01b5\u01b3\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\u01b8\3\2\2\2\u01b7"+ + "\u01b5\3\2\2\2\u01b8\u01b9\7)\2\2\u01b9r\3\2\2\2\u01ba\u01bb\t\b\2\2\u01bb"+ + "\u01bc\3\2\2\2\u01bc\u01bd\b:\2\2\u01bdt\3\2\2\2\16\2\u017a\u0181\u018d"+ + "\u0190\u0194\u0198\u019d\u01a3\u01aa\u01b3\u01b5\3\b\2\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLLexer.tokens b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLLexer.tokens index 482b47e62..dfb70e020 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLLexer.tokens +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLLexer.tokens @@ -45,60 +45,62 @@ T__43=44 T__44=45 T__45=46 T__46=47 -INPUT_VARIABLE=48 -PATH_VARIABLE=49 -BOOLEAN_LITERAL=50 -NUMBER_LITERAL=51 -DOUBLE=52 -INT=53 -ZERO=54 -STRING_LITERAL=55 -WS=56 +T__47=48 +INPUT_VARIABLE=49 +PATH_VARIABLE=50 +BOOLEAN_LITERAL=51 +NUMBER_LITERAL=52 +DOUBLE=53 +INT=54 +ZERO=55 +STRING_LITERAL=56 +WS=57 'select'=1 '('=2 ')'=3 -'where'=4 -'fetch'=5 -','=6 -'+'=7 -'query'=8 -'lazy'=9 -'or'=10 -'and'=11 -'not'=12 -'in'=13 -'between'=14 -'is'=15 -'null'=16 -'isNull'=17 -'isNotNull'=18 -'notNull'=19 -'empty'=20 -'isEmpty'=21 -'isNotEmpty'=22 -'notEmpty'=23 -'like'=24 -'ilike'=25 -'contains'=26 -'icontains'=27 -'startsWith'=28 -'istartsWith'=29 -'endsWith'=30 -'iendsWith'=31 -'='=32 -'eq'=33 -'>'=34 -'gt'=35 -'>='=36 -'ge'=37 -'gte'=38 -'<'=39 -'lt'=40 -'<='=41 -'le'=42 -'lte'=43 -'<>'=44 -'!='=45 -'ne'=46 -'ieq'=47 -'0'=54 +'distinct'=4 +'where'=5 +'fetch'=6 +','=7 +'+'=8 +'query'=9 +'lazy'=10 +'or'=11 +'and'=12 +'not'=13 +'in'=14 +'between'=15 +'is'=16 +'null'=17 +'isNull'=18 +'isNotNull'=19 +'notNull'=20 +'empty'=21 +'isEmpty'=22 +'isNotEmpty'=23 +'notEmpty'=24 +'like'=25 +'ilike'=26 +'contains'=27 +'icontains'=28 +'startsWith'=29 +'istartsWith'=30 +'endsWith'=31 +'iendsWith'=32 +'='=33 +'eq'=34 +'>'=35 +'gt'=36 +'>='=37 +'ge'=38 +'gte'=39 +'<'=40 +'lt'=41 +'<='=42 +'le'=43 +'lte'=44 +'<>'=45 +'!='=46 +'ne'=47 +'ieq'=48 +'0'=55 diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLListener.java b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLListener.java index ee3c2eae0..2603f1e21 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLListener.java +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLListener.java @@ -27,6 +27,16 @@ public interface EQLListener extends ParseTreeListener { * @param ctx the parse tree */ void exitSelect_clause(EQLParser.Select_clauseContext ctx); + /** + * Enter a parse tree produced by {@link EQLParser#distinct}. + * @param ctx the parse tree + */ + void enterDistinct(EQLParser.DistinctContext ctx); + /** + * Exit a parse tree produced by {@link EQLParser#distinct}. + * @param ctx the parse tree + */ + void exitDistinct(EQLParser.DistinctContext ctx); /** * Enter a parse tree produced by {@link EQLParser#fetch_clause}. * @param ctx the parse tree diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLParser.java b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLParser.java index a2764d4f7..ca360fb61 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLParser.java +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLParser.java @@ -23,47 +23,48 @@ public class EQLParser extends Parser { T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31, T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38, T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45, - T__45=46, T__46=47, INPUT_VARIABLE=48, PATH_VARIABLE=49, BOOLEAN_LITERAL=50, - NUMBER_LITERAL=51, DOUBLE=52, INT=53, ZERO=54, STRING_LITERAL=55, WS=56; + T__45=46, T__46=47, T__47=48, INPUT_VARIABLE=49, PATH_VARIABLE=50, BOOLEAN_LITERAL=51, + NUMBER_LITERAL=52, DOUBLE=53, INT=54, ZERO=55, STRING_LITERAL=56, WS=57; public static final int - RULE_select_statement = 0, RULE_select_clause = 1, RULE_fetch_clause = 2, - RULE_where_clause = 3, RULE_fetch_path = 4, RULE_fetch_property_set = 5, - RULE_fetch_property_group = 6, RULE_fetch_property = 7, RULE_fetch_query_hint = 8, - RULE_fetch_lazy_hint = 9, RULE_fetch_option = 10, RULE_fetch_query_option = 11, - RULE_fetch_lazy_option = 12, RULE_fetch_batch_size = 13, RULE_conditional_expression = 14, - RULE_conditional_term = 15, RULE_conditional_factor = 16, RULE_conditional_primary = 17, - RULE_any_expression = 18, RULE_in_expression = 19, RULE_in_value = 20, - RULE_between_expression = 21, RULE_propertyBetween_expression = 22, RULE_isNull_expression = 23, - RULE_isNotNull_expression = 24, RULE_isEmpty_expression = 25, RULE_isNotEmpty_expression = 26, - RULE_like_expression = 27, RULE_like_op = 28, RULE_comparison_expression = 29, - RULE_comparison_operator = 30, RULE_value_expression = 31, RULE_literal = 32; + RULE_select_statement = 0, RULE_select_clause = 1, RULE_distinct = 2, + RULE_fetch_clause = 3, RULE_where_clause = 4, RULE_fetch_path = 5, RULE_fetch_property_set = 6, + RULE_fetch_property_group = 7, RULE_fetch_property = 8, RULE_fetch_query_hint = 9, + RULE_fetch_lazy_hint = 10, RULE_fetch_option = 11, RULE_fetch_query_option = 12, + RULE_fetch_lazy_option = 13, RULE_fetch_batch_size = 14, RULE_conditional_expression = 15, + RULE_conditional_term = 16, RULE_conditional_factor = 17, RULE_conditional_primary = 18, + RULE_any_expression = 19, RULE_in_expression = 20, RULE_in_value = 21, + RULE_between_expression = 22, RULE_propertyBetween_expression = 23, RULE_isNull_expression = 24, + RULE_isNotNull_expression = 25, RULE_isEmpty_expression = 26, RULE_isNotEmpty_expression = 27, + RULE_like_expression = 28, RULE_like_op = 29, RULE_comparison_expression = 30, + RULE_comparison_operator = 31, RULE_value_expression = 32, RULE_literal = 33; public static final String[] ruleNames = { - "select_statement", "select_clause", "fetch_clause", "where_clause", "fetch_path", - "fetch_property_set", "fetch_property_group", "fetch_property", "fetch_query_hint", - "fetch_lazy_hint", "fetch_option", "fetch_query_option", "fetch_lazy_option", - "fetch_batch_size", "conditional_expression", "conditional_term", "conditional_factor", - "conditional_primary", "any_expression", "in_expression", "in_value", - "between_expression", "propertyBetween_expression", "isNull_expression", + "select_statement", "select_clause", "distinct", "fetch_clause", "where_clause", + "fetch_path", "fetch_property_set", "fetch_property_group", "fetch_property", + "fetch_query_hint", "fetch_lazy_hint", "fetch_option", "fetch_query_option", + "fetch_lazy_option", "fetch_batch_size", "conditional_expression", "conditional_term", + "conditional_factor", "conditional_primary", "any_expression", "in_expression", + "in_value", "between_expression", "propertyBetween_expression", "isNull_expression", "isNotNull_expression", "isEmpty_expression", "isNotEmpty_expression", "like_expression", "like_op", "comparison_expression", "comparison_operator", "value_expression", "literal" }; private static final String[] _LITERAL_NAMES = { - null, "'select'", "'('", "')'", "'where'", "'fetch'", "','", "'+'", "'query'", - "'lazy'", "'or'", "'and'", "'not'", "'in'", "'between'", "'is'", "'null'", - "'isNull'", "'isNotNull'", "'notNull'", "'empty'", "'isEmpty'", "'isNotEmpty'", - "'notEmpty'", "'like'", "'ilike'", "'contains'", "'icontains'", "'startsWith'", - "'istartsWith'", "'endsWith'", "'iendsWith'", "'='", "'eq'", "'>'", "'gt'", - "'>='", "'ge'", "'gte'", "'<'", "'lt'", "'<='", "'le'", "'lte'", "'<>'", - "'!='", "'ne'", "'ieq'", null, null, null, null, null, null, "'0'" + null, "'select'", "'('", "')'", "'distinct'", "'where'", "'fetch'", "','", + "'+'", "'query'", "'lazy'", "'or'", "'and'", "'not'", "'in'", "'between'", + "'is'", "'null'", "'isNull'", "'isNotNull'", "'notNull'", "'empty'", "'isEmpty'", + "'isNotEmpty'", "'notEmpty'", "'like'", "'ilike'", "'contains'", "'icontains'", + "'startsWith'", "'istartsWith'", "'endsWith'", "'iendsWith'", "'='", "'eq'", + "'>'", "'gt'", "'>='", "'ge'", "'gte'", "'<'", "'lt'", "'<='", "'le'", + "'lte'", "'<>'", "'!='", "'ne'", "'ieq'", null, null, null, null, null, + null, "'0'" }; private static final String[] _SYMBOLIC_NAMES = { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - "INPUT_VARIABLE", "PATH_VARIABLE", "BOOLEAN_LITERAL", "NUMBER_LITERAL", + null, "INPUT_VARIABLE", "PATH_VARIABLE", "BOOLEAN_LITERAL", "NUMBER_LITERAL", "DOUBLE", "INT", "ZERO", "STRING_LITERAL", "WS" }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); @@ -149,34 +150,34 @@ public class EQLParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(67); + setState(69); _la = _input.LA(1); if (_la==T__0) { { - setState(66); + setState(68); select_clause(); } } - setState(72); + setState(74); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__4) { + while (_la==T__5) { { { - setState(69); + setState(71); fetch_clause(); } } - setState(74); + setState(76); _errHandler.sync(this); _la = _input.LA(1); } - setState(76); + setState(78); _la = _input.LA(1); - if (_la==T__3) { + if (_la==T__4) { { - setState(75); + setState(77); where_clause(); } } @@ -198,6 +199,9 @@ public class EQLParser extends Parser { public Fetch_property_groupContext fetch_property_group() { return getRuleContext(Fetch_property_groupContext.class,0); } + public DistinctContext distinct() { + return getRuleContext(DistinctContext.class,0); + } public Select_clauseContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -215,16 +219,26 @@ public class EQLParser extends Parser { public final Select_clauseContext select_clause() throws RecognitionException { Select_clauseContext _localctx = new Select_clauseContext(_ctx, getState()); enterRule(_localctx, 2, RULE_select_clause); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(78); - match(T__0); - setState(79); - match(T__1); setState(80); + match(T__0); + setState(82); + _la = _input.LA(1); + if (_la==T__3) { + { + setState(81); + distinct(); + } + } + + setState(84); + match(T__1); + setState(85); fetch_property_group(); - setState(81); + setState(86); match(T__2); } } @@ -239,6 +253,42 @@ public class EQLParser extends Parser { return _localctx; } + public static class DistinctContext extends ParserRuleContext { + public DistinctContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_distinct; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof EQLListener ) ((EQLListener)listener).enterDistinct(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof EQLListener ) ((EQLListener)listener).exitDistinct(this); + } + } + + public final DistinctContext distinct() throws RecognitionException { + DistinctContext _localctx = new DistinctContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_distinct); + try { + enterOuterAlt(_localctx, 1); + { + setState(88); + match(T__3); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class Fetch_clauseContext extends ParserRuleContext { public Fetch_pathContext fetch_path() { return getRuleContext(Fetch_pathContext.class,0); @@ -259,11 +309,11 @@ public class EQLParser extends Parser { public final Fetch_clauseContext fetch_clause() throws RecognitionException { Fetch_clauseContext _localctx = new Fetch_clauseContext(_ctx, getState()); - enterRule(_localctx, 4, RULE_fetch_clause); + enterRule(_localctx, 6, RULE_fetch_clause); try { enterOuterAlt(_localctx, 1); { - setState(83); + setState(90); fetch_path(); } } @@ -298,13 +348,13 @@ public class EQLParser extends Parser { public final Where_clauseContext where_clause() throws RecognitionException { Where_clauseContext _localctx = new Where_clauseContext(_ctx, getState()); - enterRule(_localctx, 6, RULE_where_clause); + enterRule(_localctx, 8, RULE_where_clause); try { enterOuterAlt(_localctx, 1); { - setState(85); - match(T__3); - setState(86); + setState(92); + match(T__4); + setState(93); conditional_expression(); } } @@ -343,29 +393,29 @@ public class EQLParser extends Parser { public final Fetch_pathContext fetch_path() throws RecognitionException { Fetch_pathContext _localctx = new Fetch_pathContext(_ctx, getState()); - enterRule(_localctx, 8, RULE_fetch_path); + enterRule(_localctx, 10, RULE_fetch_path); int _la; try { enterOuterAlt(_localctx, 1); { - setState(88); - match(T__4); - setState(90); + setState(95); + match(T__5); + setState(97); _la = _input.LA(1); - if (_la==T__7 || _la==T__8) { + if (_la==T__8 || _la==T__9) { { - setState(89); + setState(96); fetch_option(); } } - setState(92); + setState(99); match(PATH_VARIABLE); - setState(94); + setState(101); _la = _input.LA(1); if (_la==T__1) { { - setState(93); + setState(100); fetch_property_set(); } } @@ -403,15 +453,15 @@ public class EQLParser extends Parser { public final Fetch_property_setContext fetch_property_set() throws RecognitionException { Fetch_property_setContext _localctx = new Fetch_property_setContext(_ctx, getState()); - enterRule(_localctx, 10, RULE_fetch_property_set); + enterRule(_localctx, 12, RULE_fetch_property_set); try { enterOuterAlt(_localctx, 1); { - setState(96); + setState(103); match(T__1); - setState(97); + setState(104); fetch_property_group(); - setState(98); + setState(105); match(T__2); } } @@ -449,26 +499,26 @@ public class EQLParser extends Parser { public final Fetch_property_groupContext fetch_property_group() throws RecognitionException { Fetch_property_groupContext _localctx = new Fetch_property_groupContext(_ctx, getState()); - enterRule(_localctx, 12, RULE_fetch_property_group); + enterRule(_localctx, 14, RULE_fetch_property_group); int _la; try { enterOuterAlt(_localctx, 1); { - setState(100); + setState(107); fetch_property(); - setState(105); + setState(112); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__5) { + while (_la==T__6) { { { - setState(101); - match(T__5); - setState(102); + setState(108); + match(T__6); + setState(109); fetch_property(); } } - setState(107); + setState(114); _errHandler.sync(this); _la = _input.LA(1); } @@ -509,29 +559,29 @@ public class EQLParser extends Parser { public final Fetch_propertyContext fetch_property() throws RecognitionException { Fetch_propertyContext _localctx = new Fetch_propertyContext(_ctx, getState()); - enterRule(_localctx, 14, RULE_fetch_property); + enterRule(_localctx, 16, RULE_fetch_property); try { - setState(111); + setState(118); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(108); + setState(115); match(PATH_VARIABLE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(109); + setState(116); fetch_query_hint(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(110); + setState(117); fetch_lazy_hint(); } break; @@ -568,13 +618,13 @@ public class EQLParser extends Parser { public final Fetch_query_hintContext fetch_query_hint() throws RecognitionException { Fetch_query_hintContext _localctx = new Fetch_query_hintContext(_ctx, getState()); - enterRule(_localctx, 16, RULE_fetch_query_hint); + enterRule(_localctx, 18, RULE_fetch_query_hint); try { enterOuterAlt(_localctx, 1); { - setState(113); - match(T__6); - setState(114); + setState(120); + match(T__7); + setState(121); fetch_query_option(); } } @@ -609,13 +659,13 @@ public class EQLParser extends Parser { public final Fetch_lazy_hintContext fetch_lazy_hint() throws RecognitionException { Fetch_lazy_hintContext _localctx = new Fetch_lazy_hintContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_fetch_lazy_hint); + enterRule(_localctx, 20, RULE_fetch_lazy_hint); try { enterOuterAlt(_localctx, 1); { - setState(116); - match(T__6); - setState(117); + setState(123); + match(T__7); + setState(124); fetch_lazy_option(); } } @@ -653,21 +703,21 @@ public class EQLParser extends Parser { public final Fetch_optionContext fetch_option() throws RecognitionException { Fetch_optionContext _localctx = new Fetch_optionContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_fetch_option); + enterRule(_localctx, 22, RULE_fetch_option); try { - setState(121); + setState(128); switch (_input.LA(1)) { - case T__7: + case T__8: enterOuterAlt(_localctx, 1); { - setState(119); + setState(126); fetch_query_option(); } break; - case T__8: + case T__9: enterOuterAlt(_localctx, 2); { - setState(120); + setState(127); fetch_lazy_option(); } break; @@ -706,18 +756,18 @@ public class EQLParser extends Parser { public final Fetch_query_optionContext fetch_query_option() throws RecognitionException { Fetch_query_optionContext _localctx = new Fetch_query_optionContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_fetch_query_option); + enterRule(_localctx, 24, RULE_fetch_query_option); int _la; try { enterOuterAlt(_localctx, 1); { - setState(123); - match(T__7); - setState(125); + setState(130); + match(T__8); + setState(132); _la = _input.LA(1); if (_la==T__1) { { - setState(124); + setState(131); fetch_batch_size(); } } @@ -755,18 +805,18 @@ public class EQLParser extends Parser { public final Fetch_lazy_optionContext fetch_lazy_option() throws RecognitionException { Fetch_lazy_optionContext _localctx = new Fetch_lazy_optionContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_fetch_lazy_option); + enterRule(_localctx, 26, RULE_fetch_lazy_option); int _la; try { enterOuterAlt(_localctx, 1); { - setState(127); - match(T__8); - setState(129); + setState(134); + match(T__9); + setState(136); _la = _input.LA(1); if (_la==T__1) { { - setState(128); + setState(135); fetch_batch_size(); } } @@ -802,15 +852,15 @@ public class EQLParser extends Parser { public final Fetch_batch_sizeContext fetch_batch_size() throws RecognitionException { Fetch_batch_sizeContext _localctx = new Fetch_batch_sizeContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_fetch_batch_size); + enterRule(_localctx, 28, RULE_fetch_batch_size); try { enterOuterAlt(_localctx, 1); { - setState(131); + setState(138); match(T__1); - setState(132); + setState(139); match(NUMBER_LITERAL); - setState(133); + setState(140); match(T__2); } } @@ -848,28 +898,28 @@ public class EQLParser extends Parser { public final Conditional_expressionContext conditional_expression() throws RecognitionException { Conditional_expressionContext _localctx = new Conditional_expressionContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_conditional_expression); + enterRule(_localctx, 30, RULE_conditional_expression); int _la; try { enterOuterAlt(_localctx, 1); { { - setState(135); + setState(142); conditional_term(); } - setState(140); + setState(147); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__9) { + while (_la==T__10) { { { - setState(136); - match(T__9); - setState(137); + setState(143); + match(T__10); + setState(144); conditional_term(); } } - setState(142); + setState(149); _errHandler.sync(this); _la = _input.LA(1); } @@ -909,28 +959,28 @@ public class EQLParser extends Parser { public final Conditional_termContext conditional_term() throws RecognitionException { Conditional_termContext _localctx = new Conditional_termContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_conditional_term); + enterRule(_localctx, 32, RULE_conditional_term); int _la; try { enterOuterAlt(_localctx, 1); { { - setState(143); + setState(150); conditional_factor(); } - setState(148); + setState(155); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__10) { + while (_la==T__11) { { { - setState(144); - match(T__10); - setState(145); + setState(151); + match(T__11); + setState(152); conditional_factor(); } } - setState(150); + setState(157); _errHandler.sync(this); _la = _input.LA(1); } @@ -967,21 +1017,21 @@ public class EQLParser extends Parser { public final Conditional_factorContext conditional_factor() throws RecognitionException { Conditional_factorContext _localctx = new Conditional_factorContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_conditional_factor); + enterRule(_localctx, 34, RULE_conditional_factor); int _la; try { enterOuterAlt(_localctx, 1); { - setState(152); + setState(159); _la = _input.LA(1); - if (_la==T__11) { + if (_la==T__12) { { - setState(151); - match(T__11); + setState(158); + match(T__12); } } - setState(154); + setState(161); conditional_primary(); } } @@ -1019,26 +1069,26 @@ public class EQLParser extends Parser { public final Conditional_primaryContext conditional_primary() throws RecognitionException { Conditional_primaryContext _localctx = new Conditional_primaryContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_conditional_primary); + enterRule(_localctx, 36, RULE_conditional_primary); try { - setState(161); + setState(168); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(156); + setState(163); any_expression(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(157); + setState(164); match(T__1); - setState(158); + setState(165); conditional_expression(); - setState(159); + setState(166); match(T__2); } break; @@ -1102,82 +1152,82 @@ public class EQLParser extends Parser { public final Any_expressionContext any_expression() throws RecognitionException { Any_expressionContext _localctx = new Any_expressionContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_any_expression); + enterRule(_localctx, 38, RULE_any_expression); try { - setState(176); + setState(183); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(163); + setState(170); comparison_expression(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(164); + setState(171); like_expression(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(165); + setState(172); between_expression(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(166); + setState(173); propertyBetween_expression(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(167); + setState(174); in_expression(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(168); + setState(175); isNull_expression(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(169); + setState(176); isNotNull_expression(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(170); + setState(177); isEmpty_expression(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(171); + setState(178); isNotEmpty_expression(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(172); + setState(179); match(T__1); - setState(173); + setState(180); any_expression(); - setState(174); + setState(181); match(T__2); } break; @@ -1215,15 +1265,15 @@ public class EQLParser extends Parser { public final In_expressionContext in_expression() throws RecognitionException { In_expressionContext _localctx = new In_expressionContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_in_expression); + enterRule(_localctx, 40, RULE_in_expression); try { enterOuterAlt(_localctx, 1); { - setState(178); + setState(185); match(PATH_VARIABLE); - setState(179); - match(T__12); - setState(180); + setState(186); + match(T__13); + setState(187); in_value(); } } @@ -1262,42 +1312,42 @@ public class EQLParser extends Parser { public final In_valueContext in_value() throws RecognitionException { In_valueContext _localctx = new In_valueContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_in_value); + enterRule(_localctx, 42, RULE_in_value); int _la; try { - setState(194); + setState(201); switch (_input.LA(1)) { case INPUT_VARIABLE: enterOuterAlt(_localctx, 1); { - setState(182); + setState(189); match(INPUT_VARIABLE); } break; case T__1: enterOuterAlt(_localctx, 2); { - setState(183); + setState(190); match(T__1); - setState(184); + setState(191); value_expression(); - setState(189); + setState(196); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__5) { + while (_la==T__6) { { { - setState(185); - match(T__5); - setState(186); + setState(192); + match(T__6); + setState(193); value_expression(); } } - setState(191); + setState(198); _errHandler.sync(this); _la = _input.LA(1); } - setState(192); + setState(199); match(T__2); } break; @@ -1340,19 +1390,19 @@ public class EQLParser extends Parser { public final Between_expressionContext between_expression() throws RecognitionException { Between_expressionContext _localctx = new Between_expressionContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_between_expression); + enterRule(_localctx, 44, RULE_between_expression); try { enterOuterAlt(_localctx, 1); { - setState(196); + setState(203); match(PATH_VARIABLE); - setState(197); - match(T__13); - setState(198); + setState(204); + match(T__14); + setState(205); value_expression(); - setState(199); - match(T__10); - setState(200); + setState(206); + match(T__11); + setState(207); value_expression(); } } @@ -1391,19 +1441,19 @@ public class EQLParser extends Parser { public final PropertyBetween_expressionContext propertyBetween_expression() throws RecognitionException { PropertyBetween_expressionContext _localctx = new PropertyBetween_expressionContext(_ctx, getState()); - enterRule(_localctx, 44, RULE_propertyBetween_expression); + enterRule(_localctx, 46, RULE_propertyBetween_expression); try { enterOuterAlt(_localctx, 1); { - setState(202); + setState(209); value_expression(); - setState(203); - match(T__13); - setState(204); + setState(210); + match(T__14); + setState(211); match(PATH_VARIABLE); - setState(205); - match(T__10); - setState(206); + setState(212); + match(T__11); + setState(213); match(PATH_VARIABLE); } } @@ -1436,29 +1486,29 @@ public class EQLParser extends Parser { public final IsNull_expressionContext isNull_expression() throws RecognitionException { IsNull_expressionContext _localctx = new IsNull_expressionContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_isNull_expression); + enterRule(_localctx, 48, RULE_isNull_expression); try { - setState(213); + setState(220); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(208); + setState(215); match(PATH_VARIABLE); - setState(209); - match(T__14); - setState(210); + setState(216); match(T__15); + setState(217); + match(T__16); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(211); + setState(218); match(PATH_VARIABLE); - setState(212); - match(T__16); + setState(219); + match(T__17); } break; } @@ -1492,40 +1542,40 @@ public class EQLParser extends Parser { public final IsNotNull_expressionContext isNotNull_expression() throws RecognitionException { IsNotNull_expressionContext _localctx = new IsNotNull_expressionContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_isNotNull_expression); + enterRule(_localctx, 50, RULE_isNotNull_expression); try { - setState(223); + setState(230); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(215); + setState(222); match(PATH_VARIABLE); - setState(216); - match(T__14); - setState(217); - match(T__11); - setState(218); + setState(223); match(T__15); + setState(224); + match(T__12); + setState(225); + match(T__16); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(219); + setState(226); match(PATH_VARIABLE); - setState(220); - match(T__17); + setState(227); + match(T__18); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(221); + setState(228); match(PATH_VARIABLE); - setState(222); - match(T__18); + setState(229); + match(T__19); } break; } @@ -1559,29 +1609,29 @@ public class EQLParser extends Parser { public final IsEmpty_expressionContext isEmpty_expression() throws RecognitionException { IsEmpty_expressionContext _localctx = new IsEmpty_expressionContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_isEmpty_expression); + enterRule(_localctx, 52, RULE_isEmpty_expression); try { - setState(230); + setState(237); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(225); + setState(232); match(PATH_VARIABLE); - setState(226); - match(T__14); - setState(227); - match(T__19); + setState(233); + match(T__15); + setState(234); + match(T__20); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(228); + setState(235); match(PATH_VARIABLE); - setState(229); - match(T__20); + setState(236); + match(T__21); } break; } @@ -1615,40 +1665,40 @@ public class EQLParser extends Parser { public final IsNotEmpty_expressionContext isNotEmpty_expression() throws RecognitionException { IsNotEmpty_expressionContext _localctx = new IsNotEmpty_expressionContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_isNotEmpty_expression); + enterRule(_localctx, 54, RULE_isNotEmpty_expression); try { - setState(240); + setState(247); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(232); + setState(239); match(PATH_VARIABLE); - setState(233); - match(T__14); - setState(234); - match(T__11); - setState(235); - match(T__19); + setState(240); + match(T__15); + setState(241); + match(T__12); + setState(242); + match(T__20); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(236); + setState(243); match(PATH_VARIABLE); - setState(237); - match(T__21); + setState(244); + match(T__22); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(238); + setState(245); match(PATH_VARIABLE); - setState(239); - match(T__22); + setState(246); + match(T__23); } break; } @@ -1688,15 +1738,15 @@ public class EQLParser extends Parser { public final Like_expressionContext like_expression() throws RecognitionException { Like_expressionContext _localctx = new Like_expressionContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_like_expression); + enterRule(_localctx, 56, RULE_like_expression); try { enterOuterAlt(_localctx, 1); { - setState(242); + setState(249); match(PATH_VARIABLE); - setState(243); + setState(250); like_op(); - setState(244); + setState(251); value_expression(); } } @@ -1728,14 +1778,14 @@ public class EQLParser extends Parser { public final Like_opContext like_op() throws RecognitionException { Like_opContext _localctx = new Like_opContext(_ctx, getState()); - enterRule(_localctx, 56, RULE_like_op); + enterRule(_localctx, 58, RULE_like_op); int _la; try { enterOuterAlt(_localctx, 1); { - setState(246); + setState(253); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31))) != 0)) ) { _errHandler.recoverInline(this); } else { consume(); @@ -1777,15 +1827,15 @@ public class EQLParser extends Parser { public final Comparison_expressionContext comparison_expression() throws RecognitionException { Comparison_expressionContext _localctx = new Comparison_expressionContext(_ctx, getState()); - enterRule(_localctx, 58, RULE_comparison_expression); + enterRule(_localctx, 60, RULE_comparison_expression); try { enterOuterAlt(_localctx, 1); { - setState(248); + setState(255); match(PATH_VARIABLE); - setState(249); + setState(256); comparison_operator(); - setState(250); + setState(257); value_expression(); } } @@ -1817,14 +1867,14 @@ public class EQLParser extends Parser { public final Comparison_operatorContext comparison_operator() throws RecognitionException { Comparison_operatorContext _localctx = new Comparison_operatorContext(_ctx, getState()); - enterRule(_localctx, 60, RULE_comparison_operator); + enterRule(_localctx, 62, RULE_comparison_operator); int _la; try { enterOuterAlt(_localctx, 1); { - setState(252); + setState(259); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__46))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__46) | (1L << T__47))) != 0)) ) { _errHandler.recoverInline(this); } else { consume(); @@ -1863,23 +1913,23 @@ public class EQLParser extends Parser { public final Value_expressionContext value_expression() throws RecognitionException { Value_expressionContext _localctx = new Value_expressionContext(_ctx, getState()); - enterRule(_localctx, 62, RULE_value_expression); + enterRule(_localctx, 64, RULE_value_expression); try { - setState(256); + setState(263); switch (_input.LA(1)) { case BOOLEAN_LITERAL: case NUMBER_LITERAL: case STRING_LITERAL: enterOuterAlt(_localctx, 1); { - setState(254); + setState(261); literal(); } break; case INPUT_VARIABLE: enterOuterAlt(_localctx, 2); { - setState(255); + setState(262); match(INPUT_VARIABLE); } break; @@ -1918,12 +1968,12 @@ public class EQLParser extends Parser { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_literal); + enterRule(_localctx, 66, RULE_literal); int _la; try { enterOuterAlt(_localctx, 1); { - setState(258); + setState(265); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << BOOLEAN_LITERAL) | (1L << NUMBER_LITERAL) | (1L << STRING_LITERAL))) != 0)) ) { _errHandler.recoverInline(this); @@ -1944,90 +1994,93 @@ public class EQLParser extends Parser { } public static final String _serializedATN = - "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3:\u0107\4\2\t\2\4"+ + "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3;\u010e\4\2\t\2\4"+ "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+ "\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ - "\t!\4\"\t\"\3\2\5\2F\n\2\3\2\7\2I\n\2\f\2\16\2L\13\2\3\2\5\2O\n\2\3\3"+ - "\3\3\3\3\3\3\3\3\3\4\3\4\3\5\3\5\3\5\3\6\3\6\5\6]\n\6\3\6\3\6\5\6a\n\6"+ - "\3\7\3\7\3\7\3\7\3\b\3\b\3\b\7\bj\n\b\f\b\16\bm\13\b\3\t\3\t\3\t\5\tr"+ - "\n\t\3\n\3\n\3\n\3\13\3\13\3\13\3\f\3\f\5\f|\n\f\3\r\3\r\5\r\u0080\n\r"+ - "\3\16\3\16\5\16\u0084\n\16\3\17\3\17\3\17\3\17\3\20\3\20\3\20\7\20\u008d"+ - "\n\20\f\20\16\20\u0090\13\20\3\21\3\21\3\21\7\21\u0095\n\21\f\21\16\21"+ - "\u0098\13\21\3\22\5\22\u009b\n\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\5"+ - "\23\u00a4\n\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ - "\3\24\3\24\5\24\u00b3\n\24\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26"+ - "\7\26\u00be\n\26\f\26\16\26\u00c1\13\26\3\26\3\26\5\26\u00c5\n\26\3\27"+ - "\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31"+ - "\3\31\3\31\5\31\u00d8\n\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\5\32"+ - "\u00e2\n\32\3\33\3\33\3\33\3\33\3\33\5\33\u00e9\n\33\3\34\3\34\3\34\3"+ - "\34\3\34\3\34\3\34\3\34\5\34\u00f3\n\34\3\35\3\35\3\35\3\35\3\36\3\36"+ - "\3\37\3\37\3\37\3\37\3 \3 \3!\3!\5!\u0103\n!\3\"\3\"\3\"\2\2#\2\4\6\b"+ - "\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@B\2\5\3\2\32"+ - "!\3\2\"\61\4\2\64\6599\u0106\2E\3\2\2\2\4P\3\2\2\2\6U\3\2\2\2\bW\3\2\2"+ - "\2\nZ\3\2\2\2\fb\3\2\2\2\16f\3\2\2\2\20q\3\2\2\2\22s\3\2\2\2\24v\3\2\2"+ - "\2\26{\3\2\2\2\30}\3\2\2\2\32\u0081\3\2\2\2\34\u0085\3\2\2\2\36\u0089"+ - "\3\2\2\2 \u0091\3\2\2\2\"\u009a\3\2\2\2$\u00a3\3\2\2\2&\u00b2\3\2\2\2"+ - "(\u00b4\3\2\2\2*\u00c4\3\2\2\2,\u00c6\3\2\2\2.\u00cc\3\2\2\2\60\u00d7"+ - "\3\2\2\2\62\u00e1\3\2\2\2\64\u00e8\3\2\2\2\66\u00f2\3\2\2\28\u00f4\3\2"+ - "\2\2:\u00f8\3\2\2\2<\u00fa\3\2\2\2>\u00fe\3\2\2\2@\u0102\3\2\2\2B\u0104"+ - "\3\2\2\2DF\5\4\3\2ED\3\2\2\2EF\3\2\2\2FJ\3\2\2\2GI\5\6\4\2HG\3\2\2\2I"+ - "L\3\2\2\2JH\3\2\2\2JK\3\2\2\2KN\3\2\2\2LJ\3\2\2\2MO\5\b\5\2NM\3\2\2\2"+ - "NO\3\2\2\2O\3\3\2\2\2PQ\7\3\2\2QR\7\4\2\2RS\5\16\b\2ST\7\5\2\2T\5\3\2"+ - "\2\2UV\5\n\6\2V\7\3\2\2\2WX\7\6\2\2XY\5\36\20\2Y\t\3\2\2\2Z\\\7\7\2\2"+ - "[]\5\26\f\2\\[\3\2\2\2\\]\3\2\2\2]^\3\2\2\2^`\7\63\2\2_a\5\f\7\2`_\3\2"+ - "\2\2`a\3\2\2\2a\13\3\2\2\2bc\7\4\2\2cd\5\16\b\2de\7\5\2\2e\r\3\2\2\2f"+ - "k\5\20\t\2gh\7\b\2\2hj\5\20\t\2ig\3\2\2\2jm\3\2\2\2ki\3\2\2\2kl\3\2\2"+ - "\2l\17\3\2\2\2mk\3\2\2\2nr\7\63\2\2or\5\22\n\2pr\5\24\13\2qn\3\2\2\2q"+ - "o\3\2\2\2qp\3\2\2\2r\21\3\2\2\2st\7\t\2\2tu\5\30\r\2u\23\3\2\2\2vw\7\t"+ - "\2\2wx\5\32\16\2x\25\3\2\2\2y|\5\30\r\2z|\5\32\16\2{y\3\2\2\2{z\3\2\2"+ - "\2|\27\3\2\2\2}\177\7\n\2\2~\u0080\5\34\17\2\177~\3\2\2\2\177\u0080\3"+ - "\2\2\2\u0080\31\3\2\2\2\u0081\u0083\7\13\2\2\u0082\u0084\5\34\17\2\u0083"+ - "\u0082\3\2\2\2\u0083\u0084\3\2\2\2\u0084\33\3\2\2\2\u0085\u0086\7\4\2"+ - "\2\u0086\u0087\7\65\2\2\u0087\u0088\7\5\2\2\u0088\35\3\2\2\2\u0089\u008e"+ - "\5 \21\2\u008a\u008b\7\f\2\2\u008b\u008d\5 \21\2\u008c\u008a\3\2\2\2\u008d"+ - "\u0090\3\2\2\2\u008e\u008c\3\2\2\2\u008e\u008f\3\2\2\2\u008f\37\3\2\2"+ - "\2\u0090\u008e\3\2\2\2\u0091\u0096\5\"\22\2\u0092\u0093\7\r\2\2\u0093"+ - "\u0095\5\"\22\2\u0094\u0092\3\2\2\2\u0095\u0098\3\2\2\2\u0096\u0094\3"+ - "\2\2\2\u0096\u0097\3\2\2\2\u0097!\3\2\2\2\u0098\u0096\3\2\2\2\u0099\u009b"+ - "\7\16\2\2\u009a\u0099\3\2\2\2\u009a\u009b\3\2\2\2\u009b\u009c\3\2\2\2"+ - "\u009c\u009d\5$\23\2\u009d#\3\2\2\2\u009e\u00a4\5&\24\2\u009f\u00a0\7"+ - "\4\2\2\u00a0\u00a1\5\36\20\2\u00a1\u00a2\7\5\2\2\u00a2\u00a4\3\2\2\2\u00a3"+ - "\u009e\3\2\2\2\u00a3\u009f\3\2\2\2\u00a4%\3\2\2\2\u00a5\u00b3\5<\37\2"+ - "\u00a6\u00b3\58\35\2\u00a7\u00b3\5,\27\2\u00a8\u00b3\5.\30\2\u00a9\u00b3"+ - "\5(\25\2\u00aa\u00b3\5\60\31\2\u00ab\u00b3\5\62\32\2\u00ac\u00b3\5\64"+ - "\33\2\u00ad\u00b3\5\66\34\2\u00ae\u00af\7\4\2\2\u00af\u00b0\5&\24\2\u00b0"+ - "\u00b1\7\5\2\2\u00b1\u00b3\3\2\2\2\u00b2\u00a5\3\2\2\2\u00b2\u00a6\3\2"+ - "\2\2\u00b2\u00a7\3\2\2\2\u00b2\u00a8\3\2\2\2\u00b2\u00a9\3\2\2\2\u00b2"+ - "\u00aa\3\2\2\2\u00b2\u00ab\3\2\2\2\u00b2\u00ac\3\2\2\2\u00b2\u00ad\3\2"+ - "\2\2\u00b2\u00ae\3\2\2\2\u00b3\'\3\2\2\2\u00b4\u00b5\7\63\2\2\u00b5\u00b6"+ - "\7\17\2\2\u00b6\u00b7\5*\26\2\u00b7)\3\2\2\2\u00b8\u00c5\7\62\2\2\u00b9"+ - "\u00ba\7\4\2\2\u00ba\u00bf\5@!\2\u00bb\u00bc\7\b\2\2\u00bc\u00be\5@!\2"+ - "\u00bd\u00bb\3\2\2\2\u00be\u00c1\3\2\2\2\u00bf\u00bd\3\2\2\2\u00bf\u00c0"+ - "\3\2\2\2\u00c0\u00c2\3\2\2\2\u00c1\u00bf\3\2\2\2\u00c2\u00c3\7\5\2\2\u00c3"+ - "\u00c5\3\2\2\2\u00c4\u00b8\3\2\2\2\u00c4\u00b9\3\2\2\2\u00c5+\3\2\2\2"+ - "\u00c6\u00c7\7\63\2\2\u00c7\u00c8\7\20\2\2\u00c8\u00c9\5@!\2\u00c9\u00ca"+ - "\7\r\2\2\u00ca\u00cb\5@!\2\u00cb-\3\2\2\2\u00cc\u00cd\5@!\2\u00cd\u00ce"+ - "\7\20\2\2\u00ce\u00cf\7\63\2\2\u00cf\u00d0\7\r\2\2\u00d0\u00d1\7\63\2"+ - "\2\u00d1/\3\2\2\2\u00d2\u00d3\7\63\2\2\u00d3\u00d4\7\21\2\2\u00d4\u00d8"+ - "\7\22\2\2\u00d5\u00d6\7\63\2\2\u00d6\u00d8\7\23\2\2\u00d7\u00d2\3\2\2"+ - "\2\u00d7\u00d5\3\2\2\2\u00d8\61\3\2\2\2\u00d9\u00da\7\63\2\2\u00da\u00db"+ - "\7\21\2\2\u00db\u00dc\7\16\2\2\u00dc\u00e2\7\22\2\2\u00dd\u00de\7\63\2"+ - "\2\u00de\u00e2\7\24\2\2\u00df\u00e0\7\63\2\2\u00e0\u00e2\7\25\2\2\u00e1"+ - "\u00d9\3\2\2\2\u00e1\u00dd\3\2\2\2\u00e1\u00df\3\2\2\2\u00e2\63\3\2\2"+ - "\2\u00e3\u00e4\7\63\2\2\u00e4\u00e5\7\21\2\2\u00e5\u00e9\7\26\2\2\u00e6"+ - "\u00e7\7\63\2\2\u00e7\u00e9\7\27\2\2\u00e8\u00e3\3\2\2\2\u00e8\u00e6\3"+ - "\2\2\2\u00e9\65\3\2\2\2\u00ea\u00eb\7\63\2\2\u00eb\u00ec\7\21\2\2\u00ec"+ - "\u00ed\7\16\2\2\u00ed\u00f3\7\26\2\2\u00ee\u00ef\7\63\2\2\u00ef\u00f3"+ - "\7\30\2\2\u00f0\u00f1\7\63\2\2\u00f1\u00f3\7\31\2\2\u00f2\u00ea\3\2\2"+ - "\2\u00f2\u00ee\3\2\2\2\u00f2\u00f0\3\2\2\2\u00f3\67\3\2\2\2\u00f4\u00f5"+ - "\7\63\2\2\u00f5\u00f6\5:\36\2\u00f6\u00f7\5@!\2\u00f79\3\2\2\2\u00f8\u00f9"+ - "\t\2\2\2\u00f9;\3\2\2\2\u00fa\u00fb\7\63\2\2\u00fb\u00fc\5> \2\u00fc\u00fd"+ - "\5@!\2\u00fd=\3\2\2\2\u00fe\u00ff\t\3\2\2\u00ff?\3\2\2\2\u0100\u0103\5"+ - "B\"\2\u0101\u0103\7\62\2\2\u0102\u0100\3\2\2\2\u0102\u0101\3\2\2\2\u0103"+ - "A\3\2\2\2\u0104\u0105\t\4\2\2\u0105C\3\2\2\2\30EJN\\`kq{\177\u0083\u008e"+ - "\u0096\u009a\u00a3\u00b2\u00bf\u00c4\u00d7\u00e1\u00e8\u00f2\u0102"; + "\t!\4\"\t\"\4#\t#\3\2\5\2H\n\2\3\2\7\2K\n\2\f\2\16\2N\13\2\3\2\5\2Q\n"+ + "\2\3\3\3\3\5\3U\n\3\3\3\3\3\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\7\3"+ + "\7\5\7d\n\7\3\7\3\7\5\7h\n\7\3\b\3\b\3\b\3\b\3\t\3\t\3\t\7\tq\n\t\f\t"+ + "\16\tt\13\t\3\n\3\n\3\n\5\ny\n\n\3\13\3\13\3\13\3\f\3\f\3\f\3\r\3\r\5"+ + "\r\u0083\n\r\3\16\3\16\5\16\u0087\n\16\3\17\3\17\5\17\u008b\n\17\3\20"+ + "\3\20\3\20\3\20\3\21\3\21\3\21\7\21\u0094\n\21\f\21\16\21\u0097\13\21"+ + "\3\22\3\22\3\22\7\22\u009c\n\22\f\22\16\22\u009f\13\22\3\23\5\23\u00a2"+ + "\n\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\5\24\u00ab\n\24\3\25\3\25\3\25"+ + "\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\5\25\u00ba\n\25\3\26"+ + "\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\7\27\u00c5\n\27\f\27\16\27\u00c8"+ + "\13\27\3\27\3\27\5\27\u00cc\n\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3"+ + "\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\5\32\u00df\n\32\3\33"+ + "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33\u00e9\n\33\3\34\3\34\3\34\3\34"+ + "\3\34\5\34\u00f0\n\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u00fa"+ + "\n\35\3\36\3\36\3\36\3\36\3\37\3\37\3 \3 \3 \3 \3!\3!\3\"\3\"\5\"\u010a"+ + "\n\"\3#\3#\3#\2\2$\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60"+ + "\62\64\668:<>@BD\2\5\3\2\33\"\3\2#\62\4\2\65\66::\u010d\2G\3\2\2\2\4R"+ + "\3\2\2\2\6Z\3\2\2\2\b\\\3\2\2\2\n^\3\2\2\2\fa\3\2\2\2\16i\3\2\2\2\20m"+ + "\3\2\2\2\22x\3\2\2\2\24z\3\2\2\2\26}\3\2\2\2\30\u0082\3\2\2\2\32\u0084"+ + "\3\2\2\2\34\u0088\3\2\2\2\36\u008c\3\2\2\2 \u0090\3\2\2\2\"\u0098\3\2"+ + "\2\2$\u00a1\3\2\2\2&\u00aa\3\2\2\2(\u00b9\3\2\2\2*\u00bb\3\2\2\2,\u00cb"+ + "\3\2\2\2.\u00cd\3\2\2\2\60\u00d3\3\2\2\2\62\u00de\3\2\2\2\64\u00e8\3\2"+ + "\2\2\66\u00ef\3\2\2\28\u00f9\3\2\2\2:\u00fb\3\2\2\2<\u00ff\3\2\2\2>\u0101"+ + "\3\2\2\2@\u0105\3\2\2\2B\u0109\3\2\2\2D\u010b\3\2\2\2FH\5\4\3\2GF\3\2"+ + "\2\2GH\3\2\2\2HL\3\2\2\2IK\5\b\5\2JI\3\2\2\2KN\3\2\2\2LJ\3\2\2\2LM\3\2"+ + "\2\2MP\3\2\2\2NL\3\2\2\2OQ\5\n\6\2PO\3\2\2\2PQ\3\2\2\2Q\3\3\2\2\2RT\7"+ + "\3\2\2SU\5\6\4\2TS\3\2\2\2TU\3\2\2\2UV\3\2\2\2VW\7\4\2\2WX\5\20\t\2XY"+ + "\7\5\2\2Y\5\3\2\2\2Z[\7\6\2\2[\7\3\2\2\2\\]\5\f\7\2]\t\3\2\2\2^_\7\7\2"+ + "\2_`\5 \21\2`\13\3\2\2\2ac\7\b\2\2bd\5\30\r\2cb\3\2\2\2cd\3\2\2\2de\3"+ + "\2\2\2eg\7\64\2\2fh\5\16\b\2gf\3\2\2\2gh\3\2\2\2h\r\3\2\2\2ij\7\4\2\2"+ + "jk\5\20\t\2kl\7\5\2\2l\17\3\2\2\2mr\5\22\n\2no\7\t\2\2oq\5\22\n\2pn\3"+ + "\2\2\2qt\3\2\2\2rp\3\2\2\2rs\3\2\2\2s\21\3\2\2\2tr\3\2\2\2uy\7\64\2\2"+ + "vy\5\24\13\2wy\5\26\f\2xu\3\2\2\2xv\3\2\2\2xw\3\2\2\2y\23\3\2\2\2z{\7"+ + "\n\2\2{|\5\32\16\2|\25\3\2\2\2}~\7\n\2\2~\177\5\34\17\2\177\27\3\2\2\2"+ + "\u0080\u0083\5\32\16\2\u0081\u0083\5\34\17\2\u0082\u0080\3\2\2\2\u0082"+ + "\u0081\3\2\2\2\u0083\31\3\2\2\2\u0084\u0086\7\13\2\2\u0085\u0087\5\36"+ + "\20\2\u0086\u0085\3\2\2\2\u0086\u0087\3\2\2\2\u0087\33\3\2\2\2\u0088\u008a"+ + "\7\f\2\2\u0089\u008b\5\36\20\2\u008a\u0089\3\2\2\2\u008a\u008b\3\2\2\2"+ + "\u008b\35\3\2\2\2\u008c\u008d\7\4\2\2\u008d\u008e\7\66\2\2\u008e\u008f"+ + "\7\5\2\2\u008f\37\3\2\2\2\u0090\u0095\5\"\22\2\u0091\u0092\7\r\2\2\u0092"+ + "\u0094\5\"\22\2\u0093\u0091\3\2\2\2\u0094\u0097\3\2\2\2\u0095\u0093\3"+ + "\2\2\2\u0095\u0096\3\2\2\2\u0096!\3\2\2\2\u0097\u0095\3\2\2\2\u0098\u009d"+ + "\5$\23\2\u0099\u009a\7\16\2\2\u009a\u009c\5$\23\2\u009b\u0099\3\2\2\2"+ + "\u009c\u009f\3\2\2\2\u009d\u009b\3\2\2\2\u009d\u009e\3\2\2\2\u009e#\3"+ + "\2\2\2\u009f\u009d\3\2\2\2\u00a0\u00a2\7\17\2\2\u00a1\u00a0\3\2\2\2\u00a1"+ + "\u00a2\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00a4\5&\24\2\u00a4%\3\2\2\2"+ + "\u00a5\u00ab\5(\25\2\u00a6\u00a7\7\4\2\2\u00a7\u00a8\5 \21\2\u00a8\u00a9"+ + "\7\5\2\2\u00a9\u00ab\3\2\2\2\u00aa\u00a5\3\2\2\2\u00aa\u00a6\3\2\2\2\u00ab"+ + "\'\3\2\2\2\u00ac\u00ba\5> \2\u00ad\u00ba\5:\36\2\u00ae\u00ba\5.\30\2\u00af"+ + "\u00ba\5\60\31\2\u00b0\u00ba\5*\26\2\u00b1\u00ba\5\62\32\2\u00b2\u00ba"+ + "\5\64\33\2\u00b3\u00ba\5\66\34\2\u00b4\u00ba\58\35\2\u00b5\u00b6\7\4\2"+ + "\2\u00b6\u00b7\5(\25\2\u00b7\u00b8\7\5\2\2\u00b8\u00ba\3\2\2\2\u00b9\u00ac"+ + "\3\2\2\2\u00b9\u00ad\3\2\2\2\u00b9\u00ae\3\2\2\2\u00b9\u00af\3\2\2\2\u00b9"+ + "\u00b0\3\2\2\2\u00b9\u00b1\3\2\2\2\u00b9\u00b2\3\2\2\2\u00b9\u00b3\3\2"+ + "\2\2\u00b9\u00b4\3\2\2\2\u00b9\u00b5\3\2\2\2\u00ba)\3\2\2\2\u00bb\u00bc"+ + "\7\64\2\2\u00bc\u00bd\7\20\2\2\u00bd\u00be\5,\27\2\u00be+\3\2\2\2\u00bf"+ + "\u00cc\7\63\2\2\u00c0\u00c1\7\4\2\2\u00c1\u00c6\5B\"\2\u00c2\u00c3\7\t"+ + "\2\2\u00c3\u00c5\5B\"\2\u00c4\u00c2\3\2\2\2\u00c5\u00c8\3\2\2\2\u00c6"+ + "\u00c4\3\2\2\2\u00c6\u00c7\3\2\2\2\u00c7\u00c9\3\2\2\2\u00c8\u00c6\3\2"+ + "\2\2\u00c9\u00ca\7\5\2\2\u00ca\u00cc\3\2\2\2\u00cb\u00bf\3\2\2\2\u00cb"+ + "\u00c0\3\2\2\2\u00cc-\3\2\2\2\u00cd\u00ce\7\64\2\2\u00ce\u00cf\7\21\2"+ + "\2\u00cf\u00d0\5B\"\2\u00d0\u00d1\7\16\2\2\u00d1\u00d2\5B\"\2\u00d2/\3"+ + "\2\2\2\u00d3\u00d4\5B\"\2\u00d4\u00d5\7\21\2\2\u00d5\u00d6\7\64\2\2\u00d6"+ + "\u00d7\7\16\2\2\u00d7\u00d8\7\64\2\2\u00d8\61\3\2\2\2\u00d9\u00da\7\64"+ + "\2\2\u00da\u00db\7\22\2\2\u00db\u00df\7\23\2\2\u00dc\u00dd\7\64\2\2\u00dd"+ + "\u00df\7\24\2\2\u00de\u00d9\3\2\2\2\u00de\u00dc\3\2\2\2\u00df\63\3\2\2"+ + "\2\u00e0\u00e1\7\64\2\2\u00e1\u00e2\7\22\2\2\u00e2\u00e3\7\17\2\2\u00e3"+ + "\u00e9\7\23\2\2\u00e4\u00e5\7\64\2\2\u00e5\u00e9\7\25\2\2\u00e6\u00e7"+ + "\7\64\2\2\u00e7\u00e9\7\26\2\2\u00e8\u00e0\3\2\2\2\u00e8\u00e4\3\2\2\2"+ + "\u00e8\u00e6\3\2\2\2\u00e9\65\3\2\2\2\u00ea\u00eb\7\64\2\2\u00eb\u00ec"+ + "\7\22\2\2\u00ec\u00f0\7\27\2\2\u00ed\u00ee\7\64\2\2\u00ee\u00f0\7\30\2"+ + "\2\u00ef\u00ea\3\2\2\2\u00ef\u00ed\3\2\2\2\u00f0\67\3\2\2\2\u00f1\u00f2"+ + "\7\64\2\2\u00f2\u00f3\7\22\2\2\u00f3\u00f4\7\17\2\2\u00f4\u00fa\7\27\2"+ + "\2\u00f5\u00f6\7\64\2\2\u00f6\u00fa\7\31\2\2\u00f7\u00f8\7\64\2\2\u00f8"+ + "\u00fa\7\32\2\2\u00f9\u00f1\3\2\2\2\u00f9\u00f5\3\2\2\2\u00f9\u00f7\3"+ + "\2\2\2\u00fa9\3\2\2\2\u00fb\u00fc\7\64\2\2\u00fc\u00fd\5<\37\2\u00fd\u00fe"+ + "\5B\"\2\u00fe;\3\2\2\2\u00ff\u0100\t\2\2\2\u0100=\3\2\2\2\u0101\u0102"+ + "\7\64\2\2\u0102\u0103\5@!\2\u0103\u0104\5B\"\2\u0104?\3\2\2\2\u0105\u0106"+ + "\t\3\2\2\u0106A\3\2\2\2\u0107\u010a\5D#\2\u0108\u010a\7\63\2\2\u0109\u0107"+ + "\3\2\2\2\u0109\u0108\3\2\2\2\u010aC\3\2\2\2\u010b\u010c\t\4\2\2\u010c"+ + "E\3\2\2\2\31GLPTcgrx\u0082\u0086\u008a\u0095\u009d\u00a1\u00aa\u00b9\u00c6"+ + "\u00cb\u00de\u00e8\u00ef\u00f9\u0109"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/test/java/com/avaje/ebeaninternal/server/grammer/EqlParserTest.java b/src/test/java/com/avaje/ebeaninternal/server/grammer/EqlParserTest.java index fd07c6168..fcf5e09da 100644 --- a/src/test/java/com/avaje/ebeaninternal/server/grammer/EqlParserTest.java +++ b/src/test/java/com/avaje/ebeaninternal/server/grammer/EqlParserTest.java @@ -284,16 +284,26 @@ public class EqlParserTest { customer.getBillingAddress().getCity(); } - @Test public void select() throws Exception { ResetBasicData.reset(); Query query = parse("select (name)"); + query.findList(); assertThat(query.getGeneratedSql()).contains("select t0.id c0, t0.name c1 from o_customer t0"); } + @Test + public void selectDistinct() throws Exception { + + ResetBasicData.reset(); + + Query query = parse("select distinct (name)"); + query.findList(); + assertThat(query.getGeneratedSql()).contains("select distinct t0.name c0 from o_customer t0"); + } + private Query parse(String raw) { Query query = Ebean.find(Customer.class); diff --git a/src/test/resources/EQL.g4 b/src/test/resources/EQL.g4 index e9a103692..e798e71a8 100644 --- a/src/test/resources/EQL.g4 +++ b/src/test/resources/EQL.g4 @@ -5,7 +5,11 @@ select_statement ; select_clause - : 'select' '(' fetch_property_group ')' + : 'select' (distinct)? '(' fetch_property_group ')' + ; + +distinct + : 'distinct' ; fetch_clause