/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: Apache License, Version 2.0
* See the LICENSE file in the root directory or visit http://www.apache.org/licenses/LICENSE-2.0
*/
package org.hibernate.test.sqm.parser.criteria.tree.expression.function;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.hibernate.query.sqm.domain.SqmExpressableTypeBasic;
import org.hibernate.query.sqm.domain.type.SqmDomainTypeBasic;
import org.hibernate.query.sqm.produce.spi.criteria.CriteriaVisitor;
import org.hibernate.query.sqm.produce.spi.criteria.JpaExpression;
import org.hibernate.query.sqm.tree.expression.SqmExpression;
import org.hibernate.test.sqm.parser.criteria.tree.CriteriaBuilderImpl;
/**
* Models the basic concept of a SQL function.
*
* @author Steve Ebersole
*/
public class GenericFunctionExpression<X>
extends AbstractFunctionExpression<X>
implements JpaExpression<X> {
private final List<JpaExpression<?>> arguments;
public GenericFunctionExpression(
String functionName,
SqmExpressableTypeBasic sqmType,
Class<X> javaType,
CriteriaBuilderImpl criteriaBuilder) {
this( functionName, sqmType, javaType, criteriaBuilder, Collections.emptyList() );
}
public GenericFunctionExpression(
String functionName,
SqmExpressableTypeBasic sqmType,
Class<X> javaType,
CriteriaBuilderImpl criteriaBuilder,
JpaExpression<?>... arguments) {
this( functionName, sqmType, javaType, criteriaBuilder, Arrays.asList( arguments ) );
}
public GenericFunctionExpression(
String functionName,
SqmExpressableTypeBasic sqmType,
Class<X> javaType,
CriteriaBuilderImpl criteriaBuilder,
List<JpaExpression<?>> arguments) {
super( functionName, sqmType, javaType, criteriaBuilder);
this.arguments = arguments;
}
protected static int properSize(int number) {
return number + (int)( number*.75 ) + 1;
}
public List<JpaExpression<?>> getArguments() {
return arguments;
}
@Override
public SqmExpressableTypeBasic getFunctionResultType() {
return (SqmDomainTypeBasic) super.getFunctionResultType();
}
@Override
public SqmExpression visitExpression(CriteriaVisitor visitor) {
return visitor.visitGenericFunction(
getFunctionName(),
getFunctionResultType(),
getArguments()
);
}
}