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

net.dongliu.dbutils.sqlbuilder.DynamicNode Maven / Gradle / Ivy

There is a newer version: 6.0.2
Show newest version
package net.dongliu.dbutils.sqlbuilder;

import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;

/**
 * @author Liu Dong
 */
public class DynamicNode extends SQLNode {
    private final String prefix;
    private final String suffix;
    private final Set trimBegin;
    private final Set trimEnd;
    private final ArrayList nodeList = new ArrayList<>(8);

    public DynamicNode(String prefix, String suffix, Set trimBegin, Set trimEnd) {
        this.prefix = prefix;
        this.suffix = suffix;
        this.trimBegin = trimBegin;
        this.trimEnd = trimEnd;
    }

    /**
     * If block
     */
    public DynamicNode if_(boolean condition, Consumer consumer) {
        HubNode hubNode = new HubNode();
        if (condition) {
            consumer.accept(hubNode);
            nodeList.add(hubNode);
        }
        return this;
    }

    @Nonnull
    @Override
    protected SQLSegment segment() {
        if (nodeList.isEmpty()) {
            return new SQLSegment(Collections.emptyList(), Collections.emptyList());
        }
        List clauses = new ArrayList<>();
        List params = new ArrayList<>();
        clauses.add(prefix);

        for (int i = 0; i < nodeList.size(); i++) {
            SQLNode node = nodeList.get(i);
            SQLSegment segment = node.segment();
            List currentClauses = segment.getClauses();
            if (i == 0) {
                if (!currentClauses.isEmpty()) {
                    String s = currentClauses.get(0).trim();
                    for (String tb : trimBegin) {
                        if (s.startsWith(tb)) {
                            s = s.substring(tb.length());
                            break;
                        }
                    }
                    clauses.add(s);
                    for (int j = 1; j < currentClauses.size(); j++) {
                        clauses.add(currentClauses.get(i));
                    }
                }
            } else if (i == nodeList.size() - 1) {
                if (!currentClauses.isEmpty()) {
                    String s = currentClauses.get(currentClauses.size() - 1).trim();
                    for (String te : trimEnd) {
                        if (s.endsWith(te)) {
                            s = s.substring(0, s.length() - te.length());
                            break;
                        }
                    }
                    clauses.add(s);
                    for (int j = 0; j < currentClauses.size() - 1; j++) {
                        clauses.add(currentClauses.get(i));
                    }
                }
            } else {
                params.addAll(currentClauses);
            }
            params.addAll(segment.getParams());
        }

        clauses.add(suffix);
        return new SQLSegment(clauses, params);
    }
}