/** * 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(); }
/** * Gets test data for the pipeline builder. */ public function provideAggregationPipelineTestData() { $unwind1 = new Unwind(); $unwind1->setField('foo'); $unwind2 = new Unwind(); $unwind2->setField('bar'); $unwind3 = new Unwind(); $unwind3->setField('baz'); $bag = new AggregationBag(); $bag->addAggregation($unwind2); $builder = new PipelineBuilder(); $builder->add($unwind3); return [[[$unwind1], [['$unwind' => '$foo']]], [[$bag], [['$unwind' => '$bar']]], [[$builder], [['$unwind' => '$baz']]], [[$unwind1, $bag, $builder], [['$unwind' => '$foo'], ['$unwind' => '$bar'], ['$unwind' => '$baz']]]]; }