/** * Tests if the resulting operation array is as expected. * * @dataProvider provideSumTestData */ public function testPush($testData, $expected) { $sum = new Sum(); $sum->setSum($testData); $result = $sum->getOperation(); $this->assertEquals($expected, $result); }
/** * Tests grouping some data on multiple fields. */ public function testGroupDataOnMultipleFields() { $testData = [['foo' => 'foo', 'bar' => 'bar'], ['foo' => 'foo', 'bar' => 'bar'], ['foo' => 'bar', 'bar' => 'foo'], ['foo' => 'bar', 'bar' => 'bar'], ['foo' => 'bar', 'bar' => 'bar']]; foreach ($testData as $test) { $this->collection->save($test); } $group = new Group(); $group->setGroupBy(['foo', 'bar']); $sum = new Sum(); $sum->setSum(1); $group->setResultField('count', $sum); $result = $this->collection->aggregate([$group->getStage()]); $this->assertEquals(3, count($result['result'])); foreach ($result['result'] as $res) { if ($res['_id'] == ['foo' => 'foo', 'bar' => 'bar']) { $this->assertEquals(2, $res['count']); } elseif ($res['_id'] == ['foo' => 'bar', 'bar' => 'foo']) { $this->assertEquals(1, $res['count']); } else { $this->assertEquals(2, $res['count']); } } }
/** * Gets the aggregation pipeline * * @param array $query * @param string $category * @param mixed $ranges * @return array */ private function getAggregationPipeline(array $query, $category, $ranges) { $pipelineBuilder = new PipelineBuilder(); $categoryQuery = array(); $categoryQuery[] = array($category => array('$exists' => true)); if (isset($ranges) && is_array($ranges) && $this->getRangeType($ranges) === static::MINMAX) { $categoryQuery[] = array('$or' => array(array($category => array('$type' => 1)), array($category => array('$type' => 16)), array($category => array('$type' => 18)))); } unset($query[$category]); $query['$and'] = $categoryQuery; $match = new Match(); $match->setQuery($query); $pipelineBuilder->add($match); if (is_array($ranges) && static::getRangeType($ranges) === static::MINMAX) { $rangeProjection = new RangeProjection(); $rangeProjection->addRange($category, $ranges); $pipelineBuilder->add($rangeProjection); } else { $pipelineBuilder->addBuilder(new UnwindBuilder($category)); } $group = new Group(); $group->setGroupBy($category); $sum = new Sum(); $sum->setSum(1); $group->setResultField('count', $sum); $pipelineBuilder->add($group); return $pipelineBuilder->build(); }