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