/*
 * Copyright (c) 2006, 2020 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 OrExpressionFactory} creates a new {@link OrExpression} when the portion of the query
 * to parse starts with <b>OR</b>.
 *
 * @see OrExpression
 *
 * @version 2.4
 * @since 2.3
 * @author Pascal Filion
 */
public final class OrExpressionFactory extends ExpressionFactory {

    /**
     * The unique identifier of this {@link OrExpressionFactory}.
     */
    public static final String ID = Expression.OR;

    /**
     * Creates a new <code>OrExpressionFactory</code>.
     */
    public OrExpressionFactory() {
        super(ID, Expression.OR);
    }

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

        OrExpression orExpression = new OrExpression(parent);
        orExpression.setLeftExpression(expression);
        orExpression.parse(wordParser, tolerant);
        return orExpression;
    }
}
