/** * @dataProvider assocMixedValues */ public function testCalledWithCorrectValueAndKeyParameters(\Pinq\ITraversable $traversable, array $data) { $traversable->groupJoin([0 => 0])->on(function ($outer, $inner, $outerKey, $innerKey) use($data) { $this->assertSame($data[$outerKey], $outer); $this->assertSame($inner, 0); $this->assertSame($innerKey, 0); return true; })->to(function ($outer, \Pinq\ITraversable $group, $outerKey, $groupKey) use($data) { $this->assertSame($data[$outerKey], $outer); $this->assertSame($group->asArray(), [0 => 0]); $this->assertSame($groupKey, 0); })->asArray(); $traversable->groupJoin([0 => 0])->onEquality(function ($outer, $outerKey) use($data) { $this->assertSame($data[$outerKey], $outer); return 'group Key'; }, function ($inner, $innerKey) { $this->assertSame($inner, 0); $this->assertSame($innerKey, 0); return 'group Key'; })->to(function ($outer, \Pinq\ITraversable $group, $outerKey, $groupKey) use($data) { $this->assertSame($data[$outerKey], $outer); $this->assertSame($group->asArray(), [0 => 0]); $this->assertSame($groupKey, 'group Key'); })->asArray(); }
/** * @dataProvider people */ public function testGroupJoinToSelfWithCondition(\Pinq\ITraversable $traversable, array $data) { $joinedlastNames = $traversable->groupJoin($traversable)->onEquality(function ($outer) { return $outer['firstName'][0]; }, function ($inner) { return $inner['lastName'][0]; })->to(function ($person, \Pinq\ITraversable $joinedPeople) { return $person['firstName'] . '{' . $joinedPeople->implode(',', function ($person) { return $person['lastName']; }) . '}'; })->implode(':'); $this->assertEquals('Zoe{}:Alex{}:Daniel{Denali,Desopolous,Dekresta}:Casy{}:Dave{Denali,Desopolous,Dekresta}:' . 'Hugo{}:Sandy{}:Beth{Black,Baronksy}:David{Denali,Desopolous,Dekresta}:Daniel{Denali,Desopolous,Dekresta}', $joinedlastNames); }
/** * 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; }