public function updateJoinOptions(Queries\Common\Join\Options $options) { $filter = $options->getFilter(); if ($filter instanceof Queries\Common\Join\Filter\Custom) { $filter = $filter->update($this->expressionProcessor->processFunction($filter->getOnFunction())); } elseif ($filter instanceof Queries\Common\Join\Filter\Equality) { $filter = $filter->update($this->expressionProcessor->processFunction($filter->getOuterKeyFunction()), $this->expressionProcessor->processFunction($filter->getInnerKeyFunction())); } return $options->update($options->getSource(), $options->isGroupJoin(), $filter, $options->hasDefault()); }
/** * Evaluates the join segment values and filter upon the supplied traversable. * * @param ITraversable $traversable * @param Common\Join\Options $join * @param Queries\IResolvedParameterRegistry $resolvedParameters * * @return \Pinq\Interfaces\IJoiningToTraversable */ public static function evaluateJoinOptions(ITraversable $traversable, Common\Join\Options $join, Queries\IResolvedParameterRegistry $resolvedParameters) { $values = self::evaluateSource($join->getSource(), $resolvedParameters); $joiningTraversable = $join->isGroupJoin() ? $traversable->groupJoin($values) : $traversable->join($values); if ($join->hasFilter()) { $filter = $join->getFilter(); if ($filter instanceof Common\Join\Filter\Custom) { $joiningTraversable = $joiningTraversable->on($resolvedParameters[$filter->getOnFunction()->getCallableId()]); } elseif ($filter instanceof Common\Join\Filter\Equality) { $joiningTraversable = $joiningTraversable->onEquality($resolvedParameters[$filter->getOuterKeyFunction()->getCallableId()], $resolvedParameters[$filter->getInnerKeyFunction()->getCallableId()]); } } if ($join->hasDefault()) { $joiningTraversable = $joiningTraversable->withDefault($resolvedParameters[$join->getDefaultValueId()], $resolvedParameters[$join->getDefaultKeyId()]); } return $joiningTraversable; }
public function appendJoinOptions(Queries\Common\Join\Options $joinOptions) { $this->appendSource($joinOptions->getSource()); if ($joinOptions->isGroupJoin()) { $this->append(' into groups'); } if ($joinOptions->hasFilter()) { $this->append(' filtered according to: '); $filter = $joinOptions->getFilter(); if ($filter instanceof Queries\Common\Join\Filter\Custom) { $this->appendFunction($filter->getOnFunction()); } elseif ($filter instanceof Queries\Common\Join\Filter\Equality) { $this->appendFunction($filter->getOuterKeyFunction()); $this->append(' equaling '); $this->appendFunction($filter->getInnerKeyFunction()); } } if ($joinOptions->hasDefault()) { $this->append(' with default values'); } }