/** * Update the main event constraints * * @param Demand $demand * @param bool $respectEnableFields * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param array $constraints * @return void */ protected function updateEventConstraints(Demand $demand, $respectEnableFields, \TYPO3\CMS\Extbase\Persistence\QueryInterface $query, array &$constraints) { // reset datetime constraint unset($constraints['datetime']); $eventRestriction = $demand->getEventRestriction(); if ($eventRestriction === Demand::EVENT_RESTRICTION_NO_EVENTS) { $constraints[] = $query->equals('isEvent', 0); } elseif ($eventRestriction === Demand::EVENT_RESTRICTION_ONLY_EVENTS) { $dateField = $demand->getDateField(); $begin = mktime(0, 0, 0, $demand->getMonth(), 1, $demand->getYear()); $end = mktime(23, 59, 59, $demand->getMonth() + 1, 0, $demand->getYear()); $eventsWithNoEndDate = array($query->logicalAnd($query->greaterThanOrEqual($demand->getDateField(), $begin), $query->lessThanOrEqual($demand->getDateField(), $end))); $eventsWithEndDate = array($query->logicalAnd($query->greaterThanOrEqual('datetime', $begin), $query->lessThanOrEqual('datetime', $end), $query->lessThanOrEqual('eventEnd', $end)), $query->logicalAnd($query->lessThanOrEqual($dateField, $begin), $query->greaterThanOrEqual('eventEnd', $end)), $query->logicalAnd($query->lessThanOrEqual($dateField, $begin), $query->greaterThanOrEqual('eventEnd', $begin)), $query->logicalAnd($query->lessThanOrEqual($dateField, $end), $query->greaterThanOrEqual('eventEnd', $end))); $dateConstraints1 = array($query->logicalAnd($eventsWithNoEndDate), $query->logicalOr($eventsWithEndDate)); $constraints['datetime'] = $query->logicalOr($dateConstraints1); $organizers = $demand->getOrganizers(); if (!empty($organizers)) { $constraints[] = $query->in('organizer', $organizers); } $locations = $demand->getLocations(); if (!empty($locations)) { $constraints[] = $query->in('location', $locations); } } }
/** * @param callable $closure */ public function logicalOr(\Closure $closure) { /** @var QueryProxy $newProxy */ $newProxy = $this->newProxy(); $closure($newProxy); $this->constraints[] = $this->query->logicalOr($newProxy->getContraints()); }
/** * Returns a constraint array created by a given filter array * * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param array $filter * @param array $constraints * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\ConstraintInterface|null */ protected function createFilterConstraints(\TYPO3\CMS\Extbase\Persistence\QueryInterface $query, $filter = NULL, $constraints = NULL) { if (is_null($constraints)) { $constraints = []; } if (isset($filter['uid_foreign']) && is_numeric($filter['uid_foreign']) && $filter['uid_foreign'] > 0 && isset($filter['tablenames']) && $filter['tablenames'] != "") { $constraints[] = $query->equals('uidForeign', $filter['uid_foreign']); $constraints[] = $query->equals('tablenames', $filter['tablenames']); } else { $constraints[] = $query->equals('uidForeign', 0); $constraints[] = $query->equals('tablenames', "dfgdfgjrezu67q348673463"); } if (isset($filter['feUser']) && is_numeric($filter['feUser']) && $filter['feUser'] > 0) { $constraints[] = $query->equals('feUser', $filter['feUser']); } if (!(isset($filter['isModerator']) && is_bool($filter['isModerator']) && $filter['isModerator'] == true)) { if (isset($filter['confirmed']) && is_bool($filter['confirmed']) && $filter['confirmed'] == true) { $constraints[] = $query->greaterThan('confirmed', 0); } else { $constraints[] = $query->logicalOr($query->equals('confirmed', 0), $query->equals('confirmed', ''), $query->equals('confirmed', NULL)); } } if (count($constraints) < 1) { $constraints = NULL; } return $constraints; }
/** * Returns the constraint to determine if a news event is active or not (archived) * * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\ConstraintInterface $constraint */ protected function createIsActiveConstraint(\TYPO3\CMS\Extbase\Persistence\QueryInterface $query) { /** @var $constraint \TYPO3\CMS\Extbase\Persistence\Generic\Qom\ConstraintInterface */ $constraint = null; $timestamp = time(); // + date('Z'); $constraint = $query->logicalOr($query->greaterThan('tx_roqnewsevent_startdate + tx_roqnewsevent_starttime', $timestamp), $query->logicalAnd($query->lessThan('tx_roqnewsevent_startdate + tx_roqnewsevent_starttime', $timestamp), $query->greaterThan('tx_roqnewsevent_enddate + tx_roqnewsevent_endtime', $timestamp)), $query->logicalAnd($query->lessThan('tx_roqnewsevent_startdate + tx_roqnewsevent_starttime', $timestamp), $query->greaterThan('tx_roqnewsevent_startdate + tx_roqnewsevent_endtime', $timestamp), $query->equals('tx_roqnewsevent_enddate', 0)), $query->logicalAnd($query->greaterThan('tx_roqnewsevent_startdate + 86399', $timestamp), $query->equals('tx_roqnewsevent_starttime', 0), $query->equals('tx_roqnewsevent_enddate', 0), $query->equals('tx_roqnewsevent_endtime', 0))); return $constraint; }
/** * Update the main event constraints * * @param Demand $demand * @param bool $respectEnableFields * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param array $constraints * @return void */ protected function updateEventConstraints(Demand $demand, $respectEnableFields, \TYPO3\CMS\Extbase\Persistence\QueryInterface $query, array &$constraints) { $eventRestriction = $demand->getEventRestriction(); if ($eventRestriction === Demand::EVENT_RESTRICTION_NO_EVENTS) { $constraints[] = $query->equals('isEvent', 0); } elseif ($eventRestriction === Demand::EVENT_RESTRICTION_ONLY_EVENTS) { $constraints[] = $query->equals('isEvent', 1); $monthFromDemand = $demand->getMonth(); $yearFromDemand = $demand->getYear(); if (!empty($monthFromDemand) && !empty($yearFromDemand)) { // reset datetime constraint unset($constraints['datetime']); $dateField = $demand->getDateField(); $begin = mktime(0, 0, 0, $demand->getMonth(), 1, $demand->getYear()); $end = mktime(23, 59, 59, $demand->getMonth() + 1, 0, $demand->getYear()); $eventsWithNoEndDate = array($query->logicalAnd($query->greaterThanOrEqual($demand->getDateField(), $begin), $query->lessThanOrEqual($demand->getDateField(), $end))); $eventsWithEndDate = array($query->logicalAnd($query->greaterThanOrEqual('datetime', $begin), $query->lessThanOrEqual('datetime', $end), $query->lessThanOrEqual('eventEnd', $end)), $query->logicalAnd($query->lessThanOrEqual($dateField, $begin), $query->greaterThanOrEqual('eventEnd', $end)), $query->logicalAnd($query->lessThanOrEqual($dateField, $begin), $query->greaterThanOrEqual('eventEnd', $begin)), $query->logicalAnd($query->lessThanOrEqual($dateField, $end), $query->greaterThanOrEqual('eventEnd', $end))); $dateConstraints1 = array($query->logicalAnd($eventsWithNoEndDate), $query->logicalOr($eventsWithEndDate)); $constraints['datetime'] = $query->logicalOr($dateConstraints1); } $archiveRestriction = $demand->getArchiveRestriction(); if (!empty($archiveRestriction)) { $timestamp = time(); $beginningOfDay = strtotime("midnight", $timestamp); $endOfDay = strtotime("tomorrow", $beginningOfDay) - 1; $activeConstraint = $query->logicalOr($query->greaterThan('datetime', $timestamp), $query->logicalAnd($query->equals('full_day', 0), $query->lessThan('datetime', $timestamp), $query->greaterThan('event_end', $timestamp)), $query->logicalAnd($query->equals('full_day', 1), $query->lessThan('datetime', $beginningOfDay), $query->greaterThan('event_end', $beginningOfDay), $query->lessThan('event_end', $endOfDay)), $query->logicalAnd($query->equals('full_day', 1), $query->lessThan('datetime', $timestamp), $query->greaterThan('event_end', $endOfDay)), $query->logicalAnd($query->equals('full_day', 1), $query->greaterThanOrEqual('datetime', $beginningOfDay), $query->equals('event_end', 0))); // reset existing archived constraint unset($constraints['archived']); if ($demand->getArchiveRestriction() == 'archived') { $constraints['archived'] = $query->logicalNot($activeConstraint); } elseif ($demand->getArchiveRestriction() == 'active') { $constraints['archived'] = $activeConstraint; } } $organizers = $demand->getOrganizers(); if (!empty($organizers)) { $constraints[] = $query->in('organizer', $organizers); } $locations = $demand->getLocations(); if (!empty($locations)) { $constraints[] = $query->in('location', $locations); } } }
/** * Builds the query * @return void */ protected function buildQuery() { if ($this->categoryConstraintsLength > 0 && $this->categoryIsAll === FALSE && $this->searchConstraintsLength > 0) { $this->query->matching($this->query->logicalAnd($this->query->logicalOr($this->categoryConstraints), $this->query->logicalAnd($this->searchConstraints))); } elseif ($this->categoryConstraintsLength > 0 && $this->categoryIsAll === FALSE) { $this->query->matching($this->query->logicalOr($this->categoryConstraints)); } elseif ($this->searchConstraintsLength > 0) { $this->query->matching($this->query->logicalAnd($this->searchConstraints)); } }
/** * @param \GeorgRinger\Newsadvancedsearch\Domain\Model\Dto\Demand $demand * @param bool $respectEnableFields * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param array $constraints */ protected function updateConstraints(\GeorgRinger\Newsadvancedsearch\Domain\Model\Dto\Demand $demand, $respectEnableFields, \TYPO3\CMS\Extbase\Persistence\QueryInterface $query, array &$constraints) { $subject = $demand->getSubject(); if (!empty($subject)) { $constraints[] = $query->like('title', '%' . $subject . '%'); } $locations = $demand->getLocations(); if (!empty($locations)) { $locationConstraints = array(); foreach ($locations as $typeId) { $locationConstraints[] = $query->contains('locations', $typeId); } $constraints[] = $query->logicalOr($locationConstraints); } $types = $demand->getTypes(); if (!empty($types)) { $typesConstraints = array(); foreach ($types as $typeId) { $typesConstraints[] = $query->contains('eventtypes', $typeId); } $constraints[] = $query->logicalOr($typesConstraints); } }
/** * Add category constraint * * @param array $categories * @param boolean $isAnd If TRUE categories get a logicalAnd. Otherwise a logicalOr. * @param boolean $isNot If TRUE categories get a logicalNot operator. Otherwise not. * @return void */ public function addCategoryConstraint(array $categories, $isAnd = TRUE, $isNot = FALSE) { if ($isAnd === TRUE && $isNot === FALSE) { $this->queryConstraints[] = $this->query->logicalAnd($this->buildCategoryConstraint($categories)); } if ($isAnd === TRUE && $isNot === TRUE) { $this->queryConstraints[] = $this->query->logicalNot($this->query->logicalAnd($this->buildCategoryConstraint($categories))); } if ($isAnd === FALSE && $isNot === FALSE) { $this->queryConstraints[] = $this->query->logicalOr($this->buildCategoryConstraint($categories)); } if ($isAnd === FALSE && $isNot === TRUE) { $this->queryConstraints[] = $this->query->logicalNot($this->query->logicalOr($this->buildCategoryConstraint($categories))); } }
/** * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param \DWenzel\T3events\Domain\Model\Dto\DemandInterface $demand * @return array */ public function createConstraintsFromDemand(QueryInterface $query, DemandInterface $demand) { /** @var ReservationDemand $demand */ $constraints = []; if ($demand->getLessonDeadline()) { $constraints[] = $query->logicalAnd($query->lessThan('lesson.deadline', $demand->getLessonDeadline())); } if ($demand->getStatus()) { $statusArr = GeneralUtility::intExplode(',', $demand->getStatus()); $statusConstraints = []; foreach ($statusArr as $status) { $statusConstraints[] = $query->equals('status', $status); } $constraints[] = $query->logicalOr($statusConstraints); } if ($demand->getMinAge()) { $constraints[] = $query->logicalAnd($query->lessThan('tstamp', time() - $demand->getMinAge())); } if ($demand->getLessonDate()) { if ($demand->getPeriod() === 'futureOnly') { $constraints[] = $query->greaterThanOrEqual('lesson.date', $demand->getLessonDate()); } elseif ($demand->getPeriod() === 'pastOnly') { $constraints[] = $query->lessThanOrEqual('lesson.date', $demand->getLessonDate()); } } if ((bool) ($genreConstraints = $this->createGenreConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $genreConstraints, $demand->getCategoryConjunction()); } if ((bool) ($searchConstraints = $this->createSearchConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $searchConstraints, 'OR'); } if ((bool) ($eventTypeConstraints = $this->createEventTypeConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $eventTypeConstraints, $demand->getCategoryConjunction()); } if ((bool) ($periodConstraints = $this->createPeriodConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $periodConstraints); } if ((bool) ($audienceConstraints = $this->createAudienceConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $audienceConstraints); } return $constraints; }
/** * This function builds the matchings. * It enables matchings like: * - single character: 'B' * - multiple characters: 'BDEFG' * - range of characters: 'B-G' * * @param string $characters * @return QueryInterface */ protected function getMatchings($characters = NULL) { $matching = array(); if ($characters === NULL) { $characters = $this->currentCharacter; } $characterLength = strlen($characters); if ($characterLength === 1) { // single character B $matching = $this->query->like($this->field, $characters . '%'); } else { if ($characterLength === 3 && $characters[1] === '-') { // range B-G // Build the characters like multiple characters B-G => BCDEFG // Fix orderings $firstCharacter = ord($characters[0]); $lastCharacter = ord($characters[2]); if ($firstCharacter - $lastCharacter > 0) { $tmp = $firstCharacter; $firstCharacter = $lastCharacter; $lastCharacter = $tmp; } // Build the new String $characters = ''; for ($char = $firstCharacter; $char <= $lastCharacter; ++$char) { $characters .= chr($char); } } // multiple characters BDEFG $characters = str_split($characters); foreach ($characters as $char) { $matching[] = $this->query->like($this->field, $char . '%'); } $matching = $this->query->logicalOr($matching); } return $this->query->matching($matching); }
/** * Sets the category constraint to the given constraints array * * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query Query * @param \DERHANSEN\SfEventMgt\Domain\Model\Dto\EventDemand $eventDemand EventDemand * @param array $constraints Constraints * * @return void */ protected function setCategoryConstraint($query, $eventDemand, &$constraints) { if ($eventDemand->getCategory() != '') { $categoryConstraints = array(); $categories = GeneralUtility::intExplode(',', $eventDemand->getCategory(), TRUE); foreach ($categories as $category) { $categoryConstraints[] = $query->contains('category', $category); } if (count($categoryConstraints) > 0) { $constraints[] = $query->logicalOr($categoryConstraints); } } }
/** * Sets the search constraint to the given constraints array * * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query Query * @param \DERHANSEN\SfEventMgt\Domain\Model\Dto\EventDemand $eventDemand EventDemand * @param array $constraints Constraints * * @return void */ protected function setSearchConstraint($query, $eventDemand, &$constraints) { if ($eventDemand->getSearchDemand() && $eventDemand->getSearchDemand()->getSearch() !== null && $eventDemand->getSearchDemand()->getSearch() !== '') { $searchFields = GeneralUtility::trimExplode(',', $eventDemand->getSearchDemand()->getFields(), true); $searchConstraints = []; if (count($searchFields) === 0) { throw new \UnexpectedValueException('No search fields defined', 1318497755); } $searchSubject = $eventDemand->getSearchDemand()->getSearch(); foreach ($searchFields as $field) { if (!empty($searchSubject)) { $searchConstraints[] = $query->like($field, '%' . $searchSubject . '%', false); } } if (count($searchConstraints)) { $constraints[] = $query->logicalOr($searchConstraints); } } }
/** * Add time frame related queries * * @param array $constraints * @param QueryInterface $query * @param int $startTime * @param int $endTime */ protected function addTimeFrameConstraints(&$constraints, QueryInterface $query, $startTime, $endTime) { $orConstraint = array(); // before - in $beforeIn = array($query->lessThan('start_date', $startTime), $query->greaterThanOrEqual('end_date', $startTime), $query->lessThan('end_date', $endTime)); $orConstraint[] = $query->logicalAnd($beforeIn); // in - in $inIn = array($query->greaterThanOrEqual('start_date', $startTime), $query->lessThan('end_date', $endTime)); $orConstraint[] = $query->logicalAnd($inIn); // in - after $inAfter = array($query->greaterThanOrEqual('start_date', $startTime), $query->lessThan('start_date', $endTime), $query->greaterThanOrEqual('end_date', $endTime)); $orConstraint[] = $query->logicalAnd($inAfter); // before - after $beforeAfter = array($query->lessThan('start_date', $startTime), $query->greaterThan('end_date', $endTime)); $orConstraint[] = $query->logicalAnd($beforeAfter); // finish $constraints[] = $query->logicalOr($orConstraint); }
/** * Create constraints for pending comments * * @return object */ protected function getPendingConstraints(QueryInterface $query) { $constraints = $query->logicalOr($query->equals('spam', 1), $query->equals('approved', 0)); return $constraints; }
/** * Add time frame related queries * * @param array $constraints * @param QueryInterface $query * @param int $startTime * @param int|null $endTime * * @see IndexUtility::isIndexInRange */ protected function addTimeFrameConstraints(&$constraints, QueryInterface $query, $startTime, $endTime = null) { // Simulate end time if ($endTime === null) { $endTime = $startTime + DateTimeUtility::SECONDS_DECADE; } $orConstraint = []; // before - in $beforeIn = [$query->lessThan('start_date', $startTime), $query->greaterThanOrEqual('end_date', $startTime), $query->lessThan('end_date', $endTime)]; $orConstraint[] = $query->logicalAnd($beforeIn); // in - in $inIn = [$query->greaterThanOrEqual('start_date', $startTime), $query->lessThan('end_date', $endTime)]; $orConstraint[] = $query->logicalAnd($inIn); // in - after $inAfter = [$query->greaterThanOrEqual('start_date', $startTime), $query->lessThan('start_date', $endTime), $query->greaterThanOrEqual('end_date', $endTime)]; $orConstraint[] = $query->logicalAnd($inAfter); // before - after $beforeAfter = [$query->lessThan('start_date', $startTime), $query->greaterThan('end_date', $endTime)]; $orConstraint[] = $query->logicalAnd($beforeAfter); // finish $constraints[] = $query->logicalOr($orConstraint); }
/** * Get the search constraints * * @param QueryInterface $query * @param DemandInterface $demand * @return array * @throws \UnexpectedValueException */ protected function getSearchConstraints(QueryInterface $query, DemandInterface $demand) { $constraints = []; if ($demand->getSearch() === null) { return $constraints; } /* @var $searchObject \GeorgRinger\News\Domain\Model\Dto\Search */ $searchObject = $demand->getSearch(); $searchSubject = $searchObject->getSubject(); if (!empty($searchSubject)) { $searchFields = GeneralUtility::trimExplode(',', $searchObject->getFields(), true); $searchConstraints = []; if (count($searchFields) === 0) { throw new \UnexpectedValueException('No search fields defined', 1318497755); } foreach ($searchFields as $field) { if (!empty($searchSubject)) { $searchConstraints[] = $query->like($field, '%' . $searchSubject . '%'); } } if (count($searchConstraints)) { $constraints[] = $query->logicalOr($searchConstraints); } } $minimumDate = strtotime($searchObject->getMinimumDate()); if ($minimumDate) { $field = $searchObject->getDateField(); if (empty($field)) { throw new \UnexpectedValueException('No date field is defined', 1396348732); } $constraints[] = $query->greaterThanOrEqual($field, $minimumDate); } $maximumDate = strtotime($searchObject->getMaximumDate()); if ($maximumDate) { $field = $searchObject->getDateField(); if (empty($field)) { throw new \UnexpectedValueException('No date field is defined', 1396348733); } $constraints[] = $query->lessThanOrEqual($field, $maximumDate); } return $constraints; }
/** * Get the search constraints * * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param Tx_News_Domain_Model_DemandInterface $demand * @return array * @throws UnexpectedValueException */ protected function getSearchConstraints(\TYPO3\CMS\Extbase\Persistence\QueryInterface $query, Tx_News_Domain_Model_DemandInterface $demand) { $constraints = array(); if ($demand->getSearch() === NULL) { return $constraints; } /* @var $searchObject Tx_News_Domain_Model_Dto_Search */ $searchObject = $demand->getSearch(); $searchSubject = $searchObject->getSubject(); if (!empty($searchSubject)) { $searchFields = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', $searchObject->getFields(), TRUE); $searchConstraints = array(); if (count($searchFields) === 0) { throw new UnexpectedValueException('No search fields defined', 1318497755); } foreach ($searchFields as $field) { if (!empty($searchSubject)) { $searchConstraints[] = $query->like($field, '%' . $searchSubject . '%'); } } if (count($searchConstraints)) { $constraints[] = $query->logicalOr($searchConstraints); } } $minimumDate = strtotime($searchObject->getMinimumDate()); if ($minimumDate) { $field = $searchObject->getDateField(); if (empty($field)) { throw new UnexpectedValueException('No date field is defined', 1396348732); } $constraints[] = $query->greaterThanOrEqual($field, $minimumDate); } $maximumDate = strtotime($searchObject->getMaximumDate()); if ($maximumDate) { $field = $searchObject->getDateField(); if (empty($field)) { throw new UnexpectedValueException('No date field is defined', 1396348733); } $constraints[] = $query->lessThanOrEqual($field, $maximumDate); } return $constraints; }