From 05afa810f6e9a3d39892f3de9020444069030b6c Mon Sep 17 00:00:00 2001 From: Eric Ahn Date: Thu, 4 May 2023 12:17:16 -0700 Subject: [PATCH] Add ORDER BY support --- ...alesForceQueryFilterExpressionVisitor.java | 24 +- .../example/query/SalesforceQueryBuilder.java | 18 +- ...ForceQueryFilterExpressionVisitorTest.java | 28 +- .../CustomConnectorQueryFilterLexer.g4 | 5 +- .../CustomConnectorQueryFilterParser.g4 | 21 +- .../CustomConnectorQueryFilterLexer.interp | 11 +- .../CustomConnectorQueryFilterLexer.java | 254 ++++--- .../CustomConnectorQueryFilterLexer.tokens | 27 +- .../CustomConnectorQueryFilterParser.interp | 13 +- .../CustomConnectorQueryFilterParser.java | 673 ++++++++++++------ .../CustomConnectorQueryFilterParser.tokens | 27 +- ...onnectorQueryFilterParserBaseListener.java | 38 +- ...ConnectorQueryFilterParserBaseVisitor.java | 23 +- ...tomConnectorQueryFilterParserListener.java | 38 +- ...stomConnectorQueryFilterParserVisitor.java | 23 +- .../CustomConnectorParseTreeBuilderTest.java | 14 + .../QueryFilterExpressionVisitorTest.java | 6 + .../TestQueryFilterExpressionVisitor.java | 6 + pom.xml | 2 +- 19 files changed, 873 insertions(+), 378 deletions(-) diff --git a/custom-connector-example/src/main/java/com/amazonaws/appflow/custom/connector/example/query/SalesForceQueryFilterExpressionVisitor.java b/custom-connector-example/src/main/java/com/amazonaws/appflow/custom/connector/example/query/SalesForceQueryFilterExpressionVisitor.java index 741568c..3329a95 100644 --- a/custom-connector-example/src/main/java/com/amazonaws/appflow/custom/connector/example/query/SalesForceQueryFilterExpressionVisitor.java +++ b/custom-connector-example/src/main/java/com/amazonaws/appflow/custom/connector/example/query/SalesForceQueryFilterExpressionVisitor.java @@ -23,8 +23,9 @@ import com.amazonaws.appflow.custom.connector.model.metadata.FieldDefinition; import com.amazonaws.appflow.custom.connector.queryfilter.antlr.CustomConnectorQueryFilterParser; import com.amazonaws.appflow.custom.connector.queryfilter.antlr.CustomConnectorQueryFilterParserBaseVisitor; +import org.antlr.v4.runtime.RuleContext; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang3.tuple.Triple; import java.time.Instant; import java.time.LocalDate; @@ -50,6 +51,7 @@ public class SalesForceQueryFilterExpressionVisitor extends CustomConnectorQuery // helps build the WHERE-clause for Salesforce SOQL private final StringBuilder queryBuilder = new StringBuilder(); + private final StringBuilder orderByBuilder = new StringBuilder(); private final StringBuilder limitBuilder = new StringBuilder(); // Caller will provide the entity definition for the queried entity. This holds field level metadata for the entity. @@ -297,11 +299,27 @@ public StringBuilder visitCountValueExpression(final CustomConnectorQueryFilterP return limitBuilder.append(ctx.getText()).append(SPACE); } + @Override + public StringBuilder visitOrderByExpression(final CustomConnectorQueryFilterParser.OrderByExpressionContext ctx) { + if (ctx.identifier().size() > 0) { + List orderByIdentifiers = ctx.identifier(); + String identifiers = orderByIdentifiers.stream().map(RuleContext::getText).collect(Collectors.joining(",")); + orderByBuilder.append(identifiers).append(SPACE); + orderByBuilder.append(ctx.right.getText()).append(SPACE); + } + + // Only visit the left expression instead of visiting all children + if (ctx.left != null) { + visit(ctx.left); + } + return orderByBuilder; + } + /** * Returns the final query expression built for Salesforce. Separated into (where, limit) clauses. */ - public Pair getResult() { - return Pair.of(queryBuilder.toString().trim(), limitBuilder.toString().trim()); + public Triple getResult() { + return Triple.of(queryBuilder.toString().trim(), orderByBuilder.toString().trim(), limitBuilder.toString().trim()); } @FunctionalInterface diff --git a/custom-connector-example/src/main/java/com/amazonaws/appflow/custom/connector/example/query/SalesforceQueryBuilder.java b/custom-connector-example/src/main/java/com/amazonaws/appflow/custom/connector/example/query/SalesforceQueryBuilder.java index 5be682a..10b95c9 100644 --- a/custom-connector-example/src/main/java/com/amazonaws/appflow/custom/connector/example/query/SalesforceQueryBuilder.java +++ b/custom-connector-example/src/main/java/com/amazonaws/appflow/custom/connector/example/query/SalesforceQueryBuilder.java @@ -30,7 +30,7 @@ import org.antlr.v4.runtime.tree.ParseTree; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang3.tuple.Triple; import org.apache.logging.log4j.util.Strings; import java.util.ArrayList; @@ -51,6 +51,7 @@ private SalesforceQueryBuilder() { private static final String FROM_CLAUSE = "from"; private static final String SELECT_CLAUSE = "select"; private static final String LIMIT_CLAUSE = "limit"; + private static final String ORDER_BY_CLAUSE = "order by"; public static String buildQuery(final QueryObject queryObject) { @@ -66,12 +67,17 @@ public static String buildQuery(final QueryObject queryObject) { // QueryData allows data filtering based on filter expression. if (Strings.isNotBlank(queryObject.filterExpression())) { // adding filter expression in the query - Pair whereAndLimitClauses = translateFilterExpression(queryObject.filterExpression(), queryObject.entityDefinition()); - String whereClause = whereAndLimitClauses.getLeft(); - String limitClause = whereAndLimitClauses.getRight(); + Triple + queryClauses = translateFilterExpression(queryObject.filterExpression(), queryObject.entityDefinition()); + String whereClause = queryClauses.getLeft(); + String orderByClause = queryClauses.getMiddle(); + String limitClause = queryClauses.getRight(); if (StringUtils.isNotBlank(whereClause)) { clauses.add(String.format(CLAUSE_STRING_FORMAT, WHERE_CLAUSE, whereClause)); } + if (StringUtils.isNotBlank(orderByClause)) { + clauses.add(String.format(CLAUSE_STRING_FORMAT, ORDER_BY_CLAUSE, orderByClause)); + } if (StringUtils.isNotBlank(limitClause)) { clauses.add(String.format(CLAUSE_STRING_FORMAT, LIMIT_CLAUSE, limitClause)); } @@ -141,7 +147,7 @@ private static String addSingleQuotes(final String string) { return '\'' + string + '\''; } - private static Pair translateFilterExpression(final String filterExpression, final EntityDefinition entityDefinition) { + private static Triple translateFilterExpression(final String filterExpression, final EntityDefinition entityDefinition) { if (StringUtils.isNotBlank(filterExpression)) { ParseTree parseTree = CustomConnectorParseTreeBuilder.parse(filterExpression); SalesForceQueryFilterExpressionVisitor salesForceQueryFilterExpressionVisitor = new SalesForceQueryFilterExpressionVisitor(entityDefinition); @@ -151,6 +157,6 @@ private static Pair translateFilterExpression(final String filte return salesForceQueryFilterExpressionVisitor.getResult(); } // no filter expression is defined - return Pair.of(StringUtils.EMPTY, StringUtils.EMPTY); + return Triple.of(StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY); } } diff --git a/custom-connector-example/src/test/java/com/amazonaws/appflow/custom/connector/example/query/SalesForceQueryFilterExpressionVisitorTest.java b/custom-connector-example/src/test/java/com/amazonaws/appflow/custom/connector/example/query/SalesForceQueryFilterExpressionVisitorTest.java index 6b786cc..9cc51cc 100644 --- a/custom-connector-example/src/test/java/com/amazonaws/appflow/custom/connector/example/query/SalesForceQueryFilterExpressionVisitorTest.java +++ b/custom-connector-example/src/test/java/com/amazonaws/appflow/custom/connector/example/query/SalesForceQueryFilterExpressionVisitorTest.java @@ -25,7 +25,7 @@ import com.amazonaws.appflow.custom.connector.model.metadata.ImmutableEntityDefinition; import com.amazonaws.appflow.custom.connector.model.metadata.ImmutableFieldDefinition; import com.amazonaws.appflow.custom.connector.queryfilter.CustomConnectorParseTreeBuilder; -import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang3.tuple.Triple; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; @@ -56,35 +56,41 @@ void setupTestCase() { void testConversionFromFilterExpressionToSalesforceQuery( final String filterExpression, final String expectedWhereExpression, + final String expectedOrderByExpression, final String expectedLimitExpression) { salesForceQueryFilterExpressionVisitor.visit(CustomConnectorParseTreeBuilder.parse(filterExpression)); - Pair result = salesForceQueryFilterExpressionVisitor.getResult(); + Triple result = salesForceQueryFilterExpressionVisitor.getResult(); Assertions.assertEquals(expectedWhereExpression, result.getLeft()); + Assertions.assertEquals(expectedOrderByExpression, result.getMiddle()); Assertions.assertEquals(expectedLimitExpression, result.getRight()); } private static Stream getTestFilterExpression() { return Stream.of( - Arguments.of("Name = \"TestAccountName\"", "Name = 'TestAccountName'", ""), - Arguments.of("Name = \"TestAccountName\" limit 100", "Name = 'TestAccountName'", "100"), + Arguments.of("Name = \"TestAccountName\"", "Name = 'TestAccountName'", "", ""), + Arguments.of("Name = \"TestAccountName\" limit 100", "Name = 'TestAccountName'", "", "100"), + Arguments.of("Name = \"TestAccountName\" order by Name asc", "Name = 'TestAccountName'", "Name asc", ""), + Arguments.of("Name = \"TestAccountName\" order by Name, OS asc", "Name = 'TestAccountName'", "Name,OS asc", ""), + Arguments.of("Name = \"TestAccountName\" order by Name, OS asc limit 100", "Name = 'TestAccountName'", "Name,OS asc", "100"), + Arguments.of("order by Name, OS asc", "", "Name,OS asc", ""), Arguments.of("Id != '0016g00001cyrfiAAA' AND AccountNumber = 40", - "Id != '0016g00001cyrfiAAA' AND AccountNumber = 40", ""), + "Id != '0016g00001cyrfiAAA' AND AccountNumber = 40", "", ""), Arguments.of("CreatedDate > 2021-04-20T10:30:35Z AND AccountNumber = 40", - "CreatedDate > 2021-04-20T10:30:35Z AND AccountNumber = 40", ""), + "CreatedDate > 2021-04-20T10:30:35Z AND AccountNumber = 40", "", ""), Arguments.of("CreatedDate between 2021-04-20T10:30:35Z and 2021-04-25T10:30:35Z", - "CreatedDate > 2021-04-20T10:30:35.000+0000 and CreatedDate < 2021-04-25T10:30:35.000+0000", ""), + "CreatedDate > 2021-04-20T10:30:35.000+0000 and CreatedDate < 2021-04-25T10:30:35.000+0000", "", ""), Arguments.of("Id in (5, 7, 9, 10)", - "Id IN ('5','7','9','10')", ""), + "Id IN ('5','7','9','10')", "", ""), Arguments.of("Name = \"TestAccountName\" and Id in (5, 7, 9, 10) and AccountNumber > 100", - "Name = 'TestAccountName' and Id IN ('5','7','9','10') and AccountNumber > 100", ""), + "Name = 'TestAccountName' and Id IN ('5','7','9','10') and AccountNumber > 100", "", ""), Arguments.of( "(AccountNumber > 100 and ((CreatedDate < 2021-04-20T12:30:45Z and CreatedDate > 2021-04-21T15:45:49.234Z) and Name contains \"TestAccountName\"))", "AccountNumber > 100 and CreatedDate < 2021-04-20T12:30:45Z and CreatedDate > " + - "2021-04-21T15:45:49.234Z and Name LIKE '%TestAccountName%'", ""), + "2021-04-21T15:45:49.234Z and Name LIKE '%TestAccountName%'", "", ""), Arguments.of( "(AccountNumber > 100 and ((CreatedDate < 2021-04-20T12:30:45Z and CreatedDate > 2021-04-21T15:45:49.234Z) and Name contains \"TestAccountName\")) limit 100", "AccountNumber > 100 and CreatedDate < 2021-04-20T12:30:45Z and CreatedDate > " + - "2021-04-21T15:45:49.234Z and Name LIKE '%TestAccountName%'", "100")); + "2021-04-21T15:45:49.234Z and Name LIKE '%TestAccountName%'", "", "100")); } /** diff --git a/custom-connector-queryfilter/src/main/configuration/grammar/CustomConnectorQueryFilterLexer.g4 b/custom-connector-queryfilter/src/main/configuration/grammar/CustomConnectorQueryFilterLexer.g4 index f250e72..cedf33b 100644 --- a/custom-connector-queryfilter/src/main/configuration/grammar/CustomConnectorQueryFilterLexer.g4 +++ b/custom-connector-queryfilter/src/main/configuration/grammar/CustomConnectorQueryFilterLexer.g4 @@ -24,13 +24,16 @@ RPAREN : ')' ; NULL : 'null'; IN : 'IN' | 'in'; LIMIT : 'LIMIT' | 'limit'; +ORDERBY : 'ORDER BY' | 'order by'; +ASC : 'ASC' | 'asc'; +DESC : 'DESC' | 'desc'; COMMA : ','; // represents identifier string in filter expression. IDENTIFIER : [a-zA-Z][A-Za-z0-9_.-]*; // represents a positive non-zero integer -POS_INTEGER: [1-9][0-9]+ +POS_INTEGER: [1-9]+[0-9]* ; // represents decimal values like 5.0 or -5.0 etc diff --git a/custom-connector-queryfilter/src/main/configuration/grammar/CustomConnectorQueryFilterParser.g4 b/custom-connector-queryfilter/src/main/configuration/grammar/CustomConnectorQueryFilterParser.g4 index deda1e8..9c0bcc5 100644 --- a/custom-connector-queryfilter/src/main/configuration/grammar/CustomConnectorQueryFilterParser.g4 +++ b/custom-connector-queryfilter/src/main/configuration/grammar/CustomConnectorQueryFilterParser.g4 @@ -9,12 +9,19 @@ options { tokenVocab=CustomConnectorQueryFilterLexer; } // 'queryfilter' is the root node for the filter expression queryfilter : expression EOF -| limitexpression EOF +| orderbyexpr EOF +| limitexpr EOF ; -limitexpression -: op=limit right=count #limitExpression -| left=expression op=limit right=count #limitExpression // SQL 'LIMIT xyz' operator +limitexpr +: op=limit right=count #limitExpression +| left=expression op=limit right=count #limitExpression +| orderbyexpr op=limit right=count #limitExpression // SQL 'LIMIT xyz' operator +; + +orderbyexpr +: op=orderby identifier (COMMA identifier)* right=order #orderByExpression +| left=expression op=orderby identifier (COMMA identifier)* right=order #orderByExpression // SQL 'ORDER BY xyz, abc ASC|DESC' operator ; expression @@ -84,6 +91,12 @@ in limit :LIMIT ; +orderby +:ORDERBY ; + +order +:ASC | DESC; + // Following is to support different String formats in the value expression string : SINGLE_STRING diff --git a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterLexer.interp b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterLexer.interp index 67c814a..b590559 100644 --- a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterLexer.interp +++ b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterLexer.interp @@ -18,6 +18,9 @@ null 'null' null null +null +null +null ',' null null @@ -50,6 +53,9 @@ RPAREN NULL IN LIMIT +ORDERBY +ASC +DESC COMMA IDENTIFIER POS_INTEGER @@ -81,6 +87,9 @@ RPAREN NULL IN LIMIT +ORDERBY +ASC +DESC COMMA IDENTIFIER POS_INTEGER @@ -103,4 +112,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 31, 309, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, 2, 72, 10, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 78, 10, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 86, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 100, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 117, 10, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 150, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 166, 10, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 181, 10, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 193, 10, 19, 3, 20, 3, 20, 3, 21, 3, 21, 7, 21, 199, 10, 21, 12, 21, 14, 21, 202, 11, 21, 3, 22, 3, 22, 6, 22, 206, 10, 22, 13, 22, 14, 22, 207, 3, 23, 5, 23, 211, 10, 23, 3, 23, 6, 23, 214, 10, 23, 13, 23, 14, 23, 215, 3, 23, 3, 23, 6, 23, 220, 10, 23, 13, 23, 14, 23, 221, 5, 23, 224, 10, 23, 3, 24, 3, 24, 3, 24, 6, 24, 229, 10, 24, 13, 24, 14, 24, 230, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 6, 25, 238, 10, 25, 13, 25, 14, 25, 239, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 29, 6, 29, 254, 10, 29, 13, 29, 14, 29, 255, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 269, 10, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 280, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 292, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 6, 32, 302, 10, 32, 13, 32, 14, 32, 303, 5, 32, 306, 10, 32, 3, 32, 3, 32, 2, 2, 33, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 2, 57, 29, 59, 30, 61, 31, 63, 2, 3, 2, 14, 4, 2, 67, 92, 99, 124, 7, 2, 47, 48, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 51, 59, 3, 2, 50, 59, 3, 2, 41, 41, 3, 2, 36, 36, 8, 2, 36, 36, 41, 41, 94, 94, 112, 112, 116, 116, 118, 118, 5, 2, 11, 12, 14, 15, 34, 34, 3, 2, 50, 52, 3, 2, 50, 51, 3, 2, 50, 54, 3, 2, 50, 55, 2, 336, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 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, 29, 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, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 3, 71, 3, 2, 2, 2, 5, 77, 3, 2, 2, 2, 7, 85, 3, 2, 2, 2, 9, 99, 3, 2, 2, 2, 11, 116, 3, 2, 2, 2, 13, 118, 3, 2, 2, 2, 15, 120, 3, 2, 2, 2, 17, 123, 3, 2, 2, 2, 19, 125, 3, 2, 2, 2, 21, 128, 3, 2, 2, 2, 23, 130, 3, 2, 2, 2, 25, 149, 3, 2, 2, 2, 27, 165, 3, 2, 2, 2, 29, 167, 3, 2, 2, 2, 31, 169, 3, 2, 2, 2, 33, 171, 3, 2, 2, 2, 35, 180, 3, 2, 2, 2, 37, 192, 3, 2, 2, 2, 39, 194, 3, 2, 2, 2, 41, 196, 3, 2, 2, 2, 43, 203, 3, 2, 2, 2, 45, 210, 3, 2, 2, 2, 47, 225, 3, 2, 2, 2, 49, 234, 3, 2, 2, 2, 51, 243, 3, 2, 2, 2, 53, 246, 3, 2, 2, 2, 55, 249, 3, 2, 2, 2, 57, 253, 3, 2, 2, 2, 59, 259, 3, 2, 2, 2, 61, 281, 3, 2, 2, 2, 63, 291, 3, 2, 2, 2, 65, 66, 7, 67, 2, 2, 66, 67, 7, 80, 2, 2, 67, 72, 7, 70, 2, 2, 68, 69, 7, 99, 2, 2, 69, 70, 7, 112, 2, 2, 70, 72, 7, 102, 2, 2, 71, 65, 3, 2, 2, 2, 71, 68, 3, 2, 2, 2, 72, 4, 3, 2, 2, 2, 73, 74, 7, 81, 2, 2, 74, 78, 7, 84, 2, 2, 75, 76, 7, 113, 2, 2, 76, 78, 7, 116, 2, 2, 77, 73, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 78, 6, 3, 2, 2, 2, 79, 80, 7, 80, 2, 2, 80, 81, 7, 81, 2, 2, 81, 86, 7, 86, 2, 2, 82, 83, 7, 112, 2, 2, 83, 84, 7, 113, 2, 2, 84, 86, 7, 118, 2, 2, 85, 79, 3, 2, 2, 2, 85, 82, 3, 2, 2, 2, 86, 8, 3, 2, 2, 2, 87, 88, 7, 86, 2, 2, 88, 89, 7, 84, 2, 2, 89, 90, 7, 87, 2, 2, 90, 100, 7, 71, 2, 2, 91, 92, 7, 86, 2, 2, 92, 93, 7, 116, 2, 2, 93, 94, 7, 119, 2, 2, 94, 100, 7, 103, 2, 2, 95, 96, 7, 118, 2, 2, 96, 97, 7, 116, 2, 2, 97, 98, 7, 119, 2, 2, 98, 100, 7, 103, 2, 2, 99, 87, 3, 2, 2, 2, 99, 91, 3, 2, 2, 2, 99, 95, 3, 2, 2, 2, 100, 10, 3, 2, 2, 2, 101, 102, 7, 72, 2, 2, 102, 103, 7, 67, 2, 2, 103, 104, 7, 78, 2, 2, 104, 105, 7, 85, 2, 2, 105, 117, 7, 71, 2, 2, 106, 107, 7, 72, 2, 2, 107, 108, 7, 99, 2, 2, 108, 109, 7, 110, 2, 2, 109, 110, 7, 117, 2, 2, 110, 117, 7, 103, 2, 2, 111, 112, 7, 104, 2, 2, 112, 113, 7, 99, 2, 2, 113, 114, 7, 110, 2, 2, 114, 115, 7, 117, 2, 2, 115, 117, 7, 103, 2, 2, 116, 101, 3, 2, 2, 2, 116, 106, 3, 2, 2, 2, 116, 111, 3, 2, 2, 2, 117, 12, 3, 2, 2, 2, 118, 119, 7, 64, 2, 2, 119, 14, 3, 2, 2, 2, 120, 121, 7, 64, 2, 2, 121, 122, 7, 63, 2, 2, 122, 16, 3, 2, 2, 2, 123, 124, 7, 62, 2, 2, 124, 18, 3, 2, 2, 2, 125, 126, 7, 62, 2, 2, 126, 127, 7, 63, 2, 2, 127, 20, 3, 2, 2, 2, 128, 129, 7, 63, 2, 2, 129, 22, 3, 2, 2, 2, 130, 131, 7, 35, 2, 2, 131, 132, 7, 63, 2, 2, 132, 24, 3, 2, 2, 2, 133, 134, 7, 69, 2, 2, 134, 135, 7, 81, 2, 2, 135, 136, 7, 80, 2, 2, 136, 137, 7, 86, 2, 2, 137, 138, 7, 67, 2, 2, 138, 139, 7, 75, 2, 2, 139, 140, 7, 80, 2, 2, 140, 150, 7, 85, 2, 2, 141, 142, 7, 101, 2, 2, 142, 143, 7, 113, 2, 2, 143, 144, 7, 112, 2, 2, 144, 145, 7, 118, 2, 2, 145, 146, 7, 99, 2, 2, 146, 147, 7, 107, 2, 2, 147, 148, 7, 112, 2, 2, 148, 150, 7, 117, 2, 2, 149, 133, 3, 2, 2, 2, 149, 141, 3, 2, 2, 2, 150, 26, 3, 2, 2, 2, 151, 152, 7, 68, 2, 2, 152, 153, 7, 71, 2, 2, 153, 154, 7, 86, 2, 2, 154, 155, 7, 89, 2, 2, 155, 156, 7, 71, 2, 2, 156, 157, 7, 71, 2, 2, 157, 166, 7, 80, 2, 2, 158, 159, 7, 100, 2, 2, 159, 160, 7, 103, 2, 2, 160, 161, 7, 118, 2, 2, 161, 162, 7, 121, 2, 2, 162, 163, 7, 103, 2, 2, 163, 164, 7, 103, 2, 2, 164, 166, 7, 112, 2, 2, 165, 151, 3, 2, 2, 2, 165, 158, 3, 2, 2, 2, 166, 28, 3, 2, 2, 2, 167, 168, 7, 42, 2, 2, 168, 30, 3, 2, 2, 2, 169, 170, 7, 43, 2, 2, 170, 32, 3, 2, 2, 2, 171, 172, 7, 112, 2, 2, 172, 173, 7, 119, 2, 2, 173, 174, 7, 110, 2, 2, 174, 175, 7, 110, 2, 2, 175, 34, 3, 2, 2, 2, 176, 177, 7, 75, 2, 2, 177, 181, 7, 80, 2, 2, 178, 179, 7, 107, 2, 2, 179, 181, 7, 112, 2, 2, 180, 176, 3, 2, 2, 2, 180, 178, 3, 2, 2, 2, 181, 36, 3, 2, 2, 2, 182, 183, 7, 78, 2, 2, 183, 184, 7, 75, 2, 2, 184, 185, 7, 79, 2, 2, 185, 186, 7, 75, 2, 2, 186, 193, 7, 86, 2, 2, 187, 188, 7, 110, 2, 2, 188, 189, 7, 107, 2, 2, 189, 190, 7, 111, 2, 2, 190, 191, 7, 107, 2, 2, 191, 193, 7, 118, 2, 2, 192, 182, 3, 2, 2, 2, 192, 187, 3, 2, 2, 2, 193, 38, 3, 2, 2, 2, 194, 195, 7, 46, 2, 2, 195, 40, 3, 2, 2, 2, 196, 200, 9, 2, 2, 2, 197, 199, 9, 3, 2, 2, 198, 197, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 42, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 205, 9, 4, 2, 2, 204, 206, 9, 5, 2, 2, 205, 204, 3, 2, 2, 2, 206, 207, 3, 2, 2, 2, 207, 205, 3, 2, 2, 2, 207, 208, 3, 2, 2, 2, 208, 44, 3, 2, 2, 2, 209, 211, 7, 47, 2, 2, 210, 209, 3, 2, 2, 2, 210, 211, 3, 2, 2, 2, 211, 213, 3, 2, 2, 2, 212, 214, 9, 5, 2, 2, 213, 212, 3, 2, 2, 2, 214, 215, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 223, 3, 2, 2, 2, 217, 219, 7, 48, 2, 2, 218, 220, 9, 5, 2, 2, 219, 218, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 219, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 224, 3, 2, 2, 2, 223, 217, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 46, 3, 2, 2, 2, 225, 228, 7, 41, 2, 2, 226, 229, 10, 6, 2, 2, 227, 229, 5, 55, 28, 2, 228, 226, 3, 2, 2, 2, 228, 227, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 233, 7, 41, 2, 2, 233, 48, 3, 2, 2, 2, 234, 237, 7, 36, 2, 2, 235, 238, 10, 7, 2, 2, 236, 238, 5, 55, 28, 2, 237, 235, 3, 2, 2, 2, 237, 236, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 237, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 242, 7, 36, 2, 2, 242, 50, 3, 2, 2, 2, 243, 244, 7, 41, 2, 2, 244, 245, 7, 41, 2, 2, 245, 52, 3, 2, 2, 2, 246, 247, 7, 36, 2, 2, 247, 248, 7, 36, 2, 2, 248, 54, 3, 2, 2, 2, 249, 250, 7, 94, 2, 2, 250, 251, 9, 8, 2, 2, 251, 56, 3, 2, 2, 2, 252, 254, 9, 9, 2, 2, 253, 252, 3, 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 253, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 258, 8, 29, 2, 2, 258, 58, 3, 2, 2, 2, 259, 260, 9, 5, 2, 2, 260, 261, 9, 5, 2, 2, 261, 262, 9, 5, 2, 2, 262, 263, 9, 5, 2, 2, 263, 268, 7, 47, 2, 2, 264, 265, 7, 50, 2, 2, 265, 269, 9, 4, 2, 2, 266, 267, 7, 51, 2, 2, 267, 269, 9, 10, 2, 2, 268, 264, 3, 2, 2, 2, 268, 266, 3, 2, 2, 2, 269, 270, 3, 2, 2, 2, 270, 279, 7, 47, 2, 2, 271, 272, 7, 50, 2, 2, 272, 280, 9, 5, 2, 2, 273, 274, 7, 51, 2, 2, 274, 280, 9, 5, 2, 2, 275, 276, 7, 52, 2, 2, 276, 280, 9, 5, 2, 2, 277, 278, 7, 53, 2, 2, 278, 280, 9, 11, 2, 2, 279, 271, 3, 2, 2, 2, 279, 273, 3, 2, 2, 2, 279, 275, 3, 2, 2, 2, 279, 277, 3, 2, 2, 2, 280, 60, 3, 2, 2, 2, 281, 282, 5, 59, 30, 2, 282, 283, 7, 86, 2, 2, 283, 284, 5, 63, 32, 2, 284, 62, 3, 2, 2, 2, 285, 286, 7, 50, 2, 2, 286, 292, 9, 5, 2, 2, 287, 288, 7, 51, 2, 2, 288, 292, 9, 5, 2, 2, 289, 290, 7, 52, 2, 2, 290, 292, 9, 12, 2, 2, 291, 285, 3, 2, 2, 2, 291, 287, 3, 2, 2, 2, 291, 289, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 294, 7, 60, 2, 2, 294, 295, 9, 13, 2, 2, 295, 296, 9, 5, 2, 2, 296, 297, 7, 60, 2, 2, 297, 298, 9, 13, 2, 2, 298, 305, 9, 5, 2, 2, 299, 301, 7, 48, 2, 2, 300, 302, 9, 5, 2, 2, 301, 300, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 301, 3, 2, 2, 2, 303, 304, 3, 2, 2, 2, 304, 306, 3, 2, 2, 2, 305, 299, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 308, 7, 92, 2, 2, 308, 64, 3, 2, 2, 2, 28, 2, 71, 77, 85, 99, 116, 149, 165, 180, 192, 200, 207, 210, 215, 221, 223, 228, 230, 237, 239, 255, 268, 279, 291, 303, 305, 3, 8, 2, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 34, 356, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, 2, 78, 10, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 84, 10, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 92, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 106, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 123, 10, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 156, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 172, 10, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 187, 10, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 199, 10, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 217, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 225, 10, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 235, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 7, 24, 241, 10, 24, 12, 24, 14, 24, 244, 11, 24, 3, 25, 6, 25, 247, 10, 25, 13, 25, 14, 25, 248, 3, 25, 7, 25, 252, 10, 25, 12, 25, 14, 25, 255, 11, 25, 3, 26, 5, 26, 258, 10, 26, 3, 26, 6, 26, 261, 10, 26, 13, 26, 14, 26, 262, 3, 26, 3, 26, 6, 26, 267, 10, 26, 13, 26, 14, 26, 268, 5, 26, 271, 10, 26, 3, 27, 3, 27, 3, 27, 6, 27, 276, 10, 27, 13, 27, 14, 27, 277, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 6, 28, 285, 10, 28, 13, 28, 14, 28, 286, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 32, 6, 32, 301, 10, 32, 13, 32, 14, 32, 302, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 316, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 327, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 339, 10, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 349, 10, 35, 13, 35, 14, 35, 350, 5, 35, 353, 10, 35, 3, 35, 3, 35, 2, 2, 36, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 2, 63, 32, 65, 33, 67, 34, 69, 2, 3, 2, 14, 4, 2, 67, 92, 99, 124, 7, 2, 47, 48, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 51, 59, 3, 2, 50, 59, 3, 2, 41, 41, 3, 2, 36, 36, 8, 2, 36, 36, 41, 41, 94, 94, 112, 112, 116, 116, 118, 118, 5, 2, 11, 12, 14, 15, 34, 34, 3, 2, 50, 52, 3, 2, 50, 51, 3, 2, 50, 54, 3, 2, 50, 55, 2, 387, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 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, 29, 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, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 3, 77, 3, 2, 2, 2, 5, 83, 3, 2, 2, 2, 7, 91, 3, 2, 2, 2, 9, 105, 3, 2, 2, 2, 11, 122, 3, 2, 2, 2, 13, 124, 3, 2, 2, 2, 15, 126, 3, 2, 2, 2, 17, 129, 3, 2, 2, 2, 19, 131, 3, 2, 2, 2, 21, 134, 3, 2, 2, 2, 23, 136, 3, 2, 2, 2, 25, 155, 3, 2, 2, 2, 27, 171, 3, 2, 2, 2, 29, 173, 3, 2, 2, 2, 31, 175, 3, 2, 2, 2, 33, 177, 3, 2, 2, 2, 35, 186, 3, 2, 2, 2, 37, 198, 3, 2, 2, 2, 39, 216, 3, 2, 2, 2, 41, 224, 3, 2, 2, 2, 43, 234, 3, 2, 2, 2, 45, 236, 3, 2, 2, 2, 47, 238, 3, 2, 2, 2, 49, 246, 3, 2, 2, 2, 51, 257, 3, 2, 2, 2, 53, 272, 3, 2, 2, 2, 55, 281, 3, 2, 2, 2, 57, 290, 3, 2, 2, 2, 59, 293, 3, 2, 2, 2, 61, 296, 3, 2, 2, 2, 63, 300, 3, 2, 2, 2, 65, 306, 3, 2, 2, 2, 67, 328, 3, 2, 2, 2, 69, 338, 3, 2, 2, 2, 71, 72, 7, 67, 2, 2, 72, 73, 7, 80, 2, 2, 73, 78, 7, 70, 2, 2, 74, 75, 7, 99, 2, 2, 75, 76, 7, 112, 2, 2, 76, 78, 7, 102, 2, 2, 77, 71, 3, 2, 2, 2, 77, 74, 3, 2, 2, 2, 78, 4, 3, 2, 2, 2, 79, 80, 7, 81, 2, 2, 80, 84, 7, 84, 2, 2, 81, 82, 7, 113, 2, 2, 82, 84, 7, 116, 2, 2, 83, 79, 3, 2, 2, 2, 83, 81, 3, 2, 2, 2, 84, 6, 3, 2, 2, 2, 85, 86, 7, 80, 2, 2, 86, 87, 7, 81, 2, 2, 87, 92, 7, 86, 2, 2, 88, 89, 7, 112, 2, 2, 89, 90, 7, 113, 2, 2, 90, 92, 7, 118, 2, 2, 91, 85, 3, 2, 2, 2, 91, 88, 3, 2, 2, 2, 92, 8, 3, 2, 2, 2, 93, 94, 7, 86, 2, 2, 94, 95, 7, 84, 2, 2, 95, 96, 7, 87, 2, 2, 96, 106, 7, 71, 2, 2, 97, 98, 7, 86, 2, 2, 98, 99, 7, 116, 2, 2, 99, 100, 7, 119, 2, 2, 100, 106, 7, 103, 2, 2, 101, 102, 7, 118, 2, 2, 102, 103, 7, 116, 2, 2, 103, 104, 7, 119, 2, 2, 104, 106, 7, 103, 2, 2, 105, 93, 3, 2, 2, 2, 105, 97, 3, 2, 2, 2, 105, 101, 3, 2, 2, 2, 106, 10, 3, 2, 2, 2, 107, 108, 7, 72, 2, 2, 108, 109, 7, 67, 2, 2, 109, 110, 7, 78, 2, 2, 110, 111, 7, 85, 2, 2, 111, 123, 7, 71, 2, 2, 112, 113, 7, 72, 2, 2, 113, 114, 7, 99, 2, 2, 114, 115, 7, 110, 2, 2, 115, 116, 7, 117, 2, 2, 116, 123, 7, 103, 2, 2, 117, 118, 7, 104, 2, 2, 118, 119, 7, 99, 2, 2, 119, 120, 7, 110, 2, 2, 120, 121, 7, 117, 2, 2, 121, 123, 7, 103, 2, 2, 122, 107, 3, 2, 2, 2, 122, 112, 3, 2, 2, 2, 122, 117, 3, 2, 2, 2, 123, 12, 3, 2, 2, 2, 124, 125, 7, 64, 2, 2, 125, 14, 3, 2, 2, 2, 126, 127, 7, 64, 2, 2, 127, 128, 7, 63, 2, 2, 128, 16, 3, 2, 2, 2, 129, 130, 7, 62, 2, 2, 130, 18, 3, 2, 2, 2, 131, 132, 7, 62, 2, 2, 132, 133, 7, 63, 2, 2, 133, 20, 3, 2, 2, 2, 134, 135, 7, 63, 2, 2, 135, 22, 3, 2, 2, 2, 136, 137, 7, 35, 2, 2, 137, 138, 7, 63, 2, 2, 138, 24, 3, 2, 2, 2, 139, 140, 7, 69, 2, 2, 140, 141, 7, 81, 2, 2, 141, 142, 7, 80, 2, 2, 142, 143, 7, 86, 2, 2, 143, 144, 7, 67, 2, 2, 144, 145, 7, 75, 2, 2, 145, 146, 7, 80, 2, 2, 146, 156, 7, 85, 2, 2, 147, 148, 7, 101, 2, 2, 148, 149, 7, 113, 2, 2, 149, 150, 7, 112, 2, 2, 150, 151, 7, 118, 2, 2, 151, 152, 7, 99, 2, 2, 152, 153, 7, 107, 2, 2, 153, 154, 7, 112, 2, 2, 154, 156, 7, 117, 2, 2, 155, 139, 3, 2, 2, 2, 155, 147, 3, 2, 2, 2, 156, 26, 3, 2, 2, 2, 157, 158, 7, 68, 2, 2, 158, 159, 7, 71, 2, 2, 159, 160, 7, 86, 2, 2, 160, 161, 7, 89, 2, 2, 161, 162, 7, 71, 2, 2, 162, 163, 7, 71, 2, 2, 163, 172, 7, 80, 2, 2, 164, 165, 7, 100, 2, 2, 165, 166, 7, 103, 2, 2, 166, 167, 7, 118, 2, 2, 167, 168, 7, 121, 2, 2, 168, 169, 7, 103, 2, 2, 169, 170, 7, 103, 2, 2, 170, 172, 7, 112, 2, 2, 171, 157, 3, 2, 2, 2, 171, 164, 3, 2, 2, 2, 172, 28, 3, 2, 2, 2, 173, 174, 7, 42, 2, 2, 174, 30, 3, 2, 2, 2, 175, 176, 7, 43, 2, 2, 176, 32, 3, 2, 2, 2, 177, 178, 7, 112, 2, 2, 178, 179, 7, 119, 2, 2, 179, 180, 7, 110, 2, 2, 180, 181, 7, 110, 2, 2, 181, 34, 3, 2, 2, 2, 182, 183, 7, 75, 2, 2, 183, 187, 7, 80, 2, 2, 184, 185, 7, 107, 2, 2, 185, 187, 7, 112, 2, 2, 186, 182, 3, 2, 2, 2, 186, 184, 3, 2, 2, 2, 187, 36, 3, 2, 2, 2, 188, 189, 7, 78, 2, 2, 189, 190, 7, 75, 2, 2, 190, 191, 7, 79, 2, 2, 191, 192, 7, 75, 2, 2, 192, 199, 7, 86, 2, 2, 193, 194, 7, 110, 2, 2, 194, 195, 7, 107, 2, 2, 195, 196, 7, 111, 2, 2, 196, 197, 7, 107, 2, 2, 197, 199, 7, 118, 2, 2, 198, 188, 3, 2, 2, 2, 198, 193, 3, 2, 2, 2, 199, 38, 3, 2, 2, 2, 200, 201, 7, 81, 2, 2, 201, 202, 7, 84, 2, 2, 202, 203, 7, 70, 2, 2, 203, 204, 7, 71, 2, 2, 204, 205, 7, 84, 2, 2, 205, 206, 7, 34, 2, 2, 206, 207, 7, 68, 2, 2, 207, 217, 7, 91, 2, 2, 208, 209, 7, 113, 2, 2, 209, 210, 7, 116, 2, 2, 210, 211, 7, 102, 2, 2, 211, 212, 7, 103, 2, 2, 212, 213, 7, 116, 2, 2, 213, 214, 7, 34, 2, 2, 214, 215, 7, 100, 2, 2, 215, 217, 7, 123, 2, 2, 216, 200, 3, 2, 2, 2, 216, 208, 3, 2, 2, 2, 217, 40, 3, 2, 2, 2, 218, 219, 7, 67, 2, 2, 219, 220, 7, 85, 2, 2, 220, 225, 7, 69, 2, 2, 221, 222, 7, 99, 2, 2, 222, 223, 7, 117, 2, 2, 223, 225, 7, 101, 2, 2, 224, 218, 3, 2, 2, 2, 224, 221, 3, 2, 2, 2, 225, 42, 3, 2, 2, 2, 226, 227, 7, 70, 2, 2, 227, 228, 7, 71, 2, 2, 228, 229, 7, 85, 2, 2, 229, 235, 7, 69, 2, 2, 230, 231, 7, 102, 2, 2, 231, 232, 7, 103, 2, 2, 232, 233, 7, 117, 2, 2, 233, 235, 7, 101, 2, 2, 234, 226, 3, 2, 2, 2, 234, 230, 3, 2, 2, 2, 235, 44, 3, 2, 2, 2, 236, 237, 7, 46, 2, 2, 237, 46, 3, 2, 2, 2, 238, 242, 9, 2, 2, 2, 239, 241, 9, 3, 2, 2, 240, 239, 3, 2, 2, 2, 241, 244, 3, 2, 2, 2, 242, 240, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 48, 3, 2, 2, 2, 244, 242, 3, 2, 2, 2, 245, 247, 9, 4, 2, 2, 246, 245, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 246, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 253, 3, 2, 2, 2, 250, 252, 9, 5, 2, 2, 251, 250, 3, 2, 2, 2, 252, 255, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 253, 254, 3, 2, 2, 2, 254, 50, 3, 2, 2, 2, 255, 253, 3, 2, 2, 2, 256, 258, 7, 47, 2, 2, 257, 256, 3, 2, 2, 2, 257, 258, 3, 2, 2, 2, 258, 260, 3, 2, 2, 2, 259, 261, 9, 5, 2, 2, 260, 259, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 260, 3, 2, 2, 2, 262, 263, 3, 2, 2, 2, 263, 270, 3, 2, 2, 2, 264, 266, 7, 48, 2, 2, 265, 267, 9, 5, 2, 2, 266, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 264, 3, 2, 2, 2, 270, 271, 3, 2, 2, 2, 271, 52, 3, 2, 2, 2, 272, 275, 7, 41, 2, 2, 273, 276, 10, 6, 2, 2, 274, 276, 5, 61, 31, 2, 275, 273, 3, 2, 2, 2, 275, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 275, 3, 2, 2, 2, 277, 278, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 280, 7, 41, 2, 2, 280, 54, 3, 2, 2, 2, 281, 284, 7, 36, 2, 2, 282, 285, 10, 7, 2, 2, 283, 285, 5, 61, 31, 2, 284, 282, 3, 2, 2, 2, 284, 283, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 284, 3, 2, 2, 2, 286, 287, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 288, 289, 7, 36, 2, 2, 289, 56, 3, 2, 2, 2, 290, 291, 7, 41, 2, 2, 291, 292, 7, 41, 2, 2, 292, 58, 3, 2, 2, 2, 293, 294, 7, 36, 2, 2, 294, 295, 7, 36, 2, 2, 295, 60, 3, 2, 2, 2, 296, 297, 7, 94, 2, 2, 297, 298, 9, 8, 2, 2, 298, 62, 3, 2, 2, 2, 299, 301, 9, 9, 2, 2, 300, 299, 3, 2, 2, 2, 301, 302, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 304, 3, 2, 2, 2, 304, 305, 8, 32, 2, 2, 305, 64, 3, 2, 2, 2, 306, 307, 9, 5, 2, 2, 307, 308, 9, 5, 2, 2, 308, 309, 9, 5, 2, 2, 309, 310, 9, 5, 2, 2, 310, 315, 7, 47, 2, 2, 311, 312, 7, 50, 2, 2, 312, 316, 9, 4, 2, 2, 313, 314, 7, 51, 2, 2, 314, 316, 9, 10, 2, 2, 315, 311, 3, 2, 2, 2, 315, 313, 3, 2, 2, 2, 316, 317, 3, 2, 2, 2, 317, 326, 7, 47, 2, 2, 318, 319, 7, 50, 2, 2, 319, 327, 9, 5, 2, 2, 320, 321, 7, 51, 2, 2, 321, 327, 9, 5, 2, 2, 322, 323, 7, 52, 2, 2, 323, 327, 9, 5, 2, 2, 324, 325, 7, 53, 2, 2, 325, 327, 9, 11, 2, 2, 326, 318, 3, 2, 2, 2, 326, 320, 3, 2, 2, 2, 326, 322, 3, 2, 2, 2, 326, 324, 3, 2, 2, 2, 327, 66, 3, 2, 2, 2, 328, 329, 5, 65, 33, 2, 329, 330, 7, 86, 2, 2, 330, 331, 5, 69, 35, 2, 331, 68, 3, 2, 2, 2, 332, 333, 7, 50, 2, 2, 333, 339, 9, 5, 2, 2, 334, 335, 7, 51, 2, 2, 335, 339, 9, 5, 2, 2, 336, 337, 7, 52, 2, 2, 337, 339, 9, 12, 2, 2, 338, 332, 3, 2, 2, 2, 338, 334, 3, 2, 2, 2, 338, 336, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 341, 7, 60, 2, 2, 341, 342, 9, 13, 2, 2, 342, 343, 9, 5, 2, 2, 343, 344, 7, 60, 2, 2, 344, 345, 9, 13, 2, 2, 345, 352, 9, 5, 2, 2, 346, 348, 7, 48, 2, 2, 347, 349, 9, 5, 2, 2, 348, 347, 3, 2, 2, 2, 349, 350, 3, 2, 2, 2, 350, 348, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 353, 3, 2, 2, 2, 352, 346, 3, 2, 2, 2, 352, 353, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 355, 7, 92, 2, 2, 355, 70, 3, 2, 2, 2, 32, 2, 77, 83, 91, 105, 122, 155, 171, 186, 198, 216, 224, 234, 242, 248, 253, 257, 262, 268, 270, 275, 277, 284, 286, 302, 315, 326, 338, 350, 352, 3, 8, 2, 2] \ No newline at end of file diff --git a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterLexer.java b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterLexer.java index 651ac4e..295746b 100644 --- a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterLexer.java +++ b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterLexer.java @@ -39,9 +39,10 @@ public class CustomConnectorQueryFilterLexer extends Lexer { new PredictionContextCache(); public static final int AND=1, OR=2, NOT=3, TRUE=4, FALSE=5, GT=6, GE=7, LT=8, LE=9, EQ=10, NE=11, - LIKE=12, BETWEEN=13, LPAREN=14, RPAREN=15, NULL=16, IN=17, LIMIT=18, COMMA=19, - IDENTIFIER=20, POS_INTEGER=21, DECIMAL=22, SINGLE_STRING=23, DOUBLE_STRING=24, - EMPTY_SINGLE_STRING=25, EMPTY_DOUBLE_STRING=26, WS=27, DATE=28, DATETIME=29; + LIKE=12, BETWEEN=13, LPAREN=14, RPAREN=15, NULL=16, IN=17, LIMIT=18, ORDERBY=19, + ASC=20, DESC=21, COMMA=22, IDENTIFIER=23, POS_INTEGER=24, DECIMAL=25, + SINGLE_STRING=26, DOUBLE_STRING=27, EMPTY_SINGLE_STRING=28, EMPTY_DOUBLE_STRING=29, + WS=30, DATE=31, DATETIME=32; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -53,10 +54,10 @@ public class CustomConnectorQueryFilterLexer extends Lexer { private static String[] makeRuleNames() { return new String[] { "AND", "OR", "NOT", "TRUE", "FALSE", "GT", "GE", "LT", "LE", "EQ", "NE", - "LIKE", "BETWEEN", "LPAREN", "RPAREN", "NULL", "IN", "LIMIT", "COMMA", - "IDENTIFIER", "POS_INTEGER", "DECIMAL", "SINGLE_STRING", "DOUBLE_STRING", - "EMPTY_SINGLE_STRING", "EMPTY_DOUBLE_STRING", "STR_ESC", "WS", "DATE", - "DATETIME", "TIME" + "LIKE", "BETWEEN", "LPAREN", "RPAREN", "NULL", "IN", "LIMIT", "ORDERBY", + "ASC", "DESC", "COMMA", "IDENTIFIER", "POS_INTEGER", "DECIMAL", "SINGLE_STRING", + "DOUBLE_STRING", "EMPTY_SINGLE_STRING", "EMPTY_DOUBLE_STRING", "STR_ESC", + "WS", "DATE", "DATETIME", "TIME" }; } public static final String[] ruleNames = makeRuleNames(); @@ -64,16 +65,18 @@ private static String[] makeRuleNames() { private static String[] makeLiteralNames() { return new String[] { null, null, null, null, null, null, "'>'", "'>='", "'<'", "'<='", "'='", - "'!='", null, null, "'('", "')'", "'null'", null, null, "','" + "'!='", null, null, "'('", "')'", "'null'", null, null, null, null, null, + "','" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { null, "AND", "OR", "NOT", "TRUE", "FALSE", "GT", "GE", "LT", "LE", "EQ", - "NE", "LIKE", "BETWEEN", "LPAREN", "RPAREN", "NULL", "IN", "LIMIT", "COMMA", - "IDENTIFIER", "POS_INTEGER", "DECIMAL", "SINGLE_STRING", "DOUBLE_STRING", - "EMPTY_SINGLE_STRING", "EMPTY_DOUBLE_STRING", "WS", "DATE", "DATETIME" + "NE", "LIKE", "BETWEEN", "LPAREN", "RPAREN", "NULL", "IN", "LIMIT", "ORDERBY", + "ASC", "DESC", "COMMA", "IDENTIFIER", "POS_INTEGER", "DECIMAL", "SINGLE_STRING", + "DOUBLE_STRING", "EMPTY_SINGLE_STRING", "EMPTY_DOUBLE_STRING", "WS", + "DATE", "DATETIME" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -135,112 +138,129 @@ public CustomConnectorQueryFilterLexer(CharStream input) { public ATN getATN() { return _ATN; } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\37\u0135\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"+ - " \3\2\3\2\3\2\3\2\3\2\3\2\5\2H\n\2\3\3\3\3\3\3\3\3\5\3N\n\3\3\4\3\4\3"+ - "\4\3\4\3\4\3\4\5\4V\n\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3"+ - "\5\5\5d\n\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+ - "\6\5\6u\n\6\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3\13\3\13\3\f\3\f"+ - "\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\5"+ - "\r\u0096\n\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+ - "\16\3\16\3\16\5\16\u00a6\n\16\3\17\3\17\3\20\3\20\3\21\3\21\3\21\3\21"+ - "\3\21\3\22\3\22\3\22\3\22\5\22\u00b5\n\22\3\23\3\23\3\23\3\23\3\23\3\23"+ - "\3\23\3\23\3\23\3\23\5\23\u00c1\n\23\3\24\3\24\3\25\3\25\7\25\u00c7\n"+ - "\25\f\25\16\25\u00ca\13\25\3\26\3\26\6\26\u00ce\n\26\r\26\16\26\u00cf"+ - "\3\27\5\27\u00d3\n\27\3\27\6\27\u00d6\n\27\r\27\16\27\u00d7\3\27\3\27"+ - "\6\27\u00dc\n\27\r\27\16\27\u00dd\5\27\u00e0\n\27\3\30\3\30\3\30\6\30"+ - "\u00e5\n\30\r\30\16\30\u00e6\3\30\3\30\3\31\3\31\3\31\6\31\u00ee\n\31"+ - "\r\31\16\31\u00ef\3\31\3\31\3\32\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3"+ - "\34\3\35\6\35\u00fe\n\35\r\35\16\35\u00ff\3\35\3\35\3\36\3\36\3\36\3\36"+ - "\3\36\3\36\3\36\3\36\3\36\5\36\u010d\n\36\3\36\3\36\3\36\3\36\3\36\3\36"+ - "\3\36\3\36\3\36\5\36\u0118\n\36\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 "+ - "\5 \u0124\n \3 \3 \3 \3 \3 \3 \3 \3 \6 \u012e\n \r \16 \u012f\5 \u0132"+ - "\n \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\29\35;\36=\37?\2\3\2\16\4\2C\\c|\7\2/\60\62;C\\aac|\3\2\63;\3\2\62"+ - ";\3\2))\3\2$$\b\2$$))^^ppttvv\5\2\13\f\16\17\"\"\3\2\62\64\3\2\62\63\3"+ - "\2\62\66\3\2\62\67\2\u0150\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\29\3"+ - "\2\2\2\2;\3\2\2\2\2=\3\2\2\2\3G\3\2\2\2\5M\3\2\2\2\7U\3\2\2\2\tc\3\2\2"+ - "\2\13t\3\2\2\2\rv\3\2\2\2\17x\3\2\2\2\21{\3\2\2\2\23}\3\2\2\2\25\u0080"+ - "\3\2\2\2\27\u0082\3\2\2\2\31\u0095\3\2\2\2\33\u00a5\3\2\2\2\35\u00a7\3"+ - "\2\2\2\37\u00a9\3\2\2\2!\u00ab\3\2\2\2#\u00b4\3\2\2\2%\u00c0\3\2\2\2\'"+ - "\u00c2\3\2\2\2)\u00c4\3\2\2\2+\u00cb\3\2\2\2-\u00d2\3\2\2\2/\u00e1\3\2"+ - "\2\2\61\u00ea\3\2\2\2\63\u00f3\3\2\2\2\65\u00f6\3\2\2\2\67\u00f9\3\2\2"+ - "\29\u00fd\3\2\2\2;\u0103\3\2\2\2=\u0119\3\2\2\2?\u0123\3\2\2\2AB\7C\2"+ - "\2BC\7P\2\2CH\7F\2\2DE\7c\2\2EF\7p\2\2FH\7f\2\2GA\3\2\2\2GD\3\2\2\2H\4"+ - "\3\2\2\2IJ\7Q\2\2JN\7T\2\2KL\7q\2\2LN\7t\2\2MI\3\2\2\2MK\3\2\2\2N\6\3"+ - "\2\2\2OP\7P\2\2PQ\7Q\2\2QV\7V\2\2RS\7p\2\2ST\7q\2\2TV\7v\2\2UO\3\2\2\2"+ - "UR\3\2\2\2V\b\3\2\2\2WX\7V\2\2XY\7T\2\2YZ\7W\2\2Zd\7G\2\2[\\\7V\2\2\\"+ - "]\7t\2\2]^\7w\2\2^d\7g\2\2_`\7v\2\2`a\7t\2\2ab\7w\2\2bd\7g\2\2cW\3\2\2"+ - "\2c[\3\2\2\2c_\3\2\2\2d\n\3\2\2\2ef\7H\2\2fg\7C\2\2gh\7N\2\2hi\7U\2\2"+ - "iu\7G\2\2jk\7H\2\2kl\7c\2\2lm\7n\2\2mn\7u\2\2nu\7g\2\2op\7h\2\2pq\7c\2"+ - "\2qr\7n\2\2rs\7u\2\2su\7g\2\2te\3\2\2\2tj\3\2\2\2to\3\2\2\2u\f\3\2\2\2"+ - "vw\7@\2\2w\16\3\2\2\2xy\7@\2\2yz\7?\2\2z\20\3\2\2\2{|\7>\2\2|\22\3\2\2"+ - "\2}~\7>\2\2~\177\7?\2\2\177\24\3\2\2\2\u0080\u0081\7?\2\2\u0081\26\3\2"+ - "\2\2\u0082\u0083\7#\2\2\u0083\u0084\7?\2\2\u0084\30\3\2\2\2\u0085\u0086"+ - "\7E\2\2\u0086\u0087\7Q\2\2\u0087\u0088\7P\2\2\u0088\u0089\7V\2\2\u0089"+ - "\u008a\7C\2\2\u008a\u008b\7K\2\2\u008b\u008c\7P\2\2\u008c\u0096\7U\2\2"+ - "\u008d\u008e\7e\2\2\u008e\u008f\7q\2\2\u008f\u0090\7p\2\2\u0090\u0091"+ - "\7v\2\2\u0091\u0092\7c\2\2\u0092\u0093\7k\2\2\u0093\u0094\7p\2\2\u0094"+ - "\u0096\7u\2\2\u0095\u0085\3\2\2\2\u0095\u008d\3\2\2\2\u0096\32\3\2\2\2"+ - "\u0097\u0098\7D\2\2\u0098\u0099\7G\2\2\u0099\u009a\7V\2\2\u009a\u009b"+ - "\7Y\2\2\u009b\u009c\7G\2\2\u009c\u009d\7G\2\2\u009d\u00a6\7P\2\2\u009e"+ - "\u009f\7d\2\2\u009f\u00a0\7g\2\2\u00a0\u00a1\7v\2\2\u00a1\u00a2\7y\2\2"+ - "\u00a2\u00a3\7g\2\2\u00a3\u00a4\7g\2\2\u00a4\u00a6\7p\2\2\u00a5\u0097"+ - "\3\2\2\2\u00a5\u009e\3\2\2\2\u00a6\34\3\2\2\2\u00a7\u00a8\7*\2\2\u00a8"+ - "\36\3\2\2\2\u00a9\u00aa\7+\2\2\u00aa \3\2\2\2\u00ab\u00ac\7p\2\2\u00ac"+ - "\u00ad\7w\2\2\u00ad\u00ae\7n\2\2\u00ae\u00af\7n\2\2\u00af\"\3\2\2\2\u00b0"+ - "\u00b1\7K\2\2\u00b1\u00b5\7P\2\2\u00b2\u00b3\7k\2\2\u00b3\u00b5\7p\2\2"+ - "\u00b4\u00b0\3\2\2\2\u00b4\u00b2\3\2\2\2\u00b5$\3\2\2\2\u00b6\u00b7\7"+ - "N\2\2\u00b7\u00b8\7K\2\2\u00b8\u00b9\7O\2\2\u00b9\u00ba\7K\2\2\u00ba\u00c1"+ - "\7V\2\2\u00bb\u00bc\7n\2\2\u00bc\u00bd\7k\2\2\u00bd\u00be\7o\2\2\u00be"+ - "\u00bf\7k\2\2\u00bf\u00c1\7v\2\2\u00c0\u00b6\3\2\2\2\u00c0\u00bb\3\2\2"+ - "\2\u00c1&\3\2\2\2\u00c2\u00c3\7.\2\2\u00c3(\3\2\2\2\u00c4\u00c8\t\2\2"+ - "\2\u00c5\u00c7\t\3\2\2\u00c6\u00c5\3\2\2\2\u00c7\u00ca\3\2\2\2\u00c8\u00c6"+ - "\3\2\2\2\u00c8\u00c9\3\2\2\2\u00c9*\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb"+ - "\u00cd\t\4\2\2\u00cc\u00ce\t\5\2\2\u00cd\u00cc\3\2\2\2\u00ce\u00cf\3\2"+ - "\2\2\u00cf\u00cd\3\2\2\2\u00cf\u00d0\3\2\2\2\u00d0,\3\2\2\2\u00d1\u00d3"+ - "\7/\2\2\u00d2\u00d1\3\2\2\2\u00d2\u00d3\3\2\2\2\u00d3\u00d5\3\2\2\2\u00d4"+ - "\u00d6\t\5\2\2\u00d5\u00d4\3\2\2\2\u00d6\u00d7\3\2\2\2\u00d7\u00d5\3\2"+ - "\2\2\u00d7\u00d8\3\2\2\2\u00d8\u00df\3\2\2\2\u00d9\u00db\7\60\2\2\u00da"+ - "\u00dc\t\5\2\2\u00db\u00da\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd\u00db\3\2"+ - "\2\2\u00dd\u00de\3\2\2\2\u00de\u00e0\3\2\2\2\u00df\u00d9\3\2\2\2\u00df"+ - "\u00e0\3\2\2\2\u00e0.\3\2\2\2\u00e1\u00e4\7)\2\2\u00e2\u00e5\n\6\2\2\u00e3"+ - "\u00e5\5\67\34\2\u00e4\u00e2\3\2\2\2\u00e4\u00e3\3\2\2\2\u00e5\u00e6\3"+ - "\2\2\2\u00e6\u00e4\3\2\2\2\u00e6\u00e7\3\2\2\2\u00e7\u00e8\3\2\2\2\u00e8"+ - "\u00e9\7)\2\2\u00e9\60\3\2\2\2\u00ea\u00ed\7$\2\2\u00eb\u00ee\n\7\2\2"+ - "\u00ec\u00ee\5\67\34\2\u00ed\u00eb\3\2\2\2\u00ed\u00ec\3\2\2\2\u00ee\u00ef"+ - "\3\2\2\2\u00ef\u00ed\3\2\2\2\u00ef\u00f0\3\2\2\2\u00f0\u00f1\3\2\2\2\u00f1"+ - "\u00f2\7$\2\2\u00f2\62\3\2\2\2\u00f3\u00f4\7)\2\2\u00f4\u00f5\7)\2\2\u00f5"+ - "\64\3\2\2\2\u00f6\u00f7\7$\2\2\u00f7\u00f8\7$\2\2\u00f8\66\3\2\2\2\u00f9"+ - "\u00fa\7^\2\2\u00fa\u00fb\t\b\2\2\u00fb8\3\2\2\2\u00fc\u00fe\t\t\2\2\u00fd"+ - "\u00fc\3\2\2\2\u00fe\u00ff\3\2\2\2\u00ff\u00fd\3\2\2\2\u00ff\u0100\3\2"+ - "\2\2\u0100\u0101\3\2\2\2\u0101\u0102\b\35\2\2\u0102:\3\2\2\2\u0103\u0104"+ - "\t\5\2\2\u0104\u0105\t\5\2\2\u0105\u0106\t\5\2\2\u0106\u0107\t\5\2\2\u0107"+ - "\u010c\7/\2\2\u0108\u0109\7\62\2\2\u0109\u010d\t\4\2\2\u010a\u010b\7\63"+ - "\2\2\u010b\u010d\t\n\2\2\u010c\u0108\3\2\2\2\u010c\u010a\3\2\2\2\u010d"+ - "\u010e\3\2\2\2\u010e\u0117\7/\2\2\u010f\u0110\7\62\2\2\u0110\u0118\t\5"+ - "\2\2\u0111\u0112\7\63\2\2\u0112\u0118\t\5\2\2\u0113\u0114\7\64\2\2\u0114"+ - "\u0118\t\5\2\2\u0115\u0116\7\65\2\2\u0116\u0118\t\13\2\2\u0117\u010f\3"+ - "\2\2\2\u0117\u0111\3\2\2\2\u0117\u0113\3\2\2\2\u0117\u0115\3\2\2\2\u0118"+ - "<\3\2\2\2\u0119\u011a\5;\36\2\u011a\u011b\7V\2\2\u011b\u011c\5? \2\u011c"+ - ">\3\2\2\2\u011d\u011e\7\62\2\2\u011e\u0124\t\5\2\2\u011f\u0120\7\63\2"+ - "\2\u0120\u0124\t\5\2\2\u0121\u0122\7\64\2\2\u0122\u0124\t\f\2\2\u0123"+ - "\u011d\3\2\2\2\u0123\u011f\3\2\2\2\u0123\u0121\3\2\2\2\u0124\u0125\3\2"+ - "\2\2\u0125\u0126\7<\2\2\u0126\u0127\t\r\2\2\u0127\u0128\t\5\2\2\u0128"+ - "\u0129\7<\2\2\u0129\u012a\t\r\2\2\u012a\u0131\t\5\2\2\u012b\u012d\7\60"+ - "\2\2\u012c\u012e\t\5\2\2\u012d\u012c\3\2\2\2\u012e\u012f\3\2\2\2\u012f"+ - "\u012d\3\2\2\2\u012f\u0130\3\2\2\2\u0130\u0132\3\2\2\2\u0131\u012b\3\2"+ - "\2\2\u0131\u0132\3\2\2\2\u0132\u0133\3\2\2\2\u0133\u0134\7\\\2\2\u0134"+ - "@\3\2\2\2\34\2GMUct\u0095\u00a5\u00b4\u00c0\u00c8\u00cf\u00d2\u00d7\u00dd"+ - "\u00df\u00e4\u00e6\u00ed\u00ef\u00ff\u010c\u0117\u0123\u012f\u0131\3\b"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\"\u0164\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#\3\2\3\2\3\2\3\2\3\2\3\2\5\2N\n\2\3\3\3\3\3\3\3\3\5\3"+ + "T\n\3\3\4\3\4\3\4\3\4\3\4\3\4\5\4\\\n\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3"+ + "\5\3\5\3\5\3\5\3\5\5\5j\n\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+ + "\6\3\6\3\6\3\6\3\6\5\6{\n\6\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3"+ + "\13\3\13\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3"+ + "\r\3\r\3\r\3\r\5\r\u009c\n\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+ + "\16\3\16\3\16\3\16\3\16\3\16\5\16\u00ac\n\16\3\17\3\17\3\20\3\20\3\21"+ + "\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\5\22\u00bb\n\22\3\23\3\23\3\23"+ + "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\5\23\u00c7\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\3\24\3\24\3\24\5\24\u00d9"+ + "\n\24\3\25\3\25\3\25\3\25\3\25\3\25\5\25\u00e1\n\25\3\26\3\26\3\26\3\26"+ + "\3\26\3\26\3\26\3\26\5\26\u00eb\n\26\3\27\3\27\3\30\3\30\7\30\u00f1\n"+ + "\30\f\30\16\30\u00f4\13\30\3\31\6\31\u00f7\n\31\r\31\16\31\u00f8\3\31"+ + "\7\31\u00fc\n\31\f\31\16\31\u00ff\13\31\3\32\5\32\u0102\n\32\3\32\6\32"+ + "\u0105\n\32\r\32\16\32\u0106\3\32\3\32\6\32\u010b\n\32\r\32\16\32\u010c"+ + "\5\32\u010f\n\32\3\33\3\33\3\33\6\33\u0114\n\33\r\33\16\33\u0115\3\33"+ + "\3\33\3\34\3\34\3\34\6\34\u011d\n\34\r\34\16\34\u011e\3\34\3\34\3\35\3"+ + "\35\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3 \6 \u012d\n \r \16 \u012e\3 "+ + "\3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u013c\n!\3!\3!\3!\3!\3!\3!\3!\3!\3!"+ + "\5!\u0147\n!\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\5#\u0153\n#\3#\3#\3#\3"+ + "#\3#\3#\3#\3#\6#\u015d\n#\r#\16#\u015e\5#\u0161\n#\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=\2? A!C"+ + "\"E\2\3\2\16\4\2C\\c|\7\2/\60\62;C\\aac|\3\2\63;\3\2\62;\3\2))\3\2$$\b"+ + "\2$$))^^ppttvv\5\2\13\f\16\17\"\"\3\2\62\64\3\2\62\63\3\2\62\66\3\2\62"+ + "\67\2\u0183\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\2A\3\2\2\2\2C\3\2\2\2\3M\3\2\2\2\5S\3\2\2\2"+ + "\7[\3\2\2\2\ti\3\2\2\2\13z\3\2\2\2\r|\3\2\2\2\17~\3\2\2\2\21\u0081\3\2"+ + "\2\2\23\u0083\3\2\2\2\25\u0086\3\2\2\2\27\u0088\3\2\2\2\31\u009b\3\2\2"+ + "\2\33\u00ab\3\2\2\2\35\u00ad\3\2\2\2\37\u00af\3\2\2\2!\u00b1\3\2\2\2#"+ + "\u00ba\3\2\2\2%\u00c6\3\2\2\2\'\u00d8\3\2\2\2)\u00e0\3\2\2\2+\u00ea\3"+ + "\2\2\2-\u00ec\3\2\2\2/\u00ee\3\2\2\2\61\u00f6\3\2\2\2\63\u0101\3\2\2\2"+ + "\65\u0110\3\2\2\2\67\u0119\3\2\2\29\u0122\3\2\2\2;\u0125\3\2\2\2=\u0128"+ + "\3\2\2\2?\u012c\3\2\2\2A\u0132\3\2\2\2C\u0148\3\2\2\2E\u0152\3\2\2\2G"+ + "H\7C\2\2HI\7P\2\2IN\7F\2\2JK\7c\2\2KL\7p\2\2LN\7f\2\2MG\3\2\2\2MJ\3\2"+ + "\2\2N\4\3\2\2\2OP\7Q\2\2PT\7T\2\2QR\7q\2\2RT\7t\2\2SO\3\2\2\2SQ\3\2\2"+ + "\2T\6\3\2\2\2UV\7P\2\2VW\7Q\2\2W\\\7V\2\2XY\7p\2\2YZ\7q\2\2Z\\\7v\2\2"+ + "[U\3\2\2\2[X\3\2\2\2\\\b\3\2\2\2]^\7V\2\2^_\7T\2\2_`\7W\2\2`j\7G\2\2a"+ + "b\7V\2\2bc\7t\2\2cd\7w\2\2dj\7g\2\2ef\7v\2\2fg\7t\2\2gh\7w\2\2hj\7g\2"+ + "\2i]\3\2\2\2ia\3\2\2\2ie\3\2\2\2j\n\3\2\2\2kl\7H\2\2lm\7C\2\2mn\7N\2\2"+ + "no\7U\2\2o{\7G\2\2pq\7H\2\2qr\7c\2\2rs\7n\2\2st\7u\2\2t{\7g\2\2uv\7h\2"+ + "\2vw\7c\2\2wx\7n\2\2xy\7u\2\2y{\7g\2\2zk\3\2\2\2zp\3\2\2\2zu\3\2\2\2{"+ + "\f\3\2\2\2|}\7@\2\2}\16\3\2\2\2~\177\7@\2\2\177\u0080\7?\2\2\u0080\20"+ + "\3\2\2\2\u0081\u0082\7>\2\2\u0082\22\3\2\2\2\u0083\u0084\7>\2\2\u0084"+ + "\u0085\7?\2\2\u0085\24\3\2\2\2\u0086\u0087\7?\2\2\u0087\26\3\2\2\2\u0088"+ + "\u0089\7#\2\2\u0089\u008a\7?\2\2\u008a\30\3\2\2\2\u008b\u008c\7E\2\2\u008c"+ + "\u008d\7Q\2\2\u008d\u008e\7P\2\2\u008e\u008f\7V\2\2\u008f\u0090\7C\2\2"+ + "\u0090\u0091\7K\2\2\u0091\u0092\7P\2\2\u0092\u009c\7U\2\2\u0093\u0094"+ + "\7e\2\2\u0094\u0095\7q\2\2\u0095\u0096\7p\2\2\u0096\u0097\7v\2\2\u0097"+ + "\u0098\7c\2\2\u0098\u0099\7k\2\2\u0099\u009a\7p\2\2\u009a\u009c\7u\2\2"+ + "\u009b\u008b\3\2\2\2\u009b\u0093\3\2\2\2\u009c\32\3\2\2\2\u009d\u009e"+ + "\7D\2\2\u009e\u009f\7G\2\2\u009f\u00a0\7V\2\2\u00a0\u00a1\7Y\2\2\u00a1"+ + "\u00a2\7G\2\2\u00a2\u00a3\7G\2\2\u00a3\u00ac\7P\2\2\u00a4\u00a5\7d\2\2"+ + "\u00a5\u00a6\7g\2\2\u00a6\u00a7\7v\2\2\u00a7\u00a8\7y\2\2\u00a8\u00a9"+ + "\7g\2\2\u00a9\u00aa\7g\2\2\u00aa\u00ac\7p\2\2\u00ab\u009d\3\2\2\2\u00ab"+ + "\u00a4\3\2\2\2\u00ac\34\3\2\2\2\u00ad\u00ae\7*\2\2\u00ae\36\3\2\2\2\u00af"+ + "\u00b0\7+\2\2\u00b0 \3\2\2\2\u00b1\u00b2\7p\2\2\u00b2\u00b3\7w\2\2\u00b3"+ + "\u00b4\7n\2\2\u00b4\u00b5\7n\2\2\u00b5\"\3\2\2\2\u00b6\u00b7\7K\2\2\u00b7"+ + "\u00bb\7P\2\2\u00b8\u00b9\7k\2\2\u00b9\u00bb\7p\2\2\u00ba\u00b6\3\2\2"+ + "\2\u00ba\u00b8\3\2\2\2\u00bb$\3\2\2\2\u00bc\u00bd\7N\2\2\u00bd\u00be\7"+ + "K\2\2\u00be\u00bf\7O\2\2\u00bf\u00c0\7K\2\2\u00c0\u00c7\7V\2\2\u00c1\u00c2"+ + "\7n\2\2\u00c2\u00c3\7k\2\2\u00c3\u00c4\7o\2\2\u00c4\u00c5\7k\2\2\u00c5"+ + "\u00c7\7v\2\2\u00c6\u00bc\3\2\2\2\u00c6\u00c1\3\2\2\2\u00c7&\3\2\2\2\u00c8"+ + "\u00c9\7Q\2\2\u00c9\u00ca\7T\2\2\u00ca\u00cb\7F\2\2\u00cb\u00cc\7G\2\2"+ + "\u00cc\u00cd\7T\2\2\u00cd\u00ce\7\"\2\2\u00ce\u00cf\7D\2\2\u00cf\u00d9"+ + "\7[\2\2\u00d0\u00d1\7q\2\2\u00d1\u00d2\7t\2\2\u00d2\u00d3\7f\2\2\u00d3"+ + "\u00d4\7g\2\2\u00d4\u00d5\7t\2\2\u00d5\u00d6\7\"\2\2\u00d6\u00d7\7d\2"+ + "\2\u00d7\u00d9\7{\2\2\u00d8\u00c8\3\2\2\2\u00d8\u00d0\3\2\2\2\u00d9(\3"+ + "\2\2\2\u00da\u00db\7C\2\2\u00db\u00dc\7U\2\2\u00dc\u00e1\7E\2\2\u00dd"+ + "\u00de\7c\2\2\u00de\u00df\7u\2\2\u00df\u00e1\7e\2\2\u00e0\u00da\3\2\2"+ + "\2\u00e0\u00dd\3\2\2\2\u00e1*\3\2\2\2\u00e2\u00e3\7F\2\2\u00e3\u00e4\7"+ + "G\2\2\u00e4\u00e5\7U\2\2\u00e5\u00eb\7E\2\2\u00e6\u00e7\7f\2\2\u00e7\u00e8"+ + "\7g\2\2\u00e8\u00e9\7u\2\2\u00e9\u00eb\7e\2\2\u00ea\u00e2\3\2\2\2\u00ea"+ + "\u00e6\3\2\2\2\u00eb,\3\2\2\2\u00ec\u00ed\7.\2\2\u00ed.\3\2\2\2\u00ee"+ + "\u00f2\t\2\2\2\u00ef\u00f1\t\3\2\2\u00f0\u00ef\3\2\2\2\u00f1\u00f4\3\2"+ + "\2\2\u00f2\u00f0\3\2\2\2\u00f2\u00f3\3\2\2\2\u00f3\60\3\2\2\2\u00f4\u00f2"+ + "\3\2\2\2\u00f5\u00f7\t\4\2\2\u00f6\u00f5\3\2\2\2\u00f7\u00f8\3\2\2\2\u00f8"+ + "\u00f6\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fd\3\2\2\2\u00fa\u00fc\t\5"+ + "\2\2\u00fb\u00fa\3\2\2\2\u00fc\u00ff\3\2\2\2\u00fd\u00fb\3\2\2\2\u00fd"+ + "\u00fe\3\2\2\2\u00fe\62\3\2\2\2\u00ff\u00fd\3\2\2\2\u0100\u0102\7/\2\2"+ + "\u0101\u0100\3\2\2\2\u0101\u0102\3\2\2\2\u0102\u0104\3\2\2\2\u0103\u0105"+ + "\t\5\2\2\u0104\u0103\3\2\2\2\u0105\u0106\3\2\2\2\u0106\u0104\3\2\2\2\u0106"+ + "\u0107\3\2\2\2\u0107\u010e\3\2\2\2\u0108\u010a\7\60\2\2\u0109\u010b\t"+ + "\5\2\2\u010a\u0109\3\2\2\2\u010b\u010c\3\2\2\2\u010c\u010a\3\2\2\2\u010c"+ + "\u010d\3\2\2\2\u010d\u010f\3\2\2\2\u010e\u0108\3\2\2\2\u010e\u010f\3\2"+ + "\2\2\u010f\64\3\2\2\2\u0110\u0113\7)\2\2\u0111\u0114\n\6\2\2\u0112\u0114"+ + "\5=\37\2\u0113\u0111\3\2\2\2\u0113\u0112\3\2\2\2\u0114\u0115\3\2\2\2\u0115"+ + "\u0113\3\2\2\2\u0115\u0116\3\2\2\2\u0116\u0117\3\2\2\2\u0117\u0118\7)"+ + "\2\2\u0118\66\3\2\2\2\u0119\u011c\7$\2\2\u011a\u011d\n\7\2\2\u011b\u011d"+ + "\5=\37\2\u011c\u011a\3\2\2\2\u011c\u011b\3\2\2\2\u011d\u011e\3\2\2\2\u011e"+ + "\u011c\3\2\2\2\u011e\u011f\3\2\2\2\u011f\u0120\3\2\2\2\u0120\u0121\7$"+ + "\2\2\u01218\3\2\2\2\u0122\u0123\7)\2\2\u0123\u0124\7)\2\2\u0124:\3\2\2"+ + "\2\u0125\u0126\7$\2\2\u0126\u0127\7$\2\2\u0127<\3\2\2\2\u0128\u0129\7"+ + "^\2\2\u0129\u012a\t\b\2\2\u012a>\3\2\2\2\u012b\u012d\t\t\2\2\u012c\u012b"+ + "\3\2\2\2\u012d\u012e\3\2\2\2\u012e\u012c\3\2\2\2\u012e\u012f\3\2\2\2\u012f"+ + "\u0130\3\2\2\2\u0130\u0131\b \2\2\u0131@\3\2\2\2\u0132\u0133\t\5\2\2\u0133"+ + "\u0134\t\5\2\2\u0134\u0135\t\5\2\2\u0135\u0136\t\5\2\2\u0136\u013b\7/"+ + "\2\2\u0137\u0138\7\62\2\2\u0138\u013c\t\4\2\2\u0139\u013a\7\63\2\2\u013a"+ + "\u013c\t\n\2\2\u013b\u0137\3\2\2\2\u013b\u0139\3\2\2\2\u013c\u013d\3\2"+ + "\2\2\u013d\u0146\7/\2\2\u013e\u013f\7\62\2\2\u013f\u0147\t\5\2\2\u0140"+ + "\u0141\7\63\2\2\u0141\u0147\t\5\2\2\u0142\u0143\7\64\2\2\u0143\u0147\t"+ + "\5\2\2\u0144\u0145\7\65\2\2\u0145\u0147\t\13\2\2\u0146\u013e\3\2\2\2\u0146"+ + "\u0140\3\2\2\2\u0146\u0142\3\2\2\2\u0146\u0144\3\2\2\2\u0147B\3\2\2\2"+ + "\u0148\u0149\5A!\2\u0149\u014a\7V\2\2\u014a\u014b\5E#\2\u014bD\3\2\2\2"+ + "\u014c\u014d\7\62\2\2\u014d\u0153\t\5\2\2\u014e\u014f\7\63\2\2\u014f\u0153"+ + "\t\5\2\2\u0150\u0151\7\64\2\2\u0151\u0153\t\f\2\2\u0152\u014c\3\2\2\2"+ + "\u0152\u014e\3\2\2\2\u0152\u0150\3\2\2\2\u0153\u0154\3\2\2\2\u0154\u0155"+ + "\7<\2\2\u0155\u0156\t\r\2\2\u0156\u0157\t\5\2\2\u0157\u0158\7<\2\2\u0158"+ + "\u0159\t\r\2\2\u0159\u0160\t\5\2\2\u015a\u015c\7\60\2\2\u015b\u015d\t"+ + "\5\2\2\u015c\u015b\3\2\2\2\u015d\u015e\3\2\2\2\u015e\u015c\3\2\2\2\u015e"+ + "\u015f\3\2\2\2\u015f\u0161\3\2\2\2\u0160\u015a\3\2\2\2\u0160\u0161\3\2"+ + "\2\2\u0161\u0162\3\2\2\2\u0162\u0163\7\\\2\2\u0163F\3\2\2\2 \2MS[iz\u009b"+ + "\u00ab\u00ba\u00c6\u00d8\u00e0\u00ea\u00f2\u00f8\u00fd\u0101\u0106\u010c"+ + "\u010e\u0113\u0115\u011c\u011e\u012e\u013b\u0146\u0152\u015e\u0160\3\b"+ "\2\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); diff --git a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterLexer.tokens b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterLexer.tokens index a855399..a1bc8bf 100644 --- a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterLexer.tokens +++ b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterLexer.tokens @@ -16,17 +16,20 @@ RPAREN=15 NULL=16 IN=17 LIMIT=18 -COMMA=19 -IDENTIFIER=20 -POS_INTEGER=21 -DECIMAL=22 -SINGLE_STRING=23 -DOUBLE_STRING=24 -EMPTY_SINGLE_STRING=25 -EMPTY_DOUBLE_STRING=26 -WS=27 -DATE=28 -DATETIME=29 +ORDERBY=19 +ASC=20 +DESC=21 +COMMA=22 +IDENTIFIER=23 +POS_INTEGER=24 +DECIMAL=25 +SINGLE_STRING=26 +DOUBLE_STRING=27 +EMPTY_SINGLE_STRING=28 +EMPTY_DOUBLE_STRING=29 +WS=30 +DATE=31 +DATETIME=32 '>'=6 '>='=7 '<'=8 @@ -36,4 +39,4 @@ DATETIME=29 '('=14 ')'=15 'null'=16 -','=19 +','=22 diff --git a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParser.interp b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParser.interp index 47ed56b..b4da66e 100644 --- a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParser.interp +++ b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParser.interp @@ -18,6 +18,9 @@ null 'null' null null +null +null +null ',' null null @@ -50,6 +53,9 @@ RPAREN NULL IN LIMIT +ORDERBY +ASC +DESC COMMA IDENTIFIER POS_INTEGER @@ -64,7 +70,8 @@ DATETIME rule names: queryfilter -limitexpression +limitexpr +orderbyexpr expression gtComparator geComparator @@ -80,10 +87,12 @@ bool identifier in limit +orderby +order string value count atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 31, 178, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, 2, 49, 10, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 58, 10, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 117, 10, 4, 12, 4, 14, 4, 120, 11, 4, 3, 4, 3, 4, 5, 4, 124, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 134, 10, 4, 12, 4, 14, 4, 137, 11, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 174, 10, 20, 3, 21, 3, 21, 3, 21, 2, 3, 6, 22, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 2, 4, 3, 2, 6, 7, 4, 2, 18, 18, 25, 28, 2, 180, 2, 48, 3, 2, 2, 2, 4, 57, 3, 2, 2, 2, 6, 123, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 140, 3, 2, 2, 2, 12, 142, 3, 2, 2, 2, 14, 144, 3, 2, 2, 2, 16, 146, 3, 2, 2, 2, 18, 148, 3, 2, 2, 2, 20, 150, 3, 2, 2, 2, 22, 152, 3, 2, 2, 2, 24, 154, 3, 2, 2, 2, 26, 156, 3, 2, 2, 2, 28, 158, 3, 2, 2, 2, 30, 160, 3, 2, 2, 2, 32, 162, 3, 2, 2, 2, 34, 164, 3, 2, 2, 2, 36, 166, 3, 2, 2, 2, 38, 173, 3, 2, 2, 2, 40, 175, 3, 2, 2, 2, 42, 43, 5, 6, 4, 2, 43, 44, 7, 2, 2, 3, 44, 49, 3, 2, 2, 2, 45, 46, 5, 4, 3, 2, 46, 47, 7, 2, 2, 3, 47, 49, 3, 2, 2, 2, 48, 42, 3, 2, 2, 2, 48, 45, 3, 2, 2, 2, 49, 3, 3, 2, 2, 2, 50, 51, 5, 34, 18, 2, 51, 52, 5, 40, 21, 2, 52, 58, 3, 2, 2, 2, 53, 54, 5, 6, 4, 2, 54, 55, 5, 34, 18, 2, 55, 56, 5, 40, 21, 2, 56, 58, 3, 2, 2, 2, 57, 50, 3, 2, 2, 2, 57, 53, 3, 2, 2, 2, 58, 5, 3, 2, 2, 2, 59, 60, 8, 4, 1, 2, 60, 61, 7, 16, 2, 2, 61, 62, 5, 6, 4, 2, 62, 63, 7, 17, 2, 2, 63, 124, 3, 2, 2, 2, 64, 65, 7, 5, 2, 2, 65, 124, 5, 6, 4, 18, 66, 67, 5, 30, 16, 2, 67, 68, 5, 8, 5, 2, 68, 69, 5, 38, 20, 2, 69, 124, 3, 2, 2, 2, 70, 71, 5, 30, 16, 2, 71, 72, 5, 10, 6, 2, 72, 73, 5, 38, 20, 2, 73, 124, 3, 2, 2, 2, 74, 75, 5, 30, 16, 2, 75, 76, 5, 12, 7, 2, 76, 77, 5, 38, 20, 2, 77, 124, 3, 2, 2, 2, 78, 79, 5, 30, 16, 2, 79, 80, 5, 14, 8, 2, 80, 81, 5, 38, 20, 2, 81, 124, 3, 2, 2, 2, 82, 83, 5, 30, 16, 2, 83, 84, 5, 16, 9, 2, 84, 85, 5, 38, 20, 2, 85, 124, 3, 2, 2, 2, 86, 87, 5, 30, 16, 2, 87, 88, 5, 16, 9, 2, 88, 89, 5, 28, 15, 2, 89, 124, 3, 2, 2, 2, 90, 91, 5, 30, 16, 2, 91, 92, 5, 18, 10, 2, 92, 93, 5, 38, 20, 2, 93, 124, 3, 2, 2, 2, 94, 95, 5, 30, 16, 2, 95, 96, 5, 18, 10, 2, 96, 97, 5, 28, 15, 2, 97, 124, 3, 2, 2, 2, 98, 99, 5, 30, 16, 2, 99, 100, 5, 20, 11, 2, 100, 101, 5, 38, 20, 2, 101, 124, 3, 2, 2, 2, 102, 103, 5, 30, 16, 2, 103, 104, 5, 22, 12, 2, 104, 105, 5, 38, 20, 2, 105, 106, 5, 24, 13, 2, 106, 107, 5, 38, 20, 2, 107, 124, 3, 2, 2, 2, 108, 124, 5, 30, 16, 2, 109, 124, 5, 38, 20, 2, 110, 111, 5, 30, 16, 2, 111, 112, 5, 32, 17, 2, 112, 113, 7, 16, 2, 2, 113, 118, 5, 38, 20, 2, 114, 115, 7, 21, 2, 2, 115, 117, 5, 38, 20, 2, 116, 114, 3, 2, 2, 2, 117, 120, 3, 2, 2, 2, 118, 116, 3, 2, 2, 2, 118, 119, 3, 2, 2, 2, 119, 121, 3, 2, 2, 2, 120, 118, 3, 2, 2, 2, 121, 122, 7, 17, 2, 2, 122, 124, 3, 2, 2, 2, 123, 59, 3, 2, 2, 2, 123, 64, 3, 2, 2, 2, 123, 66, 3, 2, 2, 2, 123, 70, 3, 2, 2, 2, 123, 74, 3, 2, 2, 2, 123, 78, 3, 2, 2, 2, 123, 82, 3, 2, 2, 2, 123, 86, 3, 2, 2, 2, 123, 90, 3, 2, 2, 2, 123, 94, 3, 2, 2, 2, 123, 98, 3, 2, 2, 2, 123, 102, 3, 2, 2, 2, 123, 108, 3, 2, 2, 2, 123, 109, 3, 2, 2, 2, 123, 110, 3, 2, 2, 2, 124, 135, 3, 2, 2, 2, 125, 126, 12, 17, 2, 2, 126, 127, 5, 24, 13, 2, 127, 128, 5, 6, 4, 18, 128, 134, 3, 2, 2, 2, 129, 130, 12, 16, 2, 2, 130, 131, 5, 26, 14, 2, 131, 132, 5, 6, 4, 17, 132, 134, 3, 2, 2, 2, 133, 125, 3, 2, 2, 2, 133, 129, 3, 2, 2, 2, 134, 137, 3, 2, 2, 2, 135, 133, 3, 2, 2, 2, 135, 136, 3, 2, 2, 2, 136, 7, 3, 2, 2, 2, 137, 135, 3, 2, 2, 2, 138, 139, 7, 8, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 7, 9, 2, 2, 141, 11, 3, 2, 2, 2, 142, 143, 7, 10, 2, 2, 143, 13, 3, 2, 2, 2, 144, 145, 7, 11, 2, 2, 145, 15, 3, 2, 2, 2, 146, 147, 7, 12, 2, 2, 147, 17, 3, 2, 2, 2, 148, 149, 7, 13, 2, 2, 149, 19, 3, 2, 2, 2, 150, 151, 7, 14, 2, 2, 151, 21, 3, 2, 2, 2, 152, 153, 7, 15, 2, 2, 153, 23, 3, 2, 2, 2, 154, 155, 7, 3, 2, 2, 155, 25, 3, 2, 2, 2, 156, 157, 7, 4, 2, 2, 157, 27, 3, 2, 2, 2, 158, 159, 9, 2, 2, 2, 159, 29, 3, 2, 2, 2, 160, 161, 7, 22, 2, 2, 161, 31, 3, 2, 2, 2, 162, 163, 7, 19, 2, 2, 163, 33, 3, 2, 2, 2, 164, 165, 7, 20, 2, 2, 165, 35, 3, 2, 2, 2, 166, 167, 9, 3, 2, 2, 167, 37, 3, 2, 2, 2, 168, 174, 5, 36, 19, 2, 169, 174, 7, 23, 2, 2, 170, 174, 7, 24, 2, 2, 171, 174, 7, 30, 2, 2, 172, 174, 7, 31, 2, 2, 173, 168, 3, 2, 2, 2, 173, 169, 3, 2, 2, 2, 173, 170, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 173, 172, 3, 2, 2, 2, 174, 39, 3, 2, 2, 2, 175, 176, 7, 23, 2, 2, 176, 41, 3, 2, 2, 2, 9, 48, 57, 118, 123, 133, 135, 173] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 34, 220, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, 2, 58, 10, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 71, 10, 3, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 77, 10, 4, 12, 4, 14, 4, 80, 11, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 89, 10, 4, 12, 4, 14, 4, 92, 11, 4, 3, 4, 3, 4, 5, 4, 96, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 7, 5, 155, 10, 5, 12, 5, 14, 5, 158, 11, 5, 3, 5, 3, 5, 5, 5, 162, 10, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 7, 5, 172, 10, 5, 12, 5, 14, 5, 175, 11, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 216, 10, 23, 3, 24, 3, 24, 3, 24, 2, 3, 8, 25, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 2, 5, 3, 2, 6, 7, 3, 2, 22, 23, 4, 2, 18, 18, 28, 31, 2, 224, 2, 57, 3, 2, 2, 2, 4, 70, 3, 2, 2, 2, 6, 95, 3, 2, 2, 2, 8, 161, 3, 2, 2, 2, 10, 176, 3, 2, 2, 2, 12, 178, 3, 2, 2, 2, 14, 180, 3, 2, 2, 2, 16, 182, 3, 2, 2, 2, 18, 184, 3, 2, 2, 2, 20, 186, 3, 2, 2, 2, 22, 188, 3, 2, 2, 2, 24, 190, 3, 2, 2, 2, 26, 192, 3, 2, 2, 2, 28, 194, 3, 2, 2, 2, 30, 196, 3, 2, 2, 2, 32, 198, 3, 2, 2, 2, 34, 200, 3, 2, 2, 2, 36, 202, 3, 2, 2, 2, 38, 204, 3, 2, 2, 2, 40, 206, 3, 2, 2, 2, 42, 208, 3, 2, 2, 2, 44, 215, 3, 2, 2, 2, 46, 217, 3, 2, 2, 2, 48, 49, 5, 8, 5, 2, 49, 50, 7, 2, 2, 3, 50, 58, 3, 2, 2, 2, 51, 52, 5, 6, 4, 2, 52, 53, 7, 2, 2, 3, 53, 58, 3, 2, 2, 2, 54, 55, 5, 4, 3, 2, 55, 56, 7, 2, 2, 3, 56, 58, 3, 2, 2, 2, 57, 48, 3, 2, 2, 2, 57, 51, 3, 2, 2, 2, 57, 54, 3, 2, 2, 2, 58, 3, 3, 2, 2, 2, 59, 60, 5, 36, 19, 2, 60, 61, 5, 46, 24, 2, 61, 71, 3, 2, 2, 2, 62, 63, 5, 8, 5, 2, 63, 64, 5, 36, 19, 2, 64, 65, 5, 46, 24, 2, 65, 71, 3, 2, 2, 2, 66, 67, 5, 6, 4, 2, 67, 68, 5, 36, 19, 2, 68, 69, 5, 46, 24, 2, 69, 71, 3, 2, 2, 2, 70, 59, 3, 2, 2, 2, 70, 62, 3, 2, 2, 2, 70, 66, 3, 2, 2, 2, 71, 5, 3, 2, 2, 2, 72, 73, 5, 38, 20, 2, 73, 78, 5, 32, 17, 2, 74, 75, 7, 24, 2, 2, 75, 77, 5, 32, 17, 2, 76, 74, 3, 2, 2, 2, 77, 80, 3, 2, 2, 2, 78, 76, 3, 2, 2, 2, 78, 79, 3, 2, 2, 2, 79, 81, 3, 2, 2, 2, 80, 78, 3, 2, 2, 2, 81, 82, 5, 40, 21, 2, 82, 96, 3, 2, 2, 2, 83, 84, 5, 8, 5, 2, 84, 85, 5, 38, 20, 2, 85, 90, 5, 32, 17, 2, 86, 87, 7, 24, 2, 2, 87, 89, 5, 32, 17, 2, 88, 86, 3, 2, 2, 2, 89, 92, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 93, 3, 2, 2, 2, 92, 90, 3, 2, 2, 2, 93, 94, 5, 40, 21, 2, 94, 96, 3, 2, 2, 2, 95, 72, 3, 2, 2, 2, 95, 83, 3, 2, 2, 2, 96, 7, 3, 2, 2, 2, 97, 98, 8, 5, 1, 2, 98, 99, 7, 16, 2, 2, 99, 100, 5, 8, 5, 2, 100, 101, 7, 17, 2, 2, 101, 162, 3, 2, 2, 2, 102, 103, 7, 5, 2, 2, 103, 162, 5, 8, 5, 18, 104, 105, 5, 32, 17, 2, 105, 106, 5, 10, 6, 2, 106, 107, 5, 44, 23, 2, 107, 162, 3, 2, 2, 2, 108, 109, 5, 32, 17, 2, 109, 110, 5, 12, 7, 2, 110, 111, 5, 44, 23, 2, 111, 162, 3, 2, 2, 2, 112, 113, 5, 32, 17, 2, 113, 114, 5, 14, 8, 2, 114, 115, 5, 44, 23, 2, 115, 162, 3, 2, 2, 2, 116, 117, 5, 32, 17, 2, 117, 118, 5, 16, 9, 2, 118, 119, 5, 44, 23, 2, 119, 162, 3, 2, 2, 2, 120, 121, 5, 32, 17, 2, 121, 122, 5, 18, 10, 2, 122, 123, 5, 44, 23, 2, 123, 162, 3, 2, 2, 2, 124, 125, 5, 32, 17, 2, 125, 126, 5, 18, 10, 2, 126, 127, 5, 30, 16, 2, 127, 162, 3, 2, 2, 2, 128, 129, 5, 32, 17, 2, 129, 130, 5, 20, 11, 2, 130, 131, 5, 44, 23, 2, 131, 162, 3, 2, 2, 2, 132, 133, 5, 32, 17, 2, 133, 134, 5, 20, 11, 2, 134, 135, 5, 30, 16, 2, 135, 162, 3, 2, 2, 2, 136, 137, 5, 32, 17, 2, 137, 138, 5, 22, 12, 2, 138, 139, 5, 44, 23, 2, 139, 162, 3, 2, 2, 2, 140, 141, 5, 32, 17, 2, 141, 142, 5, 24, 13, 2, 142, 143, 5, 44, 23, 2, 143, 144, 5, 26, 14, 2, 144, 145, 5, 44, 23, 2, 145, 162, 3, 2, 2, 2, 146, 162, 5, 32, 17, 2, 147, 162, 5, 44, 23, 2, 148, 149, 5, 32, 17, 2, 149, 150, 5, 34, 18, 2, 150, 151, 7, 16, 2, 2, 151, 156, 5, 44, 23, 2, 152, 153, 7, 24, 2, 2, 153, 155, 5, 44, 23, 2, 154, 152, 3, 2, 2, 2, 155, 158, 3, 2, 2, 2, 156, 154, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 159, 3, 2, 2, 2, 158, 156, 3, 2, 2, 2, 159, 160, 7, 17, 2, 2, 160, 162, 3, 2, 2, 2, 161, 97, 3, 2, 2, 2, 161, 102, 3, 2, 2, 2, 161, 104, 3, 2, 2, 2, 161, 108, 3, 2, 2, 2, 161, 112, 3, 2, 2, 2, 161, 116, 3, 2, 2, 2, 161, 120, 3, 2, 2, 2, 161, 124, 3, 2, 2, 2, 161, 128, 3, 2, 2, 2, 161, 132, 3, 2, 2, 2, 161, 136, 3, 2, 2, 2, 161, 140, 3, 2, 2, 2, 161, 146, 3, 2, 2, 2, 161, 147, 3, 2, 2, 2, 161, 148, 3, 2, 2, 2, 162, 173, 3, 2, 2, 2, 163, 164, 12, 17, 2, 2, 164, 165, 5, 26, 14, 2, 165, 166, 5, 8, 5, 18, 166, 172, 3, 2, 2, 2, 167, 168, 12, 16, 2, 2, 168, 169, 5, 28, 15, 2, 169, 170, 5, 8, 5, 17, 170, 172, 3, 2, 2, 2, 171, 163, 3, 2, 2, 2, 171, 167, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 9, 3, 2, 2, 2, 175, 173, 3, 2, 2, 2, 176, 177, 7, 8, 2, 2, 177, 11, 3, 2, 2, 2, 178, 179, 7, 9, 2, 2, 179, 13, 3, 2, 2, 2, 180, 181, 7, 10, 2, 2, 181, 15, 3, 2, 2, 2, 182, 183, 7, 11, 2, 2, 183, 17, 3, 2, 2, 2, 184, 185, 7, 12, 2, 2, 185, 19, 3, 2, 2, 2, 186, 187, 7, 13, 2, 2, 187, 21, 3, 2, 2, 2, 188, 189, 7, 14, 2, 2, 189, 23, 3, 2, 2, 2, 190, 191, 7, 15, 2, 2, 191, 25, 3, 2, 2, 2, 192, 193, 7, 3, 2, 2, 193, 27, 3, 2, 2, 2, 194, 195, 7, 4, 2, 2, 195, 29, 3, 2, 2, 2, 196, 197, 9, 2, 2, 2, 197, 31, 3, 2, 2, 2, 198, 199, 7, 25, 2, 2, 199, 33, 3, 2, 2, 2, 200, 201, 7, 19, 2, 2, 201, 35, 3, 2, 2, 2, 202, 203, 7, 20, 2, 2, 203, 37, 3, 2, 2, 2, 204, 205, 7, 21, 2, 2, 205, 39, 3, 2, 2, 2, 206, 207, 9, 3, 2, 2, 207, 41, 3, 2, 2, 2, 208, 209, 9, 4, 2, 2, 209, 43, 3, 2, 2, 2, 210, 216, 5, 42, 22, 2, 211, 216, 7, 26, 2, 2, 212, 216, 7, 27, 2, 2, 213, 216, 7, 33, 2, 2, 214, 216, 7, 34, 2, 2, 215, 210, 3, 2, 2, 2, 215, 211, 3, 2, 2, 2, 215, 212, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 215, 214, 3, 2, 2, 2, 216, 45, 3, 2, 2, 2, 217, 218, 7, 26, 2, 2, 218, 47, 3, 2, 2, 2, 12, 57, 70, 78, 90, 95, 156, 161, 171, 173, 215] \ No newline at end of file diff --git a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParser.java b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParser.java index 6e3b626..82c56e9 100644 --- a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParser.java +++ b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParser.java @@ -17,7 +17,7 @@ * limitations under the License. * #L% */ -// Generated from CustomConnectorQueryFilterParser.g4 by ANTLR 4.9.3 +// Generated from src/main/configuration/grammar/CustomConnectorQueryFilterParser.g4 by ANTLR 4.9.3 package com.amazonaws.appflow.custom.connector.queryfilter.antlr; @@ -39,21 +39,23 @@ public class CustomConnectorQueryFilterParser extends Parser { new PredictionContextCache(); public static final int AND=1, OR=2, NOT=3, TRUE=4, FALSE=5, GT=6, GE=7, LT=8, LE=9, EQ=10, NE=11, - LIKE=12, BETWEEN=13, LPAREN=14, RPAREN=15, NULL=16, IN=17, LIMIT=18, COMMA=19, - IDENTIFIER=20, POS_INTEGER=21, DECIMAL=22, SINGLE_STRING=23, DOUBLE_STRING=24, - EMPTY_SINGLE_STRING=25, EMPTY_DOUBLE_STRING=26, WS=27, DATE=28, DATETIME=29; + LIKE=12, BETWEEN=13, LPAREN=14, RPAREN=15, NULL=16, IN=17, LIMIT=18, ORDERBY=19, + ASC=20, DESC=21, COMMA=22, IDENTIFIER=23, POS_INTEGER=24, DECIMAL=25, + SINGLE_STRING=26, DOUBLE_STRING=27, EMPTY_SINGLE_STRING=28, EMPTY_DOUBLE_STRING=29, + WS=30, DATE=31, DATETIME=32; public static final int - RULE_queryfilter = 0, RULE_limitexpression = 1, RULE_expression = 2, RULE_gtComparator = 3, - RULE_geComparator = 4, RULE_ltComparator = 5, RULE_leComparator = 6, RULE_eqComparator = 7, - RULE_neComparator = 8, RULE_likeComparator = 9, RULE_betweenComparator = 10, - RULE_andBinary = 11, RULE_orBinary = 12, RULE_bool = 13, RULE_identifier = 14, - RULE_in = 15, RULE_limit = 16, RULE_string = 17, RULE_value = 18, RULE_count = 19; + RULE_queryfilter = 0, RULE_limitexpr = 1, RULE_orderbyexpr = 2, RULE_expression = 3, + RULE_gtComparator = 4, RULE_geComparator = 5, RULE_ltComparator = 6, RULE_leComparator = 7, + RULE_eqComparator = 8, RULE_neComparator = 9, RULE_likeComparator = 10, + RULE_betweenComparator = 11, RULE_andBinary = 12, RULE_orBinary = 13, + RULE_bool = 14, RULE_identifier = 15, RULE_in = 16, RULE_limit = 17, RULE_orderby = 18, + RULE_order = 19, RULE_string = 20, RULE_value = 21, RULE_count = 22; private static String[] makeRuleNames() { return new String[] { - "queryfilter", "limitexpression", "expression", "gtComparator", "geComparator", - "ltComparator", "leComparator", "eqComparator", "neComparator", "likeComparator", - "betweenComparator", "andBinary", "orBinary", "bool", "identifier", "in", - "limit", "string", "value", "count" + "queryfilter", "limitexpr", "orderbyexpr", "expression", "gtComparator", + "geComparator", "ltComparator", "leComparator", "eqComparator", "neComparator", + "likeComparator", "betweenComparator", "andBinary", "orBinary", "bool", + "identifier", "in", "limit", "orderby", "order", "string", "value", "count" }; } public static final String[] ruleNames = makeRuleNames(); @@ -61,16 +63,18 @@ private static String[] makeRuleNames() { private static String[] makeLiteralNames() { return new String[] { null, null, null, null, null, null, "'>'", "'>='", "'<'", "'<='", "'='", - "'!='", null, null, "'('", "')'", "'null'", null, null, "','" + "'!='", null, null, "'('", "')'", "'null'", null, null, null, null, null, + "','" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { null, "AND", "OR", "NOT", "TRUE", "FALSE", "GT", "GE", "LT", "LE", "EQ", - "NE", "LIKE", "BETWEEN", "LPAREN", "RPAREN", "NULL", "IN", "LIMIT", "COMMA", - "IDENTIFIER", "POS_INTEGER", "DECIMAL", "SINGLE_STRING", "DOUBLE_STRING", - "EMPTY_SINGLE_STRING", "EMPTY_DOUBLE_STRING", "WS", "DATE", "DATETIME" + "NE", "LIKE", "BETWEEN", "LPAREN", "RPAREN", "NULL", "IN", "LIMIT", "ORDERBY", + "ASC", "DESC", "COMMA", "IDENTIFIER", "POS_INTEGER", "DECIMAL", "SINGLE_STRING", + "DOUBLE_STRING", "EMPTY_SINGLE_STRING", "EMPTY_DOUBLE_STRING", "WS", + "DATE", "DATETIME" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -129,8 +133,11 @@ public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); } public TerminalNode EOF() { return getToken(CustomConnectorQueryFilterParser.EOF, 0); } - public LimitexpressionContext limitexpression() { - return getRuleContext(LimitexpressionContext.class,0); + public OrderbyexprContext orderbyexpr() { + return getRuleContext(OrderbyexprContext.class,0); + } + public LimitexprContext limitexpr() { + return getRuleContext(LimitexprContext.class,0); } public QueryfilterContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -155,24 +162,33 @@ public final QueryfilterContext queryfilter() throws RecognitionException { QueryfilterContext _localctx = new QueryfilterContext(_ctx, getState()); enterRule(_localctx, 0, RULE_queryfilter); try { - setState(46); + setState(55); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,0,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(40); + setState(46); expression(0); - setState(41); + setState(47); match(EOF); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(43); - limitexpression(); - setState(44); + setState(49); + orderbyexpr(); + setState(50); + match(EOF); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(52); + limitexpr(); + setState(53); match(EOF); } break; @@ -189,18 +205,18 @@ public final QueryfilterContext queryfilter() throws RecognitionException { return _localctx; } - public static class LimitexpressionContext extends ParserRuleContext { - public LimitexpressionContext(ParserRuleContext parent, int invokingState) { + public static class LimitexprContext extends ParserRuleContext { + public LimitexprContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_limitexpression; } + @Override public int getRuleIndex() { return RULE_limitexpr; } - public LimitexpressionContext() { } - public void copyFrom(LimitexpressionContext ctx) { + public LimitexprContext() { } + public void copyFrom(LimitexprContext ctx) { super.copyFrom(ctx); } } - public static class LimitExpressionContext extends LimitexpressionContext { + public static class LimitExpressionContext extends LimitexprContext { public LimitContext op; public CountContext right; public ExpressionContext left; @@ -213,7 +229,10 @@ public CountContext count() { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); } - public LimitExpressionContext(LimitexpressionContext ctx) { copyFrom(ctx); } + public OrderbyexprContext orderbyexpr() { + return getRuleContext(OrderbyexprContext.class,0); + } + public LimitExpressionContext(LimitexprContext ctx) { copyFrom(ctx); } @Override public void enterRule(ParseTreeListener listener) { if ( listener instanceof CustomConnectorQueryFilterParserListener ) ((CustomConnectorQueryFilterParserListener)listener).enterLimitExpression(this); @@ -229,23 +248,146 @@ public T accept(ParseTreeVisitor visitor) { } } - public final LimitexpressionContext limitexpression() throws RecognitionException { - LimitexpressionContext _localctx = new LimitexpressionContext(_ctx, getState()); - enterRule(_localctx, 2, RULE_limitexpression); + public final LimitexprContext limitexpr() throws RecognitionException { + LimitexprContext _localctx = new LimitexprContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_limitexpr); try { - setState(55); + setState(68); _errHandler.sync(this); - switch (_input.LA(1)) { - case LIMIT: + switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { + case 1: _localctx = new LimitExpressionContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(48); + setState(57); ((LimitExpressionContext)_localctx).op = limit(); - setState(49); + setState(58); + ((LimitExpressionContext)_localctx).right = count(); + } + break; + case 2: + _localctx = new LimitExpressionContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(60); + ((LimitExpressionContext)_localctx).left = expression(0); + setState(61); + ((LimitExpressionContext)_localctx).op = limit(); + setState(62); + ((LimitExpressionContext)_localctx).right = count(); + } + break; + case 3: + _localctx = new LimitExpressionContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(64); + orderbyexpr(); + setState(65); + ((LimitExpressionContext)_localctx).op = limit(); + setState(66); ((LimitExpressionContext)_localctx).right = count(); } break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class OrderbyexprContext extends ParserRuleContext { + public OrderbyexprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_orderbyexpr; } + + public OrderbyexprContext() { } + public void copyFrom(OrderbyexprContext ctx) { + super.copyFrom(ctx); + } + } + public static class OrderByExpressionContext extends OrderbyexprContext { + public OrderbyContext op; + public OrderContext right; + public ExpressionContext left; + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public OrderbyContext orderby() { + return getRuleContext(OrderbyContext.class,0); + } + public OrderContext order() { + return getRuleContext(OrderContext.class,0); + } + public List COMMA() { return getTokens(CustomConnectorQueryFilterParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CustomConnectorQueryFilterParser.COMMA, i); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public OrderByExpressionContext(OrderbyexprContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CustomConnectorQueryFilterParserListener ) ((CustomConnectorQueryFilterParserListener)listener).enterOrderByExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CustomConnectorQueryFilterParserListener ) ((CustomConnectorQueryFilterParserListener)listener).exitOrderByExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof CustomConnectorQueryFilterParserVisitor ) return ((CustomConnectorQueryFilterParserVisitor)visitor).visitOrderByExpression(this); + else return visitor.visitChildren(this); + } + } + + public final OrderbyexprContext orderbyexpr() throws RecognitionException { + OrderbyexprContext _localctx = new OrderbyexprContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_orderbyexpr); + int _la; + try { + setState(93); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ORDERBY: + _localctx = new OrderByExpressionContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(70); + ((OrderByExpressionContext)_localctx).op = orderby(); + setState(71); + identifier(); + setState(76); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(72); + match(COMMA); + setState(73); + identifier(); + } + } + setState(78); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(79); + ((OrderByExpressionContext)_localctx).right = order(); + } + break; case NOT: case LPAREN: case NULL: @@ -258,15 +400,33 @@ public final LimitexpressionContext limitexpression() throws RecognitionExceptio case EMPTY_DOUBLE_STRING: case DATE: case DATETIME: - _localctx = new LimitExpressionContext(_localctx); + _localctx = new OrderByExpressionContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(51); - ((LimitExpressionContext)_localctx).left = expression(0); - setState(52); - ((LimitExpressionContext)_localctx).op = limit(); - setState(53); - ((LimitExpressionContext)_localctx).right = count(); + setState(81); + ((OrderByExpressionContext)_localctx).left = expression(0); + setState(82); + ((OrderByExpressionContext)_localctx).op = orderby(); + setState(83); + identifier(); + setState(88); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(84); + match(COMMA); + setState(85); + identifier(); + } + } + setState(90); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(91); + ((OrderByExpressionContext)_localctx).right = order(); } break; default: @@ -763,27 +923,27 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _parentState = getState(); ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); ExpressionContext _prevctx = _localctx; - int _startState = 4; - enterRecursionRule(_localctx, 4, RULE_expression, _p); + int _startState = 6; + enterRecursionRule(_localctx, 6, RULE_expression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(121); + setState(159); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { case 1: { _localctx = new ParenExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(58); + setState(96); match(LPAREN); - setState(59); + setState(97); expression(0); - setState(60); + setState(98); match(RPAREN); } break; @@ -792,9 +952,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new NotExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(62); + setState(100); match(NOT); - setState(63); + setState(101); expression(16); } break; @@ -803,11 +963,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new GreaterThanComparatorExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(64); + setState(102); ((GreaterThanComparatorExpressionContext)_localctx).left = identifier(); - setState(65); + setState(103); ((GreaterThanComparatorExpressionContext)_localctx).op = gtComparator(); - setState(66); + setState(104); ((GreaterThanComparatorExpressionContext)_localctx).right = value(); } break; @@ -816,11 +976,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new GreaterThanEqualToComparatorExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(68); + setState(106); ((GreaterThanEqualToComparatorExpressionContext)_localctx).left = identifier(); - setState(69); + setState(107); ((GreaterThanEqualToComparatorExpressionContext)_localctx).op = geComparator(); - setState(70); + setState(108); ((GreaterThanEqualToComparatorExpressionContext)_localctx).right = value(); } break; @@ -829,11 +989,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LesserThanComparatorExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(72); + setState(110); ((LesserThanComparatorExpressionContext)_localctx).left = identifier(); - setState(73); + setState(111); ((LesserThanComparatorExpressionContext)_localctx).op = ltComparator(); - setState(74); + setState(112); ((LesserThanComparatorExpressionContext)_localctx).right = value(); } break; @@ -842,11 +1002,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LesserThanEqualToComparatorExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(76); + setState(114); ((LesserThanEqualToComparatorExpressionContext)_localctx).left = identifier(); - setState(77); + setState(115); ((LesserThanEqualToComparatorExpressionContext)_localctx).op = leComparator(); - setState(78); + setState(116); ((LesserThanEqualToComparatorExpressionContext)_localctx).right = value(); } break; @@ -855,11 +1015,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new EqualToComparatorExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(80); + setState(118); ((EqualToComparatorExpressionContext)_localctx).left = identifier(); - setState(81); + setState(119); ((EqualToComparatorExpressionContext)_localctx).op = eqComparator(); - setState(82); + setState(120); ((EqualToComparatorExpressionContext)_localctx).right = value(); } break; @@ -868,11 +1028,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new BoolEqualToComparatorExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(84); + setState(122); ((BoolEqualToComparatorExpressionContext)_localctx).left = identifier(); - setState(85); + setState(123); ((BoolEqualToComparatorExpressionContext)_localctx).op = eqComparator(); - setState(86); + setState(124); ((BoolEqualToComparatorExpressionContext)_localctx).right = bool(); } break; @@ -881,11 +1041,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new NotEqualToComparatorExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(88); + setState(126); ((NotEqualToComparatorExpressionContext)_localctx).left = identifier(); - setState(89); + setState(127); ((NotEqualToComparatorExpressionContext)_localctx).op = neComparator(); - setState(90); + setState(128); ((NotEqualToComparatorExpressionContext)_localctx).right = value(); } break; @@ -894,11 +1054,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new BoolNotEqualToComparatorExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(92); + setState(130); ((BoolNotEqualToComparatorExpressionContext)_localctx).left = identifier(); - setState(93); + setState(131); ((BoolNotEqualToComparatorExpressionContext)_localctx).op = neComparator(); - setState(94); + setState(132); ((BoolNotEqualToComparatorExpressionContext)_localctx).right = bool(); } break; @@ -907,11 +1067,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LikeComparatorExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(96); + setState(134); ((LikeComparatorExpressionContext)_localctx).left = identifier(); - setState(97); + setState(135); ((LikeComparatorExpressionContext)_localctx).op = likeComparator(); - setState(98); + setState(136); ((LikeComparatorExpressionContext)_localctx).right = value(); } break; @@ -921,16 +1081,16 @@ private ExpressionContext expression(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; { - setState(100); + setState(138); ((BetweenExpressionContext)_localctx).left = identifier(); - setState(101); + setState(139); ((BetweenExpressionContext)_localctx).op = betweenComparator(); { - setState(102); + setState(140); ((BetweenExpressionContext)_localctx).l1 = value(); - setState(103); + setState(141); ((BetweenExpressionContext)_localctx).op1 = andBinary(); - setState(104); + setState(142); ((BetweenExpressionContext)_localctx).right = value(); } } @@ -941,7 +1101,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new IdentifierExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(106); + setState(144); identifier(); } break; @@ -950,7 +1110,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new ValueExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(107); + setState(145); value(); } break; @@ -959,57 +1119,57 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new InExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(108); + setState(146); identifier(); - setState(109); + setState(147); ((InExpressionContext)_localctx).op = in(); - setState(110); + setState(148); match(LPAREN); - setState(111); + setState(149); value(); - setState(116); + setState(154); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(112); + setState(150); match(COMMA); - setState(113); + setState(151); value(); } } - setState(118); + setState(156); _errHandler.sync(this); _la = _input.LA(1); } - setState(119); + setState(157); match(RPAREN); } break; } _ctx.stop = _input.LT(-1); - setState(133); + setState(171); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,5,_ctx); + _alt = getInterpreter().adaptivePredict(_input,8,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(131); + setState(169); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: { _localctx = new ANDBinaryExpressionContext(new ExpressionContext(_parentctx, _parentState)); ((ANDBinaryExpressionContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(123); + setState(161); if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); - setState(124); + setState(162); ((ANDBinaryExpressionContext)_localctx).op = andBinary(); - setState(125); + setState(163); ((ANDBinaryExpressionContext)_localctx).right = expression(16); } break; @@ -1018,20 +1178,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new ORBinaryExpressionContext(new ExpressionContext(_parentctx, _parentState)); ((ORBinaryExpressionContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(127); + setState(165); if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); - setState(128); + setState(166); ((ORBinaryExpressionContext)_localctx).op = orBinary(); - setState(129); + setState(167); ((ORBinaryExpressionContext)_localctx).right = expression(15); } break; } } } - setState(135); + setState(173); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,5,_ctx); + _alt = getInterpreter().adaptivePredict(_input,8,_ctx); } } } @@ -1069,11 +1229,11 @@ public T accept(ParseTreeVisitor visitor) { public final GtComparatorContext gtComparator() throws RecognitionException { GtComparatorContext _localctx = new GtComparatorContext(_ctx, getState()); - enterRule(_localctx, 6, RULE_gtComparator); + enterRule(_localctx, 8, RULE_gtComparator); try { enterOuterAlt(_localctx, 1); { - setState(136); + setState(174); match(GT); } } @@ -1111,11 +1271,11 @@ public T accept(ParseTreeVisitor visitor) { public final GeComparatorContext geComparator() throws RecognitionException { GeComparatorContext _localctx = new GeComparatorContext(_ctx, getState()); - enterRule(_localctx, 8, RULE_geComparator); + enterRule(_localctx, 10, RULE_geComparator); try { enterOuterAlt(_localctx, 1); { - setState(138); + setState(176); match(GE); } } @@ -1153,11 +1313,11 @@ public T accept(ParseTreeVisitor visitor) { public final LtComparatorContext ltComparator() throws RecognitionException { LtComparatorContext _localctx = new LtComparatorContext(_ctx, getState()); - enterRule(_localctx, 10, RULE_ltComparator); + enterRule(_localctx, 12, RULE_ltComparator); try { enterOuterAlt(_localctx, 1); { - setState(140); + setState(178); match(LT); } } @@ -1195,11 +1355,11 @@ public T accept(ParseTreeVisitor visitor) { public final LeComparatorContext leComparator() throws RecognitionException { LeComparatorContext _localctx = new LeComparatorContext(_ctx, getState()); - enterRule(_localctx, 12, RULE_leComparator); + enterRule(_localctx, 14, RULE_leComparator); try { enterOuterAlt(_localctx, 1); { - setState(142); + setState(180); match(LE); } } @@ -1237,11 +1397,11 @@ public T accept(ParseTreeVisitor visitor) { public final EqComparatorContext eqComparator() throws RecognitionException { EqComparatorContext _localctx = new EqComparatorContext(_ctx, getState()); - enterRule(_localctx, 14, RULE_eqComparator); + enterRule(_localctx, 16, RULE_eqComparator); try { enterOuterAlt(_localctx, 1); { - setState(144); + setState(182); match(EQ); } } @@ -1279,11 +1439,11 @@ public T accept(ParseTreeVisitor visitor) { public final NeComparatorContext neComparator() throws RecognitionException { NeComparatorContext _localctx = new NeComparatorContext(_ctx, getState()); - enterRule(_localctx, 16, RULE_neComparator); + enterRule(_localctx, 18, RULE_neComparator); try { enterOuterAlt(_localctx, 1); { - setState(146); + setState(184); match(NE); } } @@ -1321,11 +1481,11 @@ public T accept(ParseTreeVisitor visitor) { public final LikeComparatorContext likeComparator() throws RecognitionException { LikeComparatorContext _localctx = new LikeComparatorContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_likeComparator); + enterRule(_localctx, 20, RULE_likeComparator); try { enterOuterAlt(_localctx, 1); { - setState(148); + setState(186); match(LIKE); } } @@ -1363,11 +1523,11 @@ public T accept(ParseTreeVisitor visitor) { public final BetweenComparatorContext betweenComparator() throws RecognitionException { BetweenComparatorContext _localctx = new BetweenComparatorContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_betweenComparator); + enterRule(_localctx, 22, RULE_betweenComparator); try { enterOuterAlt(_localctx, 1); { - setState(150); + setState(188); match(BETWEEN); } } @@ -1405,11 +1565,11 @@ public T accept(ParseTreeVisitor visitor) { public final AndBinaryContext andBinary() throws RecognitionException { AndBinaryContext _localctx = new AndBinaryContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_andBinary); + enterRule(_localctx, 24, RULE_andBinary); try { enterOuterAlt(_localctx, 1); { - setState(152); + setState(190); match(AND); } } @@ -1447,11 +1607,11 @@ public T accept(ParseTreeVisitor visitor) { public final OrBinaryContext orBinary() throws RecognitionException { OrBinaryContext _localctx = new OrBinaryContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_orBinary); + enterRule(_localctx, 26, RULE_orBinary); try { enterOuterAlt(_localctx, 1); { - setState(154); + setState(192); match(OR); } } @@ -1490,12 +1650,12 @@ public T accept(ParseTreeVisitor visitor) { public final BoolContext bool() throws RecognitionException { BoolContext _localctx = new BoolContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_bool); + enterRule(_localctx, 28, RULE_bool); int _la; try { enterOuterAlt(_localctx, 1); { - setState(156); + setState(194); _la = _input.LA(1); if ( !(_la==TRUE || _la==FALSE) ) { _errHandler.recoverInline(this); @@ -1541,11 +1701,11 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierContext identifier() throws RecognitionException { IdentifierContext _localctx = new IdentifierContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_identifier); + enterRule(_localctx, 30, RULE_identifier); try { enterOuterAlt(_localctx, 1); { - setState(158); + setState(196); match(IDENTIFIER); } } @@ -1583,11 +1743,11 @@ public T accept(ParseTreeVisitor visitor) { public final InContext in() throws RecognitionException { InContext _localctx = new InContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_in); + enterRule(_localctx, 32, RULE_in); try { enterOuterAlt(_localctx, 1); { - setState(160); + setState(198); match(IN); } } @@ -1625,11 +1785,11 @@ public T accept(ParseTreeVisitor visitor) { public final LimitContext limit() throws RecognitionException { LimitContext _localctx = new LimitContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_limit); + enterRule(_localctx, 34, RULE_limit); try { enterOuterAlt(_localctx, 1); { - setState(162); + setState(200); match(LIMIT); } } @@ -1644,6 +1804,100 @@ public final LimitContext limit() throws RecognitionException { return _localctx; } + public static class OrderbyContext extends ParserRuleContext { + public TerminalNode ORDERBY() { return getToken(CustomConnectorQueryFilterParser.ORDERBY, 0); } + public OrderbyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_orderby; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CustomConnectorQueryFilterParserListener ) ((CustomConnectorQueryFilterParserListener)listener).enterOrderby(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CustomConnectorQueryFilterParserListener ) ((CustomConnectorQueryFilterParserListener)listener).exitOrderby(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof CustomConnectorQueryFilterParserVisitor ) return ((CustomConnectorQueryFilterParserVisitor)visitor).visitOrderby(this); + else return visitor.visitChildren(this); + } + } + + public final OrderbyContext orderby() throws RecognitionException { + OrderbyContext _localctx = new OrderbyContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_orderby); + try { + enterOuterAlt(_localctx, 1); + { + setState(202); + match(ORDERBY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class OrderContext extends ParserRuleContext { + public TerminalNode ASC() { return getToken(CustomConnectorQueryFilterParser.ASC, 0); } + public TerminalNode DESC() { return getToken(CustomConnectorQueryFilterParser.DESC, 0); } + public OrderContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_order; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CustomConnectorQueryFilterParserListener ) ((CustomConnectorQueryFilterParserListener)listener).enterOrder(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CustomConnectorQueryFilterParserListener ) ((CustomConnectorQueryFilterParserListener)listener).exitOrder(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof CustomConnectorQueryFilterParserVisitor ) return ((CustomConnectorQueryFilterParserVisitor)visitor).visitOrder(this); + else return visitor.visitChildren(this); + } + } + + public final OrderContext order() throws RecognitionException { + OrderContext _localctx = new OrderContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_order); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(204); + _la = _input.LA(1); + if ( !(_la==ASC || _la==DESC) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class StringContext extends ParserRuleContext { public TerminalNode SINGLE_STRING() { return getToken(CustomConnectorQueryFilterParser.SINGLE_STRING, 0); } public TerminalNode DOUBLE_STRING() { return getToken(CustomConnectorQueryFilterParser.DOUBLE_STRING, 0); } @@ -1671,12 +1925,12 @@ public T accept(ParseTreeVisitor visitor) { public final StringContext string() throws RecognitionException { StringContext _localctx = new StringContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_string); + enterRule(_localctx, 40, RULE_string); int _la; try { enterOuterAlt(_localctx, 1); { - setState(164); + setState(206); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << NULL) | (1L << SINGLE_STRING) | (1L << DOUBLE_STRING) | (1L << EMPTY_SINGLE_STRING) | (1L << EMPTY_DOUBLE_STRING))) != 0)) ) { _errHandler.recoverInline(this); @@ -1784,9 +2038,9 @@ public T accept(ParseTreeVisitor visitor) { public final ValueContext value() throws RecognitionException { ValueContext _localctx = new ValueContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_value); + enterRule(_localctx, 42, RULE_value); try { - setState(171); + setState(213); _errHandler.sync(this); switch (_input.LA(1)) { case NULL: @@ -1797,7 +2051,7 @@ public final ValueContext value() throws RecognitionException { _localctx = new StringValueExpressionContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(166); + setState(208); string(); } break; @@ -1805,7 +2059,7 @@ public final ValueContext value() throws RecognitionException { _localctx = new DecimalValueExpressionContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(167); + setState(209); match(POS_INTEGER); } break; @@ -1813,7 +2067,7 @@ public final ValueContext value() throws RecognitionException { _localctx = new DecimalValueExpressionContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(168); + setState(210); match(DECIMAL); } break; @@ -1821,7 +2075,7 @@ public final ValueContext value() throws RecognitionException { _localctx = new IsoDateContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(169); + setState(211); match(DATE); } break; @@ -1829,7 +2083,7 @@ public final ValueContext value() throws RecognitionException { _localctx = new IsoDateTimeContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(170); + setState(212); match(DATETIME); } break; @@ -1879,12 +2133,12 @@ public T accept(ParseTreeVisitor visitor) { public final CountContext count() throws RecognitionException { CountContext _localctx = new CountContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_count); + enterRule(_localctx, 44, RULE_count); try { _localctx = new CountValueExpressionContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(173); + setState(215); match(POS_INTEGER); } } @@ -1901,7 +2155,7 @@ public final CountContext count() throws RecognitionException { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 2: + case 3: return expression_sempred((ExpressionContext)_localctx, predIndex); } return true; @@ -1917,56 +2171,73 @@ private boolean expression_sempred(ExpressionContext _localctx, int predIndex) { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\37\u00b2\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\3\2\3\2\3\2\3\2\3\2\3\2\5\2\61\n\2\3\3"+ - "\3\3\3\3\3\3\3\3\3\3\3\3\5\3:\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4"+ - "\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3"+ - "\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4"+ - "\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7\4u\n\4\f\4\16\4"+ - "x\13\4\3\4\3\4\5\4|\n\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7\4\u0086\n\4"+ - "\f\4\16\4\u0089\13\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3"+ - "\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\21\3\21\3\22"+ - "\3\22\3\23\3\23\3\24\3\24\3\24\3\24\3\24\5\24\u00ae\n\24\3\25\3\25\3\25"+ - "\2\3\6\26\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(\2\4\3\2\6\7\4\2"+ - "\22\22\31\34\2\u00b4\2\60\3\2\2\2\49\3\2\2\2\6{\3\2\2\2\b\u008a\3\2\2"+ - "\2\n\u008c\3\2\2\2\f\u008e\3\2\2\2\16\u0090\3\2\2\2\20\u0092\3\2\2\2\22"+ - "\u0094\3\2\2\2\24\u0096\3\2\2\2\26\u0098\3\2\2\2\30\u009a\3\2\2\2\32\u009c"+ - "\3\2\2\2\34\u009e\3\2\2\2\36\u00a0\3\2\2\2 \u00a2\3\2\2\2\"\u00a4\3\2"+ - "\2\2$\u00a6\3\2\2\2&\u00ad\3\2\2\2(\u00af\3\2\2\2*+\5\6\4\2+,\7\2\2\3"+ - ",\61\3\2\2\2-.\5\4\3\2./\7\2\2\3/\61\3\2\2\2\60*\3\2\2\2\60-\3\2\2\2\61"+ - "\3\3\2\2\2\62\63\5\"\22\2\63\64\5(\25\2\64:\3\2\2\2\65\66\5\6\4\2\66\67"+ - "\5\"\22\2\678\5(\25\28:\3\2\2\29\62\3\2\2\29\65\3\2\2\2:\5\3\2\2\2;<\b"+ - "\4\1\2<=\7\20\2\2=>\5\6\4\2>?\7\21\2\2?|\3\2\2\2@A\7\5\2\2A|\5\6\4\22"+ - "BC\5\36\20\2CD\5\b\5\2DE\5&\24\2E|\3\2\2\2FG\5\36\20\2GH\5\n\6\2HI\5&"+ - "\24\2I|\3\2\2\2JK\5\36\20\2KL\5\f\7\2LM\5&\24\2M|\3\2\2\2NO\5\36\20\2"+ - "OP\5\16\b\2PQ\5&\24\2Q|\3\2\2\2RS\5\36\20\2ST\5\20\t\2TU\5&\24\2U|\3\2"+ - "\2\2VW\5\36\20\2WX\5\20\t\2XY\5\34\17\2Y|\3\2\2\2Z[\5\36\20\2[\\\5\22"+ - "\n\2\\]\5&\24\2]|\3\2\2\2^_\5\36\20\2_`\5\22\n\2`a\5\34\17\2a|\3\2\2\2"+ - "bc\5\36\20\2cd\5\24\13\2de\5&\24\2e|\3\2\2\2fg\5\36\20\2gh\5\26\f\2hi"+ - "\5&\24\2ij\5\30\r\2jk\5&\24\2k|\3\2\2\2l|\5\36\20\2m|\5&\24\2no\5\36\20"+ - "\2op\5 \21\2pq\7\20\2\2qv\5&\24\2rs\7\25\2\2su\5&\24\2tr\3\2\2\2ux\3\2"+ - "\2\2vt\3\2\2\2vw\3\2\2\2wy\3\2\2\2xv\3\2\2\2yz\7\21\2\2z|\3\2\2\2{;\3"+ - "\2\2\2{@\3\2\2\2{B\3\2\2\2{F\3\2\2\2{J\3\2\2\2{N\3\2\2\2{R\3\2\2\2{V\3"+ - "\2\2\2{Z\3\2\2\2{^\3\2\2\2{b\3\2\2\2{f\3\2\2\2{l\3\2\2\2{m\3\2\2\2{n\3"+ - "\2\2\2|\u0087\3\2\2\2}~\f\21\2\2~\177\5\30\r\2\177\u0080\5\6\4\22\u0080"+ - "\u0086\3\2\2\2\u0081\u0082\f\20\2\2\u0082\u0083\5\32\16\2\u0083\u0084"+ - "\5\6\4\21\u0084\u0086\3\2\2\2\u0085}\3\2\2\2\u0085\u0081\3\2\2\2\u0086"+ - "\u0089\3\2\2\2\u0087\u0085\3\2\2\2\u0087\u0088\3\2\2\2\u0088\7\3\2\2\2"+ - "\u0089\u0087\3\2\2\2\u008a\u008b\7\b\2\2\u008b\t\3\2\2\2\u008c\u008d\7"+ - "\t\2\2\u008d\13\3\2\2\2\u008e\u008f\7\n\2\2\u008f\r\3\2\2\2\u0090\u0091"+ - "\7\13\2\2\u0091\17\3\2\2\2\u0092\u0093\7\f\2\2\u0093\21\3\2\2\2\u0094"+ - "\u0095\7\r\2\2\u0095\23\3\2\2\2\u0096\u0097\7\16\2\2\u0097\25\3\2\2\2"+ - "\u0098\u0099\7\17\2\2\u0099\27\3\2\2\2\u009a\u009b\7\3\2\2\u009b\31\3"+ - "\2\2\2\u009c\u009d\7\4\2\2\u009d\33\3\2\2\2\u009e\u009f\t\2\2\2\u009f"+ - "\35\3\2\2\2\u00a0\u00a1\7\26\2\2\u00a1\37\3\2\2\2\u00a2\u00a3\7\23\2\2"+ - "\u00a3!\3\2\2\2\u00a4\u00a5\7\24\2\2\u00a5#\3\2\2\2\u00a6\u00a7\t\3\2"+ - "\2\u00a7%\3\2\2\2\u00a8\u00ae\5$\23\2\u00a9\u00ae\7\27\2\2\u00aa\u00ae"+ - "\7\30\2\2\u00ab\u00ae\7\36\2\2\u00ac\u00ae\7\37\2\2\u00ad\u00a8\3\2\2"+ - "\2\u00ad\u00a9\3\2\2\2\u00ad\u00aa\3\2\2\2\u00ad\u00ab\3\2\2\2\u00ad\u00ac"+ - "\3\2\2\2\u00ae\'\3\2\2\2\u00af\u00b0\7\27\2\2\u00b0)\3\2\2\2\t\609v{\u0085"+ - "\u0087\u00ad"; + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\"\u00dc\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\3\2\3\2\3"+ + "\2\3\2\3\2\3\2\3\2\3\2\3\2\5\2:\n\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"+ + "\3\3\3\3\3\5\3G\n\3\3\4\3\4\3\4\3\4\7\4M\n\4\f\4\16\4P\13\4\3\4\3\4\3"+ + "\4\3\4\3\4\3\4\3\4\7\4Y\n\4\f\4\16\4\\\13\4\3\4\3\4\5\4`\n\4\3\5\3\5\3"+ + "\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5"+ + "\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3"+ + "\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5"+ + "\3\5\3\5\7\5\u009b\n\5\f\5\16\5\u009e\13\5\3\5\3\5\5\5\u00a2\n\5\3\5\3"+ + "\5\3\5\3\5\3\5\3\5\3\5\3\5\7\5\u00ac\n\5\f\5\16\5\u00af\13\5\3\6\3\6\3"+ + "\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\17"+ + "\3\17\3\20\3\20\3\21\3\21\3\22\3\22\3\23\3\23\3\24\3\24\3\25\3\25\3\26"+ + "\3\26\3\27\3\27\3\27\3\27\3\27\5\27\u00d8\n\27\3\30\3\30\3\30\2\3\b\31"+ + "\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\2\5\3\2\6\7\3\2\26\27"+ + "\4\2\22\22\34\37\2\u00e0\29\3\2\2\2\4F\3\2\2\2\6_\3\2\2\2\b\u00a1\3\2"+ + "\2\2\n\u00b0\3\2\2\2\f\u00b2\3\2\2\2\16\u00b4\3\2\2\2\20\u00b6\3\2\2\2"+ + "\22\u00b8\3\2\2\2\24\u00ba\3\2\2\2\26\u00bc\3\2\2\2\30\u00be\3\2\2\2\32"+ + "\u00c0\3\2\2\2\34\u00c2\3\2\2\2\36\u00c4\3\2\2\2 \u00c6\3\2\2\2\"\u00c8"+ + "\3\2\2\2$\u00ca\3\2\2\2&\u00cc\3\2\2\2(\u00ce\3\2\2\2*\u00d0\3\2\2\2,"+ + "\u00d7\3\2\2\2.\u00d9\3\2\2\2\60\61\5\b\5\2\61\62\7\2\2\3\62:\3\2\2\2"+ + "\63\64\5\6\4\2\64\65\7\2\2\3\65:\3\2\2\2\66\67\5\4\3\2\678\7\2\2\38:\3"+ + "\2\2\29\60\3\2\2\29\63\3\2\2\29\66\3\2\2\2:\3\3\2\2\2;<\5$\23\2<=\5.\30"+ + "\2=G\3\2\2\2>?\5\b\5\2?@\5$\23\2@A\5.\30\2AG\3\2\2\2BC\5\6\4\2CD\5$\23"+ + "\2DE\5.\30\2EG\3\2\2\2F;\3\2\2\2F>\3\2\2\2FB\3\2\2\2G\5\3\2\2\2HI\5&\24"+ + "\2IN\5 \21\2JK\7\30\2\2KM\5 \21\2LJ\3\2\2\2MP\3\2\2\2NL\3\2\2\2NO\3\2"+ + "\2\2OQ\3\2\2\2PN\3\2\2\2QR\5(\25\2R`\3\2\2\2ST\5\b\5\2TU\5&\24\2UZ\5 "+ + "\21\2VW\7\30\2\2WY\5 \21\2XV\3\2\2\2Y\\\3\2\2\2ZX\3\2\2\2Z[\3\2\2\2[]"+ + "\3\2\2\2\\Z\3\2\2\2]^\5(\25\2^`\3\2\2\2_H\3\2\2\2_S\3\2\2\2`\7\3\2\2\2"+ + "ab\b\5\1\2bc\7\20\2\2cd\5\b\5\2de\7\21\2\2e\u00a2\3\2\2\2fg\7\5\2\2g\u00a2"+ + "\5\b\5\22hi\5 \21\2ij\5\n\6\2jk\5,\27\2k\u00a2\3\2\2\2lm\5 \21\2mn\5\f"+ + "\7\2no\5,\27\2o\u00a2\3\2\2\2pq\5 \21\2qr\5\16\b\2rs\5,\27\2s\u00a2\3"+ + "\2\2\2tu\5 \21\2uv\5\20\t\2vw\5,\27\2w\u00a2\3\2\2\2xy\5 \21\2yz\5\22"+ + "\n\2z{\5,\27\2{\u00a2\3\2\2\2|}\5 \21\2}~\5\22\n\2~\177\5\36\20\2\177"+ + "\u00a2\3\2\2\2\u0080\u0081\5 \21\2\u0081\u0082\5\24\13\2\u0082\u0083\5"+ + ",\27\2\u0083\u00a2\3\2\2\2\u0084\u0085\5 \21\2\u0085\u0086\5\24\13\2\u0086"+ + "\u0087\5\36\20\2\u0087\u00a2\3\2\2\2\u0088\u0089\5 \21\2\u0089\u008a\5"+ + "\26\f\2\u008a\u008b\5,\27\2\u008b\u00a2\3\2\2\2\u008c\u008d\5 \21\2\u008d"+ + "\u008e\5\30\r\2\u008e\u008f\5,\27\2\u008f\u0090\5\32\16\2\u0090\u0091"+ + "\5,\27\2\u0091\u00a2\3\2\2\2\u0092\u00a2\5 \21\2\u0093\u00a2\5,\27\2\u0094"+ + "\u0095\5 \21\2\u0095\u0096\5\"\22\2\u0096\u0097\7\20\2\2\u0097\u009c\5"+ + ",\27\2\u0098\u0099\7\30\2\2\u0099\u009b\5,\27\2\u009a\u0098\3\2\2\2\u009b"+ + "\u009e\3\2\2\2\u009c\u009a\3\2\2\2\u009c\u009d\3\2\2\2\u009d\u009f\3\2"+ + "\2\2\u009e\u009c\3\2\2\2\u009f\u00a0\7\21\2\2\u00a0\u00a2\3\2\2\2\u00a1"+ + "a\3\2\2\2\u00a1f\3\2\2\2\u00a1h\3\2\2\2\u00a1l\3\2\2\2\u00a1p\3\2\2\2"+ + "\u00a1t\3\2\2\2\u00a1x\3\2\2\2\u00a1|\3\2\2\2\u00a1\u0080\3\2\2\2\u00a1"+ + "\u0084\3\2\2\2\u00a1\u0088\3\2\2\2\u00a1\u008c\3\2\2\2\u00a1\u0092\3\2"+ + "\2\2\u00a1\u0093\3\2\2\2\u00a1\u0094\3\2\2\2\u00a2\u00ad\3\2\2\2\u00a3"+ + "\u00a4\f\21\2\2\u00a4\u00a5\5\32\16\2\u00a5\u00a6\5\b\5\22\u00a6\u00ac"+ + "\3\2\2\2\u00a7\u00a8\f\20\2\2\u00a8\u00a9\5\34\17\2\u00a9\u00aa\5\b\5"+ + "\21\u00aa\u00ac\3\2\2\2\u00ab\u00a3\3\2\2\2\u00ab\u00a7\3\2\2\2\u00ac"+ + "\u00af\3\2\2\2\u00ad\u00ab\3\2\2\2\u00ad\u00ae\3\2\2\2\u00ae\t\3\2\2\2"+ + "\u00af\u00ad\3\2\2\2\u00b0\u00b1\7\b\2\2\u00b1\13\3\2\2\2\u00b2\u00b3"+ + "\7\t\2\2\u00b3\r\3\2\2\2\u00b4\u00b5\7\n\2\2\u00b5\17\3\2\2\2\u00b6\u00b7"+ + "\7\13\2\2\u00b7\21\3\2\2\2\u00b8\u00b9\7\f\2\2\u00b9\23\3\2\2\2\u00ba"+ + "\u00bb\7\r\2\2\u00bb\25\3\2\2\2\u00bc\u00bd\7\16\2\2\u00bd\27\3\2\2\2"+ + "\u00be\u00bf\7\17\2\2\u00bf\31\3\2\2\2\u00c0\u00c1\7\3\2\2\u00c1\33\3"+ + "\2\2\2\u00c2\u00c3\7\4\2\2\u00c3\35\3\2\2\2\u00c4\u00c5\t\2\2\2\u00c5"+ + "\37\3\2\2\2\u00c6\u00c7\7\31\2\2\u00c7!\3\2\2\2\u00c8\u00c9\7\23\2\2\u00c9"+ + "#\3\2\2\2\u00ca\u00cb\7\24\2\2\u00cb%\3\2\2\2\u00cc\u00cd\7\25\2\2\u00cd"+ + "\'\3\2\2\2\u00ce\u00cf\t\3\2\2\u00cf)\3\2\2\2\u00d0\u00d1\t\4\2\2\u00d1"+ + "+\3\2\2\2\u00d2\u00d8\5*\26\2\u00d3\u00d8\7\32\2\2\u00d4\u00d8\7\33\2"+ + "\2\u00d5\u00d8\7!\2\2\u00d6\u00d8\7\"\2\2\u00d7\u00d2\3\2\2\2\u00d7\u00d3"+ + "\3\2\2\2\u00d7\u00d4\3\2\2\2\u00d7\u00d5\3\2\2\2\u00d7\u00d6\3\2\2\2\u00d8"+ + "-\3\2\2\2\u00d9\u00da\7\32\2\2\u00da/\3\2\2\2\f9FNZ_\u009c\u00a1\u00ab"+ + "\u00ad\u00d7"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParser.tokens b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParser.tokens index a855399..a1bc8bf 100644 --- a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParser.tokens +++ b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParser.tokens @@ -16,17 +16,20 @@ RPAREN=15 NULL=16 IN=17 LIMIT=18 -COMMA=19 -IDENTIFIER=20 -POS_INTEGER=21 -DECIMAL=22 -SINGLE_STRING=23 -DOUBLE_STRING=24 -EMPTY_SINGLE_STRING=25 -EMPTY_DOUBLE_STRING=26 -WS=27 -DATE=28 -DATETIME=29 +ORDERBY=19 +ASC=20 +DESC=21 +COMMA=22 +IDENTIFIER=23 +POS_INTEGER=24 +DECIMAL=25 +SINGLE_STRING=26 +DOUBLE_STRING=27 +EMPTY_SINGLE_STRING=28 +EMPTY_DOUBLE_STRING=29 +WS=30 +DATE=31 +DATETIME=32 '>'=6 '>='=7 '<'=8 @@ -36,4 +39,4 @@ DATETIME=29 '('=14 ')'=15 'null'=16 -','=19 +','=22 diff --git a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserBaseListener.java b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserBaseListener.java index 9c66a47..0b55de5 100644 --- a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserBaseListener.java +++ b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserBaseListener.java @@ -17,7 +17,7 @@ * limitations under the License. * #L% */ -// Generated from CustomConnectorQueryFilterParser.g4 by ANTLR 4.9.3 +// Generated from src/main/configuration/grammar/CustomConnectorQueryFilterParser.g4 by ANTLR 4.9.3 package com.amazonaws.appflow.custom.connector.queryfilter.antlr; @@ -56,6 +56,18 @@ public class CustomConnectorQueryFilterParserBaseListener implements CustomConne *

The default implementation does nothing.

*/ @Override public void exitLimitExpression(CustomConnectorQueryFilterParser.LimitExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOrderByExpression(CustomConnectorQueryFilterParser.OrderByExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOrderByExpression(CustomConnectorQueryFilterParser.OrderByExpressionContext ctx) { } /** * {@inheritDoc} * @@ -428,6 +440,30 @@ public class CustomConnectorQueryFilterParserBaseListener implements CustomConne *

The default implementation does nothing.

*/ @Override public void exitLimit(CustomConnectorQueryFilterParser.LimitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOrderby(CustomConnectorQueryFilterParser.OrderbyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOrderby(CustomConnectorQueryFilterParser.OrderbyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOrder(CustomConnectorQueryFilterParser.OrderContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOrder(CustomConnectorQueryFilterParser.OrderContext ctx) { } /** * {@inheritDoc} * diff --git a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserBaseVisitor.java b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserBaseVisitor.java index e74a925..f0889d1 100644 --- a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserBaseVisitor.java +++ b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserBaseVisitor.java @@ -17,7 +17,7 @@ * limitations under the License. * #L% */ -// Generated from CustomConnectorQueryFilterParser.g4 by ANTLR 4.9.3 +// Generated from src/main/configuration/grammar/CustomConnectorQueryFilterParser.g4 by ANTLR 4.9.3 package com.amazonaws.appflow.custom.connector.queryfilter.antlr; @@ -46,6 +46,13 @@ public class CustomConnectorQueryFilterParserBaseVisitor extends AbstractPars * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitLimitExpression(CustomConnectorQueryFilterParser.LimitExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitOrderByExpression(CustomConnectorQueryFilterParser.OrderByExpressionContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -263,6 +270,20 @@ public class CustomConnectorQueryFilterParserBaseVisitor extends AbstractPars * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitLimit(CustomConnectorQueryFilterParser.LimitContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitOrderby(CustomConnectorQueryFilterParser.OrderbyContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitOrder(CustomConnectorQueryFilterParser.OrderContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserListener.java b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserListener.java index df97ba3..51c3ef6 100644 --- a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserListener.java +++ b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserListener.java @@ -17,7 +17,7 @@ * limitations under the License. * #L% */ -// Generated from CustomConnectorQueryFilterParser.g4 by ANTLR 4.9.3 +// Generated from src/main/configuration/grammar/CustomConnectorQueryFilterParser.g4 by ANTLR 4.9.3 package com.amazonaws.appflow.custom.connector.queryfilter.antlr; @@ -40,16 +40,28 @@ public interface CustomConnectorQueryFilterParserListener extends ParseTreeListe void exitQueryfilter(CustomConnectorQueryFilterParser.QueryfilterContext ctx); /** * Enter a parse tree produced by the {@code limitExpression} - * labeled alternative in {@link CustomConnectorQueryFilterParser#limitexpression}. + * labeled alternative in {@link CustomConnectorQueryFilterParser#limitexpr}. * @param ctx the parse tree */ void enterLimitExpression(CustomConnectorQueryFilterParser.LimitExpressionContext ctx); /** * Exit a parse tree produced by the {@code limitExpression} - * labeled alternative in {@link CustomConnectorQueryFilterParser#limitexpression}. + * labeled alternative in {@link CustomConnectorQueryFilterParser#limitexpr}. * @param ctx the parse tree */ void exitLimitExpression(CustomConnectorQueryFilterParser.LimitExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code orderByExpression} + * labeled alternative in {@link CustomConnectorQueryFilterParser#orderbyexpr}. + * @param ctx the parse tree + */ + void enterOrderByExpression(CustomConnectorQueryFilterParser.OrderByExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code orderByExpression} + * labeled alternative in {@link CustomConnectorQueryFilterParser#orderbyexpr}. + * @param ctx the parse tree + */ + void exitOrderByExpression(CustomConnectorQueryFilterParser.OrderByExpressionContext ctx); /** * Enter a parse tree produced by the {@code lesserThanComparatorExpression} * labeled alternative in {@link CustomConnectorQueryFilterParser#expression}. @@ -394,6 +406,26 @@ public interface CustomConnectorQueryFilterParserListener extends ParseTreeListe * @param ctx the parse tree */ void exitLimit(CustomConnectorQueryFilterParser.LimitContext ctx); + /** + * Enter a parse tree produced by {@link CustomConnectorQueryFilterParser#orderby}. + * @param ctx the parse tree + */ + void enterOrderby(CustomConnectorQueryFilterParser.OrderbyContext ctx); + /** + * Exit a parse tree produced by {@link CustomConnectorQueryFilterParser#orderby}. + * @param ctx the parse tree + */ + void exitOrderby(CustomConnectorQueryFilterParser.OrderbyContext ctx); + /** + * Enter a parse tree produced by {@link CustomConnectorQueryFilterParser#order}. + * @param ctx the parse tree + */ + void enterOrder(CustomConnectorQueryFilterParser.OrderContext ctx); + /** + * Exit a parse tree produced by {@link CustomConnectorQueryFilterParser#order}. + * @param ctx the parse tree + */ + void exitOrder(CustomConnectorQueryFilterParser.OrderContext ctx); /** * Enter a parse tree produced by {@link CustomConnectorQueryFilterParser#string}. * @param ctx the parse tree diff --git a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserVisitor.java b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserVisitor.java index c717a3a..327f2fb 100644 --- a/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserVisitor.java +++ b/custom-connector-queryfilter/src/main/java/com/amazonaws/appflow/custom/connector/queryfilter/antlr/CustomConnectorQueryFilterParserVisitor.java @@ -17,7 +17,7 @@ * limitations under the License. * #L% */ -// Generated from CustomConnectorQueryFilterParser.g4 by ANTLR 4.9.3 +// Generated from src/main/configuration/grammar/CustomConnectorQueryFilterParser.g4 by ANTLR 4.9.3 package com.amazonaws.appflow.custom.connector.queryfilter.antlr; @@ -39,11 +39,18 @@ public interface CustomConnectorQueryFilterParserVisitor extends ParseTreeVis T visitQueryfilter(CustomConnectorQueryFilterParser.QueryfilterContext ctx); /** * Visit a parse tree produced by the {@code limitExpression} - * labeled alternative in {@link CustomConnectorQueryFilterParser#limitexpression}. + * labeled alternative in {@link CustomConnectorQueryFilterParser#limitexpr}. * @param ctx the parse tree * @return the visitor result */ T visitLimitExpression(CustomConnectorQueryFilterParser.LimitExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code orderByExpression} + * labeled alternative in {@link CustomConnectorQueryFilterParser#orderbyexpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitOrderByExpression(CustomConnectorQueryFilterParser.OrderByExpressionContext ctx); /** * Visit a parse tree produced by the {@code lesserThanComparatorExpression} * labeled alternative in {@link CustomConnectorQueryFilterParser#expression}. @@ -247,6 +254,18 @@ public interface CustomConnectorQueryFilterParserVisitor extends ParseTreeVis * @return the visitor result */ T visitLimit(CustomConnectorQueryFilterParser.LimitContext ctx); + /** + * Visit a parse tree produced by {@link CustomConnectorQueryFilterParser#orderby}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitOrderby(CustomConnectorQueryFilterParser.OrderbyContext ctx); + /** + * Visit a parse tree produced by {@link CustomConnectorQueryFilterParser#order}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitOrder(CustomConnectorQueryFilterParser.OrderContext ctx); /** * Visit a parse tree produced by {@link CustomConnectorQueryFilterParser#string}. * @param ctx the parse tree diff --git a/custom-connector-queryfilter/src/test/java/com/amazonaws/appflow/custom/connector/queryfilter/CustomConnectorParseTreeBuilderTest.java b/custom-connector-queryfilter/src/test/java/com/amazonaws/appflow/custom/connector/queryfilter/CustomConnectorParseTreeBuilderTest.java index bc00e6f..ac63132 100644 --- a/custom-connector-queryfilter/src/test/java/com/amazonaws/appflow/custom/connector/queryfilter/CustomConnectorParseTreeBuilderTest.java +++ b/custom-connector-queryfilter/src/test/java/com/amazonaws/appflow/custom/connector/queryfilter/CustomConnectorParseTreeBuilderTest.java @@ -52,7 +52,13 @@ private static Stream validFilterExpressions() { return Stream.of( Arguments.of("os = \"mojave\""), Arguments.of("os != \"mojave\""), + Arguments.of("ORDER BY xyz ASC"), + Arguments.of("ORDER BY xyz DESC"), + Arguments.of("ORDER BY xyz, abc, def DESC"), + Arguments.of("order by foobar asc"), Arguments.of("LIMIT 100"), + Arguments.of("ORDER BY abc, def DESC LIMIT 100"), + Arguments.of("os != \"mojave\" ORDER BY os ASC"), Arguments.of("accountId > 90"), Arguments.of("dateRange BETWEEN 1611639470000 AND 1611639476298"), Arguments.of("date BETWEEN 1511630000000 AND 1611639476298"), @@ -62,6 +68,7 @@ private static Stream validFilterExpressions() { Arguments.of("accountId <= 100 LIMIT 100"), Arguments.of("accountId BETWEEN 90 AND 100"), Arguments.of("accountId BETWEEN 90 AND 100 LIMIT 100"), + Arguments.of("accountId BETWEEN 90 AND 100 ORDER BY date ASC LIMIT 100"), Arguments.of("os CONTAINS \"mojave\""), Arguments.of("os CONTAINS \"moj%ave\""), Arguments.of("os = \"mojave\" and app = \"mo\""), @@ -84,6 +91,13 @@ private static Stream invalidFilterExpressions() { Arguments.of("os == \"mojave\""), Arguments.of("os <> \"mojave\""), Arguments.of("LIMIT 100 LIMIT 100"), + Arguments.of("ORDER BY"), + Arguments.of("ORDER BY ASC"), + Arguments.of("ORDER BY xyz"), + Arguments.of("ORDER BY xyz abc DESC"), + Arguments.of("LIMIT 100 ORDER BY xyz"), + Arguments.of("ORDER BY xyz ASC ORDER BY xyz DESC"), + Arguments.of("ORDER BY 123"), Arguments.of("accountId => 90"), Arguments.of("accountId >= 90 LIMIT"), Arguments.of("accountId >= 90 LIMIT 0"), diff --git a/custom-connector-queryfilter/src/test/java/com/amazonaws/appflow/custom/connector/queryfilter/QueryFilterExpressionVisitorTest.java b/custom-connector-queryfilter/src/test/java/com/amazonaws/appflow/custom/connector/queryfilter/QueryFilterExpressionVisitorTest.java index 8c5cf54..e492735 100644 --- a/custom-connector-queryfilter/src/test/java/com/amazonaws/appflow/custom/connector/queryfilter/QueryFilterExpressionVisitorTest.java +++ b/custom-connector-queryfilter/src/test/java/com/amazonaws/appflow/custom/connector/queryfilter/QueryFilterExpressionVisitorTest.java @@ -48,6 +48,11 @@ private static Stream getValidFilterExpression() { return Stream.of( Arguments.of("os = \"mojave\"", 2), Arguments.of("os != \"mojave\"", 2), + Arguments.of("ORDER BY os ASC", 1), + Arguments.of("ORDER BY os, name ASC", 1), + Arguments.of("os != \"mojave\" ORDER BY os ASC", 3), + Arguments.of("ORDER BY os ASC LIMIT 100", 3), + Arguments.of("ORDER BY os, name ASC LIMIT 100", 3), Arguments.of("LIMIT 100", 2), Arguments.of("accountId > 90", 2), Arguments.of("dateRange BETWEEN 1611639470000 AND 1611639476298", 3), @@ -56,6 +61,7 @@ private static Stream getValidFilterExpression() { Arguments.of("accountId < 100", 2), Arguments.of("accountId >= 90", 2), Arguments.of("accountId >= 90 LIMIT 100", 4), + Arguments.of("accountId >= 90 ORDER BY name ASC LIMIT 100", 5), Arguments.of("accountId <= 100", 2), Arguments.of("account-Id <= 100", 2), Arguments.of("account.Id <= 100", 2), diff --git a/custom-connector-queryfilter/src/test/java/com/amazonaws/appflow/custom/connector/queryfilter/TestQueryFilterExpressionVisitor.java b/custom-connector-queryfilter/src/test/java/com/amazonaws/appflow/custom/connector/queryfilter/TestQueryFilterExpressionVisitor.java index 071c6c2..d69abbe 100644 --- a/custom-connector-queryfilter/src/test/java/com/amazonaws/appflow/custom/connector/queryfilter/TestQueryFilterExpressionVisitor.java +++ b/custom-connector-queryfilter/src/test/java/com/amazonaws/appflow/custom/connector/queryfilter/TestQueryFilterExpressionVisitor.java @@ -160,4 +160,10 @@ public Integer visitCountValueExpression(CustomConnectorQueryFilterParser.CountV countOfExpressionsVisited++; return super.visitCountValueExpression(ctx); } + + @Override + public Integer visitOrderByExpression(CustomConnectorQueryFilterParser.OrderByExpressionContext ctx) { + countOfExpressionsVisited++; + return super.visitOrderByExpression(ctx); + } } diff --git a/pom.xml b/pom.xml index 76a703e..a23159b 100644 --- a/pom.xml +++ b/pom.xml @@ -68,8 +68,8 @@ - custom-connector-sdk custom-connector-queryfilter + custom-connector-sdk custom-connector-example custom-connector-tests custom-connector-integ-test