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

com.talanlabs.mybatis.rsql.statement.sqlsource.AbstractRsqlSqlSource Maven / Gradle / Ivy

The newest version!
package com.talanlabs.mybatis.rsql.statement.sqlsource;

import com.talanlabs.component.IComponent;
import com.talanlabs.component.factory.ComponentDescriptor;
import com.talanlabs.component.factory.ComponentFactory;
import com.talanlabs.entity.annotation.Entity;
import com.talanlabs.mybatis.component.helper.ComponentMyBatisHelper;
import com.talanlabs.mybatis.component.session.ComponentConfiguration;
import com.talanlabs.mybatis.rsql.configuration.IRsqlConfiguration;
import com.talanlabs.mybatis.rsql.engine.EngineContext;
import com.talanlabs.mybatis.rsql.engine.SqlResult;
import com.talanlabs.mybatis.rsql.engine.orderby.ComponentSortVisitor;
import com.talanlabs.mybatis.rsql.engine.where.ComponentRsqlVisitor;
import com.talanlabs.mybatis.rsql.sort.SortParser;
import com.talanlabs.mybatis.rsql.statement.Request;
import cz.jirutka.rsql.parser.RSQLParser;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.builder.SqlSourceBuilder;
import org.apache.ibatis.mapping.SqlSource;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public abstract class AbstractRsqlSqlSource implements SqlSource {

    protected final Class componentClass;
    protected final SqlSourceBuilder sqlSourceParser;
    protected final IRsqlConfiguration rsqlConfiguration;

    public AbstractRsqlSqlSource(ComponentConfiguration componentConfiguration, IRsqlConfiguration rsqlConfiguration, Class componentClass) {
        super();

        this.rsqlConfiguration = rsqlConfiguration;
        this.componentClass = componentClass;
        this.sqlSourceParser = new SqlSourceBuilder(componentConfiguration);
    }

    protected String buildSqlFromWhereOrderBy(String rsql, Request.ICustomRequest customRequest, String sort, Request.ICustomSort customSortLeft, Request.ICustomSort customSortRight,
            Map additionalParameters, EngineContext context) {
        List whereSqlResults = new ArrayList<>();

        if (StringUtils.isNotBlank(rsql)) {
            ComponentRsqlVisitor componentRsqlVisitor = rsqlConfiguration.getComponentRsqlVisitor(componentClass);
            RSQLParser rsqlParser = rsqlConfiguration.getRsqlParser();
            whereSqlResults.add(rsqlParser.parse(rsql).accept(componentRsqlVisitor, context));
        }

        if (customRequest != null) {
            whereSqlResults.add(customRequest.buildSqlResult(context));
        }

        SqlResult whereSqlResult = whereSqlResults.stream().collect(SqlResult.SqlResultJoiner.joining(" AND ", "(", ")"));

        List sortSqlResults = new ArrayList<>();
        if (customSortLeft != null) {
            sortSqlResults.add(customSortLeft.buildSqlResult(context));
        }

        if (StringUtils.isNotBlank(sort)) {
            ComponentSortVisitor componentSortVisitor = rsqlConfiguration.getComponentSortVisitor(componentClass);
            SortParser sortParser = rsqlConfiguration.getSortParser();
            sortSqlResults.add(componentSortVisitor.visit(sortParser.parse(sort), context));
        }

        if (customSortRight != null) {
            sortSqlResults.add(customSortRight.buildSqlResult(context));
        }

        SqlResult sortSqlResult = sortSqlResults.stream().collect(SqlResult.SqlResultJoiner.joining(", ", "", ""));

        ComponentDescriptor cd = ComponentFactory.getInstance().getDescriptor(componentClass);
        Entity entity = ComponentMyBatisHelper.getEntityAnnotation(cd);

        StringBuilder sb = new StringBuilder();
        String prefix = StringUtils.isNotBlank(context.getDefaultTableName()) ? " " + context.getDefaultTableName() : "";
        sb.append("FROM ").append(entity.name()).append(prefix);

        List joins = new ArrayList<>();
        if (whereSqlResult.joins != null) {
            joins.addAll(whereSqlResult.joins);
        }
        if (sortSqlResult.joins != null) {
            joins.addAll(sortSqlResult.joins);
        }
        if (!joins.isEmpty()) {
            for (SqlResult.Join join : joins) {
                switch (join.type) {
                case Inner:
                    sb.append(" INNER JOIN ").append(join.sql);
                    break;
                case Outer:
                    sb.append(" OUTER JOIN ").append(join.sql);
                    break;
                case LeftOuter:
                    sb.append(" LEFT OUTER JOIN ").append(join.sql);
                    break;
                case RightOuter:
                    sb.append(" RIGHT OUTER JOIN ").append(join.sql);
                    break;
                default:
                    break;
                }
            }
        }

        if (StringUtils.isNotBlank(whereSqlResult.sql)) {
            sb.append(" WHERE ").append(whereSqlResult.sql);
        }
        if (StringUtils.isNotBlank(sortSqlResult.sql)) {
            sb.append(" ORDER BY ").append(sortSqlResult.sql);
        }

        if (whereSqlResult.parameterMap != null) {
            additionalParameters.putAll(whereSqlResult.parameterMap);
        }
        if (sortSqlResult.parameterMap != null) {
            additionalParameters.putAll(sortSqlResult.parameterMap);
        }

        return sb.toString();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy