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

com.github.leeonky.dal.extensions.Operators Maven / Gradle / Ivy

package com.github.leeonky.dal.extensions;

import com.github.leeonky.dal.DAL;
import com.github.leeonky.dal.ast.opt.DALOperator;
import com.github.leeonky.dal.runtime.Data;
import com.github.leeonky.dal.runtime.ExpectationFactory;
import com.github.leeonky.dal.runtime.Extension;
import com.github.leeonky.dal.runtime.Operation;
import com.github.leeonky.dal.runtime.RuntimeContextBuilder.DALRuntimeContext;
import com.github.leeonky.util.NumberType;
import com.github.leeonky.util.function.TriFunction;

import static com.github.leeonky.dal.runtime.Operators.*;

public class Operators implements Extension {

    @Override
    public int order() {
        return Integer.MIN_VALUE;
    }

    @Override
    public void extend(DAL dal) {
        numberCalculator(dal, PLUS, NumberType::plus);
        stringPlus(dal);
        numberCalculator(dal, SUB, NumberType::subtract);
        numberCalculator(dal, MUL, NumberType::multiply);
        numberCalculator(dal, DIV, NumberType::divide);

        assertEqual(dal);
        assertMatch(dal);
    }

    private void assertMatch(DAL dal) {
        dal.getRuntimeContextBuilder().registerOperator(MATCH, new Operation() {

            @Override
            public boolean match(Data v1, DALOperator operator, Data v2, DALRuntimeContext context) {
                return v2.instance() instanceof ExpectationFactory;
            }

            @Override
            public Data operate(Data v1, DALOperator operator, Data v2, DALRuntimeContext context) {
                ((ExpectationFactory) v2.instance()).create(operator, v1).matches();
                return v1;
            }
        });
    }

    private void assertEqual(DAL dal) {
        dal.getRuntimeContextBuilder().registerOperator(EQUAL, new Operation() {

            @Override
            public boolean match(Data v1, DALOperator operator, Data v2, DALRuntimeContext context) {
                return v2.instance() instanceof ExpectationFactory;
            }

            @Override
            public Data operate(Data v1, DALOperator operator, Data v2, DALRuntimeContext context) {
                ((ExpectationFactory) v2.instance()).create(operator, v1).equalTo();
                return v1;
            }
        });
    }

    private void stringPlus(DAL dal) {
        dal.getRuntimeContextBuilder().registerOperator(PLUS, new Operation() {

            @Override
            public boolean match(Data v1, DALOperator operator, Data v2, DALRuntimeContext context) {
                return v1.instance() instanceof String || v2.instance() instanceof String;
            }

            @Override
            public Data operate(Data v1, DALOperator operator, Data v2, DALRuntimeContext context) {
                return context.wrap(String.valueOf(v1.instance()) + v2.instance());
            }
        });
    }

    private void numberCalculator(DAL dal, com.github.leeonky.dal.runtime.Operators operator,
                                  TriFunction action) {
        dal.getRuntimeContextBuilder().registerOperator(operator, new Operation() {

            @Override
            public boolean match(Data v1, DALOperator operator, Data v2, DALRuntimeContext context) {
                return v1.instance() instanceof Number && v2.instance() instanceof Number;
            }

            @Override
            public Data operate(Data v1, DALOperator operator, Data v2, DALRuntimeContext context) {
                return context.wrap(action.apply(context.getNumberType(), (Number) v1.instance(),
                        (Number) v2.instance()));
            }
        });
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy