/**
  * 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']]]];
 }