/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.dialect.function;
import java.util.List;
import org.hibernate.QueryException;
import org.hibernate.engine.spi.Mapping;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.type.Type;
Support for slightly more general templating than StandardSQLFunction
, with an unlimited number of arguments. Author: Gavin King
/**
* Support for slightly more general templating than {@link StandardSQLFunction}, with an unlimited number of arguments.
*
* @author Gavin King
*/
public class VarArgsSQLFunction implements SQLFunction {
private final String begin;
private final String sep;
private final String end;
private final Type registeredType;
Constructs a VarArgsSQLFunction instance with a 'static' return type. An example of a 'static'
return type would be something like an UPPER function which is always returning
a SQL VARCHAR and thus a string type.
Params: - registeredType – The return type.
- begin – The beginning of the function templating.
- sep – The separator for each individual function argument.
- end – The end of the function templating.
/**
* Constructs a VarArgsSQLFunction instance with a 'static' return type. An example of a 'static'
* return type would be something like an <tt>UPPER</tt> function which is always returning
* a SQL VARCHAR and thus a string type.
*
* @param registeredType The return type.
* @param begin The beginning of the function templating.
* @param sep The separator for each individual function argument.
* @param end The end of the function templating.
*/
public VarArgsSQLFunction(Type registeredType, String begin, String sep, String end) {
this.registeredType = registeredType;
this.begin = begin;
this.sep = sep;
this.end = end;
}
Constructs a VarArgsSQLFunction instance with a 'dynamic' return type. For a dynamic return type,
the type of the arguments are used to resolve the type. An example of a function with a
'dynamic' return would be MAX or MIN which return a double or an integer etc
based on the types of the arguments.
Params: - begin – The beginning of the function templating.
- sep – The separator for each individual function argument.
- end – The end of the function templating.
See Also:
/**
* Constructs a VarArgsSQLFunction instance with a 'dynamic' return type. For a dynamic return type,
* the type of the arguments are used to resolve the type. An example of a function with a
* 'dynamic' return would be <tt>MAX</tt> or <tt>MIN</tt> which return a double or an integer etc
* based on the types of the arguments.
*
* @param begin The beginning of the function templating.
* @param sep The separator for each individual function argument.
* @param end The end of the function templating.
*
* @see #getReturnType Specifically, the 'firstArgumentType' argument is the 'dynamic' type.
*/
public VarArgsSQLFunction(String begin, String sep, String end) {
this( null, begin, sep, end );
}
@Override
public boolean hasArguments() {
return true;
}
@Override
public boolean hasParenthesesIfNoArguments() {
return true;
}
@Override
public Type getReturnType(Type firstArgumentType, Mapping mapping) throws QueryException {
return registeredType == null ? firstArgumentType : registeredType;
}
@Override
public String render(Type firstArgumentType, List arguments, SessionFactoryImplementor factory) {
final StringBuilder buf = new StringBuilder().append( begin );
for ( int i = 0; i < arguments.size(); i++ ) {
buf.append( transformArgument( (String) arguments.get( i ) ) );
if ( i < arguments.size() - 1 ) {
buf.append( sep );
}
}
return buf.append( end ).toString();
}
Called from render
to allow applying a change or transformation to each individual argument. Params: - argument – The argument being processed.
Returns: The transformed argument; may be the same, though should never be null.
/**
* Called from {@link #render} to allow applying a change or transformation
* to each individual argument.
*
* @param argument The argument being processed.
* @return The transformed argument; may be the same, though should never be null.
*/
protected String transformArgument(String argument) {
return argument;
}
}