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

one.xingyi.sqlAndParams.ISqlAndParams Maven / Gradle / Ivy

There is a newer version: 1.5.9
Show newest version
package one.xingyi.sqlAndParams;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import lombok.var;
import one.xingyi.fp.IPartialFunction;
import one.xingyi.helpers.ListHelpers;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

import static one.xingyi.fp.Safe.safeString;


public interface ISqlAndParams {
    static  Function   mergeLists(List>> list) {
        List> listOrResultFns = ListHelpers.map(list, l -> IPartialFunction.mapReduceFn(l, ISqlAndParams::merge));
        return req -> mergePreAndPostsIntoPres(ListHelpers.map(listOrResultFns, fn -> fn.apply(req)));
    }
    String getPreSql();
    String getPostSql();
    List getParams();

    default public String getFullSql() {return getPreSql() + " " + getPostSql();}

    static ISqlAndParams preSql(String sql, Object... params) {
        return new SqlAndParams(sql, "", Arrays.asList(params));
    }
    static ISqlAndParams of(String preSql, String postSql, Object... params) {
        return new SqlAndParams(preSql, postSql, Arrays.asList(params));
    }
    static ISqlAndParams postSql(String sql, Object... params) {
        return new SqlAndParams("", sql, Arrays.asList(params));
    }
    static ISqlAndParams merge(List sqlAndParams) {
        StringBuilder preSql = new StringBuilder();
        StringBuilder postSql = new StringBuilder();
        List params = new ArrayList<>();
        for (ISqlAndParams sap : sqlAndParams) {
            if (preSql.length() > 0) preSql.append(' ');
            preSql.append(sap.getPreSql().trim());
            if (postSql.length() > 0) postSql.append(' ');
            postSql.append(sap.getPostSql().trim());
            params.addAll(sap.getParams());
        }
        return new SqlAndParams(preSql.toString(), postSql.toString(), params);
    }
    static ISqlAndParams mergePreAndPostsIntoPres(List sqlAndParams) {
        StringBuilder preSql = new StringBuilder();
        List params = new ArrayList<>();
        for (ISqlAndParams sap : sqlAndParams) {
            if (preSql.length() > 0) preSql.append(' ');
            preSql.append(sap.getPreSql().trim());
            if (preSql.length() > 0) preSql.append(' ');
            preSql.append(sap.getPostSql().trim());
            params.addAll(sap.getParams());
        }
        return new SqlAndParams(preSql.toString(), "", params);
    }

    static  IPartialFunction always(Function fn) {
        return IPartialFunction.always(fn);
    }

    static  IPartialFunction fieldInWhere(Function fieldFn, Function sqlFn) {
        return IPartialFunction.of(query -> fieldFn.apply(query) != null, query -> ISqlAndParams.postSql(sqlFn.apply(query), fieldFn.apply(query)));
    }
    static  IPartialFunction stringFieldInWhere(Function fieldFn, Function sqlFn) {
        return IPartialFunction.of(query -> safeString(fieldFn.apply(query)).length() > 0, query -> ISqlAndParams.postSql(sqlFn.apply(query), fieldFn.apply(query)));
    }
    static  IPartialFunction stringFieldInWhereUpperCaseAndTrim(Function fieldFn, Function sqlFn) {
        return IPartialFunction.of(query -> safeString(fieldFn.apply(query)).length() > 0, query -> ISqlAndParams.postSql(sqlFn.apply(query), fieldFn.apply(query).trim().toUpperCase()));
    }

}

@ToString
@Getter
@EqualsAndHashCode
class SqlAndParams implements ISqlAndParams {
    public final String preSql;
    public final String postSql;
    public final List params;
    public SqlAndParams(String preSql, String postSql, List params) {
        this.preSql = preSql.trim();
        this.postSql = postSql.trim();
        this.params = Collections.unmodifiableList(params);
    }

}