Query calls must be immutable and return a new instance with every query call. Queries should also be executed lazily upon iteration.
Author: Elliot Levin (elliotlevin@hotmail.com)
Inheritance: extends pinq\IAggregatable, extends IteratorAggregate, extends ArrayAccess
Example #1
0
 /**
  * @dataProvider theImplementations
  */
 public function testThatMaintainsCorrectSameIteratorScheme(\Pinq\ITraversable $traversable, array $data)
 {
     $originalScheme = $traversable->getIteratorScheme();
     $queriedTraversable = $traversable->where(function () {
         throw new \Exception('This should never be executed');
     })->append([])->difference([])->except([])->groupBy(function () {
         return 1;
     })->groupJoin([])->on(function () {
         return true;
     })->to(function () {
         return 1;
     })->indexBy(function () {
         return 1;
     })->intersect([])->join([])->on(function () {
         return true;
     })->to(function () {
         return 1;
     })->keys()->orderBy(function () {
         return 1;
     }, \Pinq\Direction::ASCENDING)->thenByDescending(function () {
         return 1;
     })->reindex()->select(function () {
         return 1;
     })->selectMany(function () {
         return [];
     })->skip(1)->take(5)->union([])->where(function () {
         return true;
     })->whereIn([]);
     //Well that was fun
     $this->assertSame($originalScheme, $queriedTraversable->getIteratorScheme());
 }
Example #2
0
 /**
  * @dataProvider dateTimes
  */
 public function testAggregateValues(\Pinq\ITraversable $traversable, array $data)
 {
     $this->assertEquals(true, $traversable->all(), 'All');
     $this->assertEquals(true, $traversable->any(), 'Any');
     $this->assertEquals(max($data), $traversable->maximum(), 'Max');
     $this->assertEquals(min($data), $traversable->minimum(), 'Min');
 }
Example #3
0
 /**
  * @dataProvider emptyData
  */
 public function testThatUniqueMaintainsReferences(\Pinq\ITraversable $traversable)
 {
     $data = $this->makeRefs(array_merge(range(1, 10, 2), range(1, 10)));
     $traversable->append($data)->unique()->iterate(function (&$i) {
         $i *= 10;
     });
     $this->assertSame([10, 30, 50, 70, 90, 1, 20, 3, 40, 5, 60, 7, 80, 9, 100], $data);
 }
Example #4
0
 /**
  * @dataProvider emptyData
  */
 public function testThatUnionMaintainsReferences(\Pinq\ITraversable $traversable)
 {
     $data = $this->makeRefs(range('a', 'f'));
     $traversable->union($data)->iterate(function (&$i) {
         $i = "{$i}-";
     });
     $this->assertSame('a-b-c-d-e-f-', implode('', $data));
 }
Example #5
0
 /**
  * @dataProvider emptyData
  */
 public function testThatSliceMaintainsReferences(\Pinq\ITraversable $traversable)
 {
     $data = $this->makeRefs(range('Z', 'A'));
     $traversable->append($data)->skip(10)->take(7)->slice(5, 3)->iterate(function (&$i) {
         $i = "-{$i}{$i}-";
     });
     $this->assertSame('ZYXWVUTSRQPONML-KK--JJ-IHGFEDCBA', implode('', $data));
 }
Example #6
0
 /**
  * @dataProvider assocMixedValues
  */
 public function testThatKeysSupportNonScalarKeys(\Pinq\ITraversable $traversable, array $data)
 {
     $keys = $traversable->indexBy(function () {
         return new \stdClass();
     })->keys();
     $expectedKeys = empty($data) ? [] : array_fill_keys(range(0, count($data) - 1), new \stdClass());
     $this->assertEquals($expectedKeys, $keys->asArray());
 }
Example #7
0
 /**
  * @dataProvider emptyData
  */
 public function testThatWhereInMaintainsReferences(\Pinq\ITraversable $traversable)
 {
     $data = $this->makeRefs(range(100, 50, -10));
     $traversable->append($data)->whereIn([70, 90])->iterate(function (&$i) {
         $i /= 10;
     });
     $this->assertSame([100, 9, 80, 7, 60, 50], $data);
 }
Example #8
0
 /**
  * @dataProvider everything
  */
 public function testThatAppendWithEmptyReturnsSameAsTheOriginalButReindexedKeys(\Pinq\ITraversable $traversable, array $data)
 {
     $appendedWithTraversable = $traversable->append([]);
     $appendedWithArray = $traversable->append([]);
     $appendedWithIterator = $traversable->append(new \ArrayObject([]));
     $this->assertMatches($appendedWithTraversable, array_values($data));
     $this->assertMatches($appendedWithArray, array_values($data));
     $this->assertMatches($appendedWithIterator, array_values($data));
 }
Example #9
0
 /**
  * @dataProvider emptyData
  */
 public function testThatIntersectMaintainsReferences(\Pinq\ITraversable $traversable)
 {
     $data = $this->makeRefs(range('A', 'Z', 2));
     //Every 2nd letter: A, C, E, G...
     $traversable->append($data)->intersect(range('A', 'Z', 3))->iterate(function (&$i) {
         $i .= ':';
     });
     $this->assertSame(explode(' ', 'A: C E G: I K M: O Q S: U W Y:'), $data);
 }
Example #10
0
 /**
  * @dataProvider theImplementations
  */
 public function testThatExecutionIsDeferred(\Pinq\ITraversable $traversable, array $data)
 {
     $this->assertThatExecutionIsDeferred(function (callable $function) use($traversable) {
         return $traversable->join([])->on($function)->to($function);
     });
     $this->assertThatExecutionIsDeferred(function (callable $function) use($traversable) {
         return $traversable->join([])->onEquality($function, $function)->to($function);
     });
 }
Example #11
0
 /**
  * @dataProvider emptyData
  */
 public function testThatWhereMaintainsReferences(\Pinq\ITraversable $traversable)
 {
     $data = $this->makeRefs(range(0, 30, 2));
     $traversable->append($data)->where(function ($i) {
         return $i % 3 === 0;
     })->iterate(function (&$i) {
         $i .= '?';
     });
     $this->assertSame(['0?', 2, 4, '6?', 8, 10, '12?', 14, 16, '18?', 20, 22, '24?', 26, 28, '30?'], $data);
 }
Example #12
0
 /**
  * @dataProvider emptyData
  */
 public function testThatSelectDoesNotMaintainReferences(\Pinq\ITraversable $traversable)
 {
     $data = $this->makeRefs(range('Z', 'A'));
     $traversable->append($data)->select(function &(&$i) {
         return $i;
     })->iterate(function (&$i) {
         $i .= $i;
     });
     $this->assertSame(range('Z', 'A'), $data);
 }
Example #13
0
 /**
  * @dataProvider emptyData
  */
 public function testThatIndexByMaintainsReferences(\Pinq\ITraversable $traversable)
 {
     $data = $this->makeRefs(range('A', 'G', 2));
     $traversable->append($data)->indexBy(function ($i) {
         return $i . '-key';
     })->iterate(function (&$i) {
         $i .= ':';
     });
     $this->assertSame(['A:', 'C:', 'E:', 'G:'], $data);
 }
Example #14
0
 /**
  * @dataProvider emptyData
  */
 public function testThatReindexMaintainsReferences(\Pinq\ITraversable $traversable)
 {
     $data = $this->makeRefs(range('a', 'z'));
     $traversable->append($data)->indexBy(function ($i) {
         return $i;
     })->reindex()->iterate(function (&$i) {
         $i .= ';';
     });
     $this->assertSame('a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z;', implode('', $data));
 }
Example #15
0
 /**
  * @dataProvider emptyData
  */
 public function testThatSelectManyMaintainsReferences(\Pinq\ITraversable $traversable)
 {
     $data = $this->makeRefs(range(100, 1, -1));
     $traversable->append($data)->groupBy(function ($i) {
         return $i % 3;
     })->selectMany(function (\Pinq\ITraversable $group) {
         return $group;
     })->iterate(function (&$i) {
         $i *= 10;
     });
     $this->assertSame(range(1000, 10, -10), $data);
 }
Example #16
0
 /**
  * @dataProvider people
  */
 public function testGroupByWithArrayKey(\Pinq\ITraversable $traversable, array $data)
 {
     $ageGroupData = $traversable->groupBy(function ($i) {
         return ['sex' => $i['sex'], 'ageGroup' => floor($i['age'] / 10) * 10];
     })->orderByAscending(function (\Pinq\ITraversable $group, $key) {
         return $key['ageGroup'];
     })->thenByAscending(function (\Pinq\ITraversable $group, $key) {
         return $key['sex'];
     })->select(function (\Pinq\ITraversable $group, $key) {
         $ageGroup = $key['ageGroup'] . '+';
         $sex = $key['sex'];
         return sprintf('%s(%s){%s}', $ageGroup, $sex, $group->implode(',', function ($i) {
             return $i['firstName'];
         }));
     })->implode(':');
     $this->assertEquals('20+(Female){Casy}:20+(Male){Alex,Dave}:30+(Female){Zoe,Sandy,Beth}:30+(Male){Daniel}:' . '40+(Male){Hugo}:50+(Male){Daniel}:60+(Male){David}', $ageGroupData);
 }
Example #17
0
 /**
  * @dataProvider assocOneToTen
  */
 public function testThatContainsReturnsWhetherItContainsAnIdenticalElement(\Pinq\ITraversable $traversable, array $data)
 {
     $this->assertTrue($traversable->contains(1));
     $this->assertFalse($traversable->contains('1'));
     $this->assertTrue($traversable->contains(10));
     $this->assertFalse($traversable->contains('10'));
     $this->assertFalse($traversable->contains(-1));
     $this->assertFalse($traversable->contains(0));
     $this->assertFalse($traversable->contains(11));
 }
Example #18
0
 /**
  * @dataProvider someStrings
  */
 public function testAggregateValuesString(\Pinq\ITraversable $traversable, array $data)
 {
     $this->assertEquals(true, $traversable->all(), 'All');
     $this->assertEquals(true, $traversable->any(), 'Any');
     $this->assertEquals(array_sum(array_map('strlen', $data)) / count($data), $traversable->average('strlen'), 'Average string length');
     $this->assertEquals(array_sum(array_map('strlen', $data)), $traversable->sum('strlen'), 'Sum string length');
     $this->assertEquals(array_unique($data), $traversable->unique()->asArray(), 'Unique');
     $this->assertEquals(implode('- -- -', $data), $traversable->implode('- -- -'), 'String implode');
 }
 /**
  * @dataProvider theImplementations
  */
 public function testWithNonDeterministicQueryValuesAreNeverCached(\Pinq\ITraversable $traversable, array $data)
 {
     $query = $traversable->append(range(1, 50))->where(function ($i) {
         return (bool) mt_rand(0, 1);
     })->orderByDescending(function ($i) {
         return (int) ($i / 10);
     })->thenByAscending(function ($i) {
         return $i;
     })->slice(0, 50)->select(function ($i) {
         return ++$i;
     })->groupBy(function ($i) {
         return $i % 3;
     })->selectMany(function (\Pinq\ITraversable $group) {
         return $group;
     })->difference(range(15, 30, 2))->groupJoin(range(2, 10))->on(function ($i, $d) {
         return $i % $d === 0;
     })->to(function ($i, \Pinq\ITraversable $factors) {
         return $i . ':' . $factors->implode(',');
     });
     $this->assertNotEquals($query->asArray(), $query->asArray());
 }
Example #20
0
 public function visitOperation(Segments\Operation $query)
 {
     $otherValues = self::evaluateSource($query->getSource(), $this->resolvedParameters);
     switch ($query->getOperationType()) {
         case Segments\Operation::UNION:
             $this->traversable = $this->traversable->union($otherValues);
             break;
         case Segments\Operation::INTERSECT:
             $this->traversable = $this->traversable->intersect($otherValues);
             break;
         case Segments\Operation::DIFFERENCE:
             $this->traversable = $this->traversable->difference($otherValues);
             break;
         case Segments\Operation::APPEND:
             $this->traversable = $this->traversable->append($otherValues);
             break;
         case Segments\Operation::WHERE_IN:
             $this->traversable = $this->traversable->whereIn($otherValues);
             break;
         case Segments\Operation::EXCEPT:
             $this->traversable = $this->traversable->except($otherValues);
             break;
     }
 }
Example #21
0
 /**
  * @dataProvider oneToAHundred
  */
 public function testSimpleAggregation(\Pinq\ITraversable $traversable, array $data)
 {
     $this->assertSame(array_sum($data), $traversable->sum());
     $this->assertSame(array_sum($data) / count($data), $traversable->average());
 }
Example #22
0
 /**
  * @dataProvider emptyData
  */
 public function testThatInterationPassesReferences(\Pinq\ITraversable $traversable)
 {
     $data = $this->makeRefs(range('A', 'Z'));
     $traversable->append($data)->iterate(function (&$i) {
         $i = null;
     });
     $this->assertSame(array_fill_keys(range(0, 25), null), $data);
 }
Example #23
0
 /**
  * @dataProvider oneToTenTwice
  */
 public function testThatSumOperatesCorrectly(\Pinq\ITraversable $traversable, array $data)
 {
     $this->assertSame(empty($data) ? null : array_sum($data), $traversable->sum());
 }
Example #24
0
 public function visitImplode(Requests\Implode $request)
 {
     return $this->traversable->implode($this->resolvedParameters[$request->getDelimiterId()], $this->getOptionalFunction($request));
 }
Example #25
0
 /**
  * @dataProvider assocOneToTen
  */
 public function testThatExceptUsesStrictEquality(\Pinq\ITraversable $traversable, array $data)
 {
     $castToStringValues = array_map('strval', $data);
     $except = $traversable->except($castToStringValues);
     $this->assertMatches($except, $data);
 }
Example #26
0
 /**
  * @dataProvider emptyData
  */
 public function testThatAggregateOnEmptyReturnsNull(\Pinq\ITraversable $traversable, array $data)
 {
     $this->assertNull($traversable->aggregate(function () {
         return true;
     }));
 }
Example #27
0
 /**
  * @dataProvider assocTenRandomStrings
  */
 public function testImplodeOperatesCorrectly(\Pinq\ITraversable $traversable, array $data)
 {
     $this->assertSame(implode(',', $data), $traversable->implode(','));
 }
Example #28
0
 protected final function assertMatchesValues(\Pinq\ITraversable $traversable, array $array, $message = '')
 {
     $firstIterationArray = [];
     foreach ($traversable as $key => $value) {
         $firstIterationArray[] = $value;
     }
     $secondIterationArray = [];
     foreach ($traversable as $key => $value) {
         $secondIterationArray[] = $value;
     }
     $explicitArray = array_values($traversable->asArray());
     $array = array_values($array);
     $this->assertSame($array, $firstIterationArray, $message);
     $this->assertSame($array, $secondIterationArray, $message);
     $this->assertSame($array, $explicitArray, $message);
 }
Example #29
0
 /**
  * @dataProvider emptyData
  */
 public function testThatFirstReturnsNullWhenThereAreNoValues(\Pinq\ITraversable $empty)
 {
     $this->assertEquals(null, $empty->first());
 }
Example #30
0
 /**
  * @dataProvider emptyData
  */
 public function testThatOrderByMaintainsReferences(\Pinq\ITraversable $traversable)
 {
     $data = $this->makeRefs(range(1, 100));
     $traversable->append($data)->orderByAscending(function ($i) {
         return (int) ($i / 10);
     })->thenByDescending(function ($i) {
         return $i;
     })->iterate(function (&$i) {
         $i *= 10;
     });
     $this->assertSame(range(10, 1000, 10), $data);
 }