/** * @{inheritDoc} */ public function sortBy($comparator) { Contracts::ensureCallable($comparator); if (!(is_object($comparator) && $comparator instanceof EntityComparator)) { return parent::sortBy($comparator); } return $this->sortQbBy(array($comparator, 'updateQb'), $comparator); }
/** * {@inheritDoc} */ public function flatMapBy($mapper) { Contracts::ensureCallable($mapper); return $this->mapPairsBy($mapper, 'flatMapBy'); }
/** * {@inheritDoc} */ public function groupBy($keyFinder, $uniqueKeys = false) { Contracts::ensureCallable($keyFinder); if (!$uniqueKeys) { return $this->foldBy(function ($multimapBuilder, $element) use($keyFinder) { return $multimapBuilder->add(call_user_func($keyFinder, $element), $element); }, static::createMultimapBuilder())->build(); } else { return $this->foldBy(function ($mapBuilder, $element) use($keyFinder) { return $mapBuilder->put(call_user_func($keyFinder, $element), $element); }, static::createMapBuilder())->build(); } }
/** * @param callback $qbFolder * @param callback $nativeFolder * @param mixed $accumulator For native filter. * * @return mixed */ protected function foldQbBy($qbFolder, $nativeFolder, $accumulator) { Contracts::ensureCallable($qbFolder, $nativeFolder); if ($this->queryBuilder) { $queryBuilder = clone $this->queryBuilder; $alias = $queryBuilder->getRootAliases(); $alias = $alias[0]; // TODO Do ->getQuery()->getOneOrNullResult() here? call_user_func($qbFolder, $queryBuilder, $alias); return $queryBuilder->getQuery()->getOneOrNullResult(); } else { return $this->foldBy($nativeFolder, $accumulator); } }