code: public function findForPaginateFilterByContentTypeSiteAndLanguage(PaginateFinderConfiguration $configuration, $contentType, $siteId, $language, array $searchTypes = array())
      {
          $qa = $this->createAggregateQueryWithDeletedFilter(false);
          $qa->match($this->generateContentTypeFilter($contentType));
          $qa->match($this->generateSiteIdAndNotLinkedFilter($siteId));
          $qa->match($this->generateLanguageFilter($language));
  
          $this->filterSearch($configuration, $qa, $searchTypes);
  
          $order = $configuration->getOrder();
          $qa = $this->generateLastVersionFilter($qa, $order);
  
          $newOrder = array();
          array_walk($order, function($item, $key) use(&$newOrder) {
              $newOrder[str_replace('.', '_', $key)] = $item;
          });
  
          if (!empty($newOrder)) {
              $qa->sort($newOrder);
          }
  
          $qa->skip($configuration->getSkip());
          $qa->limit($configuration->getLimit());
  
          return $this->hydrateAggregateQuery($qa, self::ALIAS_FOR_GROUP);
      }
docs: @param PaginateFinderConfiguration $configuration
  @param string                      $contentType
  @param string                      $siteId
  @param string                      $language
  @param array                       $searchTypes
  
  @return array