em = $em; $this->manager = $manager; $this->sourceManager = $sourceManager; } /** * Fetch information for specified feed * * @param AbstractFeed $feed A AbstractFeed entity * instance. * @param SearchRequestBuilderInterface $builder A SearchRequestBuilderInterface * instance. * * @return FeedResponseInterface */ public function fetch(AbstractFeed $feed, SearchRequestBuilderInterface $builder) { if (! $feed instanceof QueryFeed) { throw new \InvalidArgumentException( 'Expect '. QueryFeed::class . ' but got '. get_class($feed) ); } // // Get proper stored query for fetched feed. // /** @var StoredQueryRepository $repository */ $repository = $this->em->getRepository('CacheBundle:Query\StoredQuery'); $query = $repository->getByFeed($feed->getId()); // // Collect information. // $queryStatus = $query->isInStatus([ StoredQueryStatusEnum::INITIALIZE, StoredQueryStatusEnum::DELETED, ]); $response = new SearchResponse(); $sources = $this->sourceManager->getSourcesForQuery($query, [ 'id', 'title', 'type' ]); $sourceLists = $this->sourceManager->getSourceListsForQuery($query, [ 'id', 'name' ]); $meta = [ 'type' => 'query_feed', 'status' => $queryStatus ? 'not_synced' : 'synced', 'search' => [ 'query' => $query->getRaw(), 'filters' => $query->getRawFilters(), 'advancedFilters' => count($query->getRawAdvancedFilters()) > 0 ? $query->getRawAdvancedFilters() : (object) [], ], 'sources' => $sources, 'sourceLists' => $sourceLists, ]; $advancedFilters = AdvancedFiltersConfig::getDefault(AFSourceEnum::FEED); if (! $query->isInStatus([ StoredQueryStatusEnum::INITIALIZE, StoredQueryStatusEnum::DELETED, ])) { $factory = $builder->getIndex()->getFilterFactory(); $builder ->addFilter($factory->andX([ $factory->eq(FieldNameEnum::COLLECTION_ID, $query->getId()), $factory->eq(FieldNameEnum::COLLECTION_TYPE, CollectionTypeEnum::QUERY), ])) ->addFilter($factory->not($factory->eq(FieldNameEnum::DELETE_FROM, $feed->getId()))); $response = $this->manager->get($feed->getUser(), $query, $builder); $advancedFilters = $this->manager->getAdvancedFilters($query, $builder); } return new FeedResponse($response, $advancedFilters, $meta); } /** * Create search builder for specified feed. * * @param AbstractFeed $feed A AbstractFeed entity instance. * * @return SearchRequestBuilderInterface|null */ public function createRequestBuilder(AbstractFeed $feed) { if (! $feed instanceof QueryFeed) { throw new \InvalidArgumentException( 'Expect '. QueryFeed::class . ' but got '. get_class($feed) ); } // // Get proper stored query for fetched feed. // /** @var StoredQueryRepository $repository */ $repository = $this->em->getRepository('CacheBundle:Query\StoredQuery'); $query = $repository->getByFeed($feed->getId()); if (! $query->isInStatus([ StoredQueryStatusEnum::INITIALIZE, StoredQueryStatusEnum::DELETED, ])) { return $this->manager->createRequestBuilder( $feed->getUser(), $query ); } return null; } /** * Return supported feed fqcn. * * @return string */ public static function support() { return QueryFeed::class; } }