blob: 518bc82151ae60d99c1482ffb42dc7b683e6beee [file] [log] [blame]
/*
* Copyright (c) 2011, 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:
// 03/08/2010 Andrei Ilitchev
// Bug 300512 - Add FUNCTION support to extended JPQL
package org.eclipse.persistence.internal.jpa.parsing;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.persistence.expressions.Expression;
/**
* INTERNAL
* <p><b>Purpose</b>:
* <p><b>Responsibilities</b>:<ul>
* <li> Generate expression for custom functions
* Example: "SELECT FUNC('NVL', e.firstName, 'NoFirstName') FROM Employee e"
* </ul>
* @author Andrei Ilitchev
* @since Eclipselink 2.1
*/
public class FuncNode extends FunctionalExpressionNode {
private String name;
private List<Node> parameters;
protected FuncNode() {
super();
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setParameters(List<Node> parameters) {
this.parameters = parameters;
}
public List<Node> getParameters() {
return this.parameters;
}
@Override
public void validate(ParseTreeContext context) {
for(Node parameter : this.parameters) {
parameter.validate(context);
}
}
/**
* INTERNAL
* Generate the EclipseLink expression for this node
*/
@Override
public Expression generateExpression(GenerationContext context) {
int size = this.parameters.size();
if(size == 0) {
return context.getBaseExpression().getFunction(this.name);
}
List<Expression> vExpressions = new ArrayList<>(size - 1);
Expression base = this.parameters.get(0).generateExpression(context);
for(int i=1; i < size; i++) {
Expression child = this.parameters.get(i).generateExpression(context);
vExpressions.add(child);
}
return base.getFunctionWithArguments(this.name, vExpressions);
}
}