in src/core-metadata/src/main/java/org/apache/kylin/metadata/model/Segments.java [514:589]
public Segments<T> calculateToBeSegments(T newSegment) {
Segments<T> tobe = (Segments<T>) this.clone();
if (newSegment != null && !tobe.contains(newSegment)) {
tobe.add(newSegment);
}
if (tobe.size() == 0)
return tobe;
// sort by source offset
Collections.sort(tobe);
ISegment firstSeg = tobe.getFirst();
firstSeg.validate();
for (int i = 0, j = 1; j < tobe.size();) {
ISegment is = (ISegment) tobe.get(i);
ISegment js = (ISegment) tobe.get(j);
js.validate();
// check i is either ready or new
if (!isNew(is) && !isReady(is) && !isWarning(is)) {
tobe.remove(i);
continue;
}
// check j is either ready or new
if (!isNew(js) && !isReady(js) && !isWarning(js)) {
tobe.remove(j);
continue;
}
if (is.getSegRange().start.compareTo(js.getSegRange().start) == 0) {
// if i, j competes
if (isReady(is) && isReady(js) || isNew(is) && isNew(js) || isWarning(is) && isWarning(js)) {
// if both new or ready, favor the bigger segment
if (is.getSegRange().end.compareTo(js.getSegRange().end) <= 0) {
tobe.remove(i);
} else {
tobe.remove(j);
}
continue;
} else {
// otherwise, favor the new segment
if (isNew(is) && is.equals(newSegment)) {
tobe.remove(j);
continue;
} else if (js.equals(newSegment)) {
tobe.remove(i);
continue;
}
}
}
// if i, j in sequence
if (is.getSegRange().end.compareTo(js.getSegRange().start) <= 0) {
i++;
j++;
continue;
}
// js can be covered by is
if (is.equals(newSegment)) {
// seems j not fitting
tobe.remove(j);
continue;
} else {
i++;
j++;
continue;
}
}
return tobe;
}