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

/**
 * This {@link RangeVariableDeclaration} creates a new {@link RangeVariableDeclaration}.
 *
 * @see RangeVariableDeclaration
 *
 * @version 2.4
 * @since 2.3
 * @author Pascal Filion
 */
@SuppressWarnings("nls")
public final class RangeVariableDeclarationFactory extends ExpressionFactory {

    /**
     * The unique identifier of this {@link RangeVariableDeclarationFactory}.
     */
    public static final String ID = "range_variable_declaration";

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

    @Override
    protected AbstractExpression buildExpression(AbstractExpression parent,
                                                 WordParser wordParser,
                                                 String word,
                                                 JPQLQueryBNF queryBNF,
                                                 AbstractExpression expression,
                                                 boolean tolerant) {

        ExpressionRegistry registry = getExpressionRegistry();

        // When the tolerant mode is turned on, parse the invalid portion of the query,
        // Order/Group are two exceptions to this rule
        // (expression != null) skip this check when parsing the first range variable declaration
        if (tolerant &&
             expression != null             &&
             // TODO: TOTALLY REDO THIS PART TO HANDLE A GENERIC WAY TO PARSE COMPOSITE CLAUSE IDENTIFIERS
            !word.equalsIgnoreCase("order") &&
            !word.equalsIgnoreCase("group") &&
            !word.equalsIgnoreCase("start") &&
            !word.equalsIgnoreCase("connect") &&
            registry.isIdentifier(word)) {

            ExpressionFactory factory = registry.expressionFactoryForIdentifier(word);

            if (factory == null) {
                return null;
            }

            expression = factory.buildExpression(parent, wordParser, word, queryBNF, expression, tolerant);

            if (expression != null) {
                return new BadExpression(parent, expression);
            }
        }

        expression = new RangeVariableDeclaration(parent);
        expression.parse(wordParser, tolerant);
        return expression;
    }
}
