/** * Basic range testing. */ public function testRangeProjection() { $testData = [['foo' => 1], ['foo' => 2], ['foo' => 3], ['foo' => 5], ['foo' => 11], ['foo' => 15], ['foo' => 22], ['foo' => 29]]; foreach ($testData as $test) { $this->collection->save($test); } $ranges = [['label' => 'low', 'max' => 10], ['label' => 'medium', 'min' => 11, 'max' => 20], ['label' => 'high', 'min' => 21]]; $rangedProjection = new RangeProjection(); $rangedProjection->addRange('foo', $ranges); $result = $this->collection->aggregate([$rangedProjection->getStage()]); $this->assertEquals(count($testData), count($result['result'])); $lows = 0; $mediums = 0; $highs = 0; foreach ($result['result'] as $res) { switch ($res['foo']) { case 'high': $highs++; break; case 'medium': $mediums++; break; case 'low': $lows++; break; } } $this->assertEquals(4, $lows); $this->assertEquals(2, $mediums); $this->assertEquals(2, $highs); }
/** * 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(); }