
com.xlrit.gears.engine.persistence.AbstractSearchFunction Maven / Gradle / Ivy
package com.xlrit.gears.engine.persistence;
import java.util.Iterator;
import java.util.List;
import org.hibernate.query.ReturnableType;
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
import org.hibernate.query.sqm.function.FunctionKind;
import org.hibernate.query.sqm.produce.function.*;
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
import org.hibernate.sql.ast.SqlAstTranslator;
import org.hibernate.sql.ast.spi.SqlAppender;
import org.hibernate.sql.ast.tree.SqlAstNode;
import org.hibernate.sql.ast.tree.expression.QueryLiteral;
import org.hibernate.type.StandardBasicTypes;
import org.hibernate.type.spi.TypeConfiguration;
/**
* SEARCH(filter, ...targets)
*/
abstract class AbstractSearchFunction extends AbstractSqmSelfRenderingFunctionDescriptor {
public AbstractSearchFunction(TypeConfiguration typeConfiguration) {
super(
"search",
FunctionKind.NORMAL,
new ArgumentTypesValidator(StandardArgumentsValidators.min(3), FunctionParameterType.ANY /*STRING*/),
StandardFunctionReturnTypeResolvers.invariant(
typeConfiguration.getBasicTypeRegistry().resolve(StandardBasicTypes.BOOLEAN)
),
StandardFunctionArgumentTypeResolvers.impliedOrInvariant(typeConfiguration, FunctionParameterType.STRING)
);
}
@Override
public void render(SqlAppender sqlAppender, List extends SqlAstNode> sqlAstArguments, /*ReturnableType> returnableType,*/ SqlAstTranslator> walker) {
if (!(sqlAstArguments.get(0) instanceof QueryLiteral> modeLiteral && modeLiteral.getLiteralValue() instanceof String mode) ) {
throw new IllegalArgumentException("JPQL function `search`: first argument `mode` must be a string literal");
}
SqlAstNode searchArg = sqlAstArguments.get(1);
List extends SqlAstNode> inputArgs = sqlAstArguments.stream().skip(2).toList();
renderSearch(sqlAppender, walker, mode, inputArgs, searchArg);
}
protected abstract void renderSearch(SqlAppender sqlAppender, SqlAstTranslator> walker, String mode, List extends SqlAstNode> inputArgs, SqlAstNode searchArg);
protected void concatInputArgs(SqlAppender sqlAppender, SqlAstTranslator> walker, List extends SqlAstNode> inputArgs) {
if (inputArgs.size() == 1) {
// only 1 input argument; no need to concatenate anything
walker.render(inputArgs.get(0), SqlAstNodeRenderingMode.DEFAULT);
}
else {
// concatenate input arguments using `concat_ws`
sqlAppender.appendSql("concat_ws(' ', ");
for (Iterator extends SqlAstNode> it = inputArgs.iterator(); it.hasNext(); ) {
SqlAstNode inputArg = it.next();
walker.render(inputArg, SqlAstNodeRenderingMode.DEFAULT);
if (it.hasNext()) sqlAppender.appendSql(",");
}
sqlAppender.appendSql(")");
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy