public function findProducts(ListingFilter $filter)
 {
     $must = [];
     if ($filter->getEshop() !== null) {
         $must[] = ["term" => [ProductMeta::ESHOP_ID => (string) $filter->getEshop()->getId()]];
     }
     if ($filter->getCategory() !== null) {
         /** @var Category[] $childrenCategories */
         $childrenCategories = $this->categoryRepository->find([CategoryMeta::PATH => $filter->getCategory()->getId()]);
         $must[] = ["terms" => [ProductMeta::CATEGORY_IDS => array_merge([(string) $filter->getCategory()->getId()], array_map(function (Category $category) {
             return (string) $category->getId();
         }, $childrenCategories))]];
     }
     $body = ["query" => ["filtered" => ["filter" => ["bool" => ["must" => $must]]]], "from" => $filter->getOffset(), "size" => $filter->getLimit(), "sort" => ["_score" => "desc"]];
     if ($filter->getQ() !== null) {
         $body["query"]["filtered"]["query"] = ["multi_match" => ["query" => $filter->getQ(), "fields" => [ProductMeta::NAME . "^5", ProductMeta::LONG_NAME . "^5", ProductMeta::DESCRIPTION, ProductMeta::MANUFACTURER . "^2", ProductMeta::BRAND . "^2", ProductMeta::ESHOP . "." . EshopMeta::NAME . "^2"]]];
     }
     //		if (empty($body["query"]["filtered"]["filter"]["bool"]["must"])) {
     //			unset($body["query"]["filtered"]["filter"]);
     //		}
     $response = $this->elasticsearch->search(["index" => $this->catalogIndexAliasName, "type" => ProductMeta::SHORT_NAME, "body" => $body]);
     if (!isset($response["hits"]["hits"])) {
         throw new \RuntimeException("Response does not have hits->hits. Got: " . json_encode($response));
     }
     $products = [];
     foreach ($response["hits"]["hits"] as $hit) {
         $products[] = ProductMeta::fromArray($hit["_source"], "json:");
     }
     return $products;
 }
 public function eshopDetailAction(Request $request)
 {
     /** @var Eshop $eshop */
     $eshop = $this->eshopRepository->findOne([EshopMeta::SLUG => $request->attributes->get("eshop")]);
     $category = null;
     if ($request->attributes->has("category")) {
         /** @var Category $category */
         $category = $this->categoryRepository->findOneById($request->attributes->get("category"));
     }
     return $this->render("CC15Bundle:Eshop:eshopDetail.html.twig", ["eshop" => $eshop, "category" => $category, "categories" => $this->categoryRepository->findCategories($eshop, $category), "products" => $this->listingService->findProducts(ListingFilter::create()->setEshop($eshop)->setCategory($category))]);
 }
 public function homepageAction()
 {
     return $this->render("CC15Bundle:Homepage:homepage.html.twig", ["eshops" => $this->eshopRepository->findEshopsForHomepage(), "products" => $this->listingService->findProducts(ListingFilter::create())]);
 }
 public function searchAction(Request $request)
 {
     $q = $request->query->get("q");
     return $this->render("CC15Bundle:Search:search.html.twig", ["q" => $q, "products" => $this->listingService->findProducts(ListingFilter::create()->setQ($q))]);
 }