/*
 * 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.jpql.parser;

import org.eclipse.persistence.jpa.jpql.ExpressionTools;
import org.eclipse.persistence.jpa.jpql.JPAVersion;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.*;

/**
 * <p>This {@link JPQLGrammar} provides support for parsing JPQL queries defined in <a
 * href="http://jcp.org/en/jsr/detail?id=220">JSR-220 - Enterprise JavaBeans 3.0</a>.</p>
 *
 * The following is the JPQL grammar defined in JPA version 1.0.
 *
 * <pre><code> QL_statement ::= select_statement | update_statement | delete_statement
 *
 * select_statement ::= select_clause from_clause [where_clause] [groupby_clause] [having_clause] [orderby_clause]
 *
 * update_statement ::= update_clause [where_clause]
 *
 * delete_statement ::= delete_clause [where_clause]
 *
 * from_clause ::= FROM identification_variable_declaration {, {identification_variable_declaration | collection_member_declaration}}*
 *
 * identification_variable_declaration ::= range_variable_declaration { join | fetch_join }*
 *
 * range_variable_declaration ::= abstract_schema_name [AS] identification_variable
 *
 * join ::= join_spec join_association_path_expression [AS] identification_variable
 *
 * fetch_join ::= join_spec FETCH join_association_path_expression
 *
 * association_path_expression ::= collection_valued_path_expression | single_valued_association_path_expression
 *
 * join_spec::= [ LEFT [OUTER] | INNER ] JOIN
 *
 * join_association_path_expression ::= join_collection_valued_path_expression |
 *                                      join_single_valued_association_path_expression
 *
 * join_collection_valued_path_expression::= identification_variable.collection_valued_association_field
 *
 * join_single_valued_association_path_expression::= identification_variable.single_valued_association_field
 *
 * collection_member_declaration ::= IN (collection_valued_path_expression) [AS] identification_variable
 *
 * single_valued_path_expression ::= state_field_path_expression |
 *                                   single_valued_association_path_expression
 *
 * state_field_path_expression ::= {identification_variable | single_valued_association_path_expression}.state_field
 *
 * single_valued_association_path_expression ::= identification_variable.{single_valued_association_field.}* single_valued_association_field
 *
 * collection_valued_path_expression ::= identification_variable.{single_valued_association_field.}*collection_valued_association_field
 *
 * state_field ::= {embedded_class_state_field.}*simple_state_field
 *
 * update_clause ::= UPDATE abstract_schema_name [[AS] identification_variable] SET update_item {, update_item}*
 *
 * update_item ::= [identification_variable.]{state_field | single_valued_association_field} = new_value
 *
 * new_value ::= simple_arithmetic_expression |
 *               string_primary |
 *               datetime_primary |
 *               boolean_primary |
 *               enum_primary |
 *               simple_entity_expression |
 *               NULL
 *
 * delete_clause ::= DELETE FROM abstract_schema_name [[AS] identification_variable]
 *
 * select_clause ::= SELECT [DISTINCT] select_expression {, select_expression}*
 *
 * select_expression ::= single_valued_path_expression |
 *                       aggregate_expression |
 *                       identification_variable |
 *                       OBJECT(identification_variable) |
 *                       constructor_expression
 *
 * constructor_expression ::= NEW constructor_name ( constructor_item {, constructor_item}* )
 *
 * constructor_item ::= single_valued_path_expression | aggregate_expression
 *
 * aggregate_expression ::= { AVG | MAX | MIN | SUM } ([DISTINCT] state_field_path_expression) |
 *                          COUNT ([DISTINCT] identification_variable |
 *                                            state_field_path_expression |
 *                                            single_valued_association_path_expression)
 *
 * where_clause ::= WHERE conditional_expression
 *
 * groupby_clause ::= GROUP BY groupby_item {, groupby_item}*
 *
 * groupby_item ::= single_valued_path_expression | identification_variable
 *
 * having_clause ::= HAVING conditional_expression
 *
 * orderby_clause ::= ORDER BY orderby_item {, orderby_item}*
 *
 * orderby_item ::= state_field_path_expression [ ASC | DESC ]
 *
 * subquery ::= simple_select_clause subquery_from_clause [where_clause] [groupby_clause] [having_clause]
 *
 * subquery_from_clause ::= FROM subselect_identification_variable_declaration {, subselect_identification_variable_declaration}*
 *
 * subselect_identification_variable_declaration ::= identification_variable_declaration |
 *                                                   association_path_expression [AS] identification_variable |
 *                                                   collection_member_declaration
 *
 * simple_select_clause ::= SELECT [DISTINCT] simple_select_expression
 *
 * simple_select_expression::= single_valued_path_expression |
 *                             aggregate_expression |
 *                             identification_variable
 *
 * conditional_expression ::= conditional_term | conditional_expression OR conditional_term
 *
 * conditional_term ::= conditional_factor | conditional_term AND conditional_factor
 *
 * conditional_factor ::= [ NOT ] conditional_primary
 *
 * conditional_primary ::= simple_cond_expression | (conditional_expression)
 *
 * simple_cond_expression ::= comparison_expression |
 *                            between_expression |
 *                            like_expression |
 *                            in_expression |
 *                            null_comparison_expression |
 *                            empty_collection_comparison_expression |
 *                            collection_member_expression |
 *                            exists_expression
 *
 * between_expression ::= arithmetic_expression [NOT] BETWEEN arithmetic_expression AND arithmetic_expression |
 *                        string_expression [NOT] BETWEEN string_expression AND string_expression |
 *                        datetime_expression [NOT] BETWEEN datetime_expression AND datetime_expression
 *
 * in_expression ::= state_field_path_expression [NOT] IN ( in_item {, in_item}* | subquery)
 *
 * in_item ::= literal | input_parameter
 *
 * like_expression ::= string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]
 *
 * escape_character ::= single_character_string_literal | character_valued_input_parameter
 *
 * null_comparison_expression ::= {single_valued_path_expression | input_parameter} IS [NOT] NULL
 *
 * empty_collection_comparison_expression ::= collection_valued_path_expression IS [NOT] EMPTY
 *
 * collection_member_expression ::= entity_expression [NOT] MEMBER [OF] collection_valued_path_expression
 *
 * exists_expression::= [NOT] EXISTS (subquery)
 *
 * all_or_any_expression ::= { ALL | ANY | SOME} (subquery)
 *
 * comparison_expression ::= string_expression comparison_operator {string_expression | all_or_any_expression} |
 *                           boolean_expression { = | {@literal <>} } {boolean_expression | all_or_any_expression} |
 *                           enum_expression { = | {@literal <>} } {enum_expression | all_or_any_expression} |
 *                           datetime_expression comparison_operator {datetime_expression | all_or_any_expression} |
 *                           entity_expression { = | {@literal <>} } {entity_expression | all_or_any_expression} |
 *                           arithmetic_expression comparison_operator {arithmetic_expression | all_or_any_expression}
 *
 * comparison_operator ::= = | {@literal > | >= | < | <= | <>}
 *
 * arithmetic_expression ::= simple_arithmetic_expression | (subquery)
 *
 * simple_arithmetic_expression ::= arithmetic_term | simple_arithmetic_expression { + | - } arithmetic_term
 *
 * arithmetic_term ::= arithmetic_factor | arithmetic_term { * | / } arithmetic_factor
 *
 * arithmetic_factor ::= [{ + | - }] arithmetic_primary
 *
 * arithmetic_primary ::= state_field_path_expression |
 *                        numeric_literal |
 *                        (simple_arithmetic_expression) |
 *                        input_parameter |
 *                        functions_returning_numerics |
 *                        aggregate_expression
 *
 * string_expression ::= string_primary | (subquery)
 *
 * string_primary ::= state_field_path_expression |
 *                    string_literal |
 *                    input_parameter |
 *                    functions_returning_strings |
 *                    aggregate_expression
 *
 * datetime_expression ::= datetime_primary | (subquery)
 *
 * datetime_primary ::= state_field_path_expression |
 *                      input_parameter |
 *                      functions_returning_datetime |
 *                      aggregate_expression
 *
 * boolean_expression ::= boolean_primary | (subquery)
 *
 * boolean_primary ::= state_field_path_expression | boolean_literal | input_parameter |
 *
 * enum_expression ::= enum_primary | (subquery)
 *
 * enum_primary ::= state_field_path_expression | enum_literal | input_parameter
 *
 * entity_expression ::= single_valued_association_path_expression | simple_entity_expression
 *
 * simple_entity_expression ::= identification_variable | input_parameter
 *
 * functions_returning_numerics::= LENGTH(string_primary) |
 *                                 LOCATE(string_primary, string_primary[, simple_arithmetic_expression]) |
 *                                 ABS(simple_arithmetic_expression) |
 *                                 SQRT(simple_arithmetic_expression) |
 *                                 MOD(simple_arithmetic_expression, simple_arithmetic_expression) |
 *                                 SIZE(collection_valued_path_expression)
 *
 * functions_returning_datetime ::= CURRENT_DATE| CURRENT_TIME | CURRENT_TIMESTAMP
 *
 * functions_returning_strings ::= CONCAT(string_primary, string_primary) |
 *                                 SUBSTRING(string_primary, simple_arithmetic_expression, simple_arithmetic_expression) |
 *                                 TRIM([[trim_specification] [trim_character] FROM] string_primary) |
 *                                 LOWER(string_primary) |
 *                                 UPPER(string_primary)
 *
 * trim_specification ::= LEADING | TRAILING | BOTH
 *
 * boolean_literal ::= TRUE | FALSE
 *
 * string_literal ::= 'string'
 *
 * enum_literal ::= {package_name.}*EnumType.CONSTANT
 *
 * literalTemporal ::= date_literal | TIME_LITERAL | TIMESTAMP_LITERAL
 *
 * input_parameter ::= (':' [a-zA-Z]+) | ('?' [0-9]+);  // TODO: TO COMPLETE
 *
 * date_literal ::= "{" "'d'" (' ' | '\t')+ '\'' DATE_STRING '\'' (' ' | '\t')* "}"
 *
 * TIME_LITERAL ::= "{" "'t'" (' ' | '\t')+ '\'' TIME_STRING '\'' (' ' | '\t')* "}"
 *
 * TIMESTAMP_LITERAL ::= "{" ('ts') (' ' | '\t')+ '\'' DATE_STRING ' ' TIME_STRING '\'' (' ' | '\t')* "}"
 *
 * DATE_STRING ::= [0-9] [0-9] [0-9] [0-9] '-' [0-9] [0-9] '-' [0-9] [0-9]
 *
 * TIME_STRING ::= [0-9] ([0-9])? ':' [0-9] [0-9] ':' [0-9] [0-9] '.' [0-9]*</code></pre>
 *
 * <p>Provisional API: This interface is part of an interim API that is still under development and
 * expected to change significantly before reaching stability. It is available at this early stage
 * to solicit feedback from pioneering adopters on the understanding that any code that uses this
 * API will almost certainly be broken (repeatedly) as the API evolves.</p>
 *
 * @version 2.5
 * @since 2.4
 * @author Pascal Filion
 */
@SuppressWarnings("nls")
public final class JPQLGrammar1_0 extends AbstractJPQLGrammar {

    /**
     * The singleton instance of this {@link JPQLGrammar1_0}.
     */
    private static final JPQLGrammar INSTANCE = new JPQLGrammar1_0();

    /**
     * Creates a new <code>JPQLGrammar1_0</code>.
     */
    public JPQLGrammar1_0() {
        super();
    }

    /**
     * Returns the singleton instance of the default implementation of {@link JPQLGrammar} which
     * provides support for the JPQL grammar defined in the JPA 1.0 functional specification.
     *
     * @return The {@link JPQLGrammar} that only has support for JPA 1.0
     */
    public static JPQLGrammar instance() {
        return INSTANCE;
    }

    @Override
    protected JPQLGrammar buildBaseGrammar() {
        return null;
    }

    @Override
    public JPAVersion getJPAVersion() {
        return JPAVersion.VERSION_1_0;
    }

    @Override
    public String getProvider() {
        return DefaultJPQLGrammar.PROVIDER_NAME;
    }

    @Override
    public String getProviderVersion() {
        return ExpressionTools.EMPTY_STRING;
    }

    @Override
    protected void initializeBNFs() {

        registerBNF(new AbstractSchemaNameBNF());
        registerBNF(new AggregateExpressionBNF());
        registerBNF(new AllOrAnyExpressionBNF());
        registerBNF(new ArithmeticExpressionBNF());
        registerBNF(new ArithmeticFactorBNF());
        registerBNF(new ArithmeticPrimaryBNF());
        registerBNF(new ArithmeticTermBNF());
        registerBNF(new BadExpressionBNF());
        registerBNF(new BetweenExpressionBNF());
        registerBNF(new BooleanExpressionBNF());
        registerBNF(new BooleanLiteralBNF());
        registerBNF(new BooleanPrimaryBNF());
        registerBNF(new CollectionMemberDeclarationBNF());
        registerBNF(new CollectionMemberExpressionBNF());
        registerBNF(new CollectionValuedPathExpressionBNF());
        registerBNF(new ComparisonExpressionBNF());
        registerBNF(new ConditionalExpressionBNF());
        registerBNF(new ConditionalFactorBNF());
        registerBNF(new ConditionalPrimaryBNF());
        registerBNF(new ConditionalTermBNF());
        registerBNF(new ConstructorExpressionBNF());
        registerBNF(new ConstructorItemBNF());
        registerBNF(new DatetimeExpressionBNF());
        registerBNF(new DateTimePrimaryBNF());
        registerBNF(new DateTimeTimestampLiteralBNF());
        registerBNF(new DeleteClauseBNF());
        registerBNF(new DeleteClauseRangeVariableDeclarationBNF());
        registerBNF(new DeleteStatementBNF());
        registerBNF(new DerivedCollectionMemberDeclarationBNF());
        registerBNF(new EmptyCollectionComparisonExpressionBNF());
        registerBNF(new EntityExpressionBNF());
        registerBNF(new EntityOrValueExpressionBNF());
        registerBNF(new EnumExpressionBNF());
        registerBNF(new EnumLiteralBNF());
        registerBNF(new EnumPrimaryBNF());
        registerBNF(new ExistsExpressionBNF());
        registerBNF(new FromClauseBNF());
        registerBNF(new FunctionsReturningDatetimeBNF());
        registerBNF(new FunctionsReturningNumericsBNF());
        registerBNF(new FunctionsReturningStringsBNF());
        registerBNF(new GeneralIdentificationVariableBNF());
        registerBNF(new GroupByClauseBNF());
        registerBNF(new GroupByItemBNF());
        registerBNF(new HavingClauseBNF());
        registerBNF(new IdentificationVariableBNF());
        registerBNF(new IdentificationVariableDeclarationBNF());
        registerBNF(new InExpressionBNF());
        registerBNF(new InExpressionExpressionBNF());
        registerBNF(new InExpressionItemBNF());
        registerBNF(new InputParameterBNF());
        registerBNF(new InternalAggregateFunctionBNF());
        registerBNF(new InternalBetweenExpressionBNF());
        registerBNF(new InternalConcatExpressionBNF());
        registerBNF(new InternalCountBNF());
        registerBNF(new InternalFromClauseBNF());
        registerBNF(new InternalJoinBNF());
        registerBNF(new InternalLengthExpressionBNF());
        registerBNF(new InternalLocateStringExpressionBNF());
        registerBNF(new InternalLocateThirdExpressionBNF());
        registerBNF(new InternalLowerExpressionBNF());
        registerBNF(new InternalModExpressionBNF());
        registerBNF(new InternalOrderByClauseBNF());
        registerBNF(new InternalOrderByItemBNF());
        registerBNF(new InternalSelectExpressionBNF());
        registerBNF(new InternalSimpleFromClauseBNF());
        registerBNF(new InternalSimpleSelectExpressionBNF());
        registerBNF(new InternalSqrtExpressionBNF());
        registerBNF(new InternalSubstringPositionExpressionBNF());
        registerBNF(new InternalSubstringStringExpressionBNF());
        registerBNF(new InternalUpdateClauseBNF());
        registerBNF(new InternalUpperExpressionBNF());
        registerBNF(new JoinAssociationPathExpressionBNF());
        registerBNF(new JoinBNF());
        registerBNF(new JoinFetchBNF());
        registerBNF(new JPQLStatementBNF());
        registerBNF(new LikeExpressionBNF());
        registerBNF(new LikeExpressionEscapeCharacterBNF());
        registerBNF(new LiteralBNF());
        registerBNF(new NewValueBNF());
        registerBNF(new NullComparisonExpressionBNF());
        registerBNF(new NumericLiteralBNF());
        registerBNF(new ObjectExpressionBNF());
        registerBNF(new OrderByClauseBNF());
        registerBNF(new OrderByItemBNF());
        registerBNF(new PatternValueBNF());
        registerBNF(new RangeDeclarationBNF());
        registerBNF(new RangeVariableDeclarationBNF());
        registerBNF(new ScalarExpressionBNF());
        registerBNF(new SelectClauseBNF());
        registerBNF(new SelectExpressionBNF());
        registerBNF(new SelectStatementBNF());
        registerBNF(new SimpleArithmeticExpressionBNF());
        registerBNF(new SimpleCaseExpressionBNF());
        registerBNF(new SimpleConditionalExpressionBNF());
        registerBNF(new SimpleEntityExpressionBNF());
        registerBNF(new SimpleEntityOrValueExpressionBNF());
        registerBNF(new SimpleSelectClauseBNF());
        registerBNF(new SimpleSelectExpressionBNF());
        registerBNF(new SingleValuedPathExpressionBNF());
        registerBNF(new StateFieldPathExpressionBNF());
        registerBNF(new StringExpressionBNF());
        registerBNF(new StringLiteralBNF());
        registerBNF(new StringPrimaryBNF());
        registerBNF(new SubqueryBNF());
        registerBNF(new SubqueryFromClauseBNF());
        registerBNF(new SubSelectIdentificationVariableDeclarationBNF());
        registerBNF(new UpdateClauseBNF());
        registerBNF(new UpdateItemBNF());
        registerBNF(new UpdateItemStateFieldPathExpressionBNF());
        registerBNF(new UpdateStatementBNF());
        registerBNF(new WhereClauseBNF());
    }

    @Override
    protected void initializeExpressionFactories() {

        registerFactory(new AbsExpressionFactory());
        registerFactory(new AbstractSchemaNameFactory());
        registerFactory(new AllOrAnyExpressionFactory());
        registerFactory(new AndExpressionFactory());
        registerFactory(new ArithmeticExpressionFactory());
        registerFactory(new AvgFunctionFactory());
        registerFactory(new BadExpressionFactory());
        registerFactory(new BetweenExpressionFactory());
        registerFactory(new CollectionMemberDeclarationFactory());
        registerFactory(new CollectionMemberExpressionFactory());
        registerFactory(new CollectionValuedPathExpressionFactory());
        registerFactory(new ComparisonExpressionFactory());
        registerFactory(new ConcatExpressionFactory());
        registerFactory(new ConstructorExpressionFactory());
        registerFactory(new CountFunctionFactory());
        registerFactory(new DateTimeFactory());
        registerFactory(new DeleteClauseFactory());
        registerFactory(new DeleteStatementFactory());
        registerFactory(new ExistsExpressionFactory());
        registerFactory(new FromClauseFactory());
        registerFactory(new GroupByClauseFactory());
        registerFactory(new GroupByItemFactory());
        registerFactory(new HavingClauseFactory());
        registerFactory(new IdentificationVariableDeclarationFactory());
        registerFactory(new IdentificationVariableFactory());
        registerFactory(new InExpressionFactory());
        registerFactory(new InternalOrderByItemFactory());
        registerFactory(new IsExpressionFactory());
        registerFactory(new JoinFactory());
        registerFactory(new KeywordExpressionFactory());
        registerFactory(new LengthExpressionFactory());
        registerFactory(new LikeExpressionFactory());
        registerFactory(new LiteralExpressionFactory());
        registerFactory(new LocateExpressionFactory());
        registerFactory(new LowerExpressionFactory());
        registerFactory(new MaxFunctionFactory());
        registerFactory(new MinFunctionFactory());
        registerFactory(new ModExpressionFactory());
        registerFactory(new NotExpressionFactory());
        registerFactory(new ObjectExpressionFactory());
        registerFactory(new OrderByClauseFactory());
        registerFactory(new OrderByItemFactory());
        registerFactory(new OrExpressionFactory());
        registerFactory(new RangeDeclarationFactory());
        registerFactory(new RangeVariableDeclarationFactory());
        registerFactory(new SelectClauseFactory());
        registerFactory(new SelectStatementFactory());
        registerFactory(new SimpleSelectStatementFactory());
        registerFactory(new SizeExpressionFactory());
        registerFactory(new SqrtExpressionFactory());
        registerFactory(new StateFieldPathExpressionFactory());
        registerFactory(new StringLiteralFactory());
        registerFactory(new SubstringExpressionFactory());
        registerFactory(new SumFunctionFactory());
        registerFactory(new TrimExpressionFactory());
        registerFactory(new UnknownExpressionFactory());
        registerFactory(new UpdateClauseFactory());
        registerFactory(new UpdateItemFactory());
        registerFactory(new UpdateItemStateFieldPathExpressionFactory());
        registerFactory(new UpdateStatementFactory());
        registerFactory(new UpperExpressionFactory());
        registerFactory(new WhereClauseFactory());
    }

    @Override
    protected void initializeIdentifiers() {

        registerIdentifierRole(ABS,                   IdentifierRole.FUNCTION);           // ABS(x)
        registerIdentifierRole(ALL,                   IdentifierRole.FUNCTION);           // ALL(x)
        registerIdentifierRole(AND,                   IdentifierRole.AGGREGATE);          // x AND y
        registerIdentifierRole(ANY,                   IdentifierRole.FUNCTION);           // ANY(x)
        registerIdentifierRole(AS,                    IdentifierRole.COMPLEMENT);
        registerIdentifierRole(ASC,                   IdentifierRole.COMPLEMENT);
        registerIdentifierRole(AVG,                   IdentifierRole.FUNCTION);           // AVG(x)
        registerIdentifierRole(BETWEEN,               IdentifierRole.COMPOUND_FUNCTION);  // x BETWEEN y AND z
        registerIdentifierRole(BIT_LENGTH,            IdentifierRole.UNUSED);
        registerIdentifierRole(BOTH,                  IdentifierRole.COMPLEMENT);
        registerIdentifierRole(CHAR_LENGTH,           IdentifierRole.UNUSED);
        registerIdentifierRole(CHARACTER_LENGTH,      IdentifierRole.UNUSED);
        registerIdentifierRole(CLASS,                 IdentifierRole.UNUSED);
        registerIdentifierRole(CONCAT,                IdentifierRole.FUNCTION);           // CONCAT(x, y)
        registerIdentifierRole(COUNT,                 IdentifierRole.FUNCTION);           // COUNT(x)
        registerIdentifierRole(CURRENT_DATE,          IdentifierRole.FUNCTION);
        registerIdentifierRole(CURRENT_TIME,          IdentifierRole.FUNCTION);
        registerIdentifierRole(CURRENT_TIMESTAMP,     IdentifierRole.FUNCTION);
        registerIdentifierRole(DELETE,                IdentifierRole.CLAUSE);
        registerIdentifierRole(DELETE_FROM,           IdentifierRole.CLAUSE);
        registerIdentifierRole(DESC,                  IdentifierRole.COMPLEMENT);
        registerIdentifierRole(DISTINCT,              IdentifierRole.COMPLEMENT);
        registerIdentifierRole(EMPTY,                 IdentifierRole.COMPOUND_FUNCTION);  // x IS EMPTY
        registerIdentifierRole(ESCAPE,                IdentifierRole.COMPLEMENT);
        registerIdentifierRole(EXISTS,                IdentifierRole.FUNCTION);           // EXISTS(x)
        registerIdentifierRole(FALSE,                 IdentifierRole.FUNCTION);
        registerIdentifierRole(FETCH,                 IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(FROM,                  IdentifierRole.CLAUSE);
        registerIdentifierRole(HAVING,                IdentifierRole.CLAUSE);
        registerIdentifierRole(IN,                    IdentifierRole.COMPOUND_FUNCTION);  // x IN { (y {, z}* | (s) | t }
        registerIdentifierRole(INNER,                 IdentifierRole.COMPOUND_FUNCTION);  // Part of JOIN
        registerIdentifierRole(IS,                    IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(JOIN,                  IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(LEADING,               IdentifierRole.COMPLEMENT);
        registerIdentifierRole(LEFT,                  IdentifierRole.COMPLEMENT);
        registerIdentifierRole(LENGTH,                IdentifierRole.FUNCTION);           // LENGTH(x)
        registerIdentifierRole(LIKE,                  IdentifierRole.COMPOUND_FUNCTION);  // x LIKE y [ESCAPE z]
        registerIdentifierRole(LOCATE,                IdentifierRole.FUNCTION);           // LOCATE(x, y [, z]))
        registerIdentifierRole(LOWER,                 IdentifierRole.FUNCTION);           // LOWER(x)
        registerIdentifierRole(MAX,                   IdentifierRole.FUNCTION);           // MAX(x)
        registerIdentifierRole(MEMBER,                IdentifierRole.COMPOUND_FUNCTION);  // x MEMBER y
        registerIdentifierRole(MIN,                   IdentifierRole.FUNCTION);           // MIN(x)
        registerIdentifierRole(MOD,                   IdentifierRole.FUNCTION);           // MOD(x, y)
        registerIdentifierRole(NEW,                   IdentifierRole.FUNCTION);           // NEW x (y {, z}*)
        registerIdentifierRole(NOT,                   IdentifierRole.COMPLEMENT);
        registerIdentifierRole(NULL,                  IdentifierRole.FUNCTION);
        registerIdentifierRole(OBJECT,                IdentifierRole.FUNCTION);           // OBJECT(x)
        registerIdentifierRole(OF,                    IdentifierRole.COMPOUND_FUNCTION);  // Part of MEMBER [OF]
        registerIdentifierRole(OR,                    IdentifierRole.AGGREGATE);          // x OR y
        registerIdentifierRole(OUTER,                 IdentifierRole.COMPLEMENT);       // Part of JOIN
        registerIdentifierRole(POSITION,              IdentifierRole.UNUSED);
        registerIdentifierRole(SELECT,                IdentifierRole.CLAUSE);
        registerIdentifierRole(SET,                   IdentifierRole.CLAUSE);
        registerIdentifierRole(SIZE,                  IdentifierRole.FUNCTION);           // SIZE(x)
        registerIdentifierRole(SOME,                  IdentifierRole.FUNCTION);           // SOME(x)
        registerIdentifierRole(SQRT,                  IdentifierRole.FUNCTION);           // SQRT(x)
        registerIdentifierRole(SUBSTRING,             IdentifierRole.FUNCTION);           // SUBSTRING(x, y {, z})
        registerIdentifierRole(SUM,                   IdentifierRole.FUNCTION);
        registerIdentifierRole(TRAILING,              IdentifierRole.COMPLEMENT);
        registerIdentifierRole(TRIM,                  IdentifierRole.FUNCTION);           // TRIM([[x [c] FROM] y)
        registerIdentifierRole(TRUE,                  IdentifierRole.FUNCTION);
        registerIdentifierRole(UNKNOWN,               IdentifierRole.UNUSED);
        registerIdentifierRole(UPDATE,                IdentifierRole.CLAUSE);
        registerIdentifierRole(UPPER,                 IdentifierRole.FUNCTION);           // UPPER(x)
        registerIdentifierRole(WHERE,                 IdentifierRole.CLAUSE);
        registerIdentifierRole(PLUS,                  IdentifierRole.AGGREGATE);          // x + y
        registerIdentifierRole(MINUS,                 IdentifierRole.AGGREGATE);          // x - y
        registerIdentifierRole(MULTIPLICATION,        IdentifierRole.AGGREGATE);          // x * y
        registerIdentifierRole(DIVISION,              IdentifierRole.AGGREGATE);          // x / y
        registerIdentifierRole(LOWER_THAN,            IdentifierRole.AGGREGATE);          // x < y
        registerIdentifierRole(LOWER_THAN_OR_EQUAL,   IdentifierRole.AGGREGATE);          // x <= y
        registerIdentifierRole(GREATER_THAN,          IdentifierRole.AGGREGATE);          // x >  y
        registerIdentifierRole(GREATER_THAN_OR_EQUAL, IdentifierRole.AGGREGATE);          // x >= y
        registerIdentifierRole(DIFFERENT,             IdentifierRole.AGGREGATE);          // x <> y
        registerIdentifierRole(EQUAL,                 IdentifierRole.AGGREGATE);          // x =  y

        // Composite Identifiers
        registerIdentifierRole(GROUP_BY,              IdentifierRole.CLAUSE);
        registerIdentifierRole(LEFT_JOIN,             IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(LEFT_JOIN_FETCH,       IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(LEFT_OUTER_JOIN,       IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(LEFT_OUTER_JOIN_FETCH, IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(INNER_JOIN,            IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(INNER_JOIN_FETCH,      IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(IS_EMPTY,              IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(IS_NOT_EMPTY,          IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(IS_NOT_NULL,           IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(IS_NULL,               IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(JOIN_FETCH,            IdentifierRole.COMPOUND_FUNCTION);
        registerIdentifierRole(MEMBER_OF,             IdentifierRole.COMPOUND_FUNCTION);  // x NOT MEMBER OF y
        registerIdentifierRole(NOT_BETWEEN,           IdentifierRole.COMPOUND_FUNCTION);  // x NOT BETWEEN y AND z
        registerIdentifierRole(NOT_EXISTS,            IdentifierRole.FUNCTION);           // NOT EXISTS(x)
        registerIdentifierRole(NOT_IN,                IdentifierRole.COMPOUND_FUNCTION);  // x NOT IN { (y {, z}* | (s) | t }
        registerIdentifierRole(NOT_LIKE,              IdentifierRole.COMPOUND_FUNCTION);  // x NOT LIKE y
        registerIdentifierRole(NOT_MEMBER,            IdentifierRole.COMPOUND_FUNCTION);  // x NOT MEMBER y
        registerIdentifierRole(NOT_MEMBER_OF,         IdentifierRole.COMPOUND_FUNCTION);  // x NOT MEMBER OF y
        registerIdentifierRole(ORDER_BY,              IdentifierRole.CLAUSE);

        // Partial Identifiers
        registerIdentifierRole("BY",                  IdentifierRole.CLAUSE);             // Part of GROUP BY, ORDER BY
        registerIdentifierRole("DELETE",              IdentifierRole.CLAUSE);             // Part of DELETE FROM
        registerIdentifierRole("GROUP",               IdentifierRole.CLAUSE);             // Part of GROUP BY
        registerIdentifierRole("ORDER",               IdentifierRole.CLAUSE);             // Part of ORDERY BY
    }

    @Override
    public String toString() {
        return "JPQLGrammar 1.0";
    }
}
