}
private <T> Integer applySystemQueryOptions(final EdmEntitySet entitySet, final List<T> data,
final FilterExpression filter, final InlineCount inlineCount, final OrderByExpression orderBy,
final String skipToken, final Integer skip, final Integer top) throws ODataException {
ODataContext context = getContext();
final int timingHandle = context.startRuntimeMeasurement(getClass().getSimpleName(), "applySystemQueryOptions");
if (filter != null) {
// Remove all elements the filter does not apply for.
// A for-each loop would not work with "remove", see Java documentation.
for (Iterator<T> iterator = data.iterator(); iterator.hasNext();) {
if (!appliesFilter(iterator.next(), filter)) {
iterator.remove();
}
}
}
final Integer count = inlineCount == InlineCount.ALLPAGES ? data.size() : null;
if (orderBy != null) {
sort(data, orderBy);
} else if (skipToken != null || skip != null || top != null) {
sortInDefaultOrder(entitySet, data);
}
if (skipToken != null) {
while (!data.isEmpty() && !getSkipToken(entitySet, data.get(0)).equals(skipToken)) {
data.remove(0);
}
}
if (skip != null) {
if (skip >= data.size()) {
data.clear();
} else {
for (int i = 0; i < skip; i++) {
data.remove(0);
}
}
}
if (top != null) {
while (data.size() > top) {
data.remove(top.intValue());
}
}
context.stopRuntimeMeasurement(timingHandle);
return count;
}