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

com.talanlabs.mybatis.rsql.engine.where.comparisons.StandardComparisonOperatorManager Maven / Gradle / Ivy

The newest version!
package com.talanlabs.mybatis.rsql.engine.where.comparisons;

import com.talanlabs.component.IComponent;
import com.talanlabs.component.factory.ComponentDescriptor;
import com.talanlabs.mybatis.rsql.configuration.IRsqlConfiguration;
import com.talanlabs.mybatis.rsql.engine.EngineContext;
import com.talanlabs.mybatis.rsql.engine.IllegalPropertyException;
import com.talanlabs.mybatis.rsql.engine.SqlResult;
import com.talanlabs.mybatis.rsql.engine.where.IComparisonOperatorManager;
import com.talanlabs.mybatis.rsql.engine.where.comparisons.factory.AssociationRsqlResultFactory;
import com.talanlabs.mybatis.rsql.engine.where.comparisons.factory.ColumnRsqlResultFactory;
import com.talanlabs.mybatis.rsql.engine.where.comparisons.factory.IRsqlResultFactory;
import com.talanlabs.mybatis.rsql.engine.where.comparisons.factory.NlsColumnRsqlResultFactory;
import cz.jirutka.rsql.parser.ast.ComparisonNode;
import org.apache.commons.lang3.StringUtils;

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

public class StandardComparisonOperatorManager implements IComparisonOperatorManager, IRsqlResultFactory.IRsqlResultContext {

    private List rsqlResultFactories = new ArrayList<>();

    public StandardComparisonOperatorManager(IRsqlConfiguration configuration) {
        super();

        addRsqlResultFactory(new ColumnRsqlResultFactory(configuration));
        addRsqlResultFactory(new NlsColumnRsqlResultFactory(configuration));
        addRsqlResultFactory(new AssociationRsqlResultFactory());
    }

    public void addRsqlResultFactory(IRsqlResultFactory rsqlResultFactory) {
        rsqlResultFactories.add(0, rsqlResultFactory);
    }

    @Override
    public  SqlResult visit(ComponentDescriptor componentDescriptor, ComparisonNode node, EngineContext context) {
        return visit(componentDescriptor, node, null, node.getSelector(), context.getDefaultTableName(), context);
    }

    @Override
    public SqlResult visit(ComponentDescriptor componentDescriptor, ComparisonNode node, String previousPropertyName, String selector, String tableJoinName, EngineContext context) {
        int indexPoint = selector.indexOf(".");
        String propertyName;
        String nextPropertyName;
        if (indexPoint == -1) {
            propertyName = selector;
            nextPropertyName = null;
        } else {
            propertyName = selector.substring(0, indexPoint);
            nextPropertyName = selector.substring(indexPoint + 1);
        }

        String current = (StringUtils.isNotBlank(previousPropertyName) ? previousPropertyName + "." : "") + propertyName;

        ComponentDescriptor.PropertyDescriptor propertyDescriptor = componentDescriptor.getPropertyDescriptor(propertyName);
        if (propertyDescriptor == null) {
            throw new IllegalPropertyException(String.format("Property %s not exists", current));
        }

        for (IRsqlResultFactory rsqlResultFactory : rsqlResultFactories) {
            if (rsqlResultFactory.acceptProperty(componentDescriptor, propertyDescriptor)) {
                return rsqlResultFactory.buildComponentRsqlResult(this, componentDescriptor, propertyDescriptor, node, previousPropertyName, nextPropertyName, tableJoinName, context);
            }
        }

        throw new IllegalPropertyException(String.format("Property %s not accepted", current));
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy