/** * @param callable $closure */ public function logicalAnd(\Closure $closure) { /** @var QueryProxy $newProxy */ $newProxy = $this->newProxy(); $closure($newProxy); $this->constraints[] = $this->query->logicalAnd($newProxy->getContraints()); }
/** * 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; }
/** * Check the constraint and execute the query * * @param QueryInterface $query * @param array $constraints * @return array|\TYPO3\CMS\Extbase\Persistence\QueryResultInterface */ public function matchAndExecute(QueryInterface $query, array $constraints = []) { if ($constraints) { $query->matching($query->logicalAnd($constraints)); } return $query->execute(); }
/** * Returns a category constraint created by * a given list of categories and a junction string * * @param QueryInterface $query * @param array $categories * @param string $conjunction * @param boolean $includeSubCategories * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\ConstraintInterface|null */ protected function createCategoryConstraint(QueryInterface $query, $categories, $conjunction, $includeSubCategories = false) { $constraint = null; $categoryConstraints = []; // If "ignore category selection" is used, nothing needs to be done if (empty($conjunction)) { return $constraint; } if (!is_array($categories)) { $categories = GeneralUtility::intExplode(',', $categories, true); } foreach ($categories as $category) { if ($includeSubCategories) { $subCategories = GeneralUtility::trimExplode(',', CategoryService::getChildrenCategories($category, 0, '', true), true); $subCategoryConstraint = []; $subCategoryConstraint[] = $query->contains('categories', $category); if (count($subCategories) > 0) { foreach ($subCategories as $subCategory) { $subCategoryConstraint[] = $query->contains('categories', $subCategory); } } if ($subCategoryConstraint) { $categoryConstraints[] = $query->logicalOr($subCategoryConstraint); } } else { $categoryConstraints[] = $query->contains('categories', $category); } } if ($categoryConstraints) { switch (strtolower($conjunction)) { case 'or': $constraint = $query->logicalOr($categoryConstraints); break; case 'notor': $constraint = $query->logicalNot($query->logicalOr($categoryConstraints)); break; case 'notand': $constraint = $query->logicalNot($query->logicalAnd($categoryConstraints)); break; case 'and': default: $constraint = $query->logicalAnd($categoryConstraints); } } return $constraint; }
/** * Returns a category constraint created by * a given list of categories and a junction string * * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param array $categories * @param string $conjunction * @param boolean $includeSubCategories * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\ConstraintInterface|null */ protected function createCategoryConstraint(\TYPO3\CMS\Extbase\Persistence\QueryInterface $query, $categories, $conjunction, $includeSubCategories = FALSE) { $constraint = NULL; $categoryConstraints = array(); // If "ignore category selection" is used, nothing needs to be done if (empty($conjunction)) { return $constraint; } if (!is_array($categories)) { $categories = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $categories, TRUE); } foreach ($categories as $category) { if ($includeSubCategories) { $subCategories = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', Tx_News_Service_CategoryService::getChildrenCategories($category, 0, '', TRUE), TRUE); $subCategoryConstraint = array(); $subCategoryConstraint[] = $query->contains('categories', $category); if (count($subCategories) > 0) { foreach ($subCategories as $subCategory) { $subCategoryConstraint[] = $query->contains('categories', $subCategory); } } if ($subCategoryConstraint) { $categoryConstraints[] = $query->logicalOr($subCategoryConstraint); } } else { $categoryConstraints[] = $query->contains('categories', $category); } } if ($categoryConstraints) { switch (strtolower($conjunction)) { case 'or': $constraint = $query->logicalOr($categoryConstraints); break; case 'notor': $constraint = $query->logicalNot($query->logicalOr($categoryConstraints)); break; case 'notand': $constraint = $query->logicalNot($query->logicalAnd($categoryConstraints)); break; case 'and': default: $constraint = $query->logicalAnd($categoryConstraints); } } 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); } } }
/** * Returns an array of constraints created from a given demand object. * * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param \DWenzel\T3events\Domain\Model\Dto\DemandInterface $demand * @return array<\TYPO3\CMS\Extbase\Persistence\Generic\Qom\Constraint> */ public function createConstraintsFromDemand(QueryInterface $query, DemandInterface $demand) { /** @var \CPSIT\T3eventsReservation\Domain\Model\Dto\PersonDemand $demand */ $constraints = []; if ($demand->getTypes()) { $personTypes = explode(',', $demand->getTypes()); $personConstraints = []; foreach ($personTypes as $personType) { $personConstraints[] = $query->equals('type', $personType); } if (count($personConstraints)) { $constraints[] = $query->logicalAnd($personConstraints); } } if ($demand->getLessonDeadline()) { $constraints[] = $query->logicalAnd($query->lessThan('lesson.deadline', $demand->getLessonDeadline())); } if ($demand->getLessonDate()) { if ($demand->getLessonPeriod() === 'futureOnly') { $constraints[] = $query->greaterThanOrEqual('reservation.lesson.date', $demand->getLessonDate()); } elseif ($demand->getLessonPeriod() === 'pastOnly') { $constraints[] = $query->lessThanOrEqual('reservation.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) ($categoryConstraints = $this->createCategoryConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $categoryConstraints, $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; }
/** * 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 \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; }
/** * 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); } } }
/** * Builds and returns the constraint for multi value properties. * * @param Persistence\QueryInterface $query * @param DomainObjectInterface $parentObject * @param string $propertyName * @param string $fieldValue * @param array $relationTableMatchFields * * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\ConstraintInterface $constraint */ protected function getConstraint(Persistence\QueryInterface $query, DomainObjectInterface $parentObject, $propertyName, $fieldValue = '', $relationTableMatchFields = array()) { $columnMap = $this->getDataMap(get_class($parentObject))->getColumnMap($propertyName); if ($columnMap->getParentKeyFieldName() !== null) { if ($columnMap->isRelationsOverriddenByTranslation()) { $constraint = $query->equals($columnMap->getParentKeyFieldName(), $parentObject->_getProperty('_localizedUid')); } else { $constraint = $query->equals($columnMap->getParentKeyFieldName(), $parentObject); } if ($columnMap->getParentTableFieldName() !== null) { $constraint = $query->logicalAnd($constraint, $query->equals($columnMap->getParentTableFieldName(), $this->getDataMap(get_class($parentObject))->getTableName())); } } else { $constraint = $query->in('uid', GeneralUtility::intExplode(',', $fieldValue)); } if (!empty($relationTableMatchFields)) { foreach ($relationTableMatchFields as $relationTableMatchFieldName => $relationTableMatchFieldValue) { $constraint = $query->logicalAnd($constraint, $query->equals($relationTableMatchFieldName, $relationTableMatchFieldValue)); } } return $constraint; }
/** * 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))); } }
/** * 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); }
/** * Builds and returns the constraint for multi value properties. * * @param Persistence\QueryInterface $query * @param DomainObjectInterface $parentObject * @param string $propertyName * @param string $fieldValue * @param array $relationTableMatchFields * @return \TYPO3\CMS\Extbase\Persistence\Generic\Qom\ConstraintInterface $constraint */ protected function getConstraint(Persistence\QueryInterface $query, DomainObjectInterface $parentObject, $propertyName, $fieldValue = '', $relationTableMatchFields = array()) { $columnMap = $this->getDataMap(get_class($parentObject))->getColumnMap($propertyName); if ($columnMap->getParentKeyFieldName() !== NULL) { $constraint = $query->equals($columnMap->getParentKeyFieldName(), $parentObject); if ($columnMap->getParentTableFieldName() !== NULL) { $constraint = $query->logicalAnd($constraint, $query->equals($columnMap->getParentTableFieldName(), $this->getDataMap(get_class($parentObject))->getTableName())); } } else { $constraint = $query->in('uid', \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $fieldValue)); } if (count($relationTableMatchFields) > 0) { foreach ($relationTableMatchFields as $relationTableMatchFieldName => $relationTableMatchFieldValue) { $constraint = $query->logicalAnd($constraint, $query->equals($relationTableMatchFieldName, $relationTableMatchFieldValue)); } } return $constraint; }
/** * 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 valid comments * * @param Tx_Extbase_Persistence_QueryInterface $query * * @return object */ protected function getValidConstraints(QueryInterface $query) { $constraints = $query->logicalAnd($query->equals('spam', 0), $query->equals('approved', 1)); return $constraints; }