/** * 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; }