| /* |
| * Copyright (c) 2006, 2021 Oracle and/or its affiliates. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0, |
| * or the Eclipse Distribution License v. 1.0 which is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause |
| */ |
| |
| // Contributors: |
| // Oracle - initial API and implementation |
| // |
| package org.eclipse.persistence.jpa.tests.jpql.parser; |
| |
| import org.eclipse.persistence.jpa.jpql.ExpressionTools; |
| import org.eclipse.persistence.jpa.jpql.JPAVersion; |
| import org.eclipse.persistence.jpa.jpql.parser.AbsExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractConditionalClause; |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractDoubleEncapsulatedExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractEncapsulatedExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractFromClause; |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractOrderByClause; |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractPathExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractSchemaName; |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractSelectClause; |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractSelectStatement; |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractSingleEncapsulatedExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractTripleEncapsulatedExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.AdditionExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.AllOrAnyExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.AndExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.ArithmeticFactor; |
| import org.eclipse.persistence.jpa.jpql.parser.AsOfClause; |
| import org.eclipse.persistence.jpa.jpql.parser.AvgFunction; |
| import org.eclipse.persistence.jpa.jpql.parser.BadExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.BetweenExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.CaseExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.CastExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.CoalesceExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.CollectionExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.CollectionMemberDeclaration; |
| import org.eclipse.persistence.jpa.jpql.parser.CollectionMemberExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.CollectionValuedPathExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.ComparisonExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.CompoundExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.ConcatExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.ConnectByClause; |
| import org.eclipse.persistence.jpa.jpql.parser.ConstructorExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.CountFunction; |
| import org.eclipse.persistence.jpa.jpql.parser.DatabaseType; |
| import org.eclipse.persistence.jpa.jpql.parser.DateTime; |
| import org.eclipse.persistence.jpa.jpql.parser.DefaultEclipseLinkJPQLGrammar; |
| import org.eclipse.persistence.jpa.jpql.parser.DefaultJPQLGrammar; |
| import org.eclipse.persistence.jpa.jpql.parser.DeleteClause; |
| import org.eclipse.persistence.jpa.jpql.parser.DeleteStatement; |
| import org.eclipse.persistence.jpa.jpql.parser.DivisionExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.EmptyCollectionComparisonExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.EntityTypeLiteral; |
| import org.eclipse.persistence.jpa.jpql.parser.EntryExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.ExistsExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.Expression; |
| import org.eclipse.persistence.jpa.jpql.parser.ExtractExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.FromClause; |
| import org.eclipse.persistence.jpa.jpql.parser.FunctionExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.GroupByClause; |
| import org.eclipse.persistence.jpa.jpql.parser.HavingClause; |
| import org.eclipse.persistence.jpa.jpql.parser.HierarchicalQueryClause; |
| import org.eclipse.persistence.jpa.jpql.parser.IdentificationVariable; |
| import org.eclipse.persistence.jpa.jpql.parser.IdentificationVariableDeclaration; |
| import org.eclipse.persistence.jpa.jpql.parser.InExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.IndexExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.InputParameter; |
| import org.eclipse.persistence.jpa.jpql.parser.JPQLExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.JPQLGrammar; |
| import org.eclipse.persistence.jpa.jpql.parser.JPQLStatementBNF; |
| import org.eclipse.persistence.jpa.jpql.parser.Join; |
| import org.eclipse.persistence.jpa.jpql.parser.KeywordExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.LengthExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.LikeExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.LocateExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.LogicalExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.LowerExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.MaxFunction; |
| import org.eclipse.persistence.jpa.jpql.parser.MinFunction; |
| import org.eclipse.persistence.jpa.jpql.parser.ModExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.MultiplicationExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.NotExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.NullComparisonExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.NullExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.NullIfExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.NumericLiteral; |
| import org.eclipse.persistence.jpa.jpql.parser.ObjectExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.OnClause; |
| import org.eclipse.persistence.jpa.jpql.parser.OrExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.OrderByClause; |
| import org.eclipse.persistence.jpa.jpql.parser.OrderByItem; |
| import org.eclipse.persistence.jpa.jpql.parser.OrderByItem.NullOrdering; |
| import org.eclipse.persistence.jpa.jpql.parser.OrderByItem.Ordering; |
| import org.eclipse.persistence.jpa.jpql.parser.OrderSiblingsByClause; |
| import org.eclipse.persistence.jpa.jpql.parser.RangeVariableDeclaration; |
| import org.eclipse.persistence.jpa.jpql.parser.RegexpExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.ResultVariable; |
| import org.eclipse.persistence.jpa.jpql.parser.SelectClause; |
| import org.eclipse.persistence.jpa.jpql.parser.SelectStatement; |
| import org.eclipse.persistence.jpa.jpql.parser.SimpleFromClause; |
| import org.eclipse.persistence.jpa.jpql.parser.SimpleSelectClause; |
| import org.eclipse.persistence.jpa.jpql.parser.SimpleSelectStatement; |
| import org.eclipse.persistence.jpa.jpql.parser.SizeExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.SqrtExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.StartWithClause; |
| import org.eclipse.persistence.jpa.jpql.parser.StateFieldPathExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.StringLiteral; |
| import org.eclipse.persistence.jpa.jpql.parser.SubExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.SubstringExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.SubtractionExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.SumFunction; |
| import org.eclipse.persistence.jpa.jpql.parser.TableExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.TableVariableDeclaration; |
| import org.eclipse.persistence.jpa.jpql.parser.TreatExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.TrimExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.TrimExpression.Specification; |
| import org.eclipse.persistence.jpa.jpql.parser.TypeExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.UnionClause; |
| import org.eclipse.persistence.jpa.jpql.parser.UnknownExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.UpdateClause; |
| import org.eclipse.persistence.jpa.jpql.parser.UpdateItem; |
| import org.eclipse.persistence.jpa.jpql.parser.UpdateStatement; |
| import org.eclipse.persistence.jpa.jpql.parser.UpperExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.WhenClause; |
| import org.eclipse.persistence.jpa.jpql.parser.WhereClause; |
| import org.eclipse.persistence.jpa.tests.jpql.JPQLBasicTest; |
| import static org.eclipse.persistence.jpa.jpql.parser.AbstractExpression.*; |
| import static org.eclipse.persistence.jpa.jpql.parser.Expression.*; |
| import static org.eclipse.persistence.jpa.tests.jpql.parser.JPQLParserTester.*; |
| import static org.eclipse.persistence.jpa.tests.jpql.parser.JPQLQueryBuilder.*; |
| import static org.junit.Assert.*; |
| |
| /** |
| * This abstract class provides the functionality to test the parsed tree representation of a JPQL |
| * query by traversing the tree and comparing each node. |
| * <p> |
| * Note: This class provides the {@link ExpressionTester} for all JPQL grammars (1.0, 2.0 and 2.1), |
| * as well as for EclipseLink (all versions). |
| * |
| * @version 2.6 |
| * @since 2.3 |
| * @author Pascal Filion |
| */ |
| @SuppressWarnings({"nls", "unused" /* For the extra import statement, see bug 330740 */ }) |
| public abstract class JPQLParserTest extends JPQLBasicTest { |
| |
| @JPQLGrammarTestHelper |
| private JPQLGrammar jpqlGrammar; |
| |
| protected JPQLGrammar getGrammar() { |
| return jpqlGrammar; |
| } |
| |
| protected final boolean isEclipseLinkProvider() { |
| return DefaultEclipseLinkJPQLGrammar.PROVIDER_NAME == jpqlGrammar.getProvider(); |
| } |
| |
| protected final boolean isGenericProvider() { |
| return DefaultJPQLGrammar.PROVIDER_NAME == jpqlGrammar.getProvider(); |
| } |
| |
| protected final boolean isJPA1_0() { |
| return jpqlGrammar.getJPAVersion() == JPAVersion.VERSION_1_0; |
| } |
| |
| protected final boolean isJPA2_0() { |
| return jpqlGrammar.getJPAVersion() == JPAVersion.VERSION_2_0; |
| } |
| |
| protected final boolean isJPA2_1() { |
| return jpqlGrammar.getJPAVersion() == JPAVersion.VERSION_2_1; |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * The parsing system will have the tolerance turned on. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| */ |
| protected void testInvalidQuery(String jpqlQuery, ExpressionTester expressionTester) { |
| testQuery(jpqlQuery, expressionTester, JPQLStatementBNF.ID, JPQLQueryStringFormatter.DEFAULT, true); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * The parsing system will have the tolerance turned on. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param jpqlGrammar The {@link JPQLGrammar} used to determine how to parse the JPQL query |
| * before it is used to test the generated string |
| */ |
| protected void testInvalidQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| JPQLGrammar jpqlGrammar) { |
| |
| testQuery(jpqlQuery, expressionTester, jpqlGrammar, JPQLStatementBNF.ID, JPQLQueryStringFormatter.DEFAULT, true); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * The parsing system will have the tolerance turned on. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param formatter This formatter is used to personalized the formatting of the JPQL query |
| * before it is used to test the generated string |
| */ |
| protected void testInvalidQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| JPQLQueryStringFormatter formatter) { |
| |
| testQuery(jpqlQuery, expressionTester, JPQLStatementBNF.ID, formatter, true); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * The parsing system will have the tolerance turned on. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param jpqlQueryBNFId The unique identifier of the |
| * {@link org.eclipse.persistence.jpa.jpql.parser.JPQLQueryBNF JPQLQueryBNF} |
| */ |
| protected void testInvalidQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| String jpqlQueryBNFId) { |
| |
| testQuery(jpqlQuery, expressionTester, jpqlQueryBNFId, JPQLQueryStringFormatter.DEFAULT, true); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * The parsing system will have the tolerance turned on. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param jpqlQueryBNFId The unique identifier of the |
| * {@link org.eclipse.persistence.jpa.jpql.parser.JPQLQueryBNF JPQLQueryBNF} |
| * @param formatter This formatter is used to personalized the formatting of the JPQL query |
| * before it is used to test the generated string |
| */ |
| protected void testInvalidQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| String jpqlQueryBNFId, |
| JPQLQueryStringFormatter formatter) { |
| |
| testQuery(jpqlQuery, expressionTester, jpqlQueryBNFId, formatter, true); |
| } |
| |
| /** |
| * Tests parsing the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) with |
| * the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * This method test both parsing modes: tolerant and non-tolerant. When the tolerant mode is |
| * turned on, it means it will parse valid/complete and invalid/incomplete JPQL queries. When the |
| * tolerant mode is turned off, it means the JPQL query has to be complete and has to be |
| * grammatically valid. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| */ |
| protected void testQuery(String jpqlQuery, ExpressionTester expressionTester) { |
| testQuery(jpqlQuery, expressionTester, JPQLStatementBNF.ID, JPQLQueryStringFormatter.DEFAULT, true); |
| testQuery(jpqlQuery, expressionTester, JPQLStatementBNF.ID, JPQLQueryStringFormatter.DEFAULT, false); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * This method test both parsing modes: tolerant and non-tolerant. When the tolerant mode is |
| * turned on, it means it will parse valid/complete and invalid/incomplete JPQL queries. When the |
| * tolerant mode is turned off, it means the JPQL query has to be complete and has to be |
| * grammatically valid. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param jpqlGrammar The {@link JPQLGrammar} used to determine how to parse the JPQL query |
| */ |
| protected void testQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| JPQLGrammar jpqlGrammar) { |
| |
| testQuery(jpqlQuery, expressionTester, jpqlGrammar, JPQLStatementBNF.ID, JPQLQueryStringFormatter.DEFAULT, true); |
| testQuery(jpqlQuery, expressionTester, jpqlGrammar, JPQLStatementBNF.ID, JPQLQueryStringFormatter.DEFAULT, false); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * This method test both parsing modes: tolerant and non-tolerant. When the tolerant mode is |
| * turned on, it means it will parse valid/complete and invalid/incomplete JPQL queries. When the |
| * tolerant mode is turned off, it means the JPQL query has to be complete and has to be |
| * grammatically valid. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param jpqlGrammar The {@link JPQLGrammar} used to determine how to parse the JPQL query |
| * @param formatter This formatter is used to personalized the formatting of the JPQL query |
| * before it is used to test the generated string |
| */ |
| protected void testQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| JPQLGrammar jpqlGrammar, |
| JPQLQueryStringFormatter formatter) { |
| |
| testQuery(jpqlQuery, expressionTester, jpqlGrammar, JPQLStatementBNF.ID, formatter, true); |
| testQuery(jpqlQuery, expressionTester, jpqlGrammar, JPQLStatementBNF.ID, formatter, false); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * This method test both parsing modes: tolerant and non-tolerant. When the tolerant mode is |
| * turned on, it means it will parse valid/complete and invalid/incomplete JPQL queries. When the |
| * tolerant mode is turned off, it means the JPQL query has to be complete and has to be |
| * grammatically valid. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param jpqlQueryBNFId The unique identifier of the |
| * {@link org.eclipse.persistence.jpa.jpql.parser.JPQLQueryBNF JPQLQueryBNF} |
| * @param formatter This formatter is used to personalized the formatting of the JPQL query |
| * before it is used to test the generated string |
| */ |
| protected void testQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| JPQLGrammar jpqlGrammar, |
| String jpqlQueryBNFId, |
| JPQLQueryStringFormatter formatter) { |
| |
| testQuery(jpqlQuery, expressionTester, jpqlGrammar, jpqlQueryBNFId, formatter, true); |
| testQuery(jpqlQuery, expressionTester, jpqlGrammar, jpqlQueryBNFId, formatter, false); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param jpqlGrammar The {@link JPQLGrammar} used to determine how to parse the JPQL query |
| * @param jpqlQueryBNFId The unique identifier of the |
| * {@link org.eclipse.persistence.jpa.jpql.parser.JPQLQueryBNF JPQLQueryBNF} |
| * @param formatter This formatter is used to personalized the formatting of the JPQL query |
| * before it is used to test the generated string |
| * @param tolerant Determines if the parsing system should be tolerant, meaning if it should try |
| * to parse grammatically invalid or incomplete queries |
| */ |
| protected void testQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| JPQLGrammar jpqlGrammar, |
| String jpqlQueryBNFId, |
| JPQLQueryStringFormatter formatter, |
| boolean tolerant) { |
| |
| JPQLExpression jpqlExpression = buildQuery(jpqlQuery, jpqlGrammar, jpqlQueryBNFId, formatter, tolerant); |
| |
| if (expressionTester.getClass() != JPQLExpressionTester.class) { |
| expressionTester = jpqlExpression(expressionTester); |
| } |
| |
| expressionTester.test(jpqlExpression); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * This method test both parsing modes: tolerant and non-tolerant. When the tolerant mode is |
| * turned on, it means it will parse valid/complete and invalid/incomplete JPQL queries. When the |
| * tolerant mode is turned off, it means the JPQL query has to be complete and has to be |
| * grammatically valid. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param formatter This formatter is used to personalized the formatting of the JPQL query |
| * before it is used to test the generated string |
| */ |
| protected void testQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| JPQLQueryStringFormatter formatter) { |
| |
| testQuery(jpqlQuery, expressionTester, JPQLStatementBNF.ID, formatter, true); |
| testQuery(jpqlQuery, expressionTester, JPQLStatementBNF.ID, formatter, false); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * This method test both parsing modes: tolerant and non-tolerant. When the tolerant mode is |
| * turned on, it means it will parse valid/complete and invalid/incomplete JPQL queries. When the |
| * tolerant mode is turned off, it means the JPQL query has to be complete and has to be |
| * grammatically valid. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param jpqlQueryBNFId The unique identifier of the {@link org.eclipse.persistence.jpa.jpql.parser.JPQLQueryBNF JPQLQueryBNF} |
| */ |
| protected void testQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| String jpqlQueryBNFId) { |
| |
| testQuery(jpqlQuery, expressionTester, jpqlQueryBNFId, JPQLQueryStringFormatter.DEFAULT, true); |
| testQuery(jpqlQuery, expressionTester, jpqlQueryBNFId, JPQLQueryStringFormatter.DEFAULT, false); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * This method test both parsing modes: tolerant and non-tolerant. When the tolerant mode is |
| * turned on, it means it will parse valid/complete and invalid/incomplete JPQL queries. When the |
| * tolerant mode is turned off, it means the JPQL query has to be complete and has to be |
| * grammatically valid. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param jpqlQueryBNFId The unique identifier of the {@link org.eclipse.persistence.jpa.jpql.parser.JPQLQueryBNF JPQLQueryBNF} |
| * @param formatter This formatter is used to personalized the formatting of the JPQL query |
| * before it is used to test the generated string |
| */ |
| protected void testQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| String jpqlQueryBNFId, |
| JPQLQueryStringFormatter formatter) { |
| |
| testQuery(jpqlQuery, expressionTester, jpqlQueryBNFId, formatter, true); |
| testQuery(jpqlQuery, expressionTester, jpqlQueryBNFId, formatter, false); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param jpqlQueryBNFId The unique identifier of the |
| * {@link org.eclipse.persistence.jpa.jpql.parser.JPQLQueryBNF JPQLQueryBNF} |
| * @param formatter This formatter is used to personalized the formatting of the JPQL query |
| * before it is used to test the generated string |
| * @param tolerant Determines if the parsing system should be tolerant, meaning if it should try |
| * to parse grammatically invalid or incomplete queries |
| */ |
| protected void testQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| String jpqlQueryBNFId, |
| JPQLQueryStringFormatter formatter, |
| boolean tolerant) { |
| |
| testQuery(jpqlQuery, expressionTester, jpqlGrammar, jpqlQueryBNFId, formatter, tolerant); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * The parsing system will have the tolerance turned off. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| */ |
| protected void testValidQuery(String jpqlQuery, ExpressionTester expressionTester) { |
| testQuery(jpqlQuery, expressionTester, JPQLStatementBNF.ID, JPQLQueryStringFormatter.DEFAULT, false); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * The parsing system will have the tolerance turned off. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param formatter This formatter is used to personalized the formatting of the JPQL query |
| * before it is used to test the generated string |
| */ |
| protected void testValidQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| JPQLQueryStringFormatter formatter) { |
| |
| testQuery(jpqlQuery, expressionTester, JPQLStatementBNF.ID, formatter, false); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * The parsing system will have the tolerance turned off. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param jpqlQueryBNFId The unique identifier of the |
| * {@link org.eclipse.persistence.jpa.jpql.parser.JPQLQueryBNF JPQLQueryBNF} |
| */ |
| protected void testValidQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| String jpqlQueryBNFId) { |
| |
| testQuery(jpqlQuery, expressionTester, jpqlQueryBNFId, JPQLQueryStringFormatter.DEFAULT, false); |
| } |
| |
| /** |
| * Tests the parsing of the given JPQL query by comparing the parsed tree ({@link JPQLExpression}) |
| * with the given tester, which is an equivalent representation of the parsed tree. |
| * <p> |
| * The parsing system will have the tolerance turned off. |
| * |
| * @param jpqlQuery The JPQL query to parse and to test the parsed tree representation |
| * @param expressionTester The tester used to verify the parsed tree is correctly representing the |
| * JPQL query |
| * @param jpqlQueryBNFId The unique identifier of the |
| * {@link org.eclipse.persistence.jpa.jpql.parser.JPQLQueryBNF JPQLQueryBNF} |
| * @param formatter This formatter is used to personalized the formatting of the JPQL query |
| * before it is used to test the generated string |
| */ |
| protected void testValidQuery(String jpqlQuery, |
| ExpressionTester expressionTester, |
| String jpqlQueryBNFId, |
| JPQLQueryStringFormatter formatter) { |
| |
| testQuery(jpqlQuery, expressionTester, jpqlQueryBNFId, formatter, false); |
| } |
| |
| public static final class AbsExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected AbsExpressionTester(ExpressionTester expression) { |
| super(expression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return AbsExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return ABS; |
| } |
| } |
| |
| public static abstract class AbstractConditionalClauseTester extends AbstractExpressionTester { |
| |
| private ExpressionTester conditionalExpression; |
| public boolean hasSpaceAfterIdentifier; |
| |
| protected AbstractConditionalClauseTester(ExpressionTester conditionalExpression) { |
| super(); |
| this.conditionalExpression = conditionalExpression; |
| this.hasSpaceAfterIdentifier = !conditionalExpression.isNull(); |
| } |
| |
| protected abstract Class<? extends AbstractConditionalClause> expressionType(); |
| |
| protected abstract String identifier(); |
| |
| @Override |
| public void test(Expression expression) { |
| |
| assertInstance(expression, expressionType()); |
| |
| AbstractConditionalClause conditionalClause = (AbstractConditionalClause) expression; |
| assertEquals(toString(), conditionalClause.toParsedText()); |
| assertEquals(!conditionalExpression.isNull(), conditionalClause.hasConditionalExpression()); |
| assertEquals(hasSpaceAfterIdentifier, conditionalClause.hasSpaceAfterIdentifier()); |
| |
| conditionalExpression.test(conditionalClause.getConditionalExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(identifier()); |
| if (hasSpaceAfterIdentifier) { |
| sb.append(SPACE); |
| } |
| sb.append(conditionalExpression); |
| return sb.toString(); |
| } |
| } |
| |
| public static abstract class AbstractDoubleEncapsulatedExpressionTester extends AbstractEncapsulatedExpressionTester { |
| |
| private ExpressionTester firstExpression; |
| public boolean hasComma; |
| public boolean hasSpaceAfterComma; |
| private ExpressionTester secondExpression; |
| |
| protected AbstractDoubleEncapsulatedExpressionTester(ExpressionTester firstExpression, |
| ExpressionTester secondExpression) { |
| |
| super(); |
| this.hasComma = true; |
| this.hasSpaceAfterComma = true; |
| this.firstExpression = firstExpression; |
| this.secondExpression = secondExpression; |
| } |
| |
| @Override |
| protected abstract Class<? extends AbstractDoubleEncapsulatedExpression> expressionType(); |
| |
| @Override |
| protected boolean hasEncapsulatedExpression() { |
| return !firstExpression.isNull() || hasComma || !secondExpression.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| |
| AbstractDoubleEncapsulatedExpression abstractDoubleEncapsulatedExpression = (AbstractDoubleEncapsulatedExpression) expression; |
| assertEquals(!firstExpression.isNull(), abstractDoubleEncapsulatedExpression.hasFirstExpression()); |
| assertEquals(!secondExpression.isNull(), abstractDoubleEncapsulatedExpression.hasSecondExpression()); |
| assertEquals(hasComma, abstractDoubleEncapsulatedExpression.hasComma()); |
| assertEquals(hasSpaceAfterComma, abstractDoubleEncapsulatedExpression.hasSpaceAfterComma()); |
| |
| firstExpression .test(abstractDoubleEncapsulatedExpression.getFirstExpression()); |
| secondExpression.test(abstractDoubleEncapsulatedExpression.getSecondExpression()); |
| } |
| |
| @Override |
| protected void toStringEncapsulatedExpression(StringBuilder sb) { |
| sb.append(firstExpression); |
| if (hasComma) { |
| sb.append(COMMA); |
| } |
| if (hasSpaceAfterComma) { |
| sb.append(SPACE); |
| } |
| sb.append(secondExpression); |
| } |
| } |
| |
| public static abstract class AbstractEncapsulatedExpressionTester extends AbstractExpressionTester { |
| |
| public boolean hasLeftParenthesis; |
| public boolean hasRightParenthesis; |
| |
| protected AbstractEncapsulatedExpressionTester() { |
| super(); |
| this.hasLeftParenthesis = true; |
| this.hasRightParenthesis = true; |
| } |
| |
| protected abstract Class<? extends AbstractEncapsulatedExpression> expressionType(); |
| |
| protected abstract boolean hasEncapsulatedExpression(); |
| |
| protected abstract String identifier(); |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, expressionType()); |
| |
| AbstractEncapsulatedExpression abstractEncapsulatedExpression = (AbstractEncapsulatedExpression) expression; |
| assertEquals(toString(), abstractEncapsulatedExpression.toParsedText()); |
| assertEquals(hasLeftParenthesis, abstractEncapsulatedExpression.hasLeftParenthesis()); |
| assertEquals(hasRightParenthesis, abstractEncapsulatedExpression.hasRightParenthesis()); |
| assertEquals(hasEncapsulatedExpression(), abstractEncapsulatedExpression.hasEncapsulatedExpression()); |
| } |
| |
| @Override |
| public final String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(identifier()); |
| if (hasLeftParenthesis) { |
| sb.append(LEFT_PARENTHESIS); |
| } |
| else if (hasEncapsulatedExpression()) { |
| sb.append(SPACE); |
| } |
| toStringEncapsulatedExpression(sb); |
| if (hasRightParenthesis) { |
| sb.append(RIGHT_PARENTHESIS); |
| } |
| return sb.toString(); |
| } |
| |
| protected abstract void toStringEncapsulatedExpression(StringBuilder sb); |
| } |
| |
| /** |
| * The abstract definition of an {@link ExpressionTester}. |
| */ |
| public static abstract class AbstractExpressionTester implements ExpressionTester { |
| |
| @Override |
| public final AdditionExpressionTester add(ExpressionTester expression) { |
| return JPQLParserTester.add(this, expression); |
| } |
| |
| @Override |
| public final AndExpressionTester and(ExpressionTester expression) { |
| return JPQLParserTester.and(this, expression); |
| } |
| |
| protected final void assertInstance(Expression expression, |
| Class<? extends Expression> expressionType) { |
| |
| Class<? extends Expression> expressionClass = expression.getClass(); |
| |
| if (expressionClass != expressionType && |
| !expressionType.isAssignableFrom(expressionClass)) { |
| |
| StringBuilder sb = new StringBuilder(); |
| sb.append("Expecting "); |
| sb.append(expressionType.getSimpleName()); |
| sb.append(" but was "); |
| sb.append(expressionClass.getSimpleName()); |
| sb.append(" for ["); |
| sb.append(expression.toParsedText()); |
| sb.append("]"); |
| |
| fail(sb.toString()); |
| } |
| } |
| |
| @Override |
| public final BetweenExpressionTester between(ExpressionTester lowerBoundExpression, |
| ExpressionTester upperBoundExpression) { |
| |
| return JPQLParserTester.between(this, lowerBoundExpression, upperBoundExpression); |
| } |
| |
| @Override |
| public final ComparisonExpressionTester different(ExpressionTester expression) { |
| return JPQLParserTester.different(this, expression); |
| } |
| |
| @Override |
| public final DivisionExpressionTester divide(ExpressionTester expression) { |
| return JPQLParserTester.division(this, expression); |
| } |
| |
| @Override |
| public final ComparisonExpressionTester equal(ExpressionTester expression) { |
| return JPQLParserTester.equal(this, expression); |
| } |
| |
| @Override |
| public final ComparisonExpressionTester greaterThan(ExpressionTester expression) { |
| return JPQLParserTester.greaterThan(this, expression); |
| } |
| |
| @Override |
| public final ComparisonExpressionTester greaterThanOrEqual(ExpressionTester expression) { |
| return JPQLParserTester.greaterThanOrEqual(this, expression); |
| } |
| |
| @Override |
| public final InExpressionTester in(ExpressionTester... inItems) { |
| if (inItems.length == 1) { |
| return JPQLParserTester.in(this, inItems[0]); |
| } |
| return JPQLParserTester.in(this, inItems); |
| } |
| |
| @Override |
| public final InExpressionTester in(String inputParameter) { |
| return JPQLParserTester.in(this, inputParameter); |
| } |
| |
| @Override |
| public final EmptyCollectionComparisonExpressionTester isEmpty() { |
| return JPQLParserTester.isEmpty(this); |
| } |
| |
| @Override |
| public final EmptyCollectionComparisonExpressionTester isNotEmpty() { |
| return JPQLParserTester.isNotEmpty(this); |
| } |
| |
| @Override |
| public boolean isNull() { |
| return false; |
| } |
| |
| @Override |
| public final LikeExpressionTester like(ExpressionTester patternValue) { |
| return JPQLParserTester.like(this, patternValue); |
| } |
| |
| @Override |
| public final LikeExpressionTester like(ExpressionTester patternValue, |
| ExpressionTester escapeCharacter) { |
| |
| return JPQLParserTester.like(this, patternValue, escapeCharacter); |
| } |
| |
| @Override |
| public final ComparisonExpressionTester lowerThan(ExpressionTester expression) { |
| return JPQLParserTester.lowerThan(this, expression); |
| } |
| |
| @Override |
| public final ComparisonExpressionTester lowerThanOrEqual(ExpressionTester expression) { |
| return JPQLParserTester.lowerThanOrEqual(this, expression); |
| } |
| |
| @Override |
| public final CollectionMemberExpressionTester member(ExpressionTester collectionPath) { |
| return JPQLParserTester.member(this, collectionPath); |
| } |
| |
| @Override |
| public final CollectionMemberExpressionTester memberOf(ExpressionTester collectionPath) { |
| return JPQLParserTester.memberOf(this, collectionPath); |
| } |
| |
| @Override |
| public final MultiplicationExpressionTester multiply(ExpressionTester expression) { |
| return JPQLParserTester.multiplication(this, expression); |
| } |
| |
| @Override |
| public final BetweenExpressionTester notBetween(ExpressionTester lowerBoundExpression, |
| ExpressionTester upperBoundExpression) { |
| |
| return JPQLParserTester.notBetween(this, lowerBoundExpression, upperBoundExpression); |
| } |
| |
| @Override |
| public final ComparisonExpressionTester notEqual(ExpressionTester expression) { |
| return JPQLParserTester.notEqual(this, expression); |
| } |
| |
| @Override |
| public final InExpressionTester notIn(ExpressionTester... inItems) { |
| if (inItems.length == 1) { |
| return JPQLParserTester.notIn(this, inItems[0]); |
| } |
| return JPQLParserTester.notIn(this, inItems); |
| } |
| |
| @Override |
| public final InExpressionTester notIn(String inputParameter) { |
| return JPQLParserTester.notIn(this, inputParameter); |
| } |
| |
| @Override |
| public final LikeExpressionTester notLike(ExpressionTester expression) { |
| return JPQLParserTester.notLike(this, expression); |
| } |
| |
| @Override |
| public final LikeExpressionTester notLike(ExpressionTester expression, |
| ExpressionTester escapeCharacter) { |
| |
| return JPQLParserTester.notLike(this, expression, escapeCharacter); |
| } |
| |
| @Override |
| public final ExpressionTester notMember(ExpressionTester collectionPath) { |
| return JPQLParserTester.notMember(this, collectionPath); |
| } |
| |
| @Override |
| public final ExpressionTester notMemberOf(ExpressionTester collectionPath) { |
| return JPQLParserTester.notMemberOf(this, collectionPath); |
| } |
| |
| @Override |
| public final OrExpressionTester or(ExpressionTester expression) { |
| return JPQLParserTester.or(this, expression); |
| } |
| |
| @Override |
| public final RegexpExpressionTester regexp(StringLiteralTester patternValue) { |
| return JPQLParserTester.regexp(this, patternValue); |
| } |
| |
| @Override |
| public final SubtractionExpressionTester subtract(ExpressionTester expression) { |
| return JPQLParserTester.subtract(this, expression); |
| } |
| } |
| |
| public static abstract class AbstractFromClauseTester extends AbstractExpressionTester { |
| |
| private ExpressionTester asOfClause; |
| private ExpressionTester declaration; |
| private boolean hasSpaceAfterDeclaration; |
| public boolean hasSpaceAfterFrom; |
| private boolean hasSpaceAfterHierarchicalQueryClause; |
| private ExpressionTester hierarchicalQueryClause; |
| |
| protected AbstractFromClauseTester(ExpressionTester declaration, |
| ExpressionTester hierarchicalQueryClause, |
| ExpressionTester asOfClause) { |
| super(); |
| this.hasSpaceAfterFrom = true; |
| this.asOfClause = asOfClause; |
| this.declaration = declaration; |
| this.hierarchicalQueryClause = hierarchicalQueryClause; |
| this.hasSpaceAfterDeclaration = !declaration.isNull() && (!hierarchicalQueryClause.isNull() || !asOfClause.isNull()); |
| this.hasSpaceAfterHierarchicalQueryClause = !hierarchicalQueryClause.isNull() && !asOfClause.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, AbstractFromClause.class); |
| |
| AbstractFromClause fromClause = (AbstractFromClause) expression; |
| assertEquals(toString(), fromClause.toParsedText()); |
| assertEquals(hasSpaceAfterFrom, fromClause.hasSpaceAfterFrom()); |
| assertEquals(!declaration.isNull(), fromClause.hasDeclaration()); |
| assertEquals(hasSpaceAfterDeclaration, fromClause.hasSpaceAfterDeclaration()); |
| assertEquals(!hierarchicalQueryClause.isNull(), fromClause.hasHierarchicalQueryClause()); |
| assertEquals(hasSpaceAfterHierarchicalQueryClause, fromClause.hasSpaceAfterHierarchicalQueryClause()); |
| assertEquals(!asOfClause.isNull(), fromClause.hasAsOfClause()); |
| |
| declaration.test(fromClause.getDeclaration()); |
| hierarchicalQueryClause.test(fromClause.getHierarchicalQueryClause()); |
| asOfClause.test(fromClause.getAsOfClause()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(FROM); |
| if (hasSpaceAfterFrom) { |
| sb.append(SPACE); |
| } |
| sb.append(declaration); |
| if (hasSpaceAfterDeclaration) { |
| sb.append(SPACE); |
| } |
| sb.append(hierarchicalQueryClause); |
| if (hasSpaceAfterHierarchicalQueryClause) { |
| sb.append(SPACE); |
| } |
| sb.append(asOfClause); |
| return sb.toString(); |
| } |
| } |
| |
| public static abstract class AbstractOrderByClauseTester extends AbstractExpressionTester { |
| |
| public boolean hasSpaceAfterIdentifier; |
| private ExpressionTester orderByItems; |
| |
| protected AbstractOrderByClauseTester(ExpressionTester orderByItems) { |
| super(); |
| this.orderByItems = orderByItems; |
| this.hasSpaceAfterIdentifier = !orderByItems.isNull(); |
| } |
| |
| protected abstract String identifier(); |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, AbstractOrderByClause.class); |
| |
| AbstractOrderByClause orderByClause = (AbstractOrderByClause) expression; |
| assertEquals(toString(), orderByClause.toParsedText()); |
| assertEquals(!orderByItems.isNull(), orderByClause.hasOrderByItems()); |
| assertEquals(hasSpaceAfterIdentifier, orderByClause.hasSpaceAfterIdentifier()); |
| |
| orderByItems.test(orderByClause.getOrderByItems()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(identifier()); |
| if (hasSpaceAfterIdentifier) { |
| sb.append(SPACE); |
| } |
| sb.append(orderByItems); |
| return sb.toString(); |
| } |
| } |
| |
| public static abstract class AbstractPathExpressionTester extends AbstractExpressionTester { |
| |
| private boolean endsWithDot; |
| private ExpressionTester identificationVariable; |
| private boolean startsWithDot; |
| private String value; |
| |
| protected AbstractPathExpressionTester(ExpressionTester identificationVariable, String value) { |
| |
| super(); |
| |
| this.value = value; |
| this.identificationVariable = identificationVariable; |
| this.startsWithDot = (identificationVariable.toString().length() == 0) && (value.indexOf(DOT) > -1); |
| |
| if (value.length() > 1) { |
| endsWithDot = value.charAt(value.length() - 1) == DOT; |
| } |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| |
| assertInstance(expression, AbstractPathExpression.class); |
| |
| AbstractPathExpression abstractPathExpression = (AbstractPathExpression) expression; |
| assertEquals(toString(), abstractPathExpression.toParsedText()); |
| assertEquals(!identificationVariable.isNull(), abstractPathExpression.hasIdentificationVariable()); |
| assertEquals(endsWithDot, abstractPathExpression.endsWithDot()); |
| assertEquals(startsWithDot, abstractPathExpression.startsWithDot()); |
| |
| identificationVariable.test(abstractPathExpression.getIdentificationVariable()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(identificationVariable); |
| if (startsWithDot || (sb.length() > 0)) { |
| sb.append(DOT); |
| } |
| sb.append(value); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class AbstractSchemaNameTester extends AbstractExpressionTester { |
| |
| private String abstractSchemaName; |
| |
| protected AbstractSchemaNameTester(String abstractSchemaName) { |
| super(); |
| this.abstractSchemaName = abstractSchemaName; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, AbstractSchemaName.class); |
| |
| AbstractSchemaName abstractSchemaName = (AbstractSchemaName) expression; |
| assertEquals(toString(), abstractSchemaName.toParsedText()); |
| } |
| |
| @Override |
| public String toString() { |
| return abstractSchemaName; |
| } |
| } |
| |
| public static abstract class AbstractSelectClauseTester extends AbstractExpressionTester { |
| |
| private boolean hasDistinct; |
| public boolean hasSpaceAfterDistinct; |
| public boolean hasSpaceAfterSelect; |
| private ExpressionTester selectExpression; |
| |
| protected AbstractSelectClauseTester(ExpressionTester selectExpression, boolean hasDistinct) { |
| super(); |
| this.hasDistinct = hasDistinct; |
| this.hasSpaceAfterDistinct = hasDistinct; |
| this.hasSpaceAfterSelect = hasDistinct || !selectExpression.isNull(); |
| this.selectExpression = selectExpression; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| |
| assertInstance(expression, AbstractSelectClause.class); |
| AbstractSelectClause selectClause = (AbstractSelectClause) expression; |
| |
| assertEquals(toString(), selectClause.toParsedText()); |
| assertEquals(hasSpaceAfterSelect, selectClause.hasSpaceAfterSelect()); |
| assertEquals(hasDistinct, selectClause.hasDistinct()); |
| assertEquals(hasSpaceAfterDistinct, selectClause.hasSpaceAfterDistinct()); |
| assertEquals(!selectExpression.isNull(), selectClause.hasSelectExpression()); |
| |
| selectExpression.test(selectClause.getSelectExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(SELECT); |
| if (hasSpaceAfterSelect) { |
| sb.append(SPACE); |
| } |
| if (hasDistinct) { |
| sb.append(DISTINCT); |
| } |
| if (hasSpaceAfterDistinct) { |
| sb.append(SPACE); |
| } |
| sb.append(selectExpression); |
| return sb.toString(); |
| } |
| } |
| |
| public static abstract class AbstractSelectStatementTester extends AbstractExpressionTester { |
| |
| private ExpressionTester fromClause; |
| private ExpressionTester groupByClause; |
| public boolean hasSpaceAfterFrom; |
| public boolean hasSpaceAfterGroupBy; |
| public boolean hasSpaceAfterSelect; |
| public boolean hasSpaceAfterWhere; |
| private ExpressionTester havingClause; |
| private ExpressionTester selectClause; |
| private ExpressionTester whereClause; |
| |
| protected AbstractSelectStatementTester(ExpressionTester selectClause, |
| ExpressionTester fromClause, |
| ExpressionTester whereClause, |
| ExpressionTester groupByClause, |
| ExpressionTester havingClause) { |
| |
| super(); |
| |
| this.selectClause = selectClause; |
| this.fromClause = fromClause; |
| this.whereClause = whereClause; |
| this.groupByClause = groupByClause; |
| this.havingClause = havingClause; |
| |
| hasSpaceAfterSelect = !fromClause.isNull(); |
| hasSpaceAfterFrom = !fromClause.isNull() && (!whereClause.isNull() || !groupByClause.isNull() || !havingClause.isNull()); |
| hasSpaceAfterWhere = !whereClause.isNull() && (!groupByClause.isNull() || !havingClause.isNull()); |
| hasSpaceAfterGroupBy = !groupByClause.isNull() && !havingClause.isNull(); |
| } |
| |
| protected abstract Class<? extends AbstractSelectStatement> expressionType(); |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, expressionType()); |
| |
| AbstractSelectStatement selectStatement = (AbstractSelectStatement) expression; |
| assertEquals(toString(), selectStatement.toParsedText()); |
| assertEquals(!selectClause .isNull(), selectStatement.hasSelectClause()); |
| assertEquals(!fromClause .isNull(), selectStatement.hasFromClause()); |
| assertEquals(!whereClause .isNull(), selectStatement.hasWhereClause()); |
| assertEquals(!groupByClause.isNull(), selectStatement.hasGroupByClause()); |
| assertEquals(!havingClause .isNull(), selectStatement.hasHavingClause()); |
| |
| selectClause .test(selectStatement.getSelectClause()); |
| fromClause .test(selectStatement.getFromClause()); |
| whereClause .test(selectStatement.getWhereClause()); |
| groupByClause.test(selectStatement.getGroupByClause()); |
| havingClause .test(selectStatement.getHavingClause()); |
| } |
| |
| @Override |
| public String toString() { |
| |
| StringBuilder sb = new StringBuilder(); |
| |
| // SELECT |
| sb.append(selectClause); |
| |
| if (hasSpaceAfterSelect && (sb.length() > 0) && (sb.charAt(sb.length() - 1) != ' ')) { |
| sb.append(SPACE); |
| } |
| |
| // FROM |
| sb.append(fromClause); |
| |
| if (hasSpaceAfterFrom && sb.charAt(sb.length() - 1) != ' ') { |
| sb.append(SPACE); |
| } |
| |
| // WHERE |
| sb.append(whereClause); |
| |
| if (hasSpaceAfterWhere && sb.charAt(sb.length() - 1) != ' ') { |
| sb.append(SPACE); |
| } |
| |
| // GROUP BY |
| sb.append(groupByClause); |
| |
| if (hasSpaceAfterGroupBy && sb.charAt(sb.length() - 1) != ' ') { |
| sb.append(SPACE); |
| } |
| |
| // HAVING |
| sb.append(havingClause); |
| |
| return sb.toString(); |
| } |
| } |
| |
| public static abstract class AbstractSingleEncapsulatedExpressionTester extends AbstractEncapsulatedExpressionTester { |
| |
| private ExpressionTester expression; |
| |
| protected AbstractSingleEncapsulatedExpressionTester(ExpressionTester expression) { |
| super(); |
| this.expression = expression; |
| } |
| |
| @Override |
| protected abstract Class<? extends AbstractSingleEncapsulatedExpression> expressionType(); |
| |
| @Override |
| protected boolean hasEncapsulatedExpression() { |
| return !expression.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| |
| AbstractSingleEncapsulatedExpression encapsulatedExpression = (AbstractSingleEncapsulatedExpression) expression; |
| this.expression.test(encapsulatedExpression.getExpression()); |
| } |
| |
| @Override |
| protected void toStringEncapsulatedExpression(StringBuilder sb) { |
| sb.append(expression); |
| } |
| } |
| |
| public static abstract class AbstractTripleEncapsulatedExpressionTester extends AbstractEncapsulatedExpressionTester { |
| |
| private ExpressionTester firstExpression; |
| public boolean hasFirstComma; |
| public boolean hasSecondComma; |
| public boolean hasSpaceAfterFirstComma; |
| public boolean hasSpaceAfterSecondComma; |
| private ExpressionTester secondExpression; |
| private ExpressionTester thirdExpression; |
| |
| protected AbstractTripleEncapsulatedExpressionTester(ExpressionTester firstExpression, |
| ExpressionTester secondExpression, |
| ExpressionTester thirdExpression) { |
| |
| super(); |
| |
| this.firstExpression = firstExpression; |
| this.secondExpression = secondExpression; |
| this.thirdExpression = thirdExpression; |
| |
| hasFirstComma = !secondExpression.isNull(); |
| hasSecondComma = !thirdExpression.isNull(); |
| |
| hasSpaceAfterFirstComma = hasFirstComma; |
| hasSpaceAfterSecondComma = hasSecondComma; |
| } |
| |
| @Override |
| protected abstract Class<? extends AbstractTripleEncapsulatedExpression> expressionType(); |
| |
| @Override |
| protected boolean hasEncapsulatedExpression() { |
| return !firstExpression.isNull() || hasFirstComma || !secondExpression.isNull() || hasSecondComma || !thirdExpression.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| assertInstance(expression, AbstractTripleEncapsulatedExpression.class); |
| |
| AbstractTripleEncapsulatedExpression tripleExpression = (AbstractTripleEncapsulatedExpression) expression; |
| assertEquals(toString(), tripleExpression.toParsedText()); |
| |
| assertEquals(hasFirstComma, tripleExpression.hasFirstComma()); |
| assertEquals(hasSecondComma, tripleExpression.hasSecondComma()); |
| |
| assertEquals(hasSpaceAfterFirstComma, tripleExpression.hasSpaceAfterFirstComma()); |
| assertEquals(hasSpaceAfterSecondComma, tripleExpression.hasSpaceAfterSecondComma()); |
| |
| assertEquals(!firstExpression.isNull(), tripleExpression.hasFirstExpression()); |
| assertEquals(!secondExpression.isNull(), tripleExpression.hasSecondExpression()); |
| assertEquals(!thirdExpression.isNull(), tripleExpression.hasThirdExpression()); |
| |
| firstExpression.test(tripleExpression.getFirstExpression()); |
| secondExpression.test(tripleExpression.getSecondExpression()); |
| thirdExpression.test(tripleExpression.getThirdExpression()); |
| } |
| |
| @Override |
| protected void toStringEncapsulatedExpression(StringBuilder sb) { |
| sb.append(firstExpression); |
| if (hasFirstComma) { |
| sb.append(COMMA); |
| } |
| if (hasSpaceAfterFirstComma) { |
| sb.append(SPACE); |
| } |
| sb.append(secondExpression); |
| if (hasSecondComma) { |
| sb.append(COMMA); |
| } |
| if (hasSpaceAfterSecondComma) { |
| sb.append(SPACE); |
| } |
| sb.append(thirdExpression); |
| } |
| } |
| |
| public static final class AdditionExpressionTester extends CompoundExpressionTester { |
| |
| protected AdditionExpressionTester(ExpressionTester leftExpression, |
| ExpressionTester rightExpression) { |
| |
| super(leftExpression, rightExpression); |
| } |
| |
| @Override |
| protected Class<? extends CompoundExpression> expressionType() { |
| return AdditionExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return PLUS; |
| } |
| } |
| |
| public static abstract class AggregateFunctionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| public boolean hasDistinct; |
| public boolean hasSpaceAfterDistinct; |
| |
| protected AggregateFunctionTester(ExpressionTester expression, boolean hasDistinct) { |
| super(expression); |
| this.hasDistinct = hasDistinct; |
| this.hasSpaceAfterDistinct = hasDistinct; |
| } |
| |
| @Override |
| protected void toStringEncapsulatedExpression(StringBuilder sb) { |
| |
| if (hasDistinct) { |
| sb.append(DISTINCT); |
| } |
| |
| if (hasSpaceAfterDistinct) { |
| sb.append(SPACE); |
| } |
| |
| super.toStringEncapsulatedExpression(sb); |
| } |
| } |
| |
| public static final class AllOrAnyExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| private String identifier; |
| |
| protected AllOrAnyExpressionTester(String identifier, ExpressionTester expression) { |
| super(expression); |
| this.identifier = identifier; |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return AllOrAnyExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return identifier; |
| } |
| } |
| |
| public static final class AndExpressionTester extends LogicalExpressionTester { |
| |
| protected AndExpressionTester(ExpressionTester leftExpression, |
| ExpressionTester rightExpression) { |
| |
| super(leftExpression, rightExpression); |
| } |
| |
| @Override |
| protected Class<? extends CompoundExpression> expressionType() { |
| return AndExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return AND; |
| } |
| } |
| |
| public static final class ArithmeticFactorTester extends AbstractExpressionTester { |
| |
| private ExpressionTester expression; |
| private String sign; |
| |
| protected ArithmeticFactorTester(String sign, ExpressionTester expression) { |
| super(); |
| this.sign = sign; |
| this.expression = expression; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, ArithmeticFactor.class); |
| |
| ArithmeticFactor factor = (ArithmeticFactor) expression; |
| assertEquals(toString(), factor.toParsedText()); |
| assertEquals(sign == MINUS, factor.isNegative()); |
| assertEquals(sign == PLUS, factor.isPositive()); |
| |
| this.expression.test(factor.getExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(sign); |
| sb.append(expression); |
| return sb.toString(); |
| } |
| } |
| |
| protected final static class AsOfClauseTester extends AbstractExpressionTester { |
| |
| private String category; |
| private ExpressionTester expression; |
| public boolean hasSpaceAfterCategory; |
| public boolean hasSpaceAfterIdentifier; |
| |
| protected AsOfClauseTester(String category, ExpressionTester expression) { |
| super(); |
| this.category = category; |
| this.expression = expression; |
| this.hasSpaceAfterIdentifier = (category != null) || !expression.isNull(); |
| this.hasSpaceAfterCategory = (category != null) && !expression.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, AsOfClause.class); |
| |
| AsOfClause asOfClause = (AsOfClause) expression; |
| assertEquals(toString(), asOfClause.toParsedText()); |
| assertEquals(!this.expression.isNull(), asOfClause.hasExpression()); |
| assertEquals(hasSpaceAfterIdentifier, asOfClause.hasSpaceAfterIdentifier()); |
| assertEquals(hasSpaceAfterCategory, asOfClause.hasSpaceAfterCategory()); |
| |
| this.expression.test(asOfClause.getExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(AS_OF); |
| if (hasSpaceAfterIdentifier) { |
| sb.append(SPACE); |
| } |
| if (category != null) { |
| sb.append(category); |
| } |
| if (hasSpaceAfterCategory) { |
| sb.append(SPACE); |
| } |
| sb.append(expression); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class AvgFunctionTester extends AggregateFunctionTester { |
| |
| protected AvgFunctionTester(ExpressionTester expression, boolean hasDistinct) { |
| super(expression, hasDistinct); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return AvgFunction.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return AVG; |
| } |
| } |
| |
| public static final class BadExpressionTester extends AbstractExpressionTester { |
| |
| private ExpressionTester expression; |
| |
| protected BadExpressionTester(ExpressionTester expression) { |
| super(); |
| this.expression = expression; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, BadExpression.class); |
| |
| BadExpression badExpression = (BadExpression) expression; |
| assertEquals(toString(), badExpression.toParsedText()); |
| |
| this.expression.test(badExpression.getExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| return expression.toString(); |
| } |
| } |
| |
| public static final class BetweenExpressionTester extends AbstractExpressionTester { |
| |
| private ExpressionTester expression; |
| public boolean hasAnd; |
| public boolean hasBetween; |
| private boolean hasNot; |
| public boolean hasSpaceAfterAnd; |
| public boolean hasSpaceAfterBetween; |
| public boolean hasSpaceAfterLowerBound; |
| private ExpressionTester lowerBoundExpression; |
| private ExpressionTester upperBoundExpression; |
| |
| protected BetweenExpressionTester(ExpressionTester expression, |
| boolean hasNot, |
| ExpressionTester lowerBoundExpression, |
| ExpressionTester upperBoundExpression) { |
| |
| super(); |
| this.hasNot = hasNot; |
| this.hasAnd = true; |
| this.expression = expression; |
| this.hasSpaceAfterAnd = true; |
| this.hasSpaceAfterLowerBound = true; |
| this.hasSpaceAfterBetween = true; |
| this.lowerBoundExpression = lowerBoundExpression; |
| this.upperBoundExpression = upperBoundExpression; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, BetweenExpression.class); |
| |
| BetweenExpression betweenExpression = (BetweenExpression) expression; |
| assertEquals(toString(), betweenExpression.toParsedText()); |
| assertEquals(!this.expression.isNull(), betweenExpression.hasExpression()); |
| assertEquals(hasNot, betweenExpression.hasNot()); |
| assertEquals(hasAnd, betweenExpression.hasAnd()); |
| assertEquals(!lowerBoundExpression.isNull(), betweenExpression.hasLowerBoundExpression()); |
| assertEquals(hasSpaceAfterAnd, betweenExpression.hasSpaceAfterAnd()); |
| assertEquals(hasSpaceAfterBetween, betweenExpression.hasSpaceAfterBetween()); |
| assertEquals(hasSpaceAfterLowerBound, betweenExpression.hasSpaceAfterLowerBound()); |
| assertEquals(!upperBoundExpression.isNull(), betweenExpression.hasUpperBoundExpression()); |
| |
| this.expression.test(betweenExpression.getExpression()); |
| lowerBoundExpression.test(betweenExpression.getLowerBoundExpression()); |
| upperBoundExpression.test(betweenExpression.getUpperBoundExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(expression); |
| if (!expression.isNull()) { |
| sb.append(SPACE); |
| } |
| if (hasNot) { |
| sb.append(NOT); |
| sb.append(SPACE); |
| } |
| sb.append(BETWEEN); |
| if (hasSpaceAfterBetween) { |
| sb.append(SPACE); |
| } |
| sb.append(lowerBoundExpression); |
| if (hasSpaceAfterLowerBound) { |
| sb.append(SPACE); |
| } |
| if (hasAnd) { |
| sb.append(AND); |
| } |
| if (hasSpaceAfterAnd) { |
| sb.append(SPACE); |
| } |
| sb.append(upperBoundExpression); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class CaseExpressionTester extends AbstractExpressionTester { |
| |
| private ExpressionTester caseOperand; |
| private ExpressionTester elseExpression; |
| public boolean hasElse; |
| public boolean hasEnd; |
| public boolean hasSpaceAfterCase; |
| public boolean hasSpaceAfterCaseOperand; |
| public boolean hasSpaceAfterElse; |
| public boolean hasSpaceAfterElseExpression; |
| public boolean hasSpaceAfterWhenClauses; |
| private ExpressionTester whenClauses; |
| |
| protected CaseExpressionTester(ExpressionTester caseOperand, |
| ExpressionTester whenClauses, |
| ExpressionTester elseExpression) { |
| |
| super(); |
| this.whenClauses = whenClauses; |
| this.caseOperand = caseOperand; |
| this.elseExpression = elseExpression; |
| this.hasElse = !elseExpression.isNull(); |
| this.hasEnd = true; |
| this.hasSpaceAfterCase = true; |
| this.hasSpaceAfterElse = hasElse; |
| this.hasSpaceAfterElseExpression = hasElse; |
| this.hasSpaceAfterCaseOperand = !caseOperand.isNull(); |
| this.hasSpaceAfterWhenClauses = !whenClauses.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| |
| assertInstance(expression, CaseExpression.class); |
| |
| CaseExpression caseExpression = (CaseExpression) expression; |
| assertEquals(toString(), caseExpression.toParsedText()); |
| assertEquals(!caseOperand.isNull(), caseExpression.hasCaseOperand()); |
| assertEquals(hasElse, caseExpression.hasElse()); |
| assertEquals(hasEnd, caseExpression.hasEnd()); |
| assertEquals(hasSpaceAfterCase, caseExpression.hasSpaceAfterCase()); |
| assertEquals(hasSpaceAfterCaseOperand, caseExpression.hasSpaceAfterCaseOperand()); |
| assertEquals(hasSpaceAfterElse, caseExpression.hasSpaceAfterElse()); |
| assertEquals(hasSpaceAfterElseExpression, caseExpression.hasSpaceAfterElseExpression()); |
| assertEquals(hasSpaceAfterWhenClauses, caseExpression.hasSpaceAfterWhenClauses()); |
| assertEquals(!whenClauses.isNull(), caseExpression.hasWhenClauses()); |
| |
| caseOperand.test(caseExpression.getCaseOperand()); |
| whenClauses.test(caseExpression.getWhenClauses()); |
| elseExpression.test(caseExpression.getElseExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(CASE); |
| if (hasSpaceAfterCase) { |
| sb.append(SPACE); |
| } |
| sb.append(caseOperand); |
| if (hasSpaceAfterCaseOperand) { |
| sb.append(SPACE); |
| } |
| sb.append(whenClauses); |
| if (hasSpaceAfterWhenClauses) { |
| sb.append(SPACE); |
| } |
| if (hasElse) { |
| sb.append(ELSE); |
| } |
| if (hasSpaceAfterElse) { |
| sb.append(SPACE); |
| } |
| sb.append(elseExpression); |
| if (hasSpaceAfterElseExpression) { |
| sb.append(SPACE); |
| } |
| if (hasEnd) { |
| sb.append(END); |
| } |
| return sb.toString(); |
| } |
| } |
| |
| public static final class CastExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| private ExpressionTester databaseType; |
| private boolean hasAs; |
| public boolean hasSpaceAfterAs; |
| public boolean hasSpaceAfterExpression; |
| |
| protected CastExpressionTester(ExpressionTester expression, |
| boolean hasAs, |
| ExpressionTester databaseType) { |
| |
| super(expression); |
| this.hasAs = hasAs; |
| this.databaseType = databaseType; |
| this.hasSpaceAfterAs = hasAs && !databaseType.isNull(); |
| this.hasSpaceAfterExpression = !expression.isNull() && (hasAs || !databaseType.isNull()); |
| } |
| |
| @Override |
| protected Class<CastExpression> expressionType() { |
| return CastExpression.class; |
| } |
| |
| @Override |
| protected boolean hasEncapsulatedExpression() { |
| return super.hasEncapsulatedExpression() || hasAs || !databaseType.isNull(); |
| } |
| |
| @Override |
| protected String identifier() { |
| return CAST; |
| } |
| |
| @Override |
| protected void toStringEncapsulatedExpression(StringBuilder sb) { |
| super.toStringEncapsulatedExpression(sb); |
| if (hasSpaceAfterExpression) { |
| sb.append(SPACE); |
| } |
| if (hasAs) { |
| sb.append(AS); |
| } |
| if (hasSpaceAfterAs) { |
| sb.append(SPACE); |
| } |
| sb.append(databaseType); |
| } |
| } |
| |
| public static final class CoalesceExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected CoalesceExpressionTester(ExpressionTester expression) { |
| super(expression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return CoalesceExpression.class; |
| } |
| |
| @Override |
| protected String identifier(){ |
| return COALESCE; |
| } |
| } |
| |
| public static final class CollectionExpressionTester extends AbstractExpressionTester { |
| |
| public Boolean[] commas; |
| private ExpressionTester[] expressionTesters; |
| public Boolean[] spaces; |
| |
| protected CollectionExpressionTester(ExpressionTester[] expressionTesters, |
| Boolean[] commas, |
| Boolean[] spaces) { |
| |
| super(); |
| this.expressionTesters = expressionTesters; |
| this.spaces = spaces; |
| this.commas = commas; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, CollectionExpression.class); |
| |
| CollectionExpression collectionExpression = (CollectionExpression) expression; |
| assertEquals(toString(), collectionExpression.toParsedText()); |
| assertEquals(spaces.length, collectionExpression.childrenSize()); |
| assertEquals(commas.length, collectionExpression.childrenSize()); |
| assertEquals(expressionTesters.length, collectionExpression.childrenSize()); |
| |
| // Expressions |
| for (int index = expressionTesters.length; --index >= 0; ) { |
| expressionTesters[index].test(collectionExpression.getChild(index)); |
| } |
| |
| // Spaces |
| for (int index = 0, count = spaces.length; index < count; index++) { |
| assertEquals( |
| "The flag for a space at " + index + " does not match", |
| spaces[index], |
| collectionExpression.hasSpace(index) |
| ); |
| } |
| |
| // Commas |
| for (int index = 0, count = commas.length; index < count; index++) { |
| assertEquals( |
| "The flag for a comma at " + index + " does not match", |
| commas[index], |
| collectionExpression.hasComma(index) |
| ); |
| } |
| } |
| |
| @Override |
| public String toString() { |
| |
| StringBuilder sb = new StringBuilder(); |
| |
| for (int index = 0, count = expressionTesters.length; index < count; index++) { |
| sb.append(expressionTesters[index]); |
| |
| if ((index < commas.length) && commas[index]) { |
| sb.append(COMMA); |
| } |
| |
| if ((index < spaces.length) && spaces[index]) { |
| sb.append(SPACE); |
| } |
| } |
| |
| return sb.toString(); |
| } |
| } |
| |
| public static final class CollectionMemberDeclarationTester extends AbstractExpressionTester { |
| |
| private ExpressionTester collectionValuedPath; |
| public boolean hasAs; |
| public boolean hasLeftParenthesis; |
| public boolean hasRightParenthesis; |
| public boolean hasSpaceAfterAs; |
| public boolean hasSpaceAfterIn; |
| public boolean hasSpaceAfterRightParenthesis; |
| private ExpressionTester identificationVariable; |
| |
| protected CollectionMemberDeclarationTester(ExpressionTester collectionValuedPath, |
| boolean hasAs, |
| ExpressionTester identificationVariable) { |
| |
| super(); |
| this.hasAs = hasAs; |
| this.hasSpaceAfterAs = hasAs; |
| this.hasLeftParenthesis = true; |
| this.hasRightParenthesis = true; |
| this.collectionValuedPath = collectionValuedPath; |
| this.identificationVariable = identificationVariable; |
| this.hasSpaceAfterRightParenthesis = hasAs || !identificationVariable.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, CollectionMemberDeclaration.class); |
| |
| CollectionMemberDeclaration collectionMemberDeclaration = (CollectionMemberDeclaration) expression; |
| assertEquals(toString(), collectionMemberDeclaration.toParsedText()); |
| assertEquals(hasAs, collectionMemberDeclaration.hasAs()); |
| assertEquals(!collectionValuedPath.isNull(), collectionMemberDeclaration.hasCollectionValuedPathExpression()); |
| assertEquals(!identificationVariable.isNull(), collectionMemberDeclaration.hasIdentificationVariable()); |
| assertEquals(hasLeftParenthesis, collectionMemberDeclaration.hasLeftParenthesis()); |
| assertEquals(hasRightParenthesis, collectionMemberDeclaration.hasRightParenthesis()); |
| assertEquals(hasSpaceAfterAs, collectionMemberDeclaration.hasSpaceAfterAs()); |
| assertEquals(hasSpaceAfterIn, collectionMemberDeclaration.hasSpaceAfterIn()); |
| assertEquals(hasSpaceAfterRightParenthesis, collectionMemberDeclaration.hasSpaceAfterRightParenthesis()); |
| |
| collectionValuedPath.test(collectionMemberDeclaration.getCollectionValuedPathExpression()); |
| identificationVariable.test(collectionMemberDeclaration.getIdentificationVariable()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(IN); |
| if (hasSpaceAfterIn) { |
| sb.append(SPACE); |
| } |
| else if (hasLeftParenthesis) { |
| sb.append(LEFT_PARENTHESIS); |
| } |
| sb.append(collectionValuedPath); |
| if (hasRightParenthesis) { |
| sb.append(RIGHT_PARENTHESIS); |
| } |
| if (hasSpaceAfterRightParenthesis) { |
| sb.append(SPACE); |
| } |
| if (hasAs) { |
| sb.append(AS); |
| } |
| if (hasSpaceAfterAs) { |
| sb.append(SPACE); |
| } |
| sb.append(identificationVariable); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class CollectionMemberExpressionTester extends AbstractExpressionTester { |
| |
| private ExpressionTester collectionPath; |
| private ExpressionTester entityExpression; |
| private boolean hasNot; |
| private boolean hasOf; |
| public boolean hasSpaceAfterMember; |
| public boolean hasSpaceAfterOf; |
| |
| protected CollectionMemberExpressionTester(ExpressionTester entityExpression, |
| boolean hasNot, |
| boolean hasOf, |
| ExpressionTester collectionPath) { |
| |
| super(); |
| this.hasNot = hasNot; |
| this.hasOf = hasOf; |
| this.hasSpaceAfterMember = true; |
| this.hasSpaceAfterOf = hasOf; |
| this.entityExpression = entityExpression; |
| this.collectionPath = collectionPath; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, CollectionMemberExpression.class); |
| |
| CollectionMemberExpression collectionMemberExpression = (CollectionMemberExpression) expression; |
| assertEquals(toString(), collectionMemberExpression.toParsedText()); |
| assertEquals(!collectionPath.isNull(), collectionMemberExpression.hasCollectionValuedPathExpression()); |
| assertEquals(!entityExpression.isNull(), collectionMemberExpression.hasEntityExpression()); |
| assertEquals(hasNot, collectionMemberExpression.hasNot()); |
| assertEquals(hasSpaceAfterMember, collectionMemberExpression.hasSpaceAfterMember()); |
| assertEquals(hasOf, collectionMemberExpression.hasOf()); |
| assertEquals(hasSpaceAfterOf, collectionMemberExpression.hasSpaceAfterOf()); |
| |
| entityExpression.test(collectionMemberExpression.getEntityExpression()); |
| collectionPath.test(collectionMemberExpression.getCollectionValuedPathExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(entityExpression); |
| if (!entityExpression.isNull()) { |
| sb.append(SPACE); |
| } |
| if (hasNot) { |
| sb.append(NOT); |
| sb.append(SPACE); |
| } |
| if (hasOf) { |
| sb.append(MEMBER_OF); |
| if (hasSpaceAfterOf) { |
| sb.append(SPACE); |
| } |
| } |
| else { |
| sb.append(MEMBER); |
| if (hasSpaceAfterMember) { |
| sb.append(SPACE); |
| } |
| } |
| sb.append(collectionPath); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class CollectionValuedPathExpressionTester extends AbstractPathExpressionTester { |
| |
| protected CollectionValuedPathExpressionTester(ExpressionTester identificationVariable, |
| String value) { |
| |
| super(identificationVariable, value); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| assertInstance(expression, CollectionValuedPathExpression.class); |
| } |
| } |
| |
| public static final class ComparisonExpressionTester extends AbstractExpressionTester { |
| |
| private String comparator; |
| public boolean hasSpaceAfterIdentifier; |
| private ExpressionTester leftExpression; |
| private ExpressionTester rightExpression; |
| |
| protected ComparisonExpressionTester(String comparator, |
| ExpressionTester leftExpression, |
| ExpressionTester rightExpression) { |
| |
| super(); |
| this.comparator = comparator; |
| this.leftExpression = leftExpression; |
| this.rightExpression = rightExpression; |
| this.hasSpaceAfterIdentifier = true; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, ComparisonExpression.class); |
| |
| ComparisonExpression comparisonExpression = (ComparisonExpression) expression; |
| assertEquals(toString(), comparisonExpression.toParsedText()); |
| assertEquals(!leftExpression.isNull(), comparisonExpression.hasLeftExpression()); |
| assertEquals(!rightExpression.isNull(), comparisonExpression.hasRightExpression()); |
| assertEquals(hasSpaceAfterIdentifier, comparisonExpression.hasSpaceAfterIdentifier()); |
| |
| leftExpression .test(comparisonExpression.getLeftExpression()); |
| rightExpression.test(comparisonExpression.getRightExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(leftExpression); |
| if (!leftExpression.isNull()) { |
| sb.append(SPACE); |
| } |
| sb.append(comparator); |
| if (hasSpaceAfterIdentifier) { |
| sb.append(SPACE); |
| } |
| sb.append(rightExpression); |
| return sb.toString(); |
| } |
| } |
| |
| public static abstract class CompoundExpressionTester extends AbstractExpressionTester { |
| |
| public boolean hasSpaceAfterIdentifier; |
| private ExpressionTester leftExpression; |
| private ExpressionTester rightExpression; |
| |
| protected CompoundExpressionTester(ExpressionTester leftExpression, |
| ExpressionTester rightExpression) { |
| |
| super(); |
| this.leftExpression = leftExpression; |
| this.rightExpression = rightExpression; |
| this.hasSpaceAfterIdentifier = !rightExpression.isNull(); |
| } |
| |
| protected abstract Class<? extends CompoundExpression> expressionType(); |
| |
| protected abstract String identifier(); |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, expressionType()); |
| |
| CompoundExpression compoundExpression = (CompoundExpression) expression; |
| assertEquals(toString(), compoundExpression.toParsedText()); |
| assertEquals(!leftExpression.isNull(), compoundExpression.hasLeftExpression()); |
| assertEquals(!rightExpression.isNull(), compoundExpression.hasRightExpression()); |
| assertEquals(hasSpaceAfterIdentifier, compoundExpression.hasSpaceAfterIdentifier()); |
| |
| leftExpression .test(compoundExpression.getLeftExpression()); |
| rightExpression.test(compoundExpression.getRightExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| |
| StringBuilder sb = new StringBuilder(); |
| |
| if (!leftExpression.isNull()) { |
| sb.append(leftExpression); |
| if (sb.charAt(sb.length() - 1) != SPACE) { |
| sb.append(SPACE); |
| } |
| } |
| |
| sb.append(identifier()); |
| |
| if (hasSpaceAfterIdentifier) { |
| sb.append(SPACE); |
| } |
| |
| sb.append(rightExpression); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class ConcatExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected ConcatExpressionTester(ExpressionTester expression) { |
| super(expression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return ConcatExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return CONCAT; |
| } |
| } |
| |
| public static final class ConnectByClauseTester extends AbstractExpressionTester { |
| |
| private ExpressionTester expression; |
| public boolean hasSpaceAfterConnectBy; |
| |
| protected ConnectByClauseTester(ExpressionTester expression) { |
| super(); |
| this.expression = expression; |
| this.hasSpaceAfterConnectBy = !expression.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, ConnectByClause.class); |
| |
| ConnectByClause priorExpression = (ConnectByClause) expression; |
| assertEquals(toString(), priorExpression.toParsedText()); |
| assertEquals(hasSpaceAfterConnectBy, priorExpression.hasSpaceAfterConnectBy()); |
| assertEquals(!this.expression.isNull(), priorExpression.hasExpression()); |
| |
| this.expression.test(priorExpression.getExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(CONNECT_BY); |
| if (hasSpaceAfterConnectBy) { |
| sb.append(SPACE); |
| } |
| sb.append(expression); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class ConstructorExpressionTester extends AbstractExpressionTester { |
| |
| private String className; |
| private ExpressionTester constructorItems; |
| public boolean hasLeftParenthesis; |
| public boolean hasRightParenthesis; |
| public boolean hasSpaceAfterNew; |
| |
| protected ConstructorExpressionTester(String className, ExpressionTester constructorItems) { |
| super(); |
| this.className = className; |
| this.constructorItems = constructorItems; |
| this.hasSpaceAfterNew = true; |
| this.hasLeftParenthesis = true; |
| this.hasRightParenthesis = true; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, ConstructorExpression.class); |
| |
| ConstructorExpression constructorExpression = (ConstructorExpression) expression; |
| assertEquals(toString(), constructorExpression.toParsedText()); |
| assertEquals(!constructorItems.isNull(), constructorExpression.hasConstructorItems()); |
| assertEquals(hasSpaceAfterNew, constructorExpression.hasSpaceAfterNew()); |
| assertEquals(hasLeftParenthesis, constructorExpression.hasLeftParenthesis()); |
| assertEquals(hasRightParenthesis, constructorExpression.hasRightParenthesis()); |
| |
| constructorItems.test(constructorExpression.getConstructorItems()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(NEW); |
| if (hasSpaceAfterNew) { |
| sb.append(SPACE); |
| } |
| sb.append(className); |
| if (hasLeftParenthesis) { |
| sb.append(LEFT_PARENTHESIS); |
| } |
| sb.append(constructorItems); |
| if (hasRightParenthesis) { |
| sb.append(RIGHT_PARENTHESIS); |
| } |
| return sb.toString(); |
| } |
| } |
| |
| public static final class CountFunctionTester extends AggregateFunctionTester { |
| |
| protected CountFunctionTester(ExpressionTester expression, boolean hasDistinct) { |
| super(expression, hasDistinct); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return CountFunction.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return COUNT; |
| } |
| } |
| |
| public static final class DatabaseTypeTester extends AbstractDoubleEncapsulatedExpressionTester { |
| |
| private String databaseType; |
| |
| protected DatabaseTypeTester(String databaseType, |
| ExpressionTester size, |
| ExpressionTester precision) { |
| |
| super(size, precision); |
| this.databaseType = databaseType; |
| } |
| |
| @Override |
| protected Class<DatabaseType> expressionType() { |
| return DatabaseType.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return databaseType; |
| } |
| } |
| |
| public static final class DateTimeTester extends AbstractExpressionTester { |
| |
| private String dateTime; |
| |
| protected DateTimeTester(String dateTime) { |
| super(); |
| this.dateTime = dateTime; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, DateTime.class); |
| |
| DateTime dateTime = (DateTime) expression; |
| assertEquals(toString(), dateTime.toParsedText()); |
| } |
| |
| @Override |
| public String toString() { |
| return dateTime; |
| } |
| } |
| |
| /** |
| * Tester for {@link DeleteClause}. |
| */ |
| public static final class DeleteClauseTester extends AbstractExpressionTester { |
| |
| public boolean hasFrom; |
| public boolean hasSpaceAfterDelete; |
| public boolean hasSpaceAfterFrom; |
| private ExpressionTester rangeVariableDeclaration; |
| |
| protected DeleteClauseTester(ExpressionTester rangeVariableDeclaration) { |
| super(); |
| this.hasFrom = true; |
| this.hasSpaceAfterFrom = true; |
| this.hasSpaceAfterDelete = true; |
| this.rangeVariableDeclaration = rangeVariableDeclaration; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| |
| assertInstance(expression, DeleteClause.class); |
| |
| DeleteClause deleteClause = (DeleteClause) expression; |
| assertEquals(toString(), deleteClause.toParsedText()); |
| assertEquals(hasSpaceAfterDelete, deleteClause.hasSpaceAfterDelete()); |
| assertEquals(hasFrom, deleteClause.hasFrom()); |
| assertEquals(hasSpaceAfterFrom, deleteClause.hasSpaceAfterFrom()); |
| assertEquals(!rangeVariableDeclaration.isNull(), deleteClause.hasRangeVariableDeclaration()); |
| |
| rangeVariableDeclaration.test(deleteClause.getRangeVariableDeclaration()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(DELETE); |
| if (hasSpaceAfterDelete) { |
| sb.append(SPACE); |
| } |
| if (hasFrom) { |
| sb.append(FROM); |
| } |
| if (hasSpaceAfterFrom) { |
| sb.append(SPACE); |
| } |
| sb.append(rangeVariableDeclaration); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class DeleteStatementTester extends AbstractExpressionTester { |
| |
| private ExpressionTester deleteClause; |
| public boolean hasSpaceAfterDeleteClause; |
| private ExpressionTester whereClause; |
| |
| protected DeleteStatementTester(ExpressionTester deleteClause, ExpressionTester whereClause) { |
| super(); |
| this.deleteClause = deleteClause; |
| this.whereClause = whereClause; |
| this.hasSpaceAfterDeleteClause = !whereClause.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| |
| assertInstance(expression, DeleteStatement.class); |
| |
| DeleteStatement deleteStatement = (DeleteStatement) expression; |
| assertEquals(toString(), deleteStatement.toParsedText()); |
| assertEquals(hasSpaceAfterDeleteClause, deleteStatement.hasSpaceAfterDeleteClause()); |
| assertEquals(!whereClause.isNull(), deleteStatement.hasWhereClause()); |
| |
| deleteClause.test(deleteStatement.getDeleteClause()); |
| whereClause .test(deleteStatement.getWhereClause()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(deleteClause); |
| if (hasSpaceAfterDeleteClause) { |
| sb.append(SPACE); |
| } |
| sb.append(whereClause); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class DivisionExpressionTester extends CompoundExpressionTester { |
| |
| protected DivisionExpressionTester(ExpressionTester leftExpression, |
| ExpressionTester rightExpression) { |
| |
| super(leftExpression, rightExpression); |
| } |
| |
| @Override |
| protected Class<? extends CompoundExpression> expressionType() { |
| return DivisionExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return DIVISION; |
| } |
| } |
| |
| public static final class EmptyCollectionComparisonExpressionTester extends AbstractExpressionTester { |
| |
| private ExpressionTester collectionPath; |
| private boolean hasNot; |
| public boolean hasSpaceAfterIs; |
| |
| protected EmptyCollectionComparisonExpressionTester(ExpressionTester collectionPath, |
| boolean hasNot) { |
| |
| super(); |
| this.hasNot = hasNot; |
| this.hasSpaceAfterIs = true; |
| this.collectionPath = collectionPath; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, EmptyCollectionComparisonExpression.class); |
| |
| EmptyCollectionComparisonExpression emptyCollection = (EmptyCollectionComparisonExpression) expression; |
| assertEquals(toString(), emptyCollection.toParsedText()); |
| assertEquals(!collectionPath.isNull(), emptyCollection.hasExpression()); |
| assertEquals(hasNot, emptyCollection.hasNot()); |
| assertEquals(hasSpaceAfterIs, emptyCollection.hasSpaceAfterIs()); |
| |
| collectionPath.test(emptyCollection.getExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(collectionPath); |
| if (!collectionPath.isNull()) { |
| sb.append(SPACE); |
| } |
| sb.append(IS); |
| if (hasSpaceAfterIs) { |
| sb.append(SPACE); |
| } |
| if (hasNot) { |
| sb.append(NOT); |
| sb.append(SPACE); |
| } |
| sb.append(EMPTY); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class EntityTypeLiteralTester extends AbstractExpressionTester { |
| |
| private String entityType; |
| |
| protected EntityTypeLiteralTester(String entityType) { |
| super(); |
| this.entityType = entityType; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, EntityTypeLiteral.class); |
| |
| EntityTypeLiteral entityTypeLiteral = (EntityTypeLiteral) expression; |
| assertEquals(toString(), entityTypeLiteral.toParsedText()); |
| } |
| |
| @Override |
| public String toString() { |
| return entityType; |
| } |
| } |
| |
| public static final class EntryExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected EntryExpressionTester(ExpressionTester identificationVariable) { |
| super(identificationVariable); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return EntryExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return ENTRY; |
| } |
| } |
| |
| public static final class ExistsExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| private boolean hasNot; |
| |
| protected ExistsExpressionTester(ExpressionTester subquery, boolean hasNot) { |
| super(subquery); |
| this.hasNot = hasNot; |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return ExistsExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return hasNot ? NOT_EXISTS : EXISTS; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| assertInstance(expression, ExistsExpression.class); |
| |
| ExistsExpression existsExpression = (ExistsExpression) expression; |
| assertEquals(hasNot, existsExpression.hasNot()); |
| } |
| } |
| |
| /** |
| * This tester tests an {@link Expression} information to make sure it correctly parsed a section |
| * of the query. This interface also adds helper method for easily creating a parsed tree |
| * representation of the actual query parsed tree. |
| */ |
| public static interface ExpressionTester { |
| |
| AdditionExpressionTester add(ExpressionTester expression); |
| AndExpressionTester and(ExpressionTester expression); |
| BetweenExpressionTester between(ExpressionTester lowerBoundExpression, ExpressionTester upperBoundExpression); |
| ComparisonExpressionTester different(ExpressionTester expression); |
| DivisionExpressionTester divide(ExpressionTester expression); |
| ComparisonExpressionTester equal(ExpressionTester expression); |
| ComparisonExpressionTester greaterThan(ExpressionTester expression); |
| ComparisonExpressionTester greaterThanOrEqual(ExpressionTester expression); |
| InExpressionTester in(ExpressionTester... inItems); |
| InExpressionTester in(String inputParameter); |
| EmptyCollectionComparisonExpressionTester isEmpty(); |
| EmptyCollectionComparisonExpressionTester isNotEmpty(); |
| |
| /** |
| * Determines whether this tester represents the {@link NullExpression}. |
| * |
| * @return <code>true</code> if this tester represents a <code>null</code> object; |
| * <code>false</code> otherwise |
| */ |
| boolean isNull(); |
| |
| LikeExpressionTester like(ExpressionTester patternValue); |
| LikeExpressionTester like(ExpressionTester patternValue, ExpressionTester escapeCharacter); |
| ComparisonExpressionTester lowerThan(ExpressionTester expression); |
| ComparisonExpressionTester lowerThanOrEqual(ExpressionTester expression); |
| ExpressionTester member(ExpressionTester collectionPath); |
| ExpressionTester memberOf(ExpressionTester collectionPath); |
| MultiplicationExpressionTester multiply(ExpressionTester expression); |
| BetweenExpressionTester notBetween(ExpressionTester lowerBoundExpression, ExpressionTester upperBoundExpression); |
| ComparisonExpressionTester notEqual(ExpressionTester expression); |
| InExpressionTester notIn(ExpressionTester... inItems); |
| InExpressionTester notIn(String inputParameter); |
| LikeExpressionTester notLike(ExpressionTester expression); |
| LikeExpressionTester notLike(ExpressionTester expression, ExpressionTester escapeCharacter); |
| ExpressionTester notMember(ExpressionTester collectionPath); |
| ExpressionTester notMemberOf(ExpressionTester collectionPath); |
| OrExpressionTester or(ExpressionTester expression); |
| RegexpExpressionTester regexp(StringLiteralTester patternValue); |
| SubtractionExpressionTester subtract(ExpressionTester expression); |
| |
| /** |
| * Tests the given {@link Expression} internal data. |
| */ |
| void test(Expression expression); |
| } |
| |
| public static final class ExtractExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| private boolean hasFrom; |
| public boolean hasSpaceAfterFrom; |
| public boolean hasSpaceAfterPart; |
| private String part; |
| |
| protected ExtractExpressionTester(String part, boolean hasFom, ExpressionTester expression) { |
| super(expression); |
| this.hasFrom = hasFom; |
| this.part = (part != null) ? part : ExpressionTools.EMPTY_STRING; |
| this.hasSpaceAfterPart = (part != null) && (hasFrom || !expression.isNull()); |
| this.hasSpaceAfterFrom = hasFom && !expression.isNull(); |
| } |
| |
| @Override |
| protected Class<ExtractExpression> expressionType() { |
| return ExtractExpression.class; |
| } |
| |
| @Override |
| protected boolean hasEncapsulatedExpression() { |
| return super.hasEncapsulatedExpression() || hasFrom || ExpressionTools.stringIsNotEmpty(part); |
| } |
| |
| @Override |
| protected String identifier() { |
| return EXTRACT; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| |
| ExtractExpression extractExpression = (ExtractExpression) expression; |
| assertEquals(part, extractExpression.getDatePart()); |
| assertEquals(hasFrom, extractExpression.hasFrom()); |
| assertSame (hasSpaceAfterFrom, extractExpression.hasSpaceAfterFrom()); |
| assertSame (hasSpaceAfterPart, extractExpression.hasSpaceAfterDatePart()); |
| } |
| |
| @Override |
| protected void toStringEncapsulatedExpression(StringBuilder sb) { |
| |
| sb.append(part); |
| |
| if (hasSpaceAfterPart) { |
| sb.append(SPACE); |
| } |
| |
| if (hasFrom) { |
| sb.append(FROM); |
| } |
| |
| if (hasSpaceAfterFrom) { |
| sb.append(SPACE); |
| } |
| |
| super.toStringEncapsulatedExpression(sb); |
| } |
| } |
| |
| public static final class FromClauseTester extends AbstractFromClauseTester { |
| |
| protected FromClauseTester(ExpressionTester declarations, |
| ExpressionTester hierarchicalQueryClause, |
| ExpressionTester asOfClause) { |
| |
| super(declarations, hierarchicalQueryClause, asOfClause); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| assertInstance(expression, FromClause.class); |
| } |
| } |
| |
| public static final class FunctionExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| private String functionName; |
| public boolean hasComma; |
| public boolean hasSpaceAfterComma; |
| private String identifier; |
| |
| protected FunctionExpressionTester(String identifier, |
| String functionName, |
| ExpressionTester funcItems) { |
| |
| super(funcItems); |
| this.identifier = identifier; |
| this.functionName = functionName; |
| this.hasSpaceAfterComma = !funcItems.isNull(); |
| this.hasComma = !funcItems.isNull(); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return FunctionExpression.class; |
| } |
| |
| @Override |
| protected boolean hasEncapsulatedExpression() { |
| return functionName.length() > 0 || |
| hasComma || |
| hasSpaceAfterComma || |
| super.hasEncapsulatedExpression(); |
| } |
| |
| @Override |
| protected String identifier() { |
| return identifier; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| |
| FunctionExpression funcExpression = (FunctionExpression) expression; |
| assertEquals(identifier, funcExpression.getIdentifier()); |
| assertEquals(functionName, funcExpression.getFunctionName()); |
| assertEquals(hasComma, funcExpression.hasComma()); |
| assertEquals(hasSpaceAfterComma, funcExpression.hasSpaceAfterComma()); |
| } |
| |
| @Override |
| protected void toStringEncapsulatedExpression(StringBuilder sb) { |
| if (functionName != null) { |
| sb.append(functionName); |
| } |
| if (hasComma) { |
| sb.append(COMMA); |
| } |
| if (hasSpaceAfterComma) { |
| sb.append(SPACE); |
| } |
| super.toStringEncapsulatedExpression(sb); |
| } |
| } |
| |
| public static final class GroupByClauseTester extends AbstractExpressionTester { |
| |
| private ExpressionTester groupByItems; |
| public boolean hasSpaceAfterGroupBy; |
| |
| protected GroupByClauseTester(ExpressionTester groupByItems) { |
| super(); |
| this.groupByItems = groupByItems; |
| this.hasSpaceAfterGroupBy = !groupByItems.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| |
| assertInstance(expression, GroupByClause.class); |
| |
| GroupByClause groupByClause = (GroupByClause) expression; |
| assertEquals(toString(), groupByClause.toParsedText()); |
| assertEquals(!groupByItems.isNull(), groupByClause.hasGroupByItems()); |
| assertEquals(hasSpaceAfterGroupBy, groupByClause.hasSpaceAfterGroupBy()); |
| |
| groupByItems.test(groupByClause.getGroupByItems()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(GROUP_BY); |
| if (hasSpaceAfterGroupBy) { |
| sb.append(SPACE); |
| } |
| sb.append(groupByItems); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class HavingClauseTester extends AbstractConditionalClauseTester { |
| |
| protected HavingClauseTester(ExpressionTester conditionalExpression) { |
| super(conditionalExpression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractConditionalClause> expressionType() { |
| return HavingClause.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return HAVING; |
| } |
| } |
| |
| public static final class HierarchicalQueryClauseTester extends AbstractExpressionTester { |
| |
| private ExpressionTester connectByClause; |
| public boolean hasSpaceAfterConnectByClause; |
| public boolean hasSpaceAfterStartWithClause; |
| private ExpressionTester orderSiblingsByClause; |
| private ExpressionTester startWithClause; |
| |
| protected HierarchicalQueryClauseTester(ExpressionTester startWithClause, |
| ExpressionTester connectByClause, |
| ExpressionTester orderSiblingsByClause) { |
| super(); |
| this.startWithClause = startWithClause; |
| this.connectByClause = connectByClause; |
| this.orderSiblingsByClause = orderSiblingsByClause; |
| this.hasSpaceAfterStartWithClause = !startWithClause.isNull() && !connectByClause.isNull(); |
| this.hasSpaceAfterConnectByClause = !connectByClause.isNull() && !orderSiblingsByClause.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, HierarchicalQueryClause.class); |
| |
| HierarchicalQueryClause clause = (HierarchicalQueryClause) expression; |
| assertEquals(toString(), clause.toString()); |
| assertEquals(!startWithClause.isNull(), clause.hasStartWithClause()); |
| assertEquals(!connectByClause.isNull(), clause.hasConnectByClause()); |
| assertEquals(!orderSiblingsByClause.isNull(), clause.hasOrderSiblingsByClause()); |
| assertEquals(hasSpaceAfterStartWithClause, clause.hasSpaceAfterStartWithClause()); |
| assertEquals(hasSpaceAfterConnectByClause, clause.hasSpaceAfterConnectByClause()); |
| |
| startWithClause.test(clause.getStartWithClause()); |
| connectByClause.test(clause.getConnectByClause()); |
| orderSiblingsByClause.test(clause.getOrderSiblingsByClause()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(startWithClause); |
| if (hasSpaceAfterStartWithClause) { |
| sb.append(SPACE); |
| } |
| sb.append(connectByClause); |
| if (hasSpaceAfterConnectByClause) { |
| sb.append(SPACE); |
| } |
| sb.append(orderSiblingsByClause); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class IdentificationVariableDeclarationTester extends AbstractExpressionTester { |
| |
| public boolean hasSpace; |
| private ExpressionTester joins; |
| private ExpressionTester rangeVariableDeclaration; |
| |
| protected IdentificationVariableDeclarationTester(ExpressionTester rangeVariableDeclaration, |
| ExpressionTester joins) { |
| |
| super(); |
| this.rangeVariableDeclaration = rangeVariableDeclaration; |
| this.hasSpace = !joins.isNull(); |
| this.joins = joins; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| |
| assertInstance(expression, IdentificationVariableDeclaration.class); |
| |
| IdentificationVariableDeclaration identificationVariableDeclaration = (IdentificationVariableDeclaration) expression; |
| assertEquals(toString(), identificationVariableDeclaration.toParsedText()); |
| assertEquals(!rangeVariableDeclaration.isNull(), identificationVariableDeclaration.hasRangeVariableDeclaration()); |
| assertEquals(hasSpace, identificationVariableDeclaration.hasSpace()); |
| assertEquals(!joins.isNull(), identificationVariableDeclaration.hasJoins()); |
| |
| rangeVariableDeclaration.test(identificationVariableDeclaration.getRangeVariableDeclaration()); |
| joins.test(identificationVariableDeclaration.getJoins()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(rangeVariableDeclaration); |
| if (hasSpace) { |
| sb.append(SPACE); |
| } |
| sb.append(joins); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class IdentificationVariableTester extends AbstractExpressionTester { |
| |
| private String identificationVariable; |
| private boolean virtual; |
| private ExpressionTester virtualPathExpression; |
| |
| protected IdentificationVariableTester(String identificationVariable, |
| boolean virtual, |
| ExpressionTester virtualPathExpression) { |
| super(); |
| this.virtual = virtual; |
| this.identificationVariable = identificationVariable; |
| this.virtualPathExpression = virtualPathExpression; |
| } |
| |
| @Override |
| public boolean isNull() { |
| return virtual && virtualPathExpression.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, IdentificationVariable.class); |
| |
| IdentificationVariable identificationVariable = (IdentificationVariable) expression; |
| assertEquals(this.identificationVariable, identificationVariable.toParsedText()); |
| assertEquals(virtual, identificationVariable.isVirtual()); |
| |
| if (virtual) { |
| StateFieldPathExpression pathExpression = identificationVariable.getStateFieldPathExpression(); |
| assertEquals(virtualPathExpression.isNull(), pathExpression == null); |
| if (pathExpression != null) { |
| virtualPathExpression.test(pathExpression); |
| } |
| } |
| } |
| |
| @Override |
| public String toString() { |
| return virtual ? virtualPathExpression.toString() : identificationVariable; |
| } |
| } |
| |
| public static final class IndexExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected IndexExpressionTester(ExpressionTester identificationVariable) { |
| super(identificationVariable); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return IndexExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return INDEX; |
| } |
| } |
| |
| public static final class InExpressionTester extends AbstractExpressionTester { |
| |
| public boolean hasLeftParenthesis; |
| private boolean hasNot; |
| public boolean hasRightParenthesis; |
| public boolean hasSpaceAfterIn; |
| private ExpressionTester inItems; |
| private ExpressionTester stateFieldPathExpression; |
| |
| protected InExpressionTester(ExpressionTester stateFieldPathExpression, |
| boolean hasNot, |
| ExpressionTester inItems) { |
| |
| super(); |
| this.stateFieldPathExpression = stateFieldPathExpression; |
| this.hasLeftParenthesis = !inItems.isNull(); |
| this.hasRightParenthesis = !inItems.isNull(); |
| this.hasNot = hasNot; |
| this.inItems = inItems; |
| this.hasSpaceAfterIn = !hasLeftParenthesis && !inItems.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, InExpression.class); |
| |
| InExpression inExpression = (InExpression) expression; |
| assertEquals(toString(), inExpression.toParsedText()); |
| assertEquals(hasLeftParenthesis, inExpression.hasLeftParenthesis()); |
| assertEquals(hasRightParenthesis, inExpression.hasRightParenthesis()); |
| assertEquals(hasNot, inExpression.hasNot()); |
| assertEquals(!inItems.isNull(), inExpression.hasInItems()); |
| assertEquals(!stateFieldPathExpression.isNull(), inExpression.hasExpression()); |
| |
| stateFieldPathExpression.test(inExpression.getExpression()); |
| inItems.test(inExpression.getInItems()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(stateFieldPathExpression); |
| if (!stateFieldPathExpression.isNull()) { |
| sb.append(SPACE); |
| } |
| sb.append(hasNot ? NOT_IN : IN); |
| if (hasSpaceAfterIn) { |
| sb.append(SPACE); |
| } |
| if (hasLeftParenthesis) { |
| sb.append(LEFT_PARENTHESIS); |
| } |
| sb.append(inItems); |
| if (hasRightParenthesis) { |
| sb.append(RIGHT_PARENTHESIS); |
| } |
| return sb.toString(); |
| } |
| } |
| |
| public static final class InputParameterTester extends AbstractExpressionTester { |
| |
| private String inputParameter; |
| |
| protected InputParameterTester(String inputParameter) { |
| super(); |
| this.inputParameter = inputParameter; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, InputParameter.class); |
| |
| InputParameter inputParameter = (InputParameter) expression; |
| assertEquals(toString(), inputParameter.toParsedText()); |
| assertEquals(this.inputParameter.charAt(0) == '?', inputParameter.isPositional()); |
| assertEquals(this.inputParameter.charAt(0) == ':', inputParameter.isNamed()); |
| assertEquals(this.inputParameter.substring(1), inputParameter.getParameterName()); |
| } |
| |
| @Override |
| public String toString() { |
| return inputParameter; |
| } |
| } |
| |
| public static final class JoinTester extends AbstractExpressionTester { |
| |
| private boolean hasAs; |
| public boolean hasSpaceAfterAs; |
| public boolean hasSpaceAfterIdentificationVariable; |
| public boolean hasSpaceAfterJoin; |
| public boolean hasSpaceAfterJoinAssociation; |
| private ExpressionTester identificationVariable; |
| private ExpressionTester joinAssociationPath; |
| private ExpressionTester joinCondition; |
| private String joinType; |
| |
| protected JoinTester(String joinType, |
| ExpressionTester joinAssociationPath, |
| boolean hasAs, |
| ExpressionTester identificationVariable, |
| ExpressionTester joinCondition) { |
| |
| super(); |
| this.joinType = joinType; |
| this.hasSpaceAfterJoin = true; |
| this.joinAssociationPath = joinAssociationPath; |
| this.hasAs = hasAs; |
| this.hasSpaceAfterAs = hasAs; |
| this.identificationVariable = identificationVariable; |
| this.hasSpaceAfterJoinAssociation = !joinAssociationPath.isNull(); |
| this.hasSpaceAfterIdentificationVariable = !identificationVariable.isNull() && !joinCondition.isNull(); |
| this.joinCondition = joinCondition; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, Join.class); |
| |
| Join join = (Join) expression; |
| assertEquals(toString(), join.toParsedText()); |
| assertEquals(joinType, join.getIdentifier()); |
| |
| assertEquals(hasSpaceAfterJoin, join.hasSpaceAfterJoin()); |
| assertEquals(!joinAssociationPath.isNull(), join.hasJoinAssociationPath()); |
| assertEquals(hasAs, join.hasAs()); |
| assertEquals(hasSpaceAfterAs, join.hasSpaceAfterAs()); |
| assertEquals(hasSpaceAfterJoinAssociation, join.hasSpaceAfterJoinAssociation()); |
| assertEquals(!identificationVariable.isNull(), join.hasIdentificationVariable()); |
| assertEquals(hasSpaceAfterIdentificationVariable, join.hasSpaceAfterIdentificationVariable()); |
| |
| joinAssociationPath.test(join.getJoinAssociationPath()); |
| identificationVariable.test(join.getIdentificationVariable()); |
| joinCondition.test(join.getOnClause()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(joinType); |
| if (hasSpaceAfterJoin) { |
| sb.append(SPACE); |
| } |
| sb.append(joinAssociationPath); |
| if (hasSpaceAfterJoinAssociation) { |
| sb.append(SPACE); |
| } |
| if (hasAs) { |
| sb.append(AS); |
| } |
| if (hasSpaceAfterAs) { |
| sb.append(SPACE); |
| } |
| sb.append(identificationVariable); |
| if (hasSpaceAfterIdentificationVariable) { |
| sb.append(SPACE); |
| } |
| sb.append(joinCondition); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class JPQLExpressionTester extends AbstractExpressionTester { |
| |
| private ExpressionTester queryStatement; |
| private ExpressionTester unknownExpression; |
| |
| protected JPQLExpressionTester(ExpressionTester queryStatement, |
| ExpressionTester unknownExpression) { |
| |
| super(); |
| this.queryStatement = queryStatement; |
| this.unknownExpression = unknownExpression; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| |
| JPQLExpression jpqlExpression = (JPQLExpression) expression; |
| |
| assertEquals(toString(), jpqlExpression.toParsedText()); |
| assertEquals(!queryStatement.isNull(), jpqlExpression.hasQueryStatement()); |
| assertEquals(!unknownExpression.isNull(), jpqlExpression.hasUnknownEndingStatement()); |
| |
| queryStatement .test(jpqlExpression.getQueryStatement()); |
| unknownExpression.test(jpqlExpression.getUnknownEndingStatement()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(queryStatement); |
| sb.append(unknownExpression); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class KeywordExpressionTester extends AbstractExpressionTester { |
| |
| private String keyword; |
| |
| protected KeywordExpressionTester(String keyword) { |
| super(); |
| this.keyword = keyword; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, KeywordExpression.class); |
| |
| KeywordExpression keywordExpression = (KeywordExpression) expression; |
| assertEquals(toString(), keywordExpression.toParsedText()); |
| } |
| |
| @Override |
| public String toString() { |
| return keyword; |
| } |
| } |
| |
| public static final class LengthExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected LengthExpressionTester(ExpressionTester expression) { |
| super(expression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return LengthExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return LENGTH; |
| } |
| } |
| |
| public static final class LikeExpressionTester extends AbstractExpressionTester { |
| |
| private ExpressionTester escapeCharacter; |
| public boolean hasEscape; |
| private boolean hasNot; |
| public boolean hasSpaceAfterEscape; |
| public boolean hasSpaceAfterLike; |
| public boolean hasSpaceAfterPatternValue; |
| private ExpressionTester patternValue; |
| private ExpressionTester stringExpression; |
| |
| protected LikeExpressionTester(ExpressionTester stringExpression, |
| boolean hasNot, |
| ExpressionTester patternValue, |
| ExpressionTester escapeCharacter) { |
| |
| super(); |
| this.hasNot = hasNot; |
| this.hasSpaceAfterLike = true; |
| this.stringExpression = stringExpression; |
| this.patternValue = patternValue; |
| this.escapeCharacter = escapeCharacter; |
| this.hasEscape = !escapeCharacter.isNull(); |
| this.hasSpaceAfterEscape = hasEscape; |
| this.hasSpaceAfterPatternValue = !patternValue.isNull() && hasEscape; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, LikeExpression.class); |
| |
| LikeExpression likeExpression = (LikeExpression) expression; |
| assertEquals(toString(), likeExpression.toParsedText()); |
| assertEquals(hasNot, likeExpression.hasNot()); |
| assertEquals(hasSpaceAfterLike, likeExpression.hasSpaceAfterLike()); |
| assertEquals(hasEscape, likeExpression.hasEscape()); |
| assertEquals(!escapeCharacter.isNull(), likeExpression.hasEscapeCharacter()); |
| assertEquals(hasSpaceAfterEscape, likeExpression.hasSpaceAfterEscape()); |
| assertEquals(hasSpaceAfterPatternValue, likeExpression.hasSpaceAfterPatternValue()); |
| assertEquals(!patternValue.isNull(), likeExpression.hasPatternValue()); |
| |
| stringExpression.test(likeExpression.getStringExpression()); |
| patternValue.test(likeExpression.getPatternValue()); |
| escapeCharacter.test(likeExpression.getEscapeCharacter()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(stringExpression); |
| if (!stringExpression.isNull()) { |
| sb.append(SPACE); |
| } |
| sb.append(hasNot ? NOT_LIKE : LIKE); |
| if (hasSpaceAfterLike) { |
| sb.append(SPACE); |
| } |
| sb.append(patternValue); |
| if (hasSpaceAfterPatternValue) { |
| sb.append(SPACE); |
| } |
| if (hasEscape) { |
| sb.append(ESCAPE); |
| } |
| if (hasSpaceAfterEscape) { |
| sb.append(SPACE); |
| } |
| sb.append(escapeCharacter); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class LocateExpressionTester extends AbstractTripleEncapsulatedExpressionTester { |
| |
| protected LocateExpressionTester(ExpressionTester firstExpression, |
| ExpressionTester secondExpression, |
| ExpressionTester thirdExpression) { |
| |
| super(firstExpression, secondExpression, thirdExpression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractTripleEncapsulatedExpression> expressionType() { |
| return LocateExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return LOCATE; |
| } |
| } |
| |
| public static abstract class LogicalExpressionTester extends CompoundExpressionTester { |
| |
| protected LogicalExpressionTester(ExpressionTester leftExpression, |
| ExpressionTester rightExpression) { |
| |
| super(leftExpression, rightExpression); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| assertInstance(expression, LogicalExpression.class); |
| } |
| } |
| |
| public static final class LowerExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected LowerExpressionTester(ExpressionTester expression) { |
| super(expression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return LowerExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return LOWER; |
| } |
| } |
| |
| public static final class MaxFunctionTester extends AggregateFunctionTester { |
| |
| protected MaxFunctionTester(ExpressionTester expression, boolean hasDistinct) { |
| super(expression, hasDistinct); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return MaxFunction.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return MAX; |
| } |
| } |
| |
| public static final class MinFunctionTester extends AggregateFunctionTester { |
| |
| protected MinFunctionTester(ExpressionTester expression, boolean hasDistinct) { |
| super(expression, hasDistinct); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return MinFunction.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return MIN; |
| } |
| } |
| |
| public static final class ModExpressionTester extends AbstractDoubleEncapsulatedExpressionTester { |
| |
| protected ModExpressionTester(ExpressionTester firstExpression, ExpressionTester secondExpression) { |
| super(firstExpression, secondExpression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractDoubleEncapsulatedExpression> expressionType() { |
| return ModExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return MOD; |
| } |
| } |
| |
| public static final class MultiplicationExpressionTester extends CompoundExpressionTester { |
| |
| protected MultiplicationExpressionTester(ExpressionTester leftExpression, |
| ExpressionTester rightExpression) { |
| |
| super(leftExpression, rightExpression); |
| } |
| |
| @Override |
| protected Class<? extends CompoundExpression> expressionType() { |
| return MultiplicationExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return MULTIPLICATION; |
| } |
| } |
| |
| public static final class NotExpressionTester extends AbstractExpressionTester { |
| |
| private ExpressionTester expression; |
| public boolean hasSpaceAfterNot; |
| |
| protected NotExpressionTester(ExpressionTester expression) { |
| super(); |
| this.expression = expression; |
| this.hasSpaceAfterNot = true; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, NotExpression.class); |
| |
| NotExpression notExpression = (NotExpression) expression; |
| assertEquals(toString(), notExpression.toParsedText()); |
| assertEquals(hasSpaceAfterNot, notExpression.hasSpaceAfterNot()); |
| assertEquals(!this.expression.isNull(), notExpression.hasExpression()); |
| |
| this.expression.test(notExpression.getExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(NOT); |
| if (hasSpaceAfterNot) { |
| sb.append(SPACE); |
| } |
| sb.append(expression); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class NullComparisonExpressionTester extends AbstractExpressionTester { |
| |
| private ExpressionTester expression; |
| private boolean hasNot; |
| |
| protected NullComparisonExpressionTester(ExpressionTester expression, boolean hasNot) { |
| super(); |
| this.hasNot = hasNot; |
| this.expression = expression; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, NullComparisonExpression.class); |
| |
| NullComparisonExpression nullComparisonExpression = (NullComparisonExpression) expression; |
| assertEquals(toString(), nullComparisonExpression.toParsedText()); |
| assertEquals(hasNot, nullComparisonExpression.hasNot()); |
| assertEquals(!this.expression.isNull(), nullComparisonExpression.hasExpression()); |
| |
| this.expression.test(nullComparisonExpression.getExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(expression); |
| if (!expression.isNull()) { |
| sb.append(SPACE); |
| } |
| sb.append(hasNot ? IS_NOT_NULL : IS_NULL); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class NullExpressionTester extends AbstractExpressionTester { |
| |
| @Override |
| public boolean isNull() { |
| return true; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, NullExpression.class); |
| } |
| |
| @Override |
| public String toString() { |
| return ExpressionTools.EMPTY_STRING; |
| } |
| } |
| |
| public static final class NullIfExpressionTester extends AbstractDoubleEncapsulatedExpressionTester { |
| |
| protected NullIfExpressionTester(ExpressionTester firstExpression, |
| ExpressionTester secondExpression) { |
| |
| super(firstExpression, secondExpression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractDoubleEncapsulatedExpression> expressionType() { |
| return NullIfExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return NULLIF; |
| } |
| } |
| |
| public static final class NumericLiteralTester extends AbstractExpressionTester { |
| |
| private String number; |
| |
| protected NumericLiteralTester(String number) { |
| super(); |
| this.number = number; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, NumericLiteral.class); |
| |
| assertEquals(toString(), expression.toParsedText()); |
| } |
| |
| @Override |
| public String toString() { |
| return number; |
| } |
| } |
| |
| public static final class ObjectExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected ObjectExpressionTester(ExpressionTester identificationVariable) { |
| super(identificationVariable); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return ObjectExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return OBJECT; |
| } |
| } |
| |
| public static final class OnClauseTester extends AbstractConditionalClauseTester { |
| |
| protected OnClauseTester(ExpressionTester conditionalExpression) { |
| super(conditionalExpression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractConditionalClause> expressionType() { |
| return OnClause.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return ON; |
| } |
| } |
| |
| public static final class OrderByClauseTester extends AbstractOrderByClauseTester { |
| |
| protected OrderByClauseTester(ExpressionTester orderByItems) { |
| super(orderByItems); |
| } |
| |
| @Override |
| protected String identifier() { |
| return ORDER_BY; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| assertInstance(expression, OrderByClause.class); |
| } |
| } |
| |
| public static final class OrderByItemTester extends AbstractExpressionTester { |
| |
| public boolean hasSpaceAfterExpression; |
| public boolean hasSpaceAfterNulls; |
| public boolean hasSpaceAfterOrdering; |
| private NullOrdering nullOrdering; |
| public String nulls; |
| private ExpressionTester orderByItem; |
| private Ordering ordering; |
| |
| protected OrderByItemTester(ExpressionTester orderByItem, |
| Ordering ordering, |
| NullOrdering nullOrdering) { |
| |
| super(); |
| this.ordering = ordering; |
| this.orderByItem = orderByItem; |
| this.nullOrdering = nullOrdering; |
| this.hasSpaceAfterExpression = ordering != Ordering.DEFAULT || |
| nullOrdering != NullOrdering.DEFAULT; |
| this.hasSpaceAfterOrdering = ordering != Ordering.DEFAULT && |
| nullOrdering != NullOrdering.DEFAULT; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, OrderByItem.class); |
| |
| OrderByItem orderByItem = (OrderByItem) expression; |
| assertEquals(toString(), orderByItem.toParsedText()); |
| assertEquals(!this.orderByItem.isNull(), orderByItem.hasExpression()); |
| assertEquals(hasSpaceAfterExpression, orderByItem.hasSpaceAfterExpression()); |
| assertEquals(hasSpaceAfterOrdering, orderByItem.hasSpaceAfterOrdering()); |
| assertSame (ordering, orderByItem.getOrdering()); |
| |
| if (nulls != null) { |
| assertEquals(nulls, orderByItem.getActualNullOrdering().toUpperCase()); |
| } |
| else { |
| assertSame(nullOrdering, orderByItem.getNullOrdering()); |
| } |
| |
| this.orderByItem.test(orderByItem.getExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| |
| StringBuilder sb = new StringBuilder(); |
| sb.append(orderByItem); |
| |
| if (hasSpaceAfterExpression) { |
| sb.append(SPACE); |
| } |
| |
| if (ordering != Ordering.DEFAULT) { |
| sb.append(ordering.name()); |
| } |
| |
| if (hasSpaceAfterOrdering) { |
| sb.append(SPACE); |
| } |
| |
| if (nulls != null) { |
| sb.append(nulls); |
| if (hasSpaceAfterNulls) { |
| sb.append(SPACE); |
| } |
| } |
| else if (nullOrdering != NullOrdering.DEFAULT) { |
| sb.append(nullOrdering.getIdentifier()); |
| } |
| |
| return sb.toString(); |
| } |
| } |
| |
| public static final class OrderSiblingsByClauseTester extends AbstractOrderByClauseTester { |
| |
| protected OrderSiblingsByClauseTester(ExpressionTester orderByItems) { |
| super(orderByItems); |
| } |
| |
| @Override |
| protected String identifier() { |
| return ORDER_SIBLINGS_BY; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| assertInstance(expression, OrderSiblingsByClause.class); |
| } |
| } |
| |
| public static final class OrExpressionTester extends LogicalExpressionTester { |
| |
| protected OrExpressionTester(ExpressionTester leftExpression, |
| ExpressionTester rightExpression) { |
| |
| super(leftExpression, rightExpression); |
| } |
| |
| @Override |
| protected Class<? extends CompoundExpression> expressionType() { |
| return OrExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return OR; |
| } |
| } |
| |
| public static final class RangeVariableDeclarationTester extends AbstractExpressionTester { |
| |
| private ExpressionTester abstractSchemaName; |
| private boolean hasAs; |
| public boolean hasSpaceAfterAbstractSchemaName; |
| public boolean hasSpaceAfterAs; |
| private ExpressionTester identificationVariable; |
| |
| protected RangeVariableDeclarationTester(ExpressionTester abstractSchemaName, |
| boolean hasAs, |
| ExpressionTester identificationVariable) { |
| |
| super(); |
| this.hasAs = hasAs; |
| this.abstractSchemaName = abstractSchemaName; |
| this.identificationVariable = identificationVariable; |
| this.hasSpaceAfterAbstractSchemaName = hasAs || !identificationVariable.isNull(); |
| this.hasSpaceAfterAs = hasAs; |
| |
| if (identificationVariable instanceof IdentificationVariableTester && |
| identificationVariable.isNull()) { |
| |
| this.hasSpaceAfterAbstractSchemaName = true; |
| } |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, RangeVariableDeclaration.class); |
| |
| RangeVariableDeclaration rangeVariableDeclaration = (RangeVariableDeclaration) expression; |
| assertEquals(toString(), rangeVariableDeclaration.toParsedText()); |
| assertEquals(hasAs, rangeVariableDeclaration.hasAs()); |
| assertEquals(hasSpaceAfterAs, rangeVariableDeclaration.hasSpaceAfterAs()); |
| assertEquals(!identificationVariable.isNull(), rangeVariableDeclaration.hasIdentificationVariable()); |
| assertEquals(hasSpaceAfterAbstractSchemaName, rangeVariableDeclaration.hasSpaceAfterRootObject()); |
| |
| abstractSchemaName.test(rangeVariableDeclaration.getRootObject()); |
| identificationVariable.test(rangeVariableDeclaration.getIdentificationVariable()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(abstractSchemaName); |
| if (hasSpaceAfterAbstractSchemaName) { |
| sb.append(SPACE); |
| } |
| if (hasAs) { |
| sb.append(AS); |
| } |
| if (hasSpaceAfterAs) { |
| sb.append(SPACE); |
| } |
| sb.append(identificationVariable); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class RegexpExpressionTester extends AbstractExpressionTester { |
| |
| public boolean hasSpaceAfterIdentifier; |
| private ExpressionTester patternValue; |
| private ExpressionTester stringExpression; |
| |
| protected RegexpExpressionTester(ExpressionTester stringExpression, |
| ExpressionTester patternValue) { |
| |
| super(); |
| this.stringExpression = stringExpression; |
| this.patternValue = patternValue; |
| this.hasSpaceAfterIdentifier = !patternValue.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, RegexpExpression.class); |
| |
| RegexpExpression regexpExpression = (RegexpExpression) expression; |
| assertEquals(toString(), regexpExpression.toParsedText()); |
| assertEquals(!patternValue.isNull(), regexpExpression.hasPatternValue()); |
| assertEquals(hasSpaceAfterIdentifier, regexpExpression.hasSpaceAfterIdentifier()); |
| assertEquals(!stringExpression.isNull(), regexpExpression.hasSpaceAfterStringExpression()); |
| assertEquals(!stringExpression.isNull(), regexpExpression.hasStringExpression()); |
| |
| stringExpression.test(regexpExpression.getStringExpression()); |
| patternValue .test(regexpExpression.getPatternValue()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(stringExpression); |
| if (!stringExpression.isNull()) { |
| sb.append(SPACE); |
| } |
| sb.append(REGEXP); |
| if (hasSpaceAfterIdentifier) { |
| sb.append(SPACE); |
| } |
| sb.append(patternValue); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class ResultVariableTester extends AbstractExpressionTester { |
| |
| private boolean hasAs; |
| public boolean hasSpaceAfterAs; |
| private ExpressionTester resultVariable; |
| private ExpressionTester selectExpression; |
| |
| protected ResultVariableTester(ExpressionTester selectExpression, |
| boolean hasAs, |
| ExpressionTester resultVariable) { |
| |
| super(); |
| this.hasAs = hasAs; |
| this.hasSpaceAfterAs = hasAs; |
| this.selectExpression = selectExpression; |
| this.resultVariable = resultVariable; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| |
| assertInstance(expression, ResultVariable.class); |
| ResultVariable resultVariable = (ResultVariable) expression; |
| |
| assertEquals(toString(), resultVariable.toParsedText()); |
| assertEquals(hasAs, resultVariable.hasAs()); |
| assertEquals(hasSpaceAfterAs, resultVariable.hasSpaceAfterAs()); |
| assertEquals(!this.resultVariable.isNull(), resultVariable.hasResultVariable()); |
| assertEquals(!selectExpression.isNull(), resultVariable.hasSelectExpression()); |
| |
| this.selectExpression.test(resultVariable.getSelectExpression()); |
| this.resultVariable .test(resultVariable.getResultVariable()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(selectExpression); |
| if (!selectExpression.isNull()) { |
| sb.append(SPACE); |
| } |
| if (hasAs) { |
| sb.append(AS); |
| } |
| if (hasSpaceAfterAs) { |
| sb.append(SPACE); |
| } |
| sb.append(resultVariable); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class SelectClauseTester extends AbstractSelectClauseTester { |
| |
| protected SelectClauseTester(ExpressionTester selectExpressions, boolean hasDistinct) { |
| super(selectExpressions, hasDistinct); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| assertInstance(expression, SelectClause.class); |
| } |
| } |
| |
| public static final class SelectStatementTester extends AbstractSelectStatementTester { |
| |
| public boolean hasSpaceBeforeOrderByClause; |
| public boolean hasSpaceBeforeUnionClauses; |
| private ExpressionTester orderByClause; |
| private ExpressionTester unionClauses; |
| |
| protected SelectStatementTester(ExpressionTester selectClause, |
| ExpressionTester fromClause, |
| ExpressionTester whereClause, |
| ExpressionTester groupByClause, |
| ExpressionTester havingClause, |
| ExpressionTester orderByClause, |
| ExpressionTester unionClauses) { |
| |
| super(selectClause, |
| fromClause, |
| whereClause, |
| groupByClause, |
| havingClause); |
| |
| this.orderByClause = orderByClause; |
| this.unionClauses = unionClauses; |
| |
| this.hasSpaceBeforeOrderByClause = !orderByClause.isNull(); |
| this.hasSpaceBeforeUnionClauses = !unionClauses .isNull(); |
| |
| // hasSpaceAfterFrom |= (!fromClause .isNull() && (!whereClause.isNull() || !groupByClause.isNull() && havingClause .isNull() && !orderByClause.isNull() && !unionClauses.isNull()); |
| // hasSpaceAfterWhere |= (!whereClause .isNull() && groupByClause.isNull() && !havingClause .isNull() && !orderByClause.isNull() && !unionClauses .isNull()); |
| // hasSpaceAfterHierarchicalQueryClause |= (!whereClause .isNull() && groupByClause.isNull() && !havingClause .isNull() && !orderByClause.isNull() && !unionClauses .isNull()); |
| // hasSpaceAfterGroupBy |= (!groupByClause.isNull() && havingClause .isNull() && !orderByClause.isNull() && !unionClauses.isNull()); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSelectStatement> expressionType() { |
| return SelectStatement.class; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| |
| SelectStatement selectStatement = (SelectStatement) expression; |
| assertEquals(!orderByClause.isNull(), selectStatement.hasOrderByClause()); |
| // assertEquals(hasSpaceBeforeOrderByClause, selectStatement.hasSpaceBeforeOrderBy()); |
| |
| orderByClause.test(selectStatement.getOrderByClause()); |
| unionClauses .test(selectStatement.getUnionClauses()); |
| } |
| |
| @Override |
| public String toString() { |
| |
| StringBuilder sb = new StringBuilder(); |
| sb.append(super.toString()); |
| if (hasSpaceBeforeOrderByClause && sb.charAt(sb.length() - 1) != ' ') { |
| sb.append(SPACE); |
| } |
| sb.append(orderByClause); |
| if (hasSpaceBeforeUnionClauses && sb.charAt(sb.length() - 1) != ' ') { |
| sb.append(SPACE); |
| } |
| sb.append(unionClauses); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class SimpleFromClauseTester extends AbstractFromClauseTester { |
| |
| protected SimpleFromClauseTester(ExpressionTester declaration, |
| ExpressionTester hierarchicalQueryClause, |
| ExpressionTester asOfClause) { |
| |
| super(declaration, hierarchicalQueryClause, asOfClause); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| assertInstance(expression, SimpleFromClause.class); |
| } |
| } |
| |
| public static final class SimpleSelectClauseTester extends AbstractSelectClauseTester { |
| |
| protected SimpleSelectClauseTester(ExpressionTester selectExpressions, boolean hasDistinct) { |
| super(selectExpressions, hasDistinct); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| assertInstance(expression, SimpleSelectClause.class); |
| } |
| } |
| |
| public static final class SimpleSelectStatementTester extends AbstractSelectStatementTester { |
| |
| protected SimpleSelectStatementTester(ExpressionTester selectClause, |
| ExpressionTester fromClause, |
| ExpressionTester whereClause, |
| ExpressionTester groupByClause, |
| ExpressionTester havingClause) { |
| |
| super(selectClause, fromClause, whereClause, groupByClause, havingClause); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSelectStatement> expressionType() { |
| return SimpleSelectStatement.class; |
| } |
| } |
| |
| public static final class SizeExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected SizeExpressionTester(ExpressionTester collectionPath) { |
| super(collectionPath); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return SizeExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return SIZE; |
| } |
| } |
| |
| public static final class SqrtExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected SqrtExpressionTester(ExpressionTester expression) { |
| super(expression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return SqrtExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return SQRT; |
| } |
| } |
| |
| public static final class StartWithClauseTester extends AbstractConditionalClauseTester { |
| |
| protected StartWithClauseTester(ExpressionTester expression) { |
| super(expression); |
| } |
| |
| @Override |
| protected Class<StartWithClause> expressionType() { |
| return StartWithClause.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return START_WITH; |
| } |
| } |
| |
| public static final class StateFieldPathExpressionTester extends AbstractPathExpressionTester { |
| |
| protected StateFieldPathExpressionTester(ExpressionTester identificationVariable, |
| String value) { |
| |
| super(identificationVariable, value); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| assertInstance(expression, StateFieldPathExpression.class); |
| } |
| } |
| |
| public static final class StringLiteralTester extends AbstractExpressionTester { |
| |
| private boolean hasCloseQuote; |
| private String literal; |
| |
| protected StringLiteralTester(String literal) { |
| |
| super(); |
| this.literal = literal; |
| |
| if (literal.length() > 1) { |
| char lastChar = literal.charAt(literal.length() - 1); |
| hasCloseQuote = (lastChar == SINGLE_QUOTE) || (lastChar == DOUBLE_QUOTE); |
| } |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, StringLiteral.class); |
| |
| StringLiteral stringLiteral = (StringLiteral) expression; |
| assertEquals(toString(), stringLiteral.toString()); |
| assertEquals(hasCloseQuote, stringLiteral.hasCloseQuote()); |
| } |
| |
| @Override |
| public String toString() { |
| return literal; |
| } |
| } |
| |
| public static final class SubExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected SubExpressionTester(ExpressionTester expression) { |
| super(expression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return SubExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return ExpressionTools.EMPTY_STRING; |
| } |
| } |
| |
| public static final class SubstringExpressionTester extends AbstractTripleEncapsulatedExpressionTester { |
| |
| protected SubstringExpressionTester(ExpressionTester firstExpression, |
| ExpressionTester firstArithmeticExpression, |
| ExpressionTester secondArithmeticExpression) { |
| |
| super(firstExpression, firstArithmeticExpression, secondArithmeticExpression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractTripleEncapsulatedExpression> expressionType() { |
| return SubstringExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return SubstringExpression.SUBSTRING; |
| } |
| } |
| |
| public static final class SubtractionExpressionTester extends CompoundExpressionTester { |
| |
| protected SubtractionExpressionTester(ExpressionTester leftExpression, |
| ExpressionTester rightExpression) { |
| |
| super(leftExpression, rightExpression); |
| } |
| |
| @Override |
| protected Class<? extends CompoundExpression> expressionType() { |
| return SubtractionExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return MINUS; |
| } |
| } |
| |
| public static final class SumFunctionTester extends AggregateFunctionTester { |
| |
| protected SumFunctionTester(ExpressionTester expression, boolean hasDistinct) { |
| super(expression, hasDistinct); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return SumFunction.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return SUM; |
| } |
| } |
| |
| public static final class TableExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected TableExpressionTester(ExpressionTester expression) { |
| super(expression); |
| } |
| |
| @Override |
| protected Class<TableExpression> expressionType() { |
| return TableExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return TABLE; |
| } |
| } |
| |
| public static final class TableVariableDeclarationTester extends AbstractExpressionTester { |
| |
| |
| private boolean hasAs; |
| public boolean hasSpaceAfterAs; |
| public boolean hasSpaceAfterTableExpression; |
| private ExpressionTester identificationVariable; |
| private TableExpressionTester tableExpression; |
| |
| protected TableVariableDeclarationTester(TableExpressionTester tableExpression, |
| boolean hasAs, |
| ExpressionTester identificationVariable) { |
| super(); |
| this.tableExpression = tableExpression; |
| this.hasAs = hasAs; |
| this.identificationVariable = identificationVariable; |
| this.hasSpaceAfterTableExpression = hasAs || !identificationVariable.isNull(); |
| this.hasSpaceAfterAs = hasAs && !identificationVariable.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, Expression.class); |
| |
| TableVariableDeclaration tableVariableDeclaration = (TableVariableDeclaration) expression; |
| assertEquals(toString(), tableVariableDeclaration.toParsedText()); |
| assertEquals(!identificationVariable.isNull(), tableVariableDeclaration.hasIdentificationVariable()); |
| assertEquals(hasAs, tableVariableDeclaration.hasAs()); |
| assertEquals(hasSpaceAfterAs, tableVariableDeclaration.hasSpaceAfterAs()); |
| assertEquals(hasSpaceAfterTableExpression, tableVariableDeclaration.hasSpaceAfterTableExpression()); |
| |
| tableExpression .test(tableVariableDeclaration.getTableExpression()); |
| identificationVariable.test(tableVariableDeclaration.getIdentificationVariable()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(tableExpression); |
| if (hasSpaceAfterTableExpression) { |
| sb.append(SPACE); |
| } |
| if (hasAs) { |
| sb.append(AS); |
| } |
| if (hasSpaceAfterAs) { |
| sb.append(SPACE); |
| } |
| sb.append(identificationVariable); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class TreatExpressionTester extends AbstractEncapsulatedExpressionTester { |
| |
| private ExpressionTester collectionValuedPathExpression; |
| private ExpressionTester entityTypeName; |
| private boolean hasAs; |
| public boolean hasSpaceAfterAs; |
| public boolean hasSpaceAfterCollectionValuedPathExpression; |
| |
| protected TreatExpressionTester(ExpressionTester collectionValuedPathExpression, |
| boolean hasAs, |
| ExpressionTester entityTypeName) { |
| super(); |
| this.hasAs = hasAs; |
| this.entityTypeName = entityTypeName; |
| this.hasSpaceAfterAs = hasAs; |
| this.hasSpaceAfterCollectionValuedPathExpression = true; |
| this.collectionValuedPathExpression = collectionValuedPathExpression; |
| } |
| |
| @Override |
| protected Class<? extends AbstractEncapsulatedExpression> expressionType() { |
| return TreatExpression.class; |
| } |
| |
| @Override |
| protected boolean hasEncapsulatedExpression() { |
| return !collectionValuedPathExpression.isNull() || !entityTypeName.isNull() || hasAs; |
| } |
| |
| @Override |
| protected String identifier() { |
| return TREAT; |
| } |
| |
| @Override |
| protected void toStringEncapsulatedExpression(StringBuilder sb) { |
| sb.append(collectionValuedPathExpression); |
| if (hasSpaceAfterCollectionValuedPathExpression) { |
| sb.append(SPACE); |
| } |
| if (hasAs) { |
| sb.append(AS); |
| } |
| if (hasSpaceAfterAs) { |
| sb.append(SPACE); |
| } |
| sb.append(entityTypeName); |
| } |
| } |
| |
| public static final class TrimExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| private boolean hasFrom; |
| public boolean hasSpaceAfterFrom; |
| public boolean hasSpaceAfterSpecification; |
| public boolean hasSpaceAfterTrimCharacter; |
| private Specification specification; |
| private ExpressionTester trimCharacter; |
| |
| protected TrimExpressionTester(Specification specification, |
| ExpressionTester stringPrimary, |
| ExpressionTester trimCharacter, |
| boolean hasFrom) { |
| |
| super(stringPrimary); |
| this.specification = specification; |
| this.trimCharacter = trimCharacter; |
| this.hasFrom = hasFrom; |
| this.hasSpaceAfterFrom = hasFrom; |
| this.hasSpaceAfterTrimCharacter = !trimCharacter.isNull(); |
| this.hasSpaceAfterSpecification = specification != Specification.DEFAULT; |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return TrimExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return TRIM; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| super.test(expression); |
| |
| TrimExpression trimExpression = (TrimExpression) expression; |
| assertEquals(hasFrom, trimExpression.hasFrom()); |
| assertEquals(hasSpaceAfterFrom, trimExpression.hasSpaceAfterFrom()); |
| assertEquals(hasSpaceAfterTrimCharacter, trimExpression.hasSpaceAfterTrimCharacter()); |
| assertEquals(!trimCharacter.isNull(), trimExpression.hasTrimCharacter()); |
| assertEquals(specification != Specification.DEFAULT, trimExpression.hasSpecification()); |
| assertEquals(hasSpaceAfterSpecification, trimExpression.hasSpaceAfterSpecification()); |
| |
| trimCharacter.test(trimExpression.getTrimCharacter()); |
| } |
| |
| @Override |
| protected void toStringEncapsulatedExpression(StringBuilder sb) { |
| if (specification != Specification.DEFAULT) { |
| sb.append(specification); |
| } |
| if (hasSpaceAfterSpecification) { |
| sb.append(SPACE); |
| } |
| sb.append(trimCharacter); |
| if (hasSpaceAfterTrimCharacter) { |
| sb.append(SPACE); |
| } |
| if (hasFrom) { |
| sb.append(FROM); |
| } |
| if (hasSpaceAfterFrom) { |
| sb.append(SPACE); |
| } |
| super.toStringEncapsulatedExpression(sb); |
| } |
| } |
| |
| public static final class TypeExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected TypeExpressionTester(ExpressionTester identificationVariable) { |
| super(identificationVariable); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return TypeExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return TYPE; |
| } |
| } |
| |
| public static final class UnionClauseTester extends AbstractExpressionTester { |
| |
| private boolean hasAll; |
| public boolean hasSpaceAfterAll; |
| public boolean hasSpaceAfterIdentifier; |
| private String identifier; |
| private ExpressionTester subquery; |
| |
| protected UnionClauseTester(String identifier, boolean hasAll, ExpressionTester subquery) { |
| super(); |
| this.identifier = identifier; |
| this.hasAll = hasAll; |
| this.subquery = subquery; |
| this.hasSpaceAfterIdentifier = hasAll || !subquery.isNull(); |
| this.hasSpaceAfterAll = hasAll && !subquery.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, UnionClause.class); |
| |
| UnionClause unionClause = (UnionClause) expression; |
| assertEquals(toString(), unionClause.toParsedText()); |
| assertEquals(identifier, unionClause.getIdentifier()); |
| assertEquals(hasSpaceAfterIdentifier, unionClause.hasSpaceAfterIdentifier()); |
| assertEquals(hasAll, unionClause.hasAll()); |
| assertEquals(!subquery.isNull(), unionClause.hasQuery()); |
| assertEquals(hasSpaceAfterAll, unionClause.hasSpaceAfterAll()); |
| |
| subquery.test(unionClause.getQuery()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(identifier); |
| if (hasSpaceAfterIdentifier) { |
| sb.append(SPACE); |
| } |
| if (hasAll) { |
| sb.append(ALL); |
| } |
| if (hasSpaceAfterAll) { |
| sb.append(SPACE); |
| } |
| sb.append(subquery); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class UnknownExpressionTester extends AbstractExpressionTester { |
| |
| private final String unknownText; |
| |
| protected UnknownExpressionTester(String unknownText) { |
| super(); |
| this.unknownText = unknownText; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, UnknownExpression.class); |
| |
| UnknownExpression unknownExpression = (UnknownExpression) expression; |
| assertEquals(toString(), unknownExpression.toParsedText()); |
| } |
| |
| @Override |
| public String toString() { |
| return unknownText; |
| } |
| } |
| |
| public static final class UpdateClauseTester extends AbstractExpressionTester { |
| |
| public boolean hasSet; |
| public boolean hasSpaceAfterRangeVariableDeclaration; |
| public boolean hasSpaceAfterSet; |
| public boolean hasSpaceAfterUpdate; |
| private ExpressionTester rangeVariableDeclaration; |
| private ExpressionTester updateItems; |
| |
| protected UpdateClauseTester(ExpressionTester rangeVariableDeclaration, |
| ExpressionTester updateItems) { |
| |
| super(); |
| this.hasSet = true; |
| this.hasSpaceAfterSet = true; |
| this.hasSpaceAfterUpdate = true; |
| this.updateItems = updateItems; |
| this.rangeVariableDeclaration = rangeVariableDeclaration; |
| this.hasSpaceAfterRangeVariableDeclaration = !rangeVariableDeclaration.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, UpdateClause.class); |
| |
| UpdateClause updateClause = (UpdateClause) expression; |
| assertEquals(toString(), updateClause.toParsedText()); |
| assertEquals(!rangeVariableDeclaration.isNull(), updateClause.hasRangeVariableDeclaration()); |
| assertEquals(hasSet, updateClause.hasSet()); |
| assertEquals(hasSpaceAfterSet, updateClause.hasSpaceAfterSet()); |
| assertEquals(hasSpaceAfterUpdate, updateClause.hasSpaceAfterUpdate()); |
| assertEquals(!updateItems.isNull(), updateClause.hasUpdateItems()); |
| assertEquals(hasSpaceAfterRangeVariableDeclaration, updateClause.hasSpaceAfterRangeVariableDeclaration()); |
| |
| rangeVariableDeclaration.test(updateClause.getRangeVariableDeclaration()); |
| updateItems.test(updateClause.getUpdateItems()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(UPDATE); |
| if (hasSpaceAfterUpdate) { |
| sb.append(SPACE); |
| } |
| sb.append(rangeVariableDeclaration); |
| if (hasSpaceAfterRangeVariableDeclaration) { |
| sb.append(SPACE); |
| } |
| if (hasSet) { |
| sb.append(SET); |
| } |
| if (hasSpaceAfterSet) { |
| sb.append(SPACE); |
| } |
| sb.append(updateItems); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class UpdateItemTester extends AbstractExpressionTester { |
| |
| public boolean hasEqualSign; |
| public boolean hasSpaceAfterEqualSign; |
| public boolean hasSpaceAfterStateFieldPathExpression; |
| private ExpressionTester newValue; |
| private ExpressionTester stateFieldPathExpression; |
| |
| protected UpdateItemTester(ExpressionTester stateFieldPathExpression, |
| ExpressionTester newValue) { |
| |
| super(); |
| this.stateFieldPathExpression = stateFieldPathExpression; |
| this.newValue = newValue; |
| this.hasSpaceAfterStateFieldPathExpression = true; |
| this.hasSpaceAfterEqualSign = true; |
| this.hasEqualSign = true; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, UpdateItem.class); |
| |
| UpdateItem updateItem = (UpdateItem) expression; |
| assertEquals(toString(), updateItem.toParsedText()); |
| assertEquals(hasEqualSign, updateItem.hasEqualSign()); |
| assertEquals(!newValue.isNull(), updateItem.hasNewValue()); |
| assertEquals(hasSpaceAfterEqualSign, updateItem.hasSpaceAfterEqualSign()); |
| assertEquals(hasSpaceAfterStateFieldPathExpression, updateItem.hasSpaceAfterStateFieldPathExpression()); |
| assertEquals(!stateFieldPathExpression.isNull(), updateItem.hasStateFieldPathExpression()); |
| |
| stateFieldPathExpression.test(updateItem.getStateFieldPathExpression()); |
| newValue.test(updateItem.getNewValue()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(stateFieldPathExpression); |
| if (hasSpaceAfterStateFieldPathExpression) { |
| sb.append(SPACE); |
| } |
| if (hasEqualSign) { |
| sb.append(EQUAL); |
| } |
| if (hasSpaceAfterEqualSign) { |
| sb.append(SPACE); |
| } |
| sb.append(newValue); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class UpdateStatementTester extends AbstractExpressionTester { |
| |
| public boolean hasSpaceAfterUpdateClause; |
| private ExpressionTester updateClause; |
| private ExpressionTester whereClause; |
| |
| protected UpdateStatementTester(ExpressionTester updateClause, ExpressionTester whereClause) { |
| super(); |
| this.updateClause = updateClause; |
| this.whereClause = whereClause; |
| this.hasSpaceAfterUpdateClause = !whereClause.isNull(); |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, UpdateStatement.class); |
| |
| UpdateStatement updateStatement = (UpdateStatement) expression; |
| assertEquals(toString(), updateStatement.toParsedText()); |
| assertEquals(hasSpaceAfterUpdateClause, updateStatement.hasSpaceAfterUpdateClause()); |
| assertEquals(!whereClause.isNull(), updateStatement.hasWhereClause()); |
| |
| updateClause.test(updateStatement.getUpdateClause()); |
| whereClause .test(updateStatement.getWhereClause()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(updateClause); |
| |
| if (hasSpaceAfterUpdateClause) { |
| sb.append(SPACE); |
| } |
| |
| sb.append(whereClause); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class UpperExpressionTester extends AbstractSingleEncapsulatedExpressionTester { |
| |
| protected UpperExpressionTester(ExpressionTester expression) { |
| super(expression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractSingleEncapsulatedExpression> expressionType() { |
| return UpperExpression.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return UPPER; |
| } |
| } |
| |
| public static final class WhenClauseTester extends AbstractExpressionTester { |
| |
| public boolean hasSpaceAfterThen; |
| public boolean hasSpaceAfterWhen; |
| public boolean hasSpaceAfterWhenExpression; |
| public boolean hasThen; |
| private ExpressionTester thenExpression; |
| private ExpressionTester whenExpression; |
| |
| protected WhenClauseTester(ExpressionTester whenExpression, ExpressionTester thenExpression) { |
| super(); |
| this.hasSpaceAfterWhenExpression = true; |
| this.hasSpaceAfterThen = true; |
| this.hasSpaceAfterWhen = true; |
| this.hasThen = true; |
| this.thenExpression = thenExpression; |
| this.whenExpression = whenExpression; |
| } |
| |
| @Override |
| public void test(Expression expression) { |
| assertInstance(expression, WhenClause.class); |
| |
| WhenClause whenClause = (WhenClause) expression; |
| assertEquals(toString(), whenClause.toParsedText()); |
| assertEquals(!whenExpression.isNull(), whenClause.hasWhenExpression()); |
| assertEquals(hasSpaceAfterWhenExpression, whenClause.hasSpaceAfterWhenExpression()); |
| assertEquals(hasSpaceAfterThen, whenClause.hasSpaceAfterThen()); |
| assertEquals(hasSpaceAfterWhen, whenClause.hasSpaceAfterWhen()); |
| assertEquals(hasThen, whenClause.hasThen()); |
| assertEquals(!thenExpression.isNull(), whenClause.hasThenExpression()); |
| |
| whenExpression.test(whenClause.getWhenExpression()); |
| thenExpression.test(whenClause.getThenExpression()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append(WHEN); |
| if (hasSpaceAfterWhen) { |
| sb.append(SPACE); |
| } |
| sb.append(whenExpression); |
| if (hasSpaceAfterWhenExpression) { |
| sb.append(SPACE); |
| } |
| if (hasThen) { |
| sb.append(THEN); |
| } |
| if (hasSpaceAfterWhen) { |
| sb.append(SPACE); |
| } |
| sb.append(thenExpression); |
| return sb.toString(); |
| } |
| } |
| |
| public static final class WhereClauseTester extends AbstractConditionalClauseTester { |
| |
| protected WhereClauseTester(ExpressionTester conditionalExpression) { |
| super(conditionalExpression); |
| } |
| |
| @Override |
| protected Class<? extends AbstractConditionalClause> expressionType() { |
| return WhereClause.class; |
| } |
| |
| @Override |
| protected String identifier() { |
| return WHERE; |
| } |
| } |
| } |