Pinq\Tests\Integration\Traversable\Complex\NumericTraversalTest::testComplexAggregationQuery PHP Метод

testComplexAggregationQuery() публичный Метод

public testComplexAggregationQuery ( Pinq\ITraversable $traversable, array $data )
$traversable Pinq\ITraversable
$data array
    public function testComplexAggregationQuery(\Pinq\ITraversable $traversable, array $data)
    {
        $traversable = $traversable->where(function ($i) {
            return $i % 2 === 0;
        })->orderByAscending(function ($i) {
            return -$i;
        })->groupBy(function ($i) {
            return $i % 7;
        })->where(function (\Pinq\ITraversable $i) {
            return $i->count() % 2 === 0;
        })->select(function (\Pinq\ITraversable $numbers) {
            return ['First' => $numbers->first(), 'Average' => $numbers->average(), 'Count' => $numbers->count(), 'Numbers' => $numbers->asArray()];
        })->indexBy(function (array $values) {
            return implode(',', $values['Numbers']);
        });
        $newData = array_filter($data, function ($i) {
            return $i % 2 === 0;
        });
        $newData = array_reverse($newData, true);
        $aggregates = [];
        foreach ($newData as $key => $value) {
            $aggregateKey = array_search($value % 7, array_map(function ($i) {
                return $i['Key'];
            }, $aggregates));
            if ($aggregateKey === false) {
                $aggregateKey = count($aggregates) + 1;
                $aggregates[$aggregateKey] = ['Key' => $value % 7, 'First' => $value, 'Average' => null, 'Count' => 0, 'Numbers' => []];
            }
            $aggregates[$aggregateKey]['Numbers'][$key] = $value;
            $aggregates[$aggregateKey]['Count']++;
        }
        $indexedAggregates = [];
        foreach ($aggregates as $key => &$value) {
            if ($value['Count'] % 2 !== 0) {
                continue;
            }
            unset($value['Key']);
            $value['Average'] = array_sum($value['Numbers']) / $value['Count'];
            $indexedAggregates[implode(',', $value['Numbers'])] =& $value;
        }
        if ($traversable instanceof IQueryable) {
            $t = 5;
        }
        $this->assertMatches($traversable, $indexedAggregates, 'Complex Aggregate');
    }