public DefaultComponentQueryResult find(ComponentQuery query, List<Component> allComponents) {
    LOG.debug("ComponentQuery : {}", query);
    Collection<Component> foundComponents = search(query, allComponents);

    // Sort components
    Collection<? extends Component> sortedComponents =
        new ComponentsFinderSort(foundComponents, query).sort();

    // Apply pagination if needed
    if (ComponentQuery.NO_PAGINATION == query.pageSize()) {
      return new DefaultComponentQueryResult(sortedComponents).setQuery(query);
    } else {
      Paging paging =
          forPageIndex(query.pageIndex())
              .withPageSize(query.pageSize())
              .andTotal(foundComponents.size());
      Collection<? extends Component> pagedComponents = pagedComponents(sortedComponents, paging);
      return new DefaultComponentQueryResult(pagedComponents).setPaging(paging).setQuery(query);
    }
  }