src/Services/Elastic/ElasticNeosService.php line 39

Open in your IDE?
  1. <?php
  2. namespace App\Services\Elastic;
  3. use App\Entity\OrganizationCodeColor;
  4. use App\Utils\NeosParams;
  5. use DateTime;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Elastica\Aggregation\Stats;
  8. use Elastica\Query;
  9. use Elastica\Query\BoolQuery;
  10. use Elastica\Query\FunctionScore;
  11. use Elastica\Query\MultiMatch;
  12. use Elastica\Query\Range;
  13. use Elastica\Query\Term;
  14. use Elastica\Query\Terms;
  15. use Elastica\Query\Exists;
  16. use Exception;
  17. use Psr\Log\LoggerInterface;
  18. use stdClass;
  19. class ElasticNeosService extends AbstractElasticService
  20. {
  21.     const DEFAULT_SIZE 10;
  22.     const MAX_LIMIT_SIZE 10000;
  23.     const MAX_AUTOCOMPLETE_SIZE 20;
  24.     const KEY_TRANSMISSION_NO 'transmissionNo';
  25.     const KEY_TRANSMISSION_NO_RAW 'transmissionNo.raw';
  26.     const STREAMFARM_PROFILE = ["STREAMFARM""UEFA"];
  27.     const WEB_STREAMING_SYSTEM "WEB STREAMING";
  28.     const NON_LINEAR_DISTRIBUTION_SYSTEM "NON-LINEAR DISTRIBUTION";
  29.     const TXM_STATUS_BIN 'BIN';
  30.     const TXM_STATUS_CAN 'CAN';
  31.     const TXM_STATUS_INQ 'INQ';
  32.     const TXM_PRODUCT_CODE_EXCL_CCT 'EXCL_CCT';
  33.     public function __construct(
  34.         NeosParams $neosParams,
  35.         LoggerInterface $logger,
  36.         EntityManagerInterface $em
  37.     )
  38.     {
  39.         parent::__construct($neosParams->host$neosParams->port$neosParams->transport$logger$neosParams->index);
  40.         $this->em $em;
  41.     }
  42.     public function getTransmissionById(string $id)
  43.     {
  44.         $queryTerm = new Term();
  45.         $queryTerm->setTerm('id'$id);
  46.         $query = new Query($queryTerm);
  47.         $resultSet $this->elasticService->getSearch()->search($query);
  48.         foreach ($resultSet as $trans) {
  49.             $transmissions[] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
  50.         }
  51.         if (empty($transmissions)) {
  52.             return null;
  53.         }
  54.         return $transmissions[0];
  55.     }
  56.     /**
  57.      * @param string $eventNo
  58.      * @return bool true if FUTURE participation is available for this event
  59.      */
  60.     public function hasParticipationsInTheFuture(string $eventNo): bool
  61.     {
  62.         $queryParams = new ParticipationQueryParams();
  63.         $queryParams->eventNo $eventNo;
  64.         $queryParams->startDate = new DateTime();
  65.         $query $this->buildQueryTransmissionParticipations($queryParamsfalse, static::DEFAULT_SIZE);
  66.         $count $this->elasticService->getSearch()->count($query);
  67.         return $count 0;
  68.     }
  69.     /**
  70.      * @param ParticipationQueryParams $queryParams
  71.      * @param bool|null $byEventParent
  72.      * @param int|null $size
  73.      * @param bool|null $includeExternalViewOnly
  74.      * @return Query
  75.      */
  76.     private function buildQueryTransmissionParticipations(ParticipationQueryParams $queryParams, ?bool $byEventParent false$size ElasticNeosService::DEFAULT_SIZEbool $includeExternalViewOnly true): Query
  77.     {
  78.         $query = new Query();
  79.         $filterBool = new BoolQuery();
  80.         if (!empty($queryParams->eventNo)) {
  81.             $queryEventNo = new Term();
  82.             if ($byEventParent) {
  83.                 $queryEventNo->setTerm('event.parentEvent.no'$queryParams->eventNo);
  84.             } else {
  85.                 $queryEventNo->setTerm('event.no'$queryParams->eventNo);
  86.             }
  87.             $filterBool->addMust($queryEventNo);
  88.         }
  89.         if (!empty($queryParams->startDate)) {
  90.             $timestamp $queryParams->startDate->getTimestamp();
  91.             $queryRange = new Range(
  92.                 'beginDate',
  93.                 [
  94.                     'gte' => $timestamp 1000,
  95.                 ]
  96.             );
  97.             $filterBool->addMust($queryRange);
  98.         }
  99.         if (!empty($queryParams->endDate)) {
  100.             $timestamp $queryParams->endDate->getTimestamp();
  101.             $queryRange = new Range(
  102.                 'endDate',
  103.                 [
  104.                     'gte' => $timestamp 1000,
  105.                 ]
  106.             );
  107.             $filterBool->addMust($queryRange);
  108.         }
  109.         if ($includeExternalViewOnly) {
  110.             // Display only bookable transmission
  111.             $queryIsBookable = new Term();
  112.             $queryIsBookable->setTerm('externalView''true');
  113.             $filterBool->addMust($queryIsBookable);
  114.         }
  115.         // Except BIN and CAN transmissions
  116.         $queryExceptBINCANStatus = new Terms('status');
  117.         $queryExceptBINCANStatus->setTerms([ElasticNeosService::TXM_STATUS_BINElasticNeosService::TXM_STATUS_CAN]);
  118.         $filterBool->addMustNot($queryExceptBINCANStatus);
  119.         // Set query to query ES
  120.         $query->setQuery($filterBool);
  121.         // Get all results
  122.         $query->setSize($size);
  123.         return $query;
  124.     }
  125.     public function getTransmissionByTransmissionNo(string $transmissionNo)
  126.     {
  127.         $queryTerm = new Term();
  128.         $queryTerm->setTerm(static::KEY_TRANSMISSION_NO_RAW$transmissionNo);
  129.         $query = new Query($queryTerm);
  130.         $resultSet $this->elasticService->getSearch()->search($query);
  131.         foreach ($resultSet as $trans) {
  132.             $currentTransmission $trans->getSource();
  133.             $currentTransmission['path'] = $this->buildPathForTransmission($currentTransmission);
  134.             $transmissions[] = array_merge($currentTransmission, ['_id' => $trans->getId()]);
  135.         }
  136.         if (empty($transmissions)) {
  137.             return null;
  138.         }
  139.         return $transmissions[0];
  140.     }
  141.     private function buildPathForTransmission(?array $transmission)
  142.     {
  143.         $path "";
  144.         // Netapplied
  145.         $networkPath "";
  146.         if (!empty($transmission['origins']['origin']) && !empty($transmission['origins']['origin'][0]['netApplied']) && !empty($transmission['origins']['origin'][0]['netApplied']['name'])) {
  147.             $networkPath $transmission['origins']['origin'][0]['netApplied']['name'];
  148.             $path .= (!empty($path)) ? " - " $networkPath $networkPath;
  149.         }
  150.         // 1 - Display NETWORK path
  151. //        $networkPath = self::getSystemCodeBySystemType($transmission['technicalSystems']['technicalSystem'], 'NETWORK');
  152. //        if (!empty($networkPath)) {
  153. //            $path .= (!empty($path)) ? " - " . $networkPath : $networkPath;
  154. //        }
  155.         // 2 - Display PLAYOUT path
  156.         $playoutPath self::getSystemCodeBySystemType($transmission['technicalSystems']['technicalSystem'], 'PLAYOUT');
  157.         if (!empty($playoutPath)) {
  158.             $path .= (!empty($path)) ? " - " $playoutPath $playoutPath;
  159.         }
  160.         // 3 - Display STANDUP path
  161.         $standupPath self::getSystemCodeBySystemType($transmission['technicalSystems']['technicalSystem'], 'STANDUP');
  162.         if (!empty($standupPath)) {
  163.             $path .= (!empty($path)) ? " - " $standupPath $standupPath;
  164.         }
  165.         // 4 - Display STUDIO path
  166.         $studioPath self::getSystemCodeBySystemType($transmission['technicalSystems']['technicalSystem'], 'STUDIO');
  167.         if (!empty($studioPath)) {
  168.             $path .= (!empty($path)) ? " - " $studioPath $studioPath;
  169.         }
  170.         // 5 - Display BRIEF path
  171.         $briefPath self::getSystemCodeBySystemType($transmission['technicalSystems']['technicalSystem'], 'BRIEF');
  172.         if (!empty($briefPath)) {
  173.             $path .= (!empty($path)) ? " - " $briefPath $briefPath;
  174.         }
  175.         // 6 - Display POOL ACCESS path
  176.         $poolAccessPath self::getSystemCodeBySystemType($transmission['technicalSystems']['technicalSystem'], 'POOL ACCESS');
  177.         if (!empty($poolAccessPath)) {
  178.             $path .= (!empty($path)) ? " - " $poolAccessPath $poolAccessPath;
  179.         }
  180.         if (empty($path) && !empty($transmission['associatedItems'])) {
  181.             $path $transmission['associatedItems'];
  182.         }
  183.         return $path;
  184.     }
  185.     private function getSystemCodeBySystemType($array$value)
  186.     {
  187.         foreach ($array as $index => $ar) {
  188.             if (!empty($ar['system']) && $ar['system']['type']) {
  189.                 if ($ar['system']['type'] == $value) {
  190.                     if (!empty($ar['system']['niceName'])) {
  191.                         return $ar['system']['niceName'];
  192.                     } else if (!empty($ar['system']['name'])) {
  193.                         return $ar['system']['name'];
  194.                     } else if (!empty($ar['system']['code'])) {
  195.                         return $ar['system']['code'];
  196.                     }
  197.                 }
  198.             }
  199.         }
  200.         return false;
  201.     }
  202.     /**
  203.      * @param string $eventNo the no of the event
  204.      * @param bool|null $byEventParent
  205.      * @param string $order
  206.      * @param bool $includePastParticipation . If true, the past participations will be included.
  207.      * @param bool $includeExternalViewOnly
  208.      * @return array|null of participation
  209.      */
  210.     public function getTransmissionParticipations($eventNo, ?bool $byEventParent false$order 'asc'bool $includePastParticipation falsebool $includeExternalViewOnly true): array
  211.     {
  212.         $query = new ParticipationQueryParams();
  213.         $query->eventNo $eventNo;
  214.         if (!$includePastParticipation) {
  215.             $query->startDate = new DateTime();
  216.         }
  217.         return $this->getTransmissionsParticipations($query$byEventParent$order$includeExternalViewOnly);
  218.     }
  219.     /**
  220.      * @param ParticipationQueryParams $queryParams
  221.      * @param bool|null $byEventParent
  222.      * @param null $order
  223.      * @param bool|null $includeExternalViewOnly
  224.      * @return array|null of participation in the future ( bookable)
  225.      */
  226.     public function getTransmissionsParticipations(ParticipationQueryParams $queryParams, ?bool $byEventParent$order nullbool $includeExternalViewOnly true)
  227.     {
  228.         $query $this->buildQueryTransmissionParticipations($queryParams$byEventParent, static::MAX_LIMIT_SIZE$includeExternalViewOnly);
  229.         return $this->searchTransmissions($query$queryParams->broadcastCenterCode$order);
  230.     }
  231.     /**
  232.      * @param Query $query
  233.      * @param null|string $broadCastCenterCode
  234.      * @param string $order
  235.      * @return array|null
  236.      */
  237.     private function searchTransmissions(Query $query, ?string $broadCastCenterCodestring $order)
  238.     {
  239.         $query->setSort(
  240.             [
  241.                 'beginDate' => ['order' => $order],
  242.                 'id' => ['order' => 'asc']
  243.             ]
  244.         );
  245.         // Get specific fieds to improve performances (EOS document is huge)
  246.         $usefulFields = [
  247.             "id",
  248.             "no",
  249.             static::KEY_TRANSMISSION_NO,
  250.             "year",
  251.             "beginDate",
  252.             "endDate",
  253.             "programBeginDate",
  254.             "programEndDate",
  255.             "product.code",
  256.             "status",
  257.             "type",
  258.             "nature1",
  259.             "nature2",
  260.             "event.no",
  261.             "event.name",
  262.             "event.type",
  263.             "event.isMultiPartialTimingAld",
  264.             "organizationAuthorized",
  265.             "origins.origin.organization.code",
  266.             "origins.origin.organization.name",
  267.             "origins.origin.organization.city.code",
  268.             "origins.origin.organization.city.name",
  269.             "origins.origin.city.code",
  270.             "origins.origin.city.name",
  271.             "origins.origin.city.country.code",
  272.             "origins.origin.city.country.name",
  273.             "origins.origin.transportable.code",
  274.             "origins.origin.broadcastCenter.code",
  275.             "origins.origin.broadcastCenter.name",
  276.             "destinations.destination.organization.code",
  277.             "destinations.destination.organization.name",
  278.             "destinations.destination.organization.city.code",
  279.             "destinations.destination.organization.city.name",
  280.             "destinations.destination.city.code",
  281.             "destinations.destination.city.name",
  282.             "destinations.destination.custOrderItem",
  283.             "destinations.destination.system",
  284.             "transmissionGroup",
  285.             "mdsChannel",
  286.             "technicalSystems.technicalSystem.audios"
  287.         ];
  288.         $query->setSource($usefulFields);
  289.         //$getQuery = json_encode($query->getQuery()->toArray());
  290.         $resultSet $this->elasticService->getSearch()->search($query);
  291.         $transmissions = [];
  292.         foreach ($resultSet as $trans) {
  293.             $transmissions[] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
  294.         }
  295.         if (empty($transmissions)) {
  296.             return [];
  297.         }
  298.         if (!empty($broadCastCenterCode)) {
  299.             $filteredTransmission = [];
  300.             foreach ($transmissions as $transmission) {
  301.                 if (!empty($transmission['origins']['origin'][0]['broadcastCenter']['code'])
  302.                     && $broadCastCenterCode == $transmission['origins']['origin'][0]['broadcastCenter']['code']
  303.                 ) {
  304.                     $filteredTransmission[] = $transmission;
  305.                 }
  306.             }
  307.             $transmissions $filteredTransmission;
  308.         }
  309.         foreach ($transmissions as &$transmission) {
  310.             $transmission['worldfeed'] = ElasticNeosService::isWorldFeed($transmission);
  311.         }
  312.         return $transmissions;
  313.     }
  314.     /**
  315.      * @param $txm
  316.      * @return bool true if the transmission array ( from Elastic search) contains a worldfeed product.
  317.      */
  318.     public static function isWorldFeed(?array $txm): bool
  319.     {
  320.         return $txm != null && !empty($txm['product']['code'])
  321.             && $txm['product']['code'] == 'WORLDFEED';
  322.     }
  323.     /**
  324.      * @param $eventNo
  325.      * @param $order
  326.      * @return array|null
  327.      */
  328.     public function getWorldFeeds(string $eventNostring $order 'asc'bool $includePastParticipation false)
  329.     {
  330.         return $this->searchTransmissions($this->buildQueryVisibleWorldFeeds($eventNo, static::MAX_LIMIT_SIZE$includePastParticipation), null$order);
  331.     }
  332.     private function buildQueryVisibleWorldFeeds(string $eventNostring $sizebool $includePastParticipation false): Query
  333.     {
  334.         $query = new Query();
  335.         $filterBool = new BoolQuery();
  336.         $queryEventNo = new Term();
  337.         $queryEventNo->setTerm('event.no'$eventNo);
  338.         $filterBool->addMust($queryEventNo);
  339.         $queryProduct = new Term();
  340.         $queryProduct->setTerm('product.code''WORLDFEED');
  341.         $filterBool->addMust($queryProduct);
  342.         if (!$includePastParticipation) {
  343.             $startDate = new DateTime();
  344.             $queryRange = new Range(
  345.                 'beginDate',
  346.                 [
  347.                     'gte' => $startDate->getTimestamp() * 1000,
  348.                 ]
  349.             );
  350.             $filterBool->addMust($queryRange);
  351.         }
  352.         // Except BIN and CAN transmissions
  353.         $queryExceptBINStatus = new Term();
  354.         $queryExceptBINStatus->setTerm('status', [ElasticNeosService::TXM_STATUS_BIN]);
  355.         $filterBool->addMustNot($queryExceptBINStatus);
  356.         // Set query to query ES
  357.         $query->setQuery($filterBool);
  358.         // Get all results
  359.         $query->setSize($size);
  360.         return $query;
  361.     }
  362.     public function hasTransmissions(string $eventNo): bool
  363.     {
  364.         try {
  365.             $resultSet $this->elasticService->getSearch()->search($this->buildQueryTransmissionByEventNo($eventNotruetrueself::DEFAULT_SIZE));
  366.             return $resultSet->getTotalHits() > 0;
  367.         } catch (Exception $ex) {
  368.             $this->logger->error("can't get transmissions for event " $eventNo,
  369.                 ['exception' => $ex]);
  370.         }
  371.         return false;
  372.     }
  373.     public function buildQueryTransmissionByEventNo($eventNo, ?bool $showUni falsebool $includePastTransmission falseint $size self::MAX_LIMIT_SIZEstring $order 'asc')
  374.     {
  375.         $query = new Query();
  376.         $filterBool = new BoolQuery();
  377.         $queryEventNo = new Term();
  378.         $queryEventNo->setTerm('event.no'$eventNo);
  379.         $filterBool->addMust($queryEventNo);
  380.         // Display only bookable transmission (MULTI) OR all
  381.         $queryIsBookable = new Term();
  382.         $queryIsBookable->setTerm('externalView''true');
  383.         $filterBool->addShould($queryIsBookable);
  384.         $queryProduct = new Term();
  385.         $queryProduct->setTerm('product.code''WORLDFEED');
  386.         $filterBool->addShould($queryProduct);
  387.         if (empty($showUni) || !$showUni) {
  388.             $queryProduct = new Term();
  389.             $queryProduct->setTerm('product.code''UNI');
  390.             $filterBool->addMustNot($queryProduct);
  391.         } else {
  392.             $queryProduct = new Term();
  393.             $queryProduct->setTerm('product.code''UNI');
  394.             $filterBool->addShould($queryProduct);
  395.         }
  396.         $filterBool->setMinimumShouldMatch(1);
  397.         // Include past transmissions OR all
  398.         if (!$includePastTransmission) {
  399.             $startDate = new DateTime();
  400.             $queryRange = new Range(
  401.                 'endDate',
  402.                 [
  403.                     'gte' => strtotime($startDate->format('Y-m-d')) * 1000,
  404.                 ]
  405.             );
  406.             $filterBool->addMust($queryRange);
  407.         }
  408.         // Except EXCL_CCT transmissions
  409.         $queryExceptEXCL_CCT = new Terms('product.code');
  410.         $queryExceptEXCL_CCT->setTerms([ElasticNeosService::TXM_PRODUCT_CODE_EXCL_CCT]);
  411.         $filterBool->addMustNot($queryExceptEXCL_CCT);
  412.         // Except BIN transmissions
  413.         $queryExceptBINStatus = new Terms('status');
  414.         $queryExceptBINStatus->setTerms([ElasticNeosService::TXM_STATUS_BIN]);
  415.         $filterBool->addMustNot($queryExceptBINStatus);
  416.         $queryExceptCANStatus = new Terms('status');
  417.         $queryExceptCANStatus->setTerms([ElasticNeosService::TXM_STATUS_CAN]);
  418.         $filterBool->addMustNot($queryExceptCANStatus);
  419.         // Set query to query ES
  420.         $query->setQuery($filterBool);
  421.         $query->setSize($size);
  422.         return $query;
  423.     }
  424.     public function hasTransmissionParticipations(string $eventNobool $includePastParticipation false): bool
  425.     {
  426.         try {
  427.             $query = new ParticipationQueryParams();
  428.             $query->eventNo $eventNo;
  429.             if (!$includePastParticipation) {
  430.                 $query->startDate = new DateTime();
  431.             }
  432.             $resultSet $this->elasticService->getSearch()->search($this->buildQueryTransmissionParticipations($queryfalse, static::DEFAULT_SIZE));
  433.             return $resultSet->getTotalHits() > 0;
  434.         } catch (Exception $ex) {
  435.             $this->logger->error("can't get transmissions participations for event " $eventNo,
  436.                 ['exception' => $ex]);
  437.         }
  438.         return false;
  439.     }
  440.     public function hasWorldFeed(string $eventNobool $includePastParticipation false): bool
  441.     {
  442.         try {
  443.             $resultSet $this->elasticService->getSearch()->search($this->buildQueryVisibleWorldFeeds($eventNo, static::DEFAULT_SIZE$includePastParticipation));
  444.             return $resultSet->getTotalHits() > 0;
  445.         } catch (Exception $ex) {
  446.             $this->logger->error("can't get worldfeeds for event " $eventNo,
  447.                 ['exception' => $ex]);
  448.         }
  449.         return false;
  450.     }
  451.     public function getTransmissionByEventNo($eventNo, ?bool $showUni falsebool $includePastTransmission falsestring $order 'asc')
  452.     {
  453.         $query $this->buildQueryTransmissionByEventNo($eventNo$showUni$includePastTransmissionself::MAX_LIMIT_SIZE);
  454.         return $this->searchEventTransmissions($query$order);
  455.     }
  456.     public function searchEventTransmissions(Query $querystring $order)
  457.     {
  458.         $query->setSort(['beginDate' => ['order' => $order]]);
  459.         //$getQuery = json_encode($query->getQuery()->toArray());
  460.         $resultSet $this->elasticService->getSearch()->search($query);
  461.         foreach ($resultSet as $trans) {
  462.             $currentTransmission $trans->getSource();
  463.             $currentTransmission['path'] = $this->buildPathForTransmission($currentTransmission);
  464.             $transmissions[] = array_merge($currentTransmission, ['_id' => $trans->getId()]);
  465.         }
  466.         if (empty($transmissions)) {
  467.             return null;
  468.         }
  469.         foreach ($transmissions as &$transmission) {
  470.             $transmission['worldfeed'] = ElasticNeosService::isWorldFeed($transmission);
  471.         }
  472.         return $transmissions;
  473.     }
  474.     public function getTransmissionByEventNoForAPI(string $eventNo, ?bool $showUni falsebool $includePastTransmission falsestring $order 'asc'): ?array
  475.     {
  476.         $query $this->buildQueryTransmissionByEventNo($eventNo$showUni$includePastTransmissionself::MAX_LIMIT_SIZE);
  477.         return $this->searchEventTransmissionsWithBasicDetails($query$order);
  478.     }
  479.     public function searchEventTransmissionsWithBasicDetails(Query $querystring $order)
  480.     {
  481.         $query->setSort(['beginDate' => ['order' => $order]]);
  482.         // Get specific fields to improve performances (EOS document is huge)
  483.         $usefulFields = [
  484.             "id",
  485.             static::KEY_TRANSMISSION_NO,
  486.             "beginDate",
  487.             "endDate",
  488.             "programBeginDate",
  489.             "programEndDate",
  490.             "product.code",
  491.             "status",
  492.             "type",
  493.             "nature1",
  494.             "nature2",
  495.             "event.no",
  496.             "event.name",
  497.             "event.type",
  498.         ];
  499.         $query->setSource($usefulFields);
  500.         //$getQuery = json_encode($query->getQuery()->toArray());
  501.         $resultSet $this->elasticService->getSearch()->search($query);
  502.         foreach ($resultSet as $trans) {
  503.             $currentTransmission $trans->getSource();
  504.             $transmissions[] = array_merge($currentTransmission);
  505.         }
  506.         if (empty($transmissions)) {
  507.             return null;
  508.         }
  509.         return $transmissions;
  510.     }
  511.     // Filter live search input
  512.     public function getTransmissions($parameters): ?array
  513.     {
  514.         $query ElasticNeosService::buildQueryTransmissions($parameters);
  515.         // Get all results and sort by date
  516.         $query->setSort(
  517.             [
  518.                 'beginDate' => ['order' => 'asc'],
  519.                 'id' => ['order' => 'asc']
  520.             ]
  521.         );
  522.         if (!empty($parameters['from'])) {
  523.             $query->setFrom($parameters['from']);
  524.         }
  525.         if (!empty($parameters['size'])) {
  526.             $query->setSize($parameters['size']);
  527.         } else {
  528.             $query->setSize(static::MAX_LIMIT_SIZE);
  529.         }
  530.         // Get specific fields to improve performances (EOS document is huge)
  531.         $usefulFields = [
  532.             "id",
  533.             "no",
  534.             static::KEY_TRANSMISSION_NO,
  535.             "year",
  536.             "beginDate",
  537.             "endDate",
  538.             "programBeginDate",
  539.             "programEndDate",
  540.             "product.code",
  541.             "status",
  542.             "type",
  543.             "nature1",
  544.             "nature2",
  545.             "event.no",
  546.             "event.name",
  547.             "event.type",
  548.             "organizationAuthorized.destinations",
  549.             "organizationAuthorized.billTo",
  550.             "organizationAuthorized.customer",
  551.             "origins.origin.organization.code",
  552.             "origins.origin.organization.name",
  553.             "origins.origin.organization.city.code",
  554.             "origins.origin.organization.city.name",
  555.             "origins.origin.city.code",
  556.             "origins.origin.city.name",
  557.             "origins.origin.transportable.code",
  558.             "origins.origin.netApplied",
  559.             "origins.origin.broadcastCenter.name",
  560.             "destinations.destination.organization.code",
  561.             "destinations.destination.organization.name",
  562.             "destinations.destination.organization.city.code",
  563.             "destinations.destination.organization.city.name",
  564.             "destinations.destination.city.code",
  565.             "destinations.destination.city.name",
  566.             "destinations.destination.custOrderItem.custOrder.event.resourceNetDef.code",
  567.             "destinations.destination.custOrderItem.id",
  568.             "destinations.destination.custOrderItem.product.type",
  569.             "destinations.destination.custOrderItem.status",
  570.             "destinations.destination.custOrderItem.custOrder",
  571.             "technicalSystems.technicalSystem.videoDefinitionCode",
  572.             "technicalSystems.technicalSystem.videoAspectRatioCode",
  573.             "technicalSystems.technicalSystem.system",
  574.             "associatedItems",
  575.             "lastSynopsisStatus",
  576.             "mdsChannel",
  577.         ];
  578.         $query->setSource($usefulFields);
  579.         //$getQuery = json_encode($query->getQuery()->toArray());
  580.         $transmissions = [];
  581.         $resultSet $this->elasticService->getSearch()->search($query);
  582.         foreach ($resultSet as $trans) {
  583.             $currentTransmission $trans->getSource();
  584.             $currentTransmission['path'] = $this->buildPathForTransmission($currentTransmission);
  585.             $currentTransmission['participationStatus'] = $this->buildStatusParticipationFromUserCodeOps($currentTransmission$parameters);
  586.             $transmissions[] = array_merge($currentTransmission, ['_id' => $trans->getId()]);
  587.         }
  588.         return $transmissions;
  589.     }
  590.     // Get all filters
  591.     public function buildQueryTransmissions($parameters)
  592.     {
  593.         date_default_timezone_set('GMT');
  594.         // Convert timestamp into milliseconds.
  595.         $fromDateTS strtotime($parameters['dateFrom']) * 1000;
  596.         $toDateTS strtotime($parameters['dateTo']) * 1000;
  597.         if ($parameters['dateFrom'] == $parameters['dateTo']) {
  598.             $toDateTS strtotime('+ 24 hours'strtotime($parameters['dateTo'])) * 1000;
  599.         }
  600.         $query = new Query();
  601.         /**
  602.          * @var BoolQuery $filters
  603.          */
  604.         $filters = new BoolQuery();
  605.         // Query multi match on transmission number, title and event
  606.         if (!empty($parameters['searchCustom'])) {
  607.             $queryMultiMatch = new MultiMatch();
  608.             $queryMultiMatch->setQuery($parameters['searchCustom']);
  609.             $fields = [
  610.                 "no",
  611.                 static::KEY_TRANSMISSION_NO,
  612.                 "nature1",
  613.                 "nature2",
  614.                 "event.no",
  615.                 "event.name",
  616.                 "destinations.destination.organization.code",
  617.                 "destinations.destination.city.code",
  618.                 "origins.origin.organization.code",
  619.                 "origins.origin.city.code",
  620.                 "destinations.destination.organization.name",
  621.                 "destinations.destination.city.name",
  622.                 "origins.origin.organization.name",
  623.                 "origins.origin.city.name",
  624.                 "technicalSystems.technicalSystem.system.name",
  625.             ];
  626.             $queryMultiMatch->setFields($fields);
  627.             $filters->addMust($queryMultiMatch);
  628.         }
  629.         // Filter query on date
  630.         if (!empty($parameters['dateFrom']) && !empty($parameters['dateTo'])) {
  631.             // 1 - Timeline start < TXM START < Timeline end
  632.             $queryRangeStart = new Range(
  633.                 'beginDate', [
  634.                     'gte' => intval($fromDateTS),
  635.                     'lte' => intval($toDateTS)
  636.                 ]
  637.             );
  638.             $filters->addShould($queryRangeStart);
  639.             // 2 - Timeline start < TXM END < Timeline end
  640.             $queryRangeEnd = new Range(
  641.                 'endDate', [
  642.                     'gte' => intval($fromDateTS),
  643.                     'lte' => intval($toDateTS)
  644.                 ]
  645.             );
  646.             $filters->addShould($queryRangeEnd);
  647.             $filters->setMinimumShouldMatch(1);
  648.         } elseif (!empty($parameters['dateFrom'])) {
  649.             // Get all transmissions where endDate > dateFrom
  650.             $queryOnlyStartDate = new Range(
  651.                 'endDate', [
  652.                     'gte' => intval($fromDateTS)
  653.                 ]
  654.             );
  655.             $filters->addMust($queryOnlyStartDate);
  656.         } elseif (!empty($parameters['dateTo'])) {
  657.             // Get all transmissions where beginDate < dateTo
  658.             $queryOnlyEndDate = new Range(
  659.                 'beginDate', [
  660.                     'lte' => intval($toDateTS)
  661.                 ]
  662.             );
  663.             $filters->addMust($queryOnlyEndDate);
  664.         }
  665.         // Filter on Company (user company or family) OR Filter on opsprod rights access
  666.         if (!empty($parameters['companies'])) {
  667.             $companyOpsprodFilter self::addFilterCompanyOrOpsprod($parameters);
  668.             $filters->addMust($companyOpsprodFilter);
  669.         }
  670.         if (!empty($parameters['typeEvent'])) {
  671.             $queryTypeEvent = new Terms('event.type.raw');
  672.             $queryTypeEvent->setTerms($parameters['typeEvent']);
  673.             $filters->addMust($queryTypeEvent);
  674.         }
  675.         if (!empty($parameters['events'])) {
  676.             // Get events
  677.             $queryEvents = new Terms('event.no');
  678.             $queryEvents->setTerms((is_array($parameters['events'])) ? $parameters['events'] : [$parameters['events']]);
  679.             $filters->addMust($queryEvents);
  680.         }
  681.         if (!empty($parameters['productCode']) && $parameters['productCode'] != "All") {
  682.             // Get product code
  683.             $queryProductCode = new Terms('product.code');
  684.             $queryProductCode->setTerms(
  685.                 (is_array($parameters['productCode'])) ? $parameters['productCode'] : [$parameters['productCode']]);
  686.             $filters->addMust($queryProductCode);
  687.         }
  688.         if (!empty($parameters['status']) && $parameters['status'] != "All") {
  689.             // Get status
  690.             $queryStatus = new Terms('status');
  691.             $queryStatus->setTerms((is_array($parameters['status'])) ? $parameters['status'] : [$parameters['status']]);
  692.             $filters->addMust($queryStatus);
  693.         }
  694.         if (!empty($parameters['eventNo'])) {
  695.             // Get event
  696.             $queryEventNo = new Term();
  697.             $queryEventNo->setTerm('event.no', (is_array($parameters['eventNo'])) ? $parameters['eventNo'] : [$parameters['eventNo']]);
  698.             $filters->addMust($queryEventNo);
  699.         }
  700.         if (!empty($parameters[static::KEY_TRANSMISSION_NO])) {
  701.             // Get transmission
  702.             $queryTransmissionNo = new Term();
  703.             $queryTransmissionNo->setTerm('no',
  704.                 (is_array($parameters[static::KEY_TRANSMISSION_NO_RAW])) ?
  705.                     $parameters[static::KEY_TRANSMISSION_NO_RAW]
  706.                     : [$parameters[static::KEY_TRANSMISSION_NO_RAW]]);
  707.             $filters->addMust($queryTransmissionNo);
  708.         }
  709.         // Show tagged items if the filter is check
  710.         if (!empty($parameters['isEvent'])) {
  711.             $queryIncludeEvent = new Exists('event');
  712.             $filters->addMust($queryIncludeEvent);
  713.         }
  714.         // Add filter on live search input
  715.         $filters self::addFilterLiveSearchInput($parameters$filters);
  716.         // Except transmissions with specific status
  717.         if ($parameters['exceptedStatus']) {
  718.             $queryExceptStatus = new Terms('status');
  719.             $queryExceptStatus->setTerms($parameters['exceptedStatus']);
  720.             $filters->addMustNot($queryExceptStatus);
  721.         }
  722.         // Set query to query ES
  723.         $query->setQuery($filters);
  724.         //$getQuery = json_encode($query->getQuery()->toArray());
  725.         return $query;
  726.     }
  727.     private function addFilterCompanyOrOpsprod($parameters)
  728.     {
  729.         $companyOrEventFilter = new BoolQuery();
  730.         // Get by companies
  731.         $queryCompaniesDestination = new Terms('organizationAuthorized.destinations');
  732.         $queryCompaniesDestination->setTerms($parameters['companies']);
  733.         $queryCompaniesBillTo = new Terms('organizationAuthorized.billTo');
  734.         $queryCompaniesBillTo->setTerms($parameters['companies']);
  735.         $queryCompaniesEventHost = new Terms('organizationAuthorized.eventHost');
  736.         $queryCompaniesEventHost->setTerms($parameters['companies']);
  737.         $queryCompaniesEventRight = new Terms('organizationAuthorized.eventRight');
  738.         $queryCompaniesEventRight->setTerms($parameters['companies']);
  739.         $queryCompaniesOrigin = new Terms('organizationAuthorized.origin');
  740.         $queryCompaniesOrigin->setTerms($parameters['companies']);
  741.         $queryCompaniesBCOwner = new Terms('organizationAuthorized.bcOwner');
  742.         $queryCompaniesBCOwner->setTerms($parameters['companies']);
  743.         $queryCompaniesEventInvoiceTo = new Terms('organizationAuthorized.eventInvoiceTo');
  744.         $queryCompaniesEventInvoiceTo->setTerms($parameters['companies']
  745.         );
  746.         $queryCompaniesAdditionalRecipients = new Terms('organizationAuthorized.additionalRecipients');
  747.         $queryCompaniesAdditionalRecipients->setTerms($parameters['companies']
  748.         );
  749.         $queryCompaniesCustomer = new Terms('organizationAuthorized.customer');
  750.         $queryCompaniesCustomer->setTerms($parameters['companies']);
  751.         $queryCompaniesSynRecipients = new Terms('organizationAuthorized.synRecipients');
  752.         $queryCompaniesSynRecipients->setTerms($parameters['companies']);
  753.         $companyOrEventFilter->addShould($queryCompaniesDestination);
  754.         $companyOrEventFilter->addShould($queryCompaniesBillTo);
  755.         $companyOrEventFilter->addShould($queryCompaniesEventHost);
  756.         $companyOrEventFilter->addShould($queryCompaniesEventRight);
  757.         $companyOrEventFilter->addShould($queryCompaniesOrigin);
  758.         $companyOrEventFilter->addShould($queryCompaniesBCOwner);
  759.         $companyOrEventFilter->addShould($queryCompaniesEventInvoiceTo);
  760.         $companyOrEventFilter->addShould($queryCompaniesAdditionalRecipients);
  761.         $companyOrEventFilter->addShould($queryCompaniesCustomer);
  762.         $companyOrEventFilter->addShould($queryCompaniesSynRecipients);
  763.         if (!empty($parameters['opsprodAccess'])) {
  764.             // Get by opsprod event right access
  765.             $queryOpsprod = new Terms('event.no');
  766.             $queryOpsprod->setTerms($parameters['opsprodAccess']);
  767.             $companyOrEventFilter->addShould($queryOpsprod);
  768.         }
  769.         return $companyOrEventFilter;
  770.     }
  771.     private function addFilterLiveSearchInput(array $parametersBoolQuery $filters)
  772.     {
  773.         // Live input search filters
  774.         if (!empty($parameters['searchTransRef'])) {
  775.             // Get transmission ref
  776.             $queryTransRef = new Term();
  777.             $queryTransRef->setTerm(static::KEY_TRANSMISSION_NO_RAW$parameters['searchTransRef']);
  778.             $filters->addMust($queryTransRef);
  779.         }
  780.         if (!empty($parameters['searchEventNo'])) {
  781.             // Get event no
  782.             $queryEventNo = new Term();
  783.             $queryEventNo->setTerm('event.no'$parameters['searchEventNo']);
  784.             $filters->addMust($queryEventNo);
  785.         }
  786.         if (!empty($parameters['searchEventType'])) {
  787.             // Get event type
  788.             $queryEventType = new Term();
  789.             $queryEventType->setTerm('event.type'strtolower($parameters['searchEventType']));
  790.             $filters->addMust($queryEventType);
  791.         }
  792.         if (!empty($parameters['searchEventName'])) {
  793.             // Get event name
  794.             $queryEventName = new Term();
  795.             $queryEventName->setTerm('event.name.raw'$parameters['searchEventName']);
  796.             $filters->addMust($queryEventName);
  797.         }
  798.         if (!empty($parameters['searchDescription'])) {
  799.             // Get nature2 (description)
  800.             $queryDescription = new Term();
  801.             $queryDescription->setTerm('nature2.raw'$parameters['searchDescription']);
  802.             $filters->addMust($queryDescription);
  803.         }
  804.         if (!empty($parameters['searchTitle'])) {
  805.             // Get nature1 (Title)
  806.             $queryTitle = new Term();
  807.             $queryTitle->setTerm('nature1.raw'$parameters['searchTitle']);
  808.             $filters->addMust($queryTitle);
  809.         }
  810.         if (!empty($parameters['searchOriginCode'])) {
  811.             // Get origin by code
  812.             $queryOrigin = new Term();
  813.             $queryOrigin->setTerm('origins.origin.organization.code.raw'$parameters['searchOriginCode']);
  814.             $filters->addMust($queryOrigin);
  815.         }
  816.         if (!empty($parameters['searchOriginCityCode'])) {
  817.             // Get origin by city code
  818.             $queryOriginCity = new Term();
  819.             $queryOriginCity->setTerm('origins.origin.city.code.raw'$parameters['searchOriginCityCode']);
  820.             $filters->addMust($queryOriginCity);
  821.         }
  822.         if (!empty($parameters['searchDestinationCode'])) {
  823.             // Get destination by code
  824.             $queryDestination = new Term();
  825.             $queryDestination->setTerm(
  826.                 'destinations.destination.organization.code.raw'$parameters['searchDestinationCode']
  827.             );
  828.             $filters->addMust($queryDestination);
  829.         }
  830.         if (!empty($parameters['searchDestinationCityCode'])) {
  831.             // Get destination by city code
  832.             $queryDestinationCity = new Term();
  833.             $queryDestinationCity->setTerm(
  834.                 'destinations.destination.city.code.raw'$parameters['searchDestinationCityCode']
  835.             );
  836.             $filters->addMust($queryDestinationCity);
  837.         }
  838.         if (!empty($parameters['searchOriginName'])) {
  839.             // Get origin by name
  840.             $queryOrigin = new Term();
  841.             $queryOrigin->setTerm('origins.origin.organization.name.raw'$parameters['searchOriginName']);
  842.             $filters->addMust($queryOrigin);
  843.         }
  844.         if (!empty($parameters['searchOriginCityName'])) {
  845.             // Get origin by city name
  846.             $queryOriginCity = new Term();
  847.             $queryOriginCity->setTerm('origins.origin.city.name.raw'$parameters['searchOriginCityName']);
  848.             $filters->addMust($queryOriginCity);
  849.         }
  850.         if (!empty($parameters['searchDestinationName'])) {
  851.             // Get destination by name
  852.             $queryDestination = new Term();
  853.             $queryDestination->setTerm(
  854.                 'destinations.destination.organization.name.raw'$parameters['searchDestinationName']
  855.             );
  856.             $filters->addMust($queryDestination);
  857.         }
  858.         if (!empty($parameters['searchDestinationCityName'])) {
  859.             // Get destination by city name
  860.             $queryDestinationCity = new Term();
  861.             $queryDestinationCity->setTerm(
  862.                 'destinations.destination.city.name.raw'$parameters['searchDestinationCityName']
  863.             );
  864.             $filters->addMust($queryDestinationCity);
  865.         }
  866.         if (!empty($parameters['searchPath'])) {
  867.             // Get path
  868.             $queryPath = new Term();
  869.             $queryPath->setTerm('technicalSystems.technicalSystem.system.name.raw'$parameters['searchPath']);
  870.             $filters->addMust($queryPath);
  871.         }
  872.         if (!empty($parameters['searchPathByCode'])) {
  873.             // Get path
  874.             $queryPathByCode = new Term();
  875.             $queryPathByCode->setTerm('technicalSystems.technicalSystem.system.code.raw'$parameters['searchPathByCode']);
  876.             $filters->addMust($queryPathByCode);
  877.         }
  878.         return $filters;
  879.     }
  880.     private function buildStatusParticipationFromUserCodeOps(?array $transmission, ?array $parameters)
  881.     {
  882.         $statusParticipation "";
  883.         if (!empty($transmission['destinations']) && !empty($transmission['destinations']['destination'])) {
  884.             foreach ($transmission['destinations']['destination'] as $destination) {
  885.                 if (!empty($destination['organization']['code'])
  886.                     && $destination['organization']['code'] == $parameters['userCodeOps']
  887.                     && !empty($destination['custOrderItem'])
  888.                     && !empty($destination['custOrderItem']['product'])
  889.                     && !empty($destination['custOrderItem']['product']['type'])
  890.                     && $destination['custOrderItem']['product']['type'] === 'PARTICIPATION'
  891.                     && !empty($destination['custOrderItem']['status'])
  892.                 ) {
  893.                     $statusParticipation $destination['custOrderItem']['status'];
  894.                 }
  895.             }
  896.         }
  897.         return $statusParticipation;
  898.     }
  899.     public function getAllFilters()
  900.     {
  901.         $query = new Query();
  902.         // Aggregations to get number in filter
  903.         $aggregationEvent = new \Elastica\Aggregation\Terms("by_event");
  904.         $aggregationEvent->setField("event.no.raw");
  905.         $aggregationEvent->setSize(0);
  906.         $aggregationStatus = new \Elastica\Aggregation\Terms("by_status");
  907.         $aggregationStatus->setField("status");
  908.         $aggregationStatus->setSize(0);
  909.         $aggregationService = new \Elastica\Aggregation\Terms("by_service");
  910.         $aggregationService->setField("product.code");
  911.         $aggregationService->setSize(0);
  912.         $aggregationEventName = new \Elastica\Aggregation\Terms("by_event_name");
  913.         $aggregationEventName->setField("event.name.raw");
  914.         $aggregationEventName->setSize(0);
  915.         $aggregationEventType = new \Elastica\Aggregation\Terms("by_event_type");
  916.         $aggregationEventType->setField("event.type.raw");
  917.         $aggregationEventType->setSize(0);
  918.         // Get Min/Max date of result
  919.         $aggregationMinMaxDate = new Stats("min_max_date");
  920.         $aggregationMinMaxDate->setField("beginDate");
  921.         $aggregationEvent->addAggregation($aggregationEventName);
  922.         $aggregationEvent->addAggregation($aggregationEventType);
  923.         $query->addAggregation($aggregationEvent);
  924.         $query->addAggregation($aggregationStatus);
  925.         $query->addAggregation($aggregationService);
  926.         $query->addAggregation($aggregationMinMaxDate);
  927.         $aggregationResult $this->elasticService->getSearch()->search($query)->getAggregations();
  928.         if (empty($aggregationResult)) {
  929.             return null;
  930.         }
  931.         return $aggregationResult;
  932.     }
  933.     public function getCount()
  934.     {
  935.         return $this->elasticService->getCount();
  936.     }
  937.     public function getIdeasForAutocomplete($parameters)
  938.     {
  939.         $query = new Query();
  940.         $filterBool = new BoolQuery();
  941.         // Query multi match on transmission number, title and event
  942.         if (!empty($parameters['searchKeywords'])) {
  943.             $queryMultiMatch = new MultiMatch();
  944.             $queryMultiMatch->setQuery($parameters['searchKeywords']);
  945.             $fields = [
  946.                 "event.no",
  947.                 "event.name",
  948.             ];
  949.             $queryMultiMatch->setFields($fields);
  950.             //$queryMultiMatch->setOperator('and');
  951.             $filterBool->addMust($queryMultiMatch);
  952.         }
  953.         // Filter on Company (user company or family) OR Filter on opsprod rights access
  954.         if (!empty($parameters['companies'])) {
  955.             $companyOpsprodFilter self::addFilterCompanyOrOpsprod($parameters);
  956.             $filterBool->addMust($companyOpsprodFilter);
  957.         }
  958.         // Add filter on live search input
  959.         $filterBool self::addFilterLiveSearchInput($parameters$filterBool);
  960.         // Except BIN transmission
  961.         $queryExceptBININQStatus = new Terms('status');
  962.         $queryExceptBININQStatus->setTerms([ElasticNeosService::TXM_STATUS_BINElasticNeosService::TXM_STATUS_INQ]);
  963.         $filterBool->addMustNot($queryExceptBININQStatus);
  964.         // Set query to query ES
  965.         $query->setQuery($filterBool);
  966.         //$getQuery = json_encode($query->getQuery()->toArray());
  967.         // Aggregations to get ideas
  968.         // Aggs on the event number
  969.         $aggregationEventNumber = new \Elastica\Aggregation\Terms("by_event_number");
  970.         $aggregationEventNumber->setField("event.no.raw");
  971.         $aggregationEventNumber->setSize(3);
  972.         // Aggs on the event name
  973.         $aggregationEventName = new \Elastica\Aggregation\Terms("by_event_name");
  974.         $aggregationEventName->setField("event.name.raw");
  975.         $aggregationEventName->setSize(3);
  976.         $aggregationEventNumber->addAggregation($aggregationEventName);
  977.         $query->addAggregation($aggregationEventNumber);
  978.         $aggregationResult $this->elasticService->getSearch()->search($query)->getAggregations();
  979.         if (empty($aggregationResult)) {
  980.             return null;
  981.         }
  982.         return $aggregationResult;
  983.     }
  984.     public function getIdeasForAutocompleteByHighlight($parameters)
  985.     {
  986.         // Query filtered
  987.         $query = new Query();
  988.         $filterBool = new BoolQuery();
  989.         // Query multi match on transmission number, title and event
  990.         if (!empty($parameters['searchKeywords'])) {
  991.             $queryMultiMatch = new MultiMatch();
  992.             $queryMultiMatch->setQuery($parameters['searchKeywords']);
  993.             $fields = [
  994.                 "no",
  995.                 "transmissionNo",
  996.                 "event.no",
  997.                 "event.name",
  998.                 "nature1",
  999.                 "nature2",
  1000.                 "destinations.destination.organization.code",
  1001.                 "destinations.destination.city.code",
  1002.                 "origins.origin.organization.code",
  1003.                 "origins.origin.city.code",
  1004.                 "destinations.destination.organization.name",
  1005.                 "destinations.destination.city.name",
  1006.                 "origins.origin.organization.name",
  1007.                 "origins.origin.city.name",
  1008.                 "technicalSystems.technicalSystem.system.name",
  1009.                 "technicalSystems.technicalSystem.system.code"
  1010.             ];
  1011.             $queryMultiMatch->setFields($fields);
  1012.             $queryMultiMatch->setOperator('and');
  1013.             $filterBool->addMust($queryMultiMatch);
  1014.         }
  1015.         // Filter on Company (user company or family) OR Filter on opsprod rights access
  1016.         if (!empty($parameters['companies'])) {
  1017.             $companyOpsprodFilter self::addFilterCompanyOrOpsprod($parameters);
  1018.             $filterBool->addMust($companyOpsprodFilter);
  1019.         }
  1020.         // Add filter on live search input
  1021.         $filterBool self::addFilterLiveSearchInput($parameters$filterBool);
  1022.         // Except BIN transmission
  1023.         $queryExceptBININQStatus = new Terms('status');
  1024.         $queryExceptBININQStatus->setTerms([ElasticNeosService::TXM_STATUS_BINElasticNeosService::TXM_STATUS_INQ]);
  1025.         $filterBool->addMustNot($queryExceptBININQStatus);
  1026.         $query->setQuery($filterBool);
  1027.         // Get specific fields to improve performances (EOS document is huge)
  1028.         $usefulFields = [
  1029.             "id",
  1030.             "no",
  1031.             "transmissionNo",
  1032.             "year",
  1033.             "beginDate",
  1034.             "endDate",
  1035.             "product.code",
  1036.             "status",
  1037.             "type",
  1038.             "nature1",
  1039.             "nature2",
  1040.             "event.no",
  1041.             "event.name",
  1042.             "event.type",
  1043.             "organizationAuthorized.destinations",
  1044.             "origins.origin.organization.code",
  1045.             "origins.origin.organization.name",
  1046.             "origins.origin.organization.city.code",
  1047.             "origins.origin.organization.city.name",
  1048.             "origins.origin.city.code",
  1049.             "origins.origin.city.name",
  1050.             "origins.origin.transportable.code",
  1051.             "destinations.destination.organization.code",
  1052.             "destinations.destination.organization.name",
  1053.             "destinations.destination.organization.city.code",
  1054.             "destinations.destination.organization.city.name",
  1055.             "destinations.destination.city.code",
  1056.             "destinations.destination.city.name",
  1057.             "technicalSystems.technicalSystem.system"
  1058.         ];
  1059.         $query->setSource($usefulFields);
  1060.         // Get word hightlighted
  1061.         $highlight = [
  1062.             "pre_tags" => ["<b>"],
  1063.             "post_tags" => ["</b>"],
  1064.             "fields" => [
  1065.                 "no" => new stdClass(),
  1066.                 "transmissionNo" => new stdClass(),
  1067.                 "event.no" => new stdClass(),
  1068.                 "event.name" => new stdClass(),
  1069.                 "nature1" => new stdClass(),
  1070.                 "nature2" => new stdClass(),
  1071.                 "destinations.destination.organization.code" => new stdClass(),
  1072.                 "destinations.destination.city.code" => new stdClass(),
  1073.                 "origins.origin.organization.code" => new stdClass(),
  1074.                 "origins.origin.city.code" => new stdClass(),
  1075.                 "destinations.destination.organization.name" => new stdClass(),
  1076.                 "destinations.destination.city.name" => new stdClass(),
  1077.                 "origins.origin.organization.name" => new stdClass(),
  1078.                 "origins.origin.city.name" => new stdClass(),
  1079.                 "technicalSystems.technicalSystem.system.name" => new stdClass(),
  1080.                 "technicalSystems.technicalSystem.system.code" => new stdClass()
  1081.             ]
  1082.         ];
  1083.         $query->setHighlight($highlight);
  1084.         // Limit size
  1085.         $query->setSize(20);
  1086.         $getQuery json_encode($query->getQuery()->toArray());
  1087.         $arrayResult null;
  1088.         foreach ($this->elasticService->getSearch()->search($query) as $trans) {
  1089.             $transmissions['source'] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
  1090.             $transmissions['highlight'] = $trans->getHighlights();
  1091.             $arrayResult[] = $transmissions;
  1092.         }
  1093.         if (empty($arrayResult)) {
  1094.             return null;
  1095.         }
  1096.         return $arrayResult;
  1097.     }
  1098.     public function getIdeasForAutocompleteByHighlight2($parameters)
  1099.     {
  1100.         // Query filtered
  1101.         $query = new Query();
  1102.         $filterBool = new BoolQuery();
  1103.         $functionScore = new FunctionScore();
  1104.         $functionScore->addDecayFunction(FunctionScore::DECAY_LINEAR"beginDate""now""20d"null0.5);
  1105.         //$functionScore->addFunction('filter', array("term" => array("event.name" => "geneva tatawine")), null, 10);
  1106.         // Query multi match on transmission number, title and event
  1107.         if (!empty($parameters['searchKeywords'])) {
  1108.             $queryMultiMatch = new MultiMatch();
  1109.             $queryMultiMatch->setQuery($parameters['searchKeywords']);
  1110.             $fields = [
  1111.                 "no",
  1112.                 "transmissionNo",
  1113.                 "event.no",
  1114.                 "event.name",
  1115.                 "nature1",
  1116.                 "nature2",
  1117.                 "destinations.destination.organization.code",
  1118.                 "destinations.destination.city.code",
  1119.                 "origins.origin.organization.code",
  1120.                 "origins.origin.city.code",
  1121.                 "destinations.destination.organization.name",
  1122.                 "destinations.destination.city.name",
  1123.                 "origins.origin.organization.name",
  1124.                 "origins.origin.city.name",
  1125.                 "technicalSystems.technicalSystem.system.name",
  1126.                 "technicalSystems.technicalSystem.system.code"
  1127.             ];
  1128.             $queryMultiMatch->setFields($fields);
  1129.             $queryMultiMatch->setOperator('and');
  1130.             $filterBool->addMust($queryMultiMatch);
  1131.         }
  1132.         // Filter on Company (user company or family) OR Filter on opsprod rights access
  1133.         if (!empty($parameters['companies'])) {
  1134.             $companyOpsprodFilter self::addFilterCompanyOrOpsprod($parameters);
  1135.             $filterBool->addMust($companyOpsprodFilter);
  1136.         }
  1137.         // Add filter on live search input
  1138.         $filterBool self::addFilterLiveSearchInput($parameters$filterBool);
  1139.         // Except BIN transmission
  1140.         $queryExceptBININQStatus = new Terms('status');
  1141.         $queryExceptBININQStatus->setTerms([ElasticNeosService::TXM_STATUS_BINElasticNeosService::TXM_STATUS_INQ]);
  1142.         $filterBool->addMustNot($queryExceptBININQStatus);
  1143.         $functionScore->setQuery($filterBool);
  1144.         $query->setQuery($functionScore);
  1145.         // Get specific fields to improve performances (EOS document is huge)
  1146.         $usefulFields = [
  1147.             "id",
  1148.             "no",
  1149.             "transmissionNo",
  1150.             "year",
  1151.             "beginDate",
  1152.             "endDate",
  1153.             "product.code",
  1154.             "status",
  1155.             "type",
  1156.             "nature1",
  1157.             "nature2",
  1158.             "event.no",
  1159.             "event.name",
  1160.             "event.type",
  1161.             "organizationAuthorized.destinations",
  1162.             "origins.origin.organization.code",
  1163.             "origins.origin.organization.name",
  1164.             "origins.origin.organization.city.code",
  1165.             "origins.origin.organization.city.name",
  1166.             "origins.origin.city.code",
  1167.             "origins.origin.city.name",
  1168.             "origins.origin.transportable.code",
  1169.             "destinations.destination.organization.code",
  1170.             "destinations.destination.organization.name",
  1171.             "destinations.destination.organization.city.code",
  1172.             "destinations.destination.organization.city.name",
  1173.             "destinations.destination.city.code",
  1174.             "destinations.destination.city.name",
  1175.             "technicalSystems.technicalSystem.system"
  1176.         ];
  1177.         $query->setSource($usefulFields);
  1178.         // Get word hightlighted
  1179.         $highlight = [
  1180.             "pre_tags" => [""],
  1181.             "post_tags" => [""],
  1182.             "fields" => [
  1183.                 "no" => new stdClass(),
  1184.                 "transmissionNo" => new stdClass(),
  1185.                 "event.no" => new stdClass(),
  1186.                 "event.name" => new stdClass(),
  1187.                 "nature1" => new stdClass(),
  1188.                 "nature2" => new stdClass(),
  1189.                 "destinations.destination.organization.code" => new stdClass(),
  1190.                 "destinations.destination.city.code" => new stdClass(),
  1191.                 "origins.origin.organization.code" => new stdClass(),
  1192.                 "origins.origin.city.code" => new stdClass(),
  1193.                 "destinations.destination.organization.name" => new stdClass(),
  1194.                 "destinations.destination.city.name" => new stdClass(),
  1195.                 "origins.origin.organization.name" => new stdClass(),
  1196.                 "origins.origin.city.name" => new stdClass(),
  1197.                 "technicalSystems.technicalSystem.system.name" => new stdClass(),
  1198.                 "technicalSystems.technicalSystem.system.code" => new stdClass()
  1199.             ]
  1200.         ];
  1201.         $query->setHighlight($highlight);
  1202.         // Limit size
  1203.         $query->setSize(50);
  1204.         // $getQuery = json_encode($query->getQuery()->toArray());
  1205.         // dump($getQuery);exit();
  1206.         $arrayResult null;
  1207.         foreach ($this->elasticService->getSearch()->search($query) as $trans) {
  1208.             $transmissions['source'] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
  1209.             $transmissions['highlight'] = $trans->getHighlights();
  1210.             $arrayResult[] = $transmissions;
  1211.         }
  1212.         if (empty($arrayResult)) {
  1213.             return null;
  1214.         }
  1215.         return $arrayResult;
  1216.     }
  1217.     public function findCustomerParticipation($codeOrganization$transmission)
  1218.     {
  1219.         if (!empty($codeOrganization) && !empty($transmission) && !empty($transmission['destinations']) && !empty($transmission['destinations']['destination'])) {
  1220.             foreach ($transmission['destinations']['destination'] as $destination) {
  1221.                 $currentOrganization $destination['organization']['code'];
  1222.                 if ($codeOrganization != $currentOrganization) {
  1223.                     continue;
  1224.                 } else {
  1225.                     if (!empty($destination['custOrderItem']) && !empty($destination['custOrderItem']['product']) && !empty($destination['custOrderItem']['product']['type']) && !empty($destination['custOrderItem']['status']) && $destination['custOrderItem']['product']['type'] === "PARTICIPATION") {
  1226.                         return $destination;
  1227.                     }
  1228.                 }
  1229.             }
  1230.         }
  1231.         return null;
  1232.     }
  1233.     public function getStreamfarmTransmissions($parameters): ?array
  1234.     {
  1235.         $query ElasticNeosService::buildQueryTransmissionStreamfarm($parameters);
  1236.         // Get all results and sort by date
  1237.         $query->setSort(['beginDate' => ['order' => 'asc']]);
  1238.         if (!empty($parameters['from'])) {
  1239.             $query->setFrom($parameters['from']);
  1240.         }
  1241.         if (!empty($parameters['size'])) {
  1242.             $query->setSize($parameters['size']);
  1243.         } else {
  1244.             $query->setSize(static::MAX_LIMIT_SIZE);
  1245.         }
  1246.         // Get specific fields to improve performances (EOS document is huge)
  1247.         $usefulFields = [
  1248.             "id",
  1249.             "no",
  1250.             static::KEY_TRANSMISSION_NO,
  1251.             "year",
  1252.             "beginDate",
  1253.             "endDate",
  1254.             "programBeginDate",
  1255.             "programEndDate",
  1256.             "product.code",
  1257.             "status",
  1258.             "type",
  1259.             "nature1",
  1260.             "nature2",
  1261.             "event.no",
  1262.             "event.name",
  1263.             "event.type",
  1264.             "organizationAuthorized.destinations",
  1265.             "organizationAuthorized.billTo",
  1266.             "organizationAuthorized.customer",
  1267.             "origins.origin.organization.code",
  1268.             "origins.origin.organization.name",
  1269.             "origins.origin.organization.city.code",
  1270.             "origins.origin.organization.city.name",
  1271.             "origins.origin.city.code",
  1272.             "origins.origin.city.name",
  1273.             "origins.origin.transportable.code",
  1274.             "origins.origin.netApplied",
  1275.             "destinations.destination.organization.code",
  1276.             "destinations.destination.organization.name",
  1277.             "destinations.destination.organization.city.code",
  1278.             "destinations.destination.organization.city.name",
  1279.             "destinations.destination.city.code",
  1280.             "destinations.destination.city.name",
  1281.             "destinations.destination.custOrderItem.custOrder.event.resourceNetDef.code",
  1282.             "destinations.destination.custOrderItem.id",
  1283.             "destinations.destination.custOrderItem.product.type",
  1284.             "destinations.destination.custOrderItem.status",
  1285.             "destinations.destination.custOrderItem.custOrder",
  1286.             "destinations.destination.system",
  1287.             "technicalSystems.technicalSystem.videoDefinitionCode",
  1288.             "technicalSystems.technicalSystem.videoAspectRatioCode",
  1289.             "technicalSystems.technicalSystem.system",
  1290.             "associatedItems",
  1291.             "lastSynopsisStatus",
  1292.             "mdsChannel",
  1293.             "streamFarmOperator.email",
  1294.         ];
  1295.         $query->setSource($usefulFields);
  1296.         // Debug - get ES query
  1297.         //$getQuery = json_encode($query->getQuery()->toArray());
  1298.         $transmissions = [];
  1299.         $resultSet $this->elasticService->getSearch()->search($query);
  1300.         foreach ($resultSet as $trans) {
  1301.             $currentTransmission $trans->getSource();
  1302.             $currentTransmission['path'] = $this->buildPathForTransmission($currentTransmission);
  1303.             $transmissions[] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
  1304.         }
  1305.         $organizationsCodeColor $this->em->getRepository(OrganizationCodeColor::class)->findAll();
  1306.         foreach ($transmissions as $key => &$aDestination) {
  1307.             $nbWebStreamingDestinations 0;
  1308.             $WebStreamingDestinationCode "";
  1309.             $arrayTakers = [];
  1310.             if (!empty($aDestination['destinations']['destination'])) {
  1311.                 foreach ($aDestination['destinations']['destination'] as $currentDestination) {
  1312.                     if (!empty($currentDestination['system']) && ($currentDestination['system'] == ElasticNeosService::WEB_STREAMING_SYSTEM || $currentDestination['system'] == ElasticNeosService::NON_LINEAR_DISTRIBUTION_SYSTEM)) {
  1313.                         if (empty($currentDestination['custOrderItem']) || !empty($currentDestination['custOrderItem']['status']) && $currentDestination['custOrderItem']['status'] != 'CANCELLED') {
  1314.                             $nbWebStreamingDestinations++;
  1315.                             $WebStreamingDestinationCode $currentDestination['organization']['code'];
  1316.                             if (!in_array($WebStreamingDestinationCode$arrayTakers)) {
  1317.                                 $arrayTakers[] = $WebStreamingDestinationCode;
  1318.                             }
  1319.                         }
  1320.                     }
  1321.                 }
  1322.             }
  1323.             // List of codes WEB STREAMING & NON_LINEAR
  1324.             $aDestination['streamfarmTakers'] = $arrayTakers;
  1325.             if (!empty($WebStreamingDestinationCode) && $organizationsCodeColor != null && $nbWebStreamingDestinations <= 1) {
  1326.                 foreach ($organizationsCodeColor as $organizationCodeColor) {
  1327.                     if ($WebStreamingDestinationCode == strtoupper($organizationCodeColor->getOrganization())) {
  1328.                         $aDestination['codeColor'] = $organizationCodeColor->getCodeColor();
  1329.                     }
  1330.                 }
  1331.             }
  1332.             if ($nbWebStreamingDestinations === 0) {
  1333.                 unset($transmissions[$key]);
  1334.             }
  1335.         }
  1336.         return array_values($transmissions);
  1337.     }
  1338.     private function buildQueryTransmissionStreamfarm($parameters)
  1339.     {
  1340.         date_default_timezone_set('GMT');
  1341.         // Convert timestamp into milliseconds.
  1342.         $fromDateTS strtotime($parameters['dateFrom']) * 1000;
  1343.         $toDateTS strtotime($parameters['dateTo']) * 1000;
  1344.         if ($parameters['dateFrom'] == $parameters['dateTo']) {
  1345.             $toDateTS strtotime('+ 24 hours'strtotime($parameters['dateTo'])) * 1000;
  1346.         }
  1347.         $query = new Query();
  1348.         $filterBool = new BoolQuery();
  1349.         // Filter query on date
  1350.         if (!empty($parameters['dateFrom'])) {
  1351.             // Get all transmissions where endDate > dateFrom
  1352.             $queryOnlyStartDate = new Range(
  1353.                 'endDate', [
  1354.                     'gte' => intval($fromDateTS)
  1355.                 ]
  1356.             );
  1357.             $filterBool->addMust($queryOnlyStartDate);
  1358.         }
  1359.         if (!empty($parameters['dateTo'])) {
  1360.             // Get all transmissions where beginDate < dateTo
  1361.             $queryOnlyEndDate = new Range(
  1362.                 'beginDate', [
  1363.                     'lte' => intval($toDateTS)
  1364.                 ]
  1365.             );
  1366.             $filterBool->addMust($queryOnlyEndDate);
  1367.         }
  1368.         $queryWebStreamingSystem = new Terms('destinations.destination.system');
  1369.         $queryWebStreamingSystem->setTerms([ElasticNeosService::WEB_STREAMING_SYSTEMElasticNeosService::NON_LINEAR_DISTRIBUTION_SYSTEM]);
  1370.         $filterBool->addMust($queryWebStreamingSystem);
  1371.         // Filter on operator
  1372.         if (!empty($parameters['operator'])) {
  1373.             $queryStreamfarmOperator = new Term();
  1374.             $queryStreamfarmOperator->setTerm('streamFarmOperator.email'$parameters['operator']);
  1375.             $filterBool->addMust($queryStreamfarmOperator);
  1376.         }
  1377.         // Filter on client
  1378.         if (!empty($parameters['client'])) {
  1379.             $queryStreamfarmClient = new Term();
  1380.             $queryStreamfarmClient->setTerm('organizationAuthorized.destinations'$parameters['client'][0]);
  1381.             $filterBool->addMust($queryStreamfarmClient);
  1382.         }
  1383.         // Except BIN and CAN transmissions
  1384.         $queryExceptBINCANStatus = new Terms('status');
  1385.         $queryExceptBINCANStatus->setTerms([ElasticNeosService::TXM_STATUS_BINElasticNeosService::TXM_STATUS_CAN]);
  1386.         $filterBool->addMustNot($queryExceptBINCANStatus);
  1387.         // Set query to query ES
  1388.         $query->setQuery($filterBool);
  1389.         // Get all results
  1390.         $query->setSize(static::MAX_LIMIT_SIZE);
  1391.         return $query;
  1392.     }
  1393.     public function getStreamfarmClients()
  1394.     {
  1395.         $query = new Query();
  1396.         $filterBool = new BoolQuery();
  1397. //        $queryStreamingProfileType = new \Elastica\Query\Terms();
  1398. //        $queryStreamingProfileType->setTerms('destinations.destination.webDestinationParameter.streamingProfile.type', ElasticNeosService::STREAMFARM_PROFILE);
  1399. //        $filterBool->addMust($queryStreamingProfileType);
  1400.         $queryWebStreamingSystem = new Terms('destinations.destination.system');
  1401.         $queryWebStreamingSystem->setTerms([ElasticNeosService::WEB_STREAMING_SYSTEMElasticNeosService::NON_LINEAR_DISTRIBUTION_SYSTEM]);
  1402.         $filterBool->addMust($queryWebStreamingSystem);
  1403.         // Aggregations to get number in filter
  1404.         $aggregationStreamfarmClient = new \Elastica\Aggregation\Terms("streamfarmClient");
  1405.         $aggregationStreamfarmClient->setField("destinations.destination.organization.code.raw");
  1406.         $query->addAggregation($aggregationStreamfarmClient);
  1407.         $aggregationResult $this->elasticService->getSearch()->search($query)->getAggregations();
  1408.         if (empty($aggregationResult) || empty($aggregationResult['streamfarmClient']) || empty($aggregationResult['streamfarmClient']['buckets'])) {
  1409.             return null;
  1410.         }
  1411.         return $aggregationResult['streamfarmClient']['buckets'];
  1412.     }
  1413.     public function getStreamfarmOperators()
  1414.     {
  1415.         $query = new Query();
  1416.         $filterBool = new BoolQuery();
  1417. //        $queryStreamingProfileType = new \Elastica\Query\Terms();
  1418. //        $queryStreamingProfileType->setTerms('destinations.destination.webDestinationParameter.streamingProfile.type', ElasticNeosService::STREAMFARM_PROFILE);
  1419. //        $filterBool->addMust($queryStreamingProfileType);
  1420.         $queryWebStreamingSystem = new Terms('destinations.destination.system');
  1421.         $queryWebStreamingSystem->setTerms([ElasticNeosService::WEB_STREAMING_SYSTEMElasticNeosService::NON_LINEAR_DISTRIBUTION_SYSTEM]);
  1422.         $filterBool->addMust($queryWebStreamingSystem);
  1423.         // Aggregations to get number in filter
  1424.         $aggregationStreamfarmOperator = new \Elastica\Aggregation\Terms("streamfarmOperator");
  1425.         $aggregationStreamfarmOperator->setField("streamFarmOperator.email");
  1426.         $query->addAggregation($aggregationStreamfarmOperator);
  1427.         $aggregationResult $this->elasticService->getSearch()->search($query)->getAggregations();
  1428.         if (empty($aggregationResult) || empty($aggregationResult['streamfarmOperator']) || empty($aggregationResult['streamfarmOperator']['buckets'])) {
  1429.             return null;
  1430.         }
  1431.         return $aggregationResult['streamfarmOperator']['buckets'];
  1432.     }
  1433.     public function getTransmissionsForAutocomplete($parameters)
  1434.     {
  1435.         // Query filtered
  1436.         $query = new Query();
  1437.         $filterBool = new BoolQuery();
  1438.         $functionScore = new FunctionScore();
  1439.         $functionScore->addDecayFunction(FunctionScore::DECAY_LINEAR"beginDate""now""20d"null0.5);
  1440.         // Query multi match on transmission number, title and event
  1441.         if (!empty($parameters['searchKeywords'])) {
  1442.             $queryMultiMatch = new MultiMatch();
  1443.             $queryMultiMatch->setQuery($parameters['searchKeywords']);
  1444.             $fields = [
  1445.                 "no",
  1446.                 "transmissionNo",
  1447.                 "nature1",
  1448.                 "nature2"
  1449.             ];
  1450.             $queryMultiMatch->setFields($fields);
  1451.             $queryMultiMatch->setOperator('and');
  1452.             $filterBool->addMust($queryMultiMatch);
  1453.         }
  1454.         // Filter on Company (user company or family) OR Filter on opsprod rights access
  1455.         if (!empty($parameters['companies'])) {
  1456.             $companyOpsprodFilter self::addFilterCompanyOrOpsprod($parameters);
  1457.             $filterBool->addMust($companyOpsprodFilter);
  1458.         }
  1459.         // Except BIN transmission
  1460.         $queryExceptBININQStatus = new Terms('status');
  1461.         $queryExceptBININQStatus->setTerms([ElasticNeosService::TXM_STATUS_BINElasticNeosService::TXM_STATUS_INQ]);
  1462.         $filterBool->addMustNot($queryExceptBININQStatus);
  1463.         $functionScore->setQuery($filterBool);
  1464.         $query->setQuery($functionScore);
  1465.         // Get specific fields to improve performances (EOS document is huge)
  1466.         $usefulFields = [
  1467.             "id",
  1468.             "no",
  1469.             "transmissionNo",
  1470.             "nature1",
  1471.             "nature2"
  1472.         ];
  1473.         $query->setSource($usefulFields);
  1474.         // Get word hightlighted
  1475.         $highlight = [
  1476.             "pre_tags" => [""],
  1477.             "post_tags" => [""],
  1478.             "fields" => [
  1479.                 "no" => new stdClass(),
  1480.                 "transmissionNo" => new stdClass(),
  1481.                 "nature1" => new stdClass(),
  1482.                 "nature2" => new stdClass(),
  1483.             ]
  1484.         ];
  1485.         $query->setHighlight($highlight);
  1486.         // Limit size
  1487.         $query->setSize(20);
  1488.         $arrayResult null;
  1489.         foreach ($this->elasticService->getSearch()->search($query) as $trans) {
  1490.             $transmissions['source'] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
  1491.             $transmissions['highlight'] = $trans->getHighlights();
  1492.             $arrayResult[] = $transmissions;
  1493.         }
  1494.         if (empty($arrayResult)) {
  1495.             return null;
  1496.         }
  1497.         return $arrayResult;
  1498.     }
  1499.     public function getEventsForAutocomplete($parameters)
  1500.     {
  1501.         // Query filtered
  1502.         $query = new Query();
  1503.         $filterBool = new BoolQuery();
  1504.         $functionScore = new FunctionScore();
  1505.         $functionScore->addDecayFunction(FunctionScore::DECAY_LINEAR"beginDate""now""20d"null0.5);
  1506.         // Query multi match on transmission number, title and event
  1507.         if (!empty($parameters['searchKeywords'])) {
  1508.             $queryMultiMatch = new MultiMatch();
  1509.             $queryMultiMatch->setQuery($parameters['searchKeywords']);
  1510.             $fields = [
  1511.                 "event.no",
  1512.                 "event.name",
  1513.             ];
  1514.             $queryMultiMatch->setFields($fields);
  1515.             $queryMultiMatch->setOperator('and');
  1516.             $filterBool->addMust($queryMultiMatch);
  1517.         }
  1518.         // Filter on Company (user company or family) OR Filter on opsprod rights access
  1519.         if (!empty($parameters['companies'])) {
  1520.             $companyOpsprodFilter self::addFilterCompanyOrOpsprod($parameters);
  1521.             $filterBool->addMust($companyOpsprodFilter);
  1522.         }
  1523.         // Except BIN transmission
  1524.         $queryExceptBININQStatus = new Terms('status');
  1525.         $queryExceptBININQStatus->setTerms([ElasticNeosService::TXM_STATUS_BINElasticNeosService::TXM_STATUS_INQ]);
  1526.         $filterBool->addMustNot($queryExceptBININQStatus);
  1527.         $functionScore->setQuery($filterBool);
  1528.         $query->setQuery($functionScore);
  1529.         // Get specific fields to improve performances (EOS document is huge)
  1530.         $usefulFields = [
  1531.             "event.no",
  1532.             "event.name",
  1533.         ];
  1534.         $query->setSource($usefulFields);
  1535.         // Get word hightlighted
  1536.         $highlight = [
  1537.             "pre_tags" => [""],
  1538.             "post_tags" => [""],
  1539.             "fields" => [
  1540.                 "event.no" => new stdClass(),
  1541.                 "event.name" => new stdClass(),
  1542.             ]
  1543.         ];
  1544.         $query->setHighlight($highlight);
  1545.         // Limit size
  1546.         $query->setSize(20);
  1547.         $arrayResult null;
  1548.         foreach ($this->elasticService->getSearch()->search($query) as $trans) {
  1549.             $transmissions['source'] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
  1550.             $transmissions['highlight'] = $trans->getHighlights();
  1551.             $arrayResult[] = $transmissions;
  1552.         }
  1553.         if (empty($arrayResult)) {
  1554.             return null;
  1555.         }
  1556.         return $arrayResult;
  1557.     }
  1558. }