// first determine the interval, which overlaps with the lower
// limit
overlappedInterval = searchLowerLimit(lowerLimit, 0,
this.selectivityOfInterval.size() - 1);
final Literal lowerLimit2 = (overlappedInterval < 0) ? null
: this.selectivityOfInterval.get(overlappedInterval).literal;
if (overlappedInterval + 1 < this.selectivityOfInterval.size()) {
final Entry e3 = this.selectivityOfInterval
.get(overlappedInterval + 1);
if (e3.literal
.compareToNotNecessarilySPARQLSpecificationConform(lowerLimit) > 0) {
int intervalSize;
if (lowerLimit2 == null)
intervalSize = distance(e3.literal, null);
else
intervalSize = distance(e3.literal, lowerLimit2);
int fraction;
// does e3 completely contain e?
if (e3.literal
.compareToNotNecessarilySPARQLSpecificationConform(e.literal) > 0) {
fraction = distance(e.literal, lowerLimit);
double sel = (e3.distinctLiterals == 0.0) ? e3.selectivity
: e3.selectivity / e3.distinctLiterals;
sel *= (intervalSize == 0) ? fraction
: (double) fraction / intervalSize;
return new Tuple<Integer, Double>(
overlappedInterval + 1, sel);
} else {
fraction = distance(e3.literal, lowerLimit);
}
double sel = (e3.distinctLiterals == 0.0) ? e3.selectivity
: e3.selectivity / e3.distinctLiterals;
sel *= (intervalSize == 0) ? fraction : (double) fraction
/ intervalSize;
result = sel;
}
}
}
// then all intervals, which are completely contained in the given
// interval
Literal lowerLimit2 = null;
int index = overlappedInterval + 1;
boolean next = (lowerLimit == null);
while (index < this.selectivityOfInterval.size()) {
final Entry e3 = this.selectivityOfInterval.get(index);
if (next) {