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

com.heliorm.sql.AbstractionHelper Maven / Gradle / Ivy

The newest version!
package com.heliorm.sql;

import com.heliorm.Table;
import com.heliorm.impl.ExecutablePart;
import com.heliorm.impl.JoinPart;
import com.heliorm.impl.OrderPart;
import com.heliorm.impl.OrderedPart;
import com.heliorm.impl.SelectPart;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 * Helper class that deals with creating concrete selection hierarchies from ones containing abstract classes.
 */
final class AbstractionHelper {

    /**
     * Expand the query parts in the list so that the query branches into
     * multiple table queries when a select or join with a table which has
     * sub-tables is encountered.
     *
     * @param tail part
     * @return The expanded query parts lists.
     */
   static  List> explodeAbstractions(ExecutablePart tail) {
        if (tail instanceof SelectPart sp) {
            return explode(sp.getSelect());
        }
        if (tail instanceof OrderedPart op) {
            return explode(op);
        }
        return Collections.emptyList();
    }

    /**
     * Create a comparator based on the tail of the query that will compare
     * Pojos on their fields.
     *
     */
    static  Comparator> makeComparatorForTail(List> order) {
        List>> comps = new LinkedList<>();
        for (OrderPart op : order) {
            comps.add((PojoCompare w1, PojoCompare w2) -> {
                if (op.getDirection() == OrderPart.Direction.ASCENDING) {
                    return w1.compareTo(w2, op.getField());
                } else {
                    return w2.compareTo(w1, op.getField());

                }
            });
        }
        return new CompoundComparator<>(comps);
    }

    private static  List> explode(OrderedPart ordered) {
        List> res = new ArrayList<>();
        SelectPart select = ordered.getSelect();
        Table table = select.getTable();
        Set> subTables = table.getSubTables();
        if (subTables.isEmpty()) {
            var selectPart = new SelectPart<>(select.getSelector(), select.getTable(), select.getWhere().orElse(null), explode(select.getJoins()));
            res.add(new OrderedPart(select.getSelector(), selectPart,
                    ordered.getOrder(), ordered.getLimit()));
        } else {
            for (Table subTable : subTables) {
                res.add(new OrderedPart(select.getSelector(),
                        new SelectPart(select.getSelector(), subTable, select.getWhere().orElse(null), explode(select.getJoins())),
                        ordered.getOrder(), ordered.getLimit()));
            }
        }
        return res;
    }

    private static  List> explode(SelectPart select) {
        List> res = new ArrayList<>();
        Table table = select.getTable();
        Set> subTables = table.getSubTables();
        if (subTables.isEmpty()) {
            res.add(new SelectPart(select.getSelector(), select.getTable(), select.getWhere().orElse(null), explode(select.getJoins()), select.getOrder(), select.getLimit()));
        } else {
            for (Table subTable : subTables) {
                res.add(new SelectPart(select.getSelector(), subTable, select.getWhere().orElse(null), explode(select.getJoins()), select.getOrder(), select.getLimit()));
            }
        }
        return res;
    }

    private static List> explode(List> joins) {
        List> res = new ArrayList<>();
        for (JoinPart join : joins) {
            Table table = join.getTable();
            Set> subTables = table.getSubTables();
            if (subTables.isEmpty()) {
                res.add(new JoinPart(join.getTable(), join.getOn(), join.getWhere().orElse(null), explode(join.getJoins())));
            } else {
                for (Table subTable : subTables) {
                    res.add(new JoinPart(subTable, join.getOn(), join.getWhere().orElse(null), explode(join.getJoins())));
                }
            }
        }
        return res;
    }

    private AbstractionHelper() {}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy