groupJoin() public method

Matches the values with the supplied values according to the supplied filter, groups the the joined values for every original and then maps into as according to the supplied function.
public groupJoin ( array | Traversable $values ) : Pinq\Interfaces\IJoiningOnTraversable
$values array | Traversable
return Pinq\Interfaces\IJoiningOnTraversable
コード例 #1
0
ファイル: GroupJoinTest.php プロジェクト: timetoogo/pinq
 /**
  * @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();
 }
コード例 #2
0
ファイル: ArrayTraversalTest.php プロジェクト: timetoogo/pinq
 /**
  * @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);
 }
コード例 #3
0
ファイル: ScopeEvaluator.php プロジェクト: timetoogo/pinq
 /**
  * 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;
 }