All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 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 inputArgs = sqlAstArguments.stream().skip(2).toList();

        renderSearch(sqlAppender, walker, mode, inputArgs, searchArg);
    }

    protected abstract void renderSearch(SqlAppender sqlAppender, SqlAstTranslator walker, String mode, List inputArgs, SqlAstNode searchArg);

    protected void concatInputArgs(SqlAppender sqlAppender, SqlAstTranslator walker, List 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 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