private Integer applySystemQueryOptions()

in nuget-feed/src/jetbrains/buildServer/nuget/feed/server/olingo/processor/NuGetPackagesProcessor.java [543:594]


  private <T extends Comparable> 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 {
    final 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 && !data.isEmpty()) {
      String entitySkipToken;
      do {
        entitySkipToken = getSkipToken(entitySet, data.get(0));
        data.remove(0);
      } while (!data.isEmpty() && !entitySkipToken.equals(skipToken));
    }

    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;
  }