diff --git a/backend/src/main/java/com/bakdata/conquery/models/query/statistics/BalancingHistogram.java b/backend/src/main/java/com/bakdata/conquery/models/query/statistics/BalancingHistogram.java index fd728eba4b..49ba9d6ed2 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/query/statistics/BalancingHistogram.java +++ b/backend/src/main/java/com/bakdata/conquery/models/query/statistics/BalancingHistogram.java @@ -86,6 +86,7 @@ private List mergeLeft(Node[] nodes) { } private List splitRight(List nodes) { + final int expectedBinSize = total / expectedBins; final List bins = new ArrayList<>(); @@ -93,13 +94,24 @@ private List splitRight(List nodes) { while(!frontier.isEmpty()) { final Node node = frontier.pop(); - if (node.getCount() <= (total / expectedBins * 1.5d)) { + if (node.getCount() <= (expectedBinSize * 1.5d)) { bins.add(node); continue; } - frontier.addFirst(node.split().get(1)); - frontier.addFirst(node.split().get(0)); + final List split = node.split(); + + final Node lower = split.get(0); + final Node higher = split.get(1); + + // node has a heavy bias + if(Math.min(higher.getCount(), lower.getCount()) <= expectedBinSize * 0.1d){ + bins.add(node); + continue; + } + + frontier.addFirst(higher); + frontier.addFirst(lower); } return bins;