<?php
namespace App\Repository;
use App\Entity\Profile\Profile;
use App\Specification\ElasticSearch\Spec;
use FOS\ElasticaBundle\Finder\TransformedFinder;
use FOS\ElasticaBundle\HybridResult;
use Symfony\Component\DependencyInjection\ContainerInterface;
class ProfileRecommendationRepository
{
private ?array $lastQuery = null;
private array $scores = [];
private TransformedFinder $finder;
public function __construct(ContainerInterface $container)
{
$this->finder = $container->get('fos_elastica.finder.recommendations.profile');
}
/**
* @return mixed[]
*/
public function getByRecommendationWeightsData(Spec $mainQuery, array $filtersQuery, ?array $customSpecQuery, $offset, $limit): array
{
$query = [
'query' => [
'function_score' => [
'query' => [
//... required conditions
],
'functions' => [
//... weight filters
],
'max_boost' => 99999,
'score_mode' => 'sum',
'boost_mode' => 'sum',
'min_score' => 0,
],
],
'from' => $offset,
'size' => $limit,
];
$mainQuery = $mainQuery->toEsQueryObject();
if(key($mainQuery) == 'bool')
$query['query']['function_score']['query'] = $mainQuery;
else
$query['query']['function_score']['query']['bool']['must'] = $mainQuery;
$customQueryIsEmpty = isset($customSpecQuery['bool']) && (empty($customSpecQuery['bool']) || empty(current($customSpecQuery['bool'])));
if($customSpecQuery && false === $customQueryIsEmpty) {
$query['query']['function_score']['query']['bool']['must'][] = [$customSpecQuery];
}
$query['query']['function_score']['functions'] = $filtersQuery;
//print_r(json_encode($query, JSON_PRETTY_PRINT));die;
$this->lastQuery = $query;
//$this->debugLog->checkQuery($this->lastQuery);
$result = $this->finder->findHybrid($query);
$profiles = [];
foreach ($result as /** @var HybridResult $item */ $item) {
/** @var Profile $profile */
$profile = $item->getTransformed();
$profiles[] = $profile;
$this->scores[$profile->getId()] = $item->getResult()->getScore();
}
return $profiles;
}
public function getLastQuery(): ?array
{
return $this->lastQuery;
}
public function getScores(): array
{
return $this->scores;
}
}