blob: 53df739df4e6627f2b6055686962a1dfb29206db [file] [log] [blame]
/*
* 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 AndExpression} creates a new {@link AdditionExpression} when the portion of the query
* to parse starts with <b>AND</b>.
*
* @see AndExpression
*
* @version 2.4
* @since 2.3
* @author Pascal Filion
*/
public final class AndExpressionFactory extends ExpressionFactory {
/**
* This {@link ExpressionVisitor} is used to check if the {@link Expression}
* passed to this factory is an {@link OrExpression}.
*/
private OrExpressionVisitor visitor;
/**
* The unique identifier of this {@link AndExpression}.
*/
public static final String ID = Expression.AND;
/**
* Creates a new <code>AndExpressionFactory</code>.
*/
public AndExpressionFactory() {
super(ID, Expression.AND);
}
@Override
@SuppressWarnings("null")
protected AbstractExpression buildExpression(AbstractExpression parent,
WordParser wordParser,
String word,
JPQLQueryBNF queryBNF,
AbstractExpression expression,
boolean tolerant) {
if (expression != null) {
expression.accept(visitor());
}
if ((visitor != null) && visitor.found) {
visitor.found = false;
OrExpression orExpression = (OrExpression) expression;
AndExpression andExpression = new AndExpression(parent);
andExpression.setLeftExpression((AbstractExpression) orExpression.getRightExpression());
andExpression.parse(wordParser, tolerant);
orExpression.setRightExpression(andExpression);
return orExpression;
}
else {
AndExpression andExpression = new AndExpression(parent);
if (expression != null) {
andExpression.setLeftExpression(expression);
}
andExpression.parse(wordParser, tolerant);
return andExpression;
}
}
private OrExpressionVisitor visitor() {
if (visitor == null) {
visitor = new OrExpressionVisitor();
}
return visitor;
}
// Made static final for performance reasons.
/**
* This {@link ExpressionVisitor} is used to check if the {@link Expression} passed to this
* factory is an {@link OrExpression}.
*/
private static final class OrExpressionVisitor extends AbstractExpressionVisitor {
/**
* This flag is turned on if the {@link Expression} visited is {@link OrExpression}.
*/
boolean found;
@Override
public void visit(OrExpression expression) {
found = true;
}
}
}