<?php
namespace App\Services\Elastic;
use App\Entity\OrganizationCodeColor;
use App\Utils\NeosParams;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Elastica\Aggregation\Stats;
use Elastica\Query;
use Elastica\Query\BoolQuery;
use Elastica\Query\FunctionScore;
use Elastica\Query\MultiMatch;
use Elastica\Query\Range;
use Elastica\Query\Term;
use Elastica\Query\Terms;
use Elastica\Query\Exists;
use Exception;
use Psr\Log\LoggerInterface;
use stdClass;
class ElasticNeosService extends AbstractElasticService
{
const DEFAULT_SIZE = 10;
const MAX_LIMIT_SIZE = 10000;
const MAX_AUTOCOMPLETE_SIZE = 20;
const KEY_TRANSMISSION_NO = 'transmissionNo';
const KEY_TRANSMISSION_NO_RAW = 'transmissionNo.raw';
const STREAMFARM_PROFILE = ["STREAMFARM", "UEFA"];
const WEB_STREAMING_SYSTEM = "WEB STREAMING";
const NON_LINEAR_DISTRIBUTION_SYSTEM = "NON-LINEAR DISTRIBUTION";
const TXM_STATUS_BIN = 'BIN';
const TXM_STATUS_CAN = 'CAN';
const TXM_STATUS_INQ = 'INQ';
const TXM_PRODUCT_CODE_EXCL_CCT = 'EXCL_CCT';
public function __construct(
NeosParams $neosParams,
LoggerInterface $logger,
EntityManagerInterface $em
)
{
parent::__construct($neosParams->host, $neosParams->port, $neosParams->transport, $logger, $neosParams->index);
$this->em = $em;
}
public function getTransmissionById(string $id)
{
$queryTerm = new Term();
$queryTerm->setTerm('id', $id);
$query = new Query($queryTerm);
$resultSet = $this->elasticService->getSearch()->search($query);
foreach ($resultSet as $trans) {
$transmissions[] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
}
if (empty($transmissions)) {
return null;
}
return $transmissions[0];
}
/**
* @param string $eventNo
* @return bool true if FUTURE participation is available for this event
*/
public function hasParticipationsInTheFuture(string $eventNo): bool
{
$queryParams = new ParticipationQueryParams();
$queryParams->eventNo = $eventNo;
$queryParams->startDate = new DateTime();
$query = $this->buildQueryTransmissionParticipations($queryParams, false, static::DEFAULT_SIZE);
$count = $this->elasticService->getSearch()->count($query);
return $count > 0;
}
/**
* @param ParticipationQueryParams $queryParams
* @param bool|null $byEventParent
* @param int|null $size
* @param bool|null $includeExternalViewOnly
* @return Query
*/
private function buildQueryTransmissionParticipations(ParticipationQueryParams $queryParams, ?bool $byEventParent = false, $size = ElasticNeosService::DEFAULT_SIZE, bool $includeExternalViewOnly = true): Query
{
$query = new Query();
$filterBool = new BoolQuery();
if (!empty($queryParams->eventNo)) {
$queryEventNo = new Term();
if ($byEventParent) {
$queryEventNo->setTerm('event.parentEvent.no', $queryParams->eventNo);
} else {
$queryEventNo->setTerm('event.no', $queryParams->eventNo);
}
$filterBool->addMust($queryEventNo);
}
if (!empty($queryParams->startDate)) {
$timestamp = $queryParams->startDate->getTimestamp();
$queryRange = new Range(
'beginDate',
[
'gte' => $timestamp * 1000,
]
);
$filterBool->addMust($queryRange);
}
if (!empty($queryParams->endDate)) {
$timestamp = $queryParams->endDate->getTimestamp();
$queryRange = new Range(
'endDate',
[
'gte' => $timestamp * 1000,
]
);
$filterBool->addMust($queryRange);
}
if ($includeExternalViewOnly) {
// Display only bookable transmission
$queryIsBookable = new Term();
$queryIsBookable->setTerm('externalView', 'true');
$filterBool->addMust($queryIsBookable);
}
// Except BIN and CAN transmissions
$queryExceptBINCANStatus = new Terms('status');
$queryExceptBINCANStatus->setTerms([ElasticNeosService::TXM_STATUS_BIN, ElasticNeosService::TXM_STATUS_CAN]);
$filterBool->addMustNot($queryExceptBINCANStatus);
// Set query to query ES
$query->setQuery($filterBool);
// Get all results
$query->setSize($size);
return $query;
}
public function getTransmissionByTransmissionNo(string $transmissionNo)
{
$queryTerm = new Term();
$queryTerm->setTerm(static::KEY_TRANSMISSION_NO_RAW, $transmissionNo);
$query = new Query($queryTerm);
$resultSet = $this->elasticService->getSearch()->search($query);
foreach ($resultSet as $trans) {
$currentTransmission = $trans->getSource();
$currentTransmission['path'] = $this->buildPathForTransmission($currentTransmission);
$transmissions[] = array_merge($currentTransmission, ['_id' => $trans->getId()]);
}
if (empty($transmissions)) {
return null;
}
return $transmissions[0];
}
private function buildPathForTransmission(?array $transmission)
{
$path = "";
// Netapplied
$networkPath = "";
if (!empty($transmission['origins']['origin']) && !empty($transmission['origins']['origin'][0]['netApplied']) && !empty($transmission['origins']['origin'][0]['netApplied']['name'])) {
$networkPath = $transmission['origins']['origin'][0]['netApplied']['name'];
$path .= (!empty($path)) ? " - " . $networkPath : $networkPath;
}
// 1 - Display NETWORK path
// $networkPath = self::getSystemCodeBySystemType($transmission['technicalSystems']['technicalSystem'], 'NETWORK');
// if (!empty($networkPath)) {
// $path .= (!empty($path)) ? " - " . $networkPath : $networkPath;
// }
// 2 - Display PLAYOUT path
$playoutPath = self::getSystemCodeBySystemType($transmission['technicalSystems']['technicalSystem'], 'PLAYOUT');
if (!empty($playoutPath)) {
$path .= (!empty($path)) ? " - " . $playoutPath : $playoutPath;
}
// 3 - Display STANDUP path
$standupPath = self::getSystemCodeBySystemType($transmission['technicalSystems']['technicalSystem'], 'STANDUP');
if (!empty($standupPath)) {
$path .= (!empty($path)) ? " - " . $standupPath : $standupPath;
}
// 4 - Display STUDIO path
$studioPath = self::getSystemCodeBySystemType($transmission['technicalSystems']['technicalSystem'], 'STUDIO');
if (!empty($studioPath)) {
$path .= (!empty($path)) ? " - " . $studioPath : $studioPath;
}
// 5 - Display BRIEF path
$briefPath = self::getSystemCodeBySystemType($transmission['technicalSystems']['technicalSystem'], 'BRIEF');
if (!empty($briefPath)) {
$path .= (!empty($path)) ? " - " . $briefPath : $briefPath;
}
// 6 - Display POOL ACCESS path
$poolAccessPath = self::getSystemCodeBySystemType($transmission['technicalSystems']['technicalSystem'], 'POOL ACCESS');
if (!empty($poolAccessPath)) {
$path .= (!empty($path)) ? " - " . $poolAccessPath : $poolAccessPath;
}
if (empty($path) && !empty($transmission['associatedItems'])) {
$path = $transmission['associatedItems'];
}
return $path;
}
private function getSystemCodeBySystemType($array, $value)
{
foreach ($array as $index => $ar) {
if (!empty($ar['system']) && $ar['system']['type']) {
if ($ar['system']['type'] == $value) {
if (!empty($ar['system']['niceName'])) {
return $ar['system']['niceName'];
} else if (!empty($ar['system']['name'])) {
return $ar['system']['name'];
} else if (!empty($ar['system']['code'])) {
return $ar['system']['code'];
}
}
}
}
return false;
}
/**
* @param string $eventNo the no of the event
* @param bool|null $byEventParent
* @param string $order
* @param bool $includePastParticipation . If true, the past participations will be included.
* @param bool $includeExternalViewOnly
* @return array|null of participation
*/
public function getTransmissionParticipations($eventNo, ?bool $byEventParent = false, $order = 'asc', bool $includePastParticipation = false, bool $includeExternalViewOnly = true): array
{
$query = new ParticipationQueryParams();
$query->eventNo = $eventNo;
if (!$includePastParticipation) {
$query->startDate = new DateTime();
}
return $this->getTransmissionsParticipations($query, $byEventParent, $order, $includeExternalViewOnly);
}
/**
* @param ParticipationQueryParams $queryParams
* @param bool|null $byEventParent
* @param null $order
* @param bool|null $includeExternalViewOnly
* @return array|null of participation in the future ( bookable)
*/
public function getTransmissionsParticipations(ParticipationQueryParams $queryParams, ?bool $byEventParent, $order = null, bool $includeExternalViewOnly = true)
{
$query = $this->buildQueryTransmissionParticipations($queryParams, $byEventParent, static::MAX_LIMIT_SIZE, $includeExternalViewOnly);
return $this->searchTransmissions($query, $queryParams->broadcastCenterCode, $order);
}
/**
* @param Query $query
* @param null|string $broadCastCenterCode
* @param string $order
* @return array|null
*/
private function searchTransmissions(Query $query, ?string $broadCastCenterCode, string $order)
{
$query->setSort(
[
'beginDate' => ['order' => $order],
'id' => ['order' => 'asc']
]
);
// Get specific fieds to improve performances (EOS document is huge)
$usefulFields = [
"id",
"no",
static::KEY_TRANSMISSION_NO,
"year",
"beginDate",
"endDate",
"programBeginDate",
"programEndDate",
"product.code",
"status",
"type",
"nature1",
"nature2",
"event.no",
"event.name",
"event.type",
"event.isMultiPartialTimingAld",
"organizationAuthorized",
"origins.origin.organization.code",
"origins.origin.organization.name",
"origins.origin.organization.city.code",
"origins.origin.organization.city.name",
"origins.origin.city.code",
"origins.origin.city.name",
"origins.origin.city.country.code",
"origins.origin.city.country.name",
"origins.origin.transportable.code",
"origins.origin.broadcastCenter.code",
"origins.origin.broadcastCenter.name",
"destinations.destination.organization.code",
"destinations.destination.organization.name",
"destinations.destination.organization.city.code",
"destinations.destination.organization.city.name",
"destinations.destination.city.code",
"destinations.destination.city.name",
"destinations.destination.custOrderItem",
"destinations.destination.system",
"transmissionGroup",
"mdsChannel",
"technicalSystems.technicalSystem.audios"
];
$query->setSource($usefulFields);
//$getQuery = json_encode($query->getQuery()->toArray());
$resultSet = $this->elasticService->getSearch()->search($query);
$transmissions = [];
foreach ($resultSet as $trans) {
$transmissions[] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
}
if (empty($transmissions)) {
return [];
}
if (!empty($broadCastCenterCode)) {
$filteredTransmission = [];
foreach ($transmissions as $transmission) {
if (!empty($transmission['origins']['origin'][0]['broadcastCenter']['code'])
&& $broadCastCenterCode == $transmission['origins']['origin'][0]['broadcastCenter']['code']
) {
$filteredTransmission[] = $transmission;
}
}
$transmissions = $filteredTransmission;
}
foreach ($transmissions as &$transmission) {
$transmission['worldfeed'] = ElasticNeosService::isWorldFeed($transmission);
}
return $transmissions;
}
/**
* @param $txm
* @return bool true if the transmission array ( from Elastic search) contains a worldfeed product.
*/
public static function isWorldFeed(?array $txm): bool
{
return $txm != null && !empty($txm['product']['code'])
&& $txm['product']['code'] == 'WORLDFEED';
}
/**
* @param $eventNo
* @param $order
* @return array|null
*/
public function getWorldFeeds(string $eventNo, string $order = 'asc', bool $includePastParticipation = false)
{
return $this->searchTransmissions($this->buildQueryVisibleWorldFeeds($eventNo, static::MAX_LIMIT_SIZE, $includePastParticipation), null, $order);
}
private function buildQueryVisibleWorldFeeds(string $eventNo, string $size, bool $includePastParticipation = false): Query
{
$query = new Query();
$filterBool = new BoolQuery();
$queryEventNo = new Term();
$queryEventNo->setTerm('event.no', $eventNo);
$filterBool->addMust($queryEventNo);
$queryProduct = new Term();
$queryProduct->setTerm('product.code', 'WORLDFEED');
$filterBool->addMust($queryProduct);
if (!$includePastParticipation) {
$startDate = new DateTime();
$queryRange = new Range(
'beginDate',
[
'gte' => $startDate->getTimestamp() * 1000,
]
);
$filterBool->addMust($queryRange);
}
// Except BIN and CAN transmissions
$queryExceptBINStatus = new Term();
$queryExceptBINStatus->setTerm('status', [ElasticNeosService::TXM_STATUS_BIN]);
$filterBool->addMustNot($queryExceptBINStatus);
// Set query to query ES
$query->setQuery($filterBool);
// Get all results
$query->setSize($size);
return $query;
}
public function hasTransmissions(string $eventNo): bool
{
try {
$resultSet = $this->elasticService->getSearch()->search($this->buildQueryTransmissionByEventNo($eventNo, true, true, self::DEFAULT_SIZE));
return $resultSet->getTotalHits() > 0;
} catch (Exception $ex) {
$this->logger->error("can't get transmissions for event " . $eventNo,
['exception' => $ex]);
}
return false;
}
public function buildQueryTransmissionByEventNo($eventNo, ?bool $showUni = false, bool $includePastTransmission = false, int $size = self::MAX_LIMIT_SIZE, string $order = 'asc')
{
$query = new Query();
$filterBool = new BoolQuery();
$queryEventNo = new Term();
$queryEventNo->setTerm('event.no', $eventNo);
$filterBool->addMust($queryEventNo);
// Display only bookable transmission (MULTI) OR all
$queryIsBookable = new Term();
$queryIsBookable->setTerm('externalView', 'true');
$filterBool->addShould($queryIsBookable);
$queryProduct = new Term();
$queryProduct->setTerm('product.code', 'WORLDFEED');
$filterBool->addShould($queryProduct);
if (empty($showUni) || !$showUni) {
$queryProduct = new Term();
$queryProduct->setTerm('product.code', 'UNI');
$filterBool->addMustNot($queryProduct);
} else {
$queryProduct = new Term();
$queryProduct->setTerm('product.code', 'UNI');
$filterBool->addShould($queryProduct);
}
$filterBool->setMinimumShouldMatch(1);
// Include past transmissions OR all
if (!$includePastTransmission) {
$startDate = new DateTime();
$queryRange = new Range(
'endDate',
[
'gte' => strtotime($startDate->format('Y-m-d')) * 1000,
]
);
$filterBool->addMust($queryRange);
}
// Except EXCL_CCT transmissions
$queryExceptEXCL_CCT = new Terms('product.code');
$queryExceptEXCL_CCT->setTerms([ElasticNeosService::TXM_PRODUCT_CODE_EXCL_CCT]);
$filterBool->addMustNot($queryExceptEXCL_CCT);
// Except BIN transmissions
$queryExceptBINStatus = new Terms('status');
$queryExceptBINStatus->setTerms([ElasticNeosService::TXM_STATUS_BIN]);
$filterBool->addMustNot($queryExceptBINStatus);
$queryExceptCANStatus = new Terms('status');
$queryExceptCANStatus->setTerms([ElasticNeosService::TXM_STATUS_CAN]);
$filterBool->addMustNot($queryExceptCANStatus);
// Set query to query ES
$query->setQuery($filterBool);
$query->setSize($size);
return $query;
}
public function hasTransmissionParticipations(string $eventNo, bool $includePastParticipation = false): bool
{
try {
$query = new ParticipationQueryParams();
$query->eventNo = $eventNo;
if (!$includePastParticipation) {
$query->startDate = new DateTime();
}
$resultSet = $this->elasticService->getSearch()->search($this->buildQueryTransmissionParticipations($query, false, static::DEFAULT_SIZE));
return $resultSet->getTotalHits() > 0;
} catch (Exception $ex) {
$this->logger->error("can't get transmissions participations for event " . $eventNo,
['exception' => $ex]);
}
return false;
}
public function hasWorldFeed(string $eventNo, bool $includePastParticipation = false): bool
{
try {
$resultSet = $this->elasticService->getSearch()->search($this->buildQueryVisibleWorldFeeds($eventNo, static::DEFAULT_SIZE, $includePastParticipation));
return $resultSet->getTotalHits() > 0;
} catch (Exception $ex) {
$this->logger->error("can't get worldfeeds for event " . $eventNo,
['exception' => $ex]);
}
return false;
}
public function getTransmissionByEventNo($eventNo, ?bool $showUni = false, bool $includePastTransmission = false, string $order = 'asc')
{
$query = $this->buildQueryTransmissionByEventNo($eventNo, $showUni, $includePastTransmission, self::MAX_LIMIT_SIZE);
return $this->searchEventTransmissions($query, $order);
}
public function searchEventTransmissions(Query $query, string $order)
{
$query->setSort(['beginDate' => ['order' => $order]]);
//$getQuery = json_encode($query->getQuery()->toArray());
$resultSet = $this->elasticService->getSearch()->search($query);
foreach ($resultSet as $trans) {
$currentTransmission = $trans->getSource();
$currentTransmission['path'] = $this->buildPathForTransmission($currentTransmission);
$transmissions[] = array_merge($currentTransmission, ['_id' => $trans->getId()]);
}
if (empty($transmissions)) {
return null;
}
foreach ($transmissions as &$transmission) {
$transmission['worldfeed'] = ElasticNeosService::isWorldFeed($transmission);
}
return $transmissions;
}
public function getTransmissionByEventNoForAPI(string $eventNo, ?bool $showUni = false, bool $includePastTransmission = false, string $order = 'asc'): ?array
{
$query = $this->buildQueryTransmissionByEventNo($eventNo, $showUni, $includePastTransmission, self::MAX_LIMIT_SIZE);
return $this->searchEventTransmissionsWithBasicDetails($query, $order);
}
public function searchEventTransmissionsWithBasicDetails(Query $query, string $order)
{
$query->setSort(['beginDate' => ['order' => $order]]);
// Get specific fields to improve performances (EOS document is huge)
$usefulFields = [
"id",
static::KEY_TRANSMISSION_NO,
"beginDate",
"endDate",
"programBeginDate",
"programEndDate",
"product.code",
"status",
"type",
"nature1",
"nature2",
"event.no",
"event.name",
"event.type",
];
$query->setSource($usefulFields);
//$getQuery = json_encode($query->getQuery()->toArray());
$resultSet = $this->elasticService->getSearch()->search($query);
foreach ($resultSet as $trans) {
$currentTransmission = $trans->getSource();
$transmissions[] = array_merge($currentTransmission);
}
if (empty($transmissions)) {
return null;
}
return $transmissions;
}
// Filter live search input
public function getTransmissions($parameters): ?array
{
$query = ElasticNeosService::buildQueryTransmissions($parameters);
// Get all results and sort by date
$query->setSort(
[
'beginDate' => ['order' => 'asc'],
'id' => ['order' => 'asc']
]
);
if (!empty($parameters['from'])) {
$query->setFrom($parameters['from']);
}
if (!empty($parameters['size'])) {
$query->setSize($parameters['size']);
} else {
$query->setSize(static::MAX_LIMIT_SIZE);
}
// Get specific fields to improve performances (EOS document is huge)
$usefulFields = [
"id",
"no",
static::KEY_TRANSMISSION_NO,
"year",
"beginDate",
"endDate",
"programBeginDate",
"programEndDate",
"product.code",
"status",
"type",
"nature1",
"nature2",
"event.no",
"event.name",
"event.type",
"organizationAuthorized.destinations",
"organizationAuthorized.billTo",
"organizationAuthorized.customer",
"origins.origin.organization.code",
"origins.origin.organization.name",
"origins.origin.organization.city.code",
"origins.origin.organization.city.name",
"origins.origin.city.code",
"origins.origin.city.name",
"origins.origin.transportable.code",
"origins.origin.netApplied",
"origins.origin.broadcastCenter.name",
"destinations.destination.organization.code",
"destinations.destination.organization.name",
"destinations.destination.organization.city.code",
"destinations.destination.organization.city.name",
"destinations.destination.city.code",
"destinations.destination.city.name",
"destinations.destination.custOrderItem.custOrder.event.resourceNetDef.code",
"destinations.destination.custOrderItem.id",
"destinations.destination.custOrderItem.product.type",
"destinations.destination.custOrderItem.status",
"destinations.destination.custOrderItem.custOrder",
"technicalSystems.technicalSystem.videoDefinitionCode",
"technicalSystems.technicalSystem.videoAspectRatioCode",
"technicalSystems.technicalSystem.system",
"associatedItems",
"lastSynopsisStatus",
"mdsChannel",
];
$query->setSource($usefulFields);
//$getQuery = json_encode($query->getQuery()->toArray());
$transmissions = [];
$resultSet = $this->elasticService->getSearch()->search($query);
foreach ($resultSet as $trans) {
$currentTransmission = $trans->getSource();
$currentTransmission['path'] = $this->buildPathForTransmission($currentTransmission);
$currentTransmission['participationStatus'] = $this->buildStatusParticipationFromUserCodeOps($currentTransmission, $parameters);
$transmissions[] = array_merge($currentTransmission, ['_id' => $trans->getId()]);
}
return $transmissions;
}
// Get all filters
public function buildQueryTransmissions($parameters)
{
date_default_timezone_set('GMT');
// Convert timestamp into milliseconds.
$fromDateTS = strtotime($parameters['dateFrom']) * 1000;
$toDateTS = strtotime($parameters['dateTo']) * 1000;
if ($parameters['dateFrom'] == $parameters['dateTo']) {
$toDateTS = strtotime('+ 24 hours', strtotime($parameters['dateTo'])) * 1000;
}
$query = new Query();
/**
* @var BoolQuery $filters
*/
$filters = new BoolQuery();
// Query multi match on transmission number, title and event
if (!empty($parameters['searchCustom'])) {
$queryMultiMatch = new MultiMatch();
$queryMultiMatch->setQuery($parameters['searchCustom']);
$fields = [
"no",
static::KEY_TRANSMISSION_NO,
"nature1",
"nature2",
"event.no",
"event.name",
"destinations.destination.organization.code",
"destinations.destination.city.code",
"origins.origin.organization.code",
"origins.origin.city.code",
"destinations.destination.organization.name",
"destinations.destination.city.name",
"origins.origin.organization.name",
"origins.origin.city.name",
"technicalSystems.technicalSystem.system.name",
];
$queryMultiMatch->setFields($fields);
$filters->addMust($queryMultiMatch);
}
// Filter query on date
if (!empty($parameters['dateFrom']) && !empty($parameters['dateTo'])) {
// 1 - Timeline start < TXM START < Timeline end
$queryRangeStart = new Range(
'beginDate', [
'gte' => intval($fromDateTS),
'lte' => intval($toDateTS)
]
);
$filters->addShould($queryRangeStart);
// 2 - Timeline start < TXM END < Timeline end
$queryRangeEnd = new Range(
'endDate', [
'gte' => intval($fromDateTS),
'lte' => intval($toDateTS)
]
);
$filters->addShould($queryRangeEnd);
$filters->setMinimumShouldMatch(1);
} elseif (!empty($parameters['dateFrom'])) {
// Get all transmissions where endDate > dateFrom
$queryOnlyStartDate = new Range(
'endDate', [
'gte' => intval($fromDateTS)
]
);
$filters->addMust($queryOnlyStartDate);
} elseif (!empty($parameters['dateTo'])) {
// Get all transmissions where beginDate < dateTo
$queryOnlyEndDate = new Range(
'beginDate', [
'lte' => intval($toDateTS)
]
);
$filters->addMust($queryOnlyEndDate);
}
// Filter on Company (user company or family) OR Filter on opsprod rights access
if (!empty($parameters['companies'])) {
$companyOpsprodFilter = self::addFilterCompanyOrOpsprod($parameters);
$filters->addMust($companyOpsprodFilter);
}
if (!empty($parameters['typeEvent'])) {
$queryTypeEvent = new Terms('event.type.raw');
$queryTypeEvent->setTerms($parameters['typeEvent']);
$filters->addMust($queryTypeEvent);
}
if (!empty($parameters['events'])) {
// Get events
$queryEvents = new Terms('event.no');
$queryEvents->setTerms((is_array($parameters['events'])) ? $parameters['events'] : [$parameters['events']]);
$filters->addMust($queryEvents);
}
if (!empty($parameters['productCode']) && $parameters['productCode'] != "All") {
// Get product code
$queryProductCode = new Terms('product.code');
$queryProductCode->setTerms(
(is_array($parameters['productCode'])) ? $parameters['productCode'] : [$parameters['productCode']]);
$filters->addMust($queryProductCode);
}
if (!empty($parameters['status']) && $parameters['status'] != "All") {
// Get status
$queryStatus = new Terms('status');
$queryStatus->setTerms((is_array($parameters['status'])) ? $parameters['status'] : [$parameters['status']]);
$filters->addMust($queryStatus);
}
if (!empty($parameters['eventNo'])) {
// Get event
$queryEventNo = new Term();
$queryEventNo->setTerm('event.no', (is_array($parameters['eventNo'])) ? $parameters['eventNo'] : [$parameters['eventNo']]);
$filters->addMust($queryEventNo);
}
if (!empty($parameters[static::KEY_TRANSMISSION_NO])) {
// Get transmission
$queryTransmissionNo = new Term();
$queryTransmissionNo->setTerm('no',
(is_array($parameters[static::KEY_TRANSMISSION_NO_RAW])) ?
$parameters[static::KEY_TRANSMISSION_NO_RAW]
: [$parameters[static::KEY_TRANSMISSION_NO_RAW]]);
$filters->addMust($queryTransmissionNo);
}
// Show tagged items if the filter is check
if (!empty($parameters['isEvent'])) {
$queryIncludeEvent = new Exists('event');
$filters->addMust($queryIncludeEvent);
}
// Add filter on live search input
$filters = self::addFilterLiveSearchInput($parameters, $filters);
// Except transmissions with specific status
if ($parameters['exceptedStatus']) {
$queryExceptStatus = new Terms('status');
$queryExceptStatus->setTerms($parameters['exceptedStatus']);
$filters->addMustNot($queryExceptStatus);
}
// Set query to query ES
$query->setQuery($filters);
//$getQuery = json_encode($query->getQuery()->toArray());
return $query;
}
private function addFilterCompanyOrOpsprod($parameters)
{
$companyOrEventFilter = new BoolQuery();
// Get by companies
$queryCompaniesDestination = new Terms('organizationAuthorized.destinations');
$queryCompaniesDestination->setTerms($parameters['companies']);
$queryCompaniesBillTo = new Terms('organizationAuthorized.billTo');
$queryCompaniesBillTo->setTerms($parameters['companies']);
$queryCompaniesEventHost = new Terms('organizationAuthorized.eventHost');
$queryCompaniesEventHost->setTerms($parameters['companies']);
$queryCompaniesEventRight = new Terms('organizationAuthorized.eventRight');
$queryCompaniesEventRight->setTerms($parameters['companies']);
$queryCompaniesOrigin = new Terms('organizationAuthorized.origin');
$queryCompaniesOrigin->setTerms($parameters['companies']);
$queryCompaniesBCOwner = new Terms('organizationAuthorized.bcOwner');
$queryCompaniesBCOwner->setTerms($parameters['companies']);
$queryCompaniesEventInvoiceTo = new Terms('organizationAuthorized.eventInvoiceTo');
$queryCompaniesEventInvoiceTo->setTerms($parameters['companies']
);
$queryCompaniesAdditionalRecipients = new Terms('organizationAuthorized.additionalRecipients');
$queryCompaniesAdditionalRecipients->setTerms($parameters['companies']
);
$queryCompaniesCustomer = new Terms('organizationAuthorized.customer');
$queryCompaniesCustomer->setTerms($parameters['companies']);
$queryCompaniesSynRecipients = new Terms('organizationAuthorized.synRecipients');
$queryCompaniesSynRecipients->setTerms($parameters['companies']);
$companyOrEventFilter->addShould($queryCompaniesDestination);
$companyOrEventFilter->addShould($queryCompaniesBillTo);
$companyOrEventFilter->addShould($queryCompaniesEventHost);
$companyOrEventFilter->addShould($queryCompaniesEventRight);
$companyOrEventFilter->addShould($queryCompaniesOrigin);
$companyOrEventFilter->addShould($queryCompaniesBCOwner);
$companyOrEventFilter->addShould($queryCompaniesEventInvoiceTo);
$companyOrEventFilter->addShould($queryCompaniesAdditionalRecipients);
$companyOrEventFilter->addShould($queryCompaniesCustomer);
$companyOrEventFilter->addShould($queryCompaniesSynRecipients);
if (!empty($parameters['opsprodAccess'])) {
// Get by opsprod event right access
$queryOpsprod = new Terms('event.no');
$queryOpsprod->setTerms($parameters['opsprodAccess']);
$companyOrEventFilter->addShould($queryOpsprod);
}
return $companyOrEventFilter;
}
private function addFilterLiveSearchInput(array $parameters, BoolQuery $filters)
{
// Live input search filters
if (!empty($parameters['searchTransRef'])) {
// Get transmission ref
$queryTransRef = new Term();
$queryTransRef->setTerm(static::KEY_TRANSMISSION_NO_RAW, $parameters['searchTransRef']);
$filters->addMust($queryTransRef);
}
if (!empty($parameters['searchEventNo'])) {
// Get event no
$queryEventNo = new Term();
$queryEventNo->setTerm('event.no', $parameters['searchEventNo']);
$filters->addMust($queryEventNo);
}
if (!empty($parameters['searchEventType'])) {
// Get event type
$queryEventType = new Term();
$queryEventType->setTerm('event.type', strtolower($parameters['searchEventType']));
$filters->addMust($queryEventType);
}
if (!empty($parameters['searchEventName'])) {
// Get event name
$queryEventName = new Term();
$queryEventName->setTerm('event.name.raw', $parameters['searchEventName']);
$filters->addMust($queryEventName);
}
if (!empty($parameters['searchDescription'])) {
// Get nature2 (description)
$queryDescription = new Term();
$queryDescription->setTerm('nature2.raw', $parameters['searchDescription']);
$filters->addMust($queryDescription);
}
if (!empty($parameters['searchTitle'])) {
// Get nature1 (Title)
$queryTitle = new Term();
$queryTitle->setTerm('nature1.raw', $parameters['searchTitle']);
$filters->addMust($queryTitle);
}
if (!empty($parameters['searchOriginCode'])) {
// Get origin by code
$queryOrigin = new Term();
$queryOrigin->setTerm('origins.origin.organization.code.raw', $parameters['searchOriginCode']);
$filters->addMust($queryOrigin);
}
if (!empty($parameters['searchOriginCityCode'])) {
// Get origin by city code
$queryOriginCity = new Term();
$queryOriginCity->setTerm('origins.origin.city.code.raw', $parameters['searchOriginCityCode']);
$filters->addMust($queryOriginCity);
}
if (!empty($parameters['searchDestinationCode'])) {
// Get destination by code
$queryDestination = new Term();
$queryDestination->setTerm(
'destinations.destination.organization.code.raw', $parameters['searchDestinationCode']
);
$filters->addMust($queryDestination);
}
if (!empty($parameters['searchDestinationCityCode'])) {
// Get destination by city code
$queryDestinationCity = new Term();
$queryDestinationCity->setTerm(
'destinations.destination.city.code.raw', $parameters['searchDestinationCityCode']
);
$filters->addMust($queryDestinationCity);
}
if (!empty($parameters['searchOriginName'])) {
// Get origin by name
$queryOrigin = new Term();
$queryOrigin->setTerm('origins.origin.organization.name.raw', $parameters['searchOriginName']);
$filters->addMust($queryOrigin);
}
if (!empty($parameters['searchOriginCityName'])) {
// Get origin by city name
$queryOriginCity = new Term();
$queryOriginCity->setTerm('origins.origin.city.name.raw', $parameters['searchOriginCityName']);
$filters->addMust($queryOriginCity);
}
if (!empty($parameters['searchDestinationName'])) {
// Get destination by name
$queryDestination = new Term();
$queryDestination->setTerm(
'destinations.destination.organization.name.raw', $parameters['searchDestinationName']
);
$filters->addMust($queryDestination);
}
if (!empty($parameters['searchDestinationCityName'])) {
// Get destination by city name
$queryDestinationCity = new Term();
$queryDestinationCity->setTerm(
'destinations.destination.city.name.raw', $parameters['searchDestinationCityName']
);
$filters->addMust($queryDestinationCity);
}
if (!empty($parameters['searchPath'])) {
// Get path
$queryPath = new Term();
$queryPath->setTerm('technicalSystems.technicalSystem.system.name.raw', $parameters['searchPath']);
$filters->addMust($queryPath);
}
if (!empty($parameters['searchPathByCode'])) {
// Get path
$queryPathByCode = new Term();
$queryPathByCode->setTerm('technicalSystems.technicalSystem.system.code.raw', $parameters['searchPathByCode']);
$filters->addMust($queryPathByCode);
}
return $filters;
}
private function buildStatusParticipationFromUserCodeOps(?array $transmission, ?array $parameters)
{
$statusParticipation = "";
if (!empty($transmission['destinations']) && !empty($transmission['destinations']['destination'])) {
foreach ($transmission['destinations']['destination'] as $destination) {
if (!empty($destination['organization']['code'])
&& $destination['organization']['code'] == $parameters['userCodeOps']
&& !empty($destination['custOrderItem'])
&& !empty($destination['custOrderItem']['product'])
&& !empty($destination['custOrderItem']['product']['type'])
&& $destination['custOrderItem']['product']['type'] === 'PARTICIPATION'
&& !empty($destination['custOrderItem']['status'])
) {
$statusParticipation = $destination['custOrderItem']['status'];
}
}
}
return $statusParticipation;
}
public function getAllFilters()
{
$query = new Query();
// Aggregations to get number in filter
$aggregationEvent = new \Elastica\Aggregation\Terms("by_event");
$aggregationEvent->setField("event.no.raw");
$aggregationEvent->setSize(0);
$aggregationStatus = new \Elastica\Aggregation\Terms("by_status");
$aggregationStatus->setField("status");
$aggregationStatus->setSize(0);
$aggregationService = new \Elastica\Aggregation\Terms("by_service");
$aggregationService->setField("product.code");
$aggregationService->setSize(0);
$aggregationEventName = new \Elastica\Aggregation\Terms("by_event_name");
$aggregationEventName->setField("event.name.raw");
$aggregationEventName->setSize(0);
$aggregationEventType = new \Elastica\Aggregation\Terms("by_event_type");
$aggregationEventType->setField("event.type.raw");
$aggregationEventType->setSize(0);
// Get Min/Max date of result
$aggregationMinMaxDate = new Stats("min_max_date");
$aggregationMinMaxDate->setField("beginDate");
$aggregationEvent->addAggregation($aggregationEventName);
$aggregationEvent->addAggregation($aggregationEventType);
$query->addAggregation($aggregationEvent);
$query->addAggregation($aggregationStatus);
$query->addAggregation($aggregationService);
$query->addAggregation($aggregationMinMaxDate);
$aggregationResult = $this->elasticService->getSearch()->search($query)->getAggregations();
if (empty($aggregationResult)) {
return null;
}
return $aggregationResult;
}
public function getCount()
{
return $this->elasticService->getCount();
}
public function getIdeasForAutocomplete($parameters)
{
$query = new Query();
$filterBool = new BoolQuery();
// Query multi match on transmission number, title and event
if (!empty($parameters['searchKeywords'])) {
$queryMultiMatch = new MultiMatch();
$queryMultiMatch->setQuery($parameters['searchKeywords']);
$fields = [
"event.no",
"event.name",
];
$queryMultiMatch->setFields($fields);
//$queryMultiMatch->setOperator('and');
$filterBool->addMust($queryMultiMatch);
}
// Filter on Company (user company or family) OR Filter on opsprod rights access
if (!empty($parameters['companies'])) {
$companyOpsprodFilter = self::addFilterCompanyOrOpsprod($parameters);
$filterBool->addMust($companyOpsprodFilter);
}
// Add filter on live search input
$filterBool = self::addFilterLiveSearchInput($parameters, $filterBool);
// Except BIN transmission
$queryExceptBININQStatus = new Terms('status');
$queryExceptBININQStatus->setTerms([ElasticNeosService::TXM_STATUS_BIN, ElasticNeosService::TXM_STATUS_INQ]);
$filterBool->addMustNot($queryExceptBININQStatus);
// Set query to query ES
$query->setQuery($filterBool);
//$getQuery = json_encode($query->getQuery()->toArray());
// Aggregations to get ideas
// Aggs on the event number
$aggregationEventNumber = new \Elastica\Aggregation\Terms("by_event_number");
$aggregationEventNumber->setField("event.no.raw");
$aggregationEventNumber->setSize(3);
// Aggs on the event name
$aggregationEventName = new \Elastica\Aggregation\Terms("by_event_name");
$aggregationEventName->setField("event.name.raw");
$aggregationEventName->setSize(3);
$aggregationEventNumber->addAggregation($aggregationEventName);
$query->addAggregation($aggregationEventNumber);
$aggregationResult = $this->elasticService->getSearch()->search($query)->getAggregations();
if (empty($aggregationResult)) {
return null;
}
return $aggregationResult;
}
public function getIdeasForAutocompleteByHighlight($parameters)
{
// Query filtered
$query = new Query();
$filterBool = new BoolQuery();
// Query multi match on transmission number, title and event
if (!empty($parameters['searchKeywords'])) {
$queryMultiMatch = new MultiMatch();
$queryMultiMatch->setQuery($parameters['searchKeywords']);
$fields = [
"no",
"transmissionNo",
"event.no",
"event.name",
"nature1",
"nature2",
"destinations.destination.organization.code",
"destinations.destination.city.code",
"origins.origin.organization.code",
"origins.origin.city.code",
"destinations.destination.organization.name",
"destinations.destination.city.name",
"origins.origin.organization.name",
"origins.origin.city.name",
"technicalSystems.technicalSystem.system.name",
"technicalSystems.technicalSystem.system.code"
];
$queryMultiMatch->setFields($fields);
$queryMultiMatch->setOperator('and');
$filterBool->addMust($queryMultiMatch);
}
// Filter on Company (user company or family) OR Filter on opsprod rights access
if (!empty($parameters['companies'])) {
$companyOpsprodFilter = self::addFilterCompanyOrOpsprod($parameters);
$filterBool->addMust($companyOpsprodFilter);
}
// Add filter on live search input
$filterBool = self::addFilterLiveSearchInput($parameters, $filterBool);
// Except BIN transmission
$queryExceptBININQStatus = new Terms('status');
$queryExceptBININQStatus->setTerms([ElasticNeosService::TXM_STATUS_BIN, ElasticNeosService::TXM_STATUS_INQ]);
$filterBool->addMustNot($queryExceptBININQStatus);
$query->setQuery($filterBool);
// Get specific fields to improve performances (EOS document is huge)
$usefulFields = [
"id",
"no",
"transmissionNo",
"year",
"beginDate",
"endDate",
"product.code",
"status",
"type",
"nature1",
"nature2",
"event.no",
"event.name",
"event.type",
"organizationAuthorized.destinations",
"origins.origin.organization.code",
"origins.origin.organization.name",
"origins.origin.organization.city.code",
"origins.origin.organization.city.name",
"origins.origin.city.code",
"origins.origin.city.name",
"origins.origin.transportable.code",
"destinations.destination.organization.code",
"destinations.destination.organization.name",
"destinations.destination.organization.city.code",
"destinations.destination.organization.city.name",
"destinations.destination.city.code",
"destinations.destination.city.name",
"technicalSystems.technicalSystem.system"
];
$query->setSource($usefulFields);
// Get word hightlighted
$highlight = [
"pre_tags" => ["<b>"],
"post_tags" => ["</b>"],
"fields" => [
"no" => new stdClass(),
"transmissionNo" => new stdClass(),
"event.no" => new stdClass(),
"event.name" => new stdClass(),
"nature1" => new stdClass(),
"nature2" => new stdClass(),
"destinations.destination.organization.code" => new stdClass(),
"destinations.destination.city.code" => new stdClass(),
"origins.origin.organization.code" => new stdClass(),
"origins.origin.city.code" => new stdClass(),
"destinations.destination.organization.name" => new stdClass(),
"destinations.destination.city.name" => new stdClass(),
"origins.origin.organization.name" => new stdClass(),
"origins.origin.city.name" => new stdClass(),
"technicalSystems.technicalSystem.system.name" => new stdClass(),
"technicalSystems.technicalSystem.system.code" => new stdClass()
]
];
$query->setHighlight($highlight);
// Limit size
$query->setSize(20);
$getQuery = json_encode($query->getQuery()->toArray());
$arrayResult = null;
foreach ($this->elasticService->getSearch()->search($query) as $trans) {
$transmissions['source'] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
$transmissions['highlight'] = $trans->getHighlights();
$arrayResult[] = $transmissions;
}
if (empty($arrayResult)) {
return null;
}
return $arrayResult;
}
public function getIdeasForAutocompleteByHighlight2($parameters)
{
// Query filtered
$query = new Query();
$filterBool = new BoolQuery();
$functionScore = new FunctionScore();
$functionScore->addDecayFunction(FunctionScore::DECAY_LINEAR, "beginDate", "now", "20d", null, 0.5);
//$functionScore->addFunction('filter', array("term" => array("event.name" => "geneva tatawine")), null, 10);
// Query multi match on transmission number, title and event
if (!empty($parameters['searchKeywords'])) {
$queryMultiMatch = new MultiMatch();
$queryMultiMatch->setQuery($parameters['searchKeywords']);
$fields = [
"no",
"transmissionNo",
"event.no",
"event.name",
"nature1",
"nature2",
"destinations.destination.organization.code",
"destinations.destination.city.code",
"origins.origin.organization.code",
"origins.origin.city.code",
"destinations.destination.organization.name",
"destinations.destination.city.name",
"origins.origin.organization.name",
"origins.origin.city.name",
"technicalSystems.technicalSystem.system.name",
"technicalSystems.technicalSystem.system.code"
];
$queryMultiMatch->setFields($fields);
$queryMultiMatch->setOperator('and');
$filterBool->addMust($queryMultiMatch);
}
// Filter on Company (user company or family) OR Filter on opsprod rights access
if (!empty($parameters['companies'])) {
$companyOpsprodFilter = self::addFilterCompanyOrOpsprod($parameters);
$filterBool->addMust($companyOpsprodFilter);
}
// Add filter on live search input
$filterBool = self::addFilterLiveSearchInput($parameters, $filterBool);
// Except BIN transmission
$queryExceptBININQStatus = new Terms('status');
$queryExceptBININQStatus->setTerms([ElasticNeosService::TXM_STATUS_BIN, ElasticNeosService::TXM_STATUS_INQ]);
$filterBool->addMustNot($queryExceptBININQStatus);
$functionScore->setQuery($filterBool);
$query->setQuery($functionScore);
// Get specific fields to improve performances (EOS document is huge)
$usefulFields = [
"id",
"no",
"transmissionNo",
"year",
"beginDate",
"endDate",
"product.code",
"status",
"type",
"nature1",
"nature2",
"event.no",
"event.name",
"event.type",
"organizationAuthorized.destinations",
"origins.origin.organization.code",
"origins.origin.organization.name",
"origins.origin.organization.city.code",
"origins.origin.organization.city.name",
"origins.origin.city.code",
"origins.origin.city.name",
"origins.origin.transportable.code",
"destinations.destination.organization.code",
"destinations.destination.organization.name",
"destinations.destination.organization.city.code",
"destinations.destination.organization.city.name",
"destinations.destination.city.code",
"destinations.destination.city.name",
"technicalSystems.technicalSystem.system"
];
$query->setSource($usefulFields);
// Get word hightlighted
$highlight = [
"pre_tags" => [""],
"post_tags" => [""],
"fields" => [
"no" => new stdClass(),
"transmissionNo" => new stdClass(),
"event.no" => new stdClass(),
"event.name" => new stdClass(),
"nature1" => new stdClass(),
"nature2" => new stdClass(),
"destinations.destination.organization.code" => new stdClass(),
"destinations.destination.city.code" => new stdClass(),
"origins.origin.organization.code" => new stdClass(),
"origins.origin.city.code" => new stdClass(),
"destinations.destination.organization.name" => new stdClass(),
"destinations.destination.city.name" => new stdClass(),
"origins.origin.organization.name" => new stdClass(),
"origins.origin.city.name" => new stdClass(),
"technicalSystems.technicalSystem.system.name" => new stdClass(),
"technicalSystems.technicalSystem.system.code" => new stdClass()
]
];
$query->setHighlight($highlight);
// Limit size
$query->setSize(50);
// $getQuery = json_encode($query->getQuery()->toArray());
// dump($getQuery);exit();
$arrayResult = null;
foreach ($this->elasticService->getSearch()->search($query) as $trans) {
$transmissions['source'] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
$transmissions['highlight'] = $trans->getHighlights();
$arrayResult[] = $transmissions;
}
if (empty($arrayResult)) {
return null;
}
return $arrayResult;
}
public function findCustomerParticipation($codeOrganization, $transmission)
{
if (!empty($codeOrganization) && !empty($transmission) && !empty($transmission['destinations']) && !empty($transmission['destinations']['destination'])) {
foreach ($transmission['destinations']['destination'] as $destination) {
$currentOrganization = $destination['organization']['code'];
if ($codeOrganization != $currentOrganization) {
continue;
} else {
if (!empty($destination['custOrderItem']) && !empty($destination['custOrderItem']['product']) && !empty($destination['custOrderItem']['product']['type']) && !empty($destination['custOrderItem']['status']) && $destination['custOrderItem']['product']['type'] === "PARTICIPATION") {
return $destination;
}
}
}
}
return null;
}
public function getStreamfarmTransmissions($parameters): ?array
{
$query = ElasticNeosService::buildQueryTransmissionStreamfarm($parameters);
// Get all results and sort by date
$query->setSort(['beginDate' => ['order' => 'asc']]);
if (!empty($parameters['from'])) {
$query->setFrom($parameters['from']);
}
if (!empty($parameters['size'])) {
$query->setSize($parameters['size']);
} else {
$query->setSize(static::MAX_LIMIT_SIZE);
}
// Get specific fields to improve performances (EOS document is huge)
$usefulFields = [
"id",
"no",
static::KEY_TRANSMISSION_NO,
"year",
"beginDate",
"endDate",
"programBeginDate",
"programEndDate",
"product.code",
"status",
"type",
"nature1",
"nature2",
"event.no",
"event.name",
"event.type",
"organizationAuthorized.destinations",
"organizationAuthorized.billTo",
"organizationAuthorized.customer",
"origins.origin.organization.code",
"origins.origin.organization.name",
"origins.origin.organization.city.code",
"origins.origin.organization.city.name",
"origins.origin.city.code",
"origins.origin.city.name",
"origins.origin.transportable.code",
"origins.origin.netApplied",
"destinations.destination.organization.code",
"destinations.destination.organization.name",
"destinations.destination.organization.city.code",
"destinations.destination.organization.city.name",
"destinations.destination.city.code",
"destinations.destination.city.name",
"destinations.destination.custOrderItem.custOrder.event.resourceNetDef.code",
"destinations.destination.custOrderItem.id",
"destinations.destination.custOrderItem.product.type",
"destinations.destination.custOrderItem.status",
"destinations.destination.custOrderItem.custOrder",
"destinations.destination.system",
"technicalSystems.technicalSystem.videoDefinitionCode",
"technicalSystems.technicalSystem.videoAspectRatioCode",
"technicalSystems.technicalSystem.system",
"associatedItems",
"lastSynopsisStatus",
"mdsChannel",
"streamFarmOperator.email",
];
$query->setSource($usefulFields);
// Debug - get ES query
//$getQuery = json_encode($query->getQuery()->toArray());
$transmissions = [];
$resultSet = $this->elasticService->getSearch()->search($query);
foreach ($resultSet as $trans) {
$currentTransmission = $trans->getSource();
$currentTransmission['path'] = $this->buildPathForTransmission($currentTransmission);
$transmissions[] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
}
$organizationsCodeColor = $this->em->getRepository(OrganizationCodeColor::class)->findAll();
foreach ($transmissions as $key => &$aDestination) {
$nbWebStreamingDestinations = 0;
$WebStreamingDestinationCode = "";
$arrayTakers = [];
if (!empty($aDestination['destinations']['destination'])) {
foreach ($aDestination['destinations']['destination'] as $currentDestination) {
if (!empty($currentDestination['system']) && ($currentDestination['system'] == ElasticNeosService::WEB_STREAMING_SYSTEM || $currentDestination['system'] == ElasticNeosService::NON_LINEAR_DISTRIBUTION_SYSTEM)) {
if (empty($currentDestination['custOrderItem']) || !empty($currentDestination['custOrderItem']['status']) && $currentDestination['custOrderItem']['status'] != 'CANCELLED') {
$nbWebStreamingDestinations++;
$WebStreamingDestinationCode = $currentDestination['organization']['code'];
if (!in_array($WebStreamingDestinationCode, $arrayTakers)) {
$arrayTakers[] = $WebStreamingDestinationCode;
}
}
}
}
}
// List of codes WEB STREAMING & NON_LINEAR
$aDestination['streamfarmTakers'] = $arrayTakers;
if (!empty($WebStreamingDestinationCode) && $organizationsCodeColor != null && $nbWebStreamingDestinations <= 1) {
foreach ($organizationsCodeColor as $organizationCodeColor) {
if ($WebStreamingDestinationCode == strtoupper($organizationCodeColor->getOrganization())) {
$aDestination['codeColor'] = $organizationCodeColor->getCodeColor();
}
}
}
if ($nbWebStreamingDestinations === 0) {
unset($transmissions[$key]);
}
}
return array_values($transmissions);
}
private function buildQueryTransmissionStreamfarm($parameters)
{
date_default_timezone_set('GMT');
// Convert timestamp into milliseconds.
$fromDateTS = strtotime($parameters['dateFrom']) * 1000;
$toDateTS = strtotime($parameters['dateTo']) * 1000;
if ($parameters['dateFrom'] == $parameters['dateTo']) {
$toDateTS = strtotime('+ 24 hours', strtotime($parameters['dateTo'])) * 1000;
}
$query = new Query();
$filterBool = new BoolQuery();
// Filter query on date
if (!empty($parameters['dateFrom'])) {
// Get all transmissions where endDate > dateFrom
$queryOnlyStartDate = new Range(
'endDate', [
'gte' => intval($fromDateTS)
]
);
$filterBool->addMust($queryOnlyStartDate);
}
if (!empty($parameters['dateTo'])) {
// Get all transmissions where beginDate < dateTo
$queryOnlyEndDate = new Range(
'beginDate', [
'lte' => intval($toDateTS)
]
);
$filterBool->addMust($queryOnlyEndDate);
}
$queryWebStreamingSystem = new Terms('destinations.destination.system');
$queryWebStreamingSystem->setTerms([ElasticNeosService::WEB_STREAMING_SYSTEM, ElasticNeosService::NON_LINEAR_DISTRIBUTION_SYSTEM]);
$filterBool->addMust($queryWebStreamingSystem);
// Filter on operator
if (!empty($parameters['operator'])) {
$queryStreamfarmOperator = new Term();
$queryStreamfarmOperator->setTerm('streamFarmOperator.email', $parameters['operator']);
$filterBool->addMust($queryStreamfarmOperator);
}
// Filter on client
if (!empty($parameters['client'])) {
$queryStreamfarmClient = new Term();
$queryStreamfarmClient->setTerm('organizationAuthorized.destinations', $parameters['client'][0]);
$filterBool->addMust($queryStreamfarmClient);
}
// Except BIN and CAN transmissions
$queryExceptBINCANStatus = new Terms('status');
$queryExceptBINCANStatus->setTerms([ElasticNeosService::TXM_STATUS_BIN, ElasticNeosService::TXM_STATUS_CAN]);
$filterBool->addMustNot($queryExceptBINCANStatus);
// Set query to query ES
$query->setQuery($filterBool);
// Get all results
$query->setSize(static::MAX_LIMIT_SIZE);
return $query;
}
public function getStreamfarmClients()
{
$query = new Query();
$filterBool = new BoolQuery();
// $queryStreamingProfileType = new \Elastica\Query\Terms();
// $queryStreamingProfileType->setTerms('destinations.destination.webDestinationParameter.streamingProfile.type', ElasticNeosService::STREAMFARM_PROFILE);
// $filterBool->addMust($queryStreamingProfileType);
$queryWebStreamingSystem = new Terms('destinations.destination.system');
$queryWebStreamingSystem->setTerms([ElasticNeosService::WEB_STREAMING_SYSTEM, ElasticNeosService::NON_LINEAR_DISTRIBUTION_SYSTEM]);
$filterBool->addMust($queryWebStreamingSystem);
// Aggregations to get number in filter
$aggregationStreamfarmClient = new \Elastica\Aggregation\Terms("streamfarmClient");
$aggregationStreamfarmClient->setField("destinations.destination.organization.code.raw");
$query->addAggregation($aggregationStreamfarmClient);
$aggregationResult = $this->elasticService->getSearch()->search($query)->getAggregations();
if (empty($aggregationResult) || empty($aggregationResult['streamfarmClient']) || empty($aggregationResult['streamfarmClient']['buckets'])) {
return null;
}
return $aggregationResult['streamfarmClient']['buckets'];
}
public function getStreamfarmOperators()
{
$query = new Query();
$filterBool = new BoolQuery();
// $queryStreamingProfileType = new \Elastica\Query\Terms();
// $queryStreamingProfileType->setTerms('destinations.destination.webDestinationParameter.streamingProfile.type', ElasticNeosService::STREAMFARM_PROFILE);
// $filterBool->addMust($queryStreamingProfileType);
$queryWebStreamingSystem = new Terms('destinations.destination.system');
$queryWebStreamingSystem->setTerms([ElasticNeosService::WEB_STREAMING_SYSTEM, ElasticNeosService::NON_LINEAR_DISTRIBUTION_SYSTEM]);
$filterBool->addMust($queryWebStreamingSystem);
// Aggregations to get number in filter
$aggregationStreamfarmOperator = new \Elastica\Aggregation\Terms("streamfarmOperator");
$aggregationStreamfarmOperator->setField("streamFarmOperator.email");
$query->addAggregation($aggregationStreamfarmOperator);
$aggregationResult = $this->elasticService->getSearch()->search($query)->getAggregations();
if (empty($aggregationResult) || empty($aggregationResult['streamfarmOperator']) || empty($aggregationResult['streamfarmOperator']['buckets'])) {
return null;
}
return $aggregationResult['streamfarmOperator']['buckets'];
}
public function getTransmissionsForAutocomplete($parameters)
{
// Query filtered
$query = new Query();
$filterBool = new BoolQuery();
$functionScore = new FunctionScore();
$functionScore->addDecayFunction(FunctionScore::DECAY_LINEAR, "beginDate", "now", "20d", null, 0.5);
// Query multi match on transmission number, title and event
if (!empty($parameters['searchKeywords'])) {
$queryMultiMatch = new MultiMatch();
$queryMultiMatch->setQuery($parameters['searchKeywords']);
$fields = [
"no",
"transmissionNo",
"nature1",
"nature2"
];
$queryMultiMatch->setFields($fields);
$queryMultiMatch->setOperator('and');
$filterBool->addMust($queryMultiMatch);
}
// Filter on Company (user company or family) OR Filter on opsprod rights access
if (!empty($parameters['companies'])) {
$companyOpsprodFilter = self::addFilterCompanyOrOpsprod($parameters);
$filterBool->addMust($companyOpsprodFilter);
}
// Except BIN transmission
$queryExceptBININQStatus = new Terms('status');
$queryExceptBININQStatus->setTerms([ElasticNeosService::TXM_STATUS_BIN, ElasticNeosService::TXM_STATUS_INQ]);
$filterBool->addMustNot($queryExceptBININQStatus);
$functionScore->setQuery($filterBool);
$query->setQuery($functionScore);
// Get specific fields to improve performances (EOS document is huge)
$usefulFields = [
"id",
"no",
"transmissionNo",
"nature1",
"nature2"
];
$query->setSource($usefulFields);
// Get word hightlighted
$highlight = [
"pre_tags" => [""],
"post_tags" => [""],
"fields" => [
"no" => new stdClass(),
"transmissionNo" => new stdClass(),
"nature1" => new stdClass(),
"nature2" => new stdClass(),
]
];
$query->setHighlight($highlight);
// Limit size
$query->setSize(20);
$arrayResult = null;
foreach ($this->elasticService->getSearch()->search($query) as $trans) {
$transmissions['source'] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
$transmissions['highlight'] = $trans->getHighlights();
$arrayResult[] = $transmissions;
}
if (empty($arrayResult)) {
return null;
}
return $arrayResult;
}
public function getEventsForAutocomplete($parameters)
{
// Query filtered
$query = new Query();
$filterBool = new BoolQuery();
$functionScore = new FunctionScore();
$functionScore->addDecayFunction(FunctionScore::DECAY_LINEAR, "beginDate", "now", "20d", null, 0.5);
// Query multi match on transmission number, title and event
if (!empty($parameters['searchKeywords'])) {
$queryMultiMatch = new MultiMatch();
$queryMultiMatch->setQuery($parameters['searchKeywords']);
$fields = [
"event.no",
"event.name",
];
$queryMultiMatch->setFields($fields);
$queryMultiMatch->setOperator('and');
$filterBool->addMust($queryMultiMatch);
}
// Filter on Company (user company or family) OR Filter on opsprod rights access
if (!empty($parameters['companies'])) {
$companyOpsprodFilter = self::addFilterCompanyOrOpsprod($parameters);
$filterBool->addMust($companyOpsprodFilter);
}
// Except BIN transmission
$queryExceptBININQStatus = new Terms('status');
$queryExceptBININQStatus->setTerms([ElasticNeosService::TXM_STATUS_BIN, ElasticNeosService::TXM_STATUS_INQ]);
$filterBool->addMustNot($queryExceptBININQStatus);
$functionScore->setQuery($filterBool);
$query->setQuery($functionScore);
// Get specific fields to improve performances (EOS document is huge)
$usefulFields = [
"event.no",
"event.name",
];
$query->setSource($usefulFields);
// Get word hightlighted
$highlight = [
"pre_tags" => [""],
"post_tags" => [""],
"fields" => [
"event.no" => new stdClass(),
"event.name" => new stdClass(),
]
];
$query->setHighlight($highlight);
// Limit size
$query->setSize(20);
$arrayResult = null;
foreach ($this->elasticService->getSearch()->search($query) as $trans) {
$transmissions['source'] = array_merge($trans->getSource(), ['_id' => $trans->getId()]);
$transmissions['highlight'] = $trans->getHighlights();
$arrayResult[] = $transmissions;
}
if (empty($arrayResult)) {
return null;
}
return $arrayResult;
}
}