/** * Parse result data into result objects * * @param Solarium_Query_Select $query * @param Solarium_Query_Select_Component_Grouping $grouping * @param array $data * @return Solarium_Result_Select_Grouping */ public function parse($query, $grouping, $data) { $groups = array(); if (isset($data['grouped'])) { // parse field groups foreach ($grouping->getFields() as $field) { if (isset($data['grouped'][$field])) { $result = $data['grouped'][$field]; $matches = isset($result['matches']) ? $result['matches'] : null; $groupCount = isset($result['ngroups']) ? $result['ngroups'] : null; $valueGroups = array(); foreach ($result['groups'] as $valueGroupResult) { $value = isset($valueGroupResult['groupValue']) ? $valueGroupResult['groupValue'] : null; $numFound = isset($valueGroupResult['doclist']['numFound']) ? $valueGroupResult['doclist']['numFound'] : null; $start = isset($valueGroupResult['doclist']['start']) ? $valueGroupResult['doclist']['start'] : null; // create document instances $documentClass = $query->getOption('documentclass'); $documents = array(); if (isset($valueGroupResult['doclist']['docs']) && is_array($valueGroupResult['doclist']['docs'])) { foreach ($valueGroupResult['doclist']['docs'] as $doc) { $documents[] = new $documentClass($doc); } } $valueGroups[] = new Solarium_Result_Select_Grouping_ValueGroup($value, $numFound, $start, $documents); } $groups[$field] = new Solarium_Result_Select_Grouping_FieldGroup($matches, $groupCount, $valueGroups); } } // parse query groups foreach ($grouping->getQueries() as $groupQuery) { if (isset($data['grouped'][$groupQuery])) { $result = $data['grouped'][$groupQuery]; // get statistics $matches = isset($result['matches']) ? $result['matches'] : null; $numFound = isset($result['doclist']['numFound']) ? $result['doclist']['numFound'] : null; $start = isset($result['doclist']['start']) ? $result['doclist']['start'] : null; $maxScore = isset($result['doclist']['maxScore']) ? $result['doclist']['maxScore'] : null; // create document instances $documentClass = $query->getOption('documentclass'); $documents = array(); if (isset($result['doclist']['docs']) && is_array($result['doclist']['docs'])) { foreach ($result['doclist']['docs'] as $doc) { $documents[] = new $documentClass($doc); } } // create a group result object $group = new Solarium_Result_Select_Grouping_QueryGroup($matches, $numFound, $start, $maxScore, $documents); $groups[$groupQuery] = $group; } } } return new Solarium_Result_Select_Grouping($groups); }
/** * Add request settings for Grouping * * @param Solarium_Query_Select_Component_Grouping $component * @param Solarium_Client_Request $request * @return Solarium_Client_Request */ public function build($component, $request) { // enable grouping $request->addParam('group', 'true'); $request->addParam('group.field', $component->getFields()); $request->addParam('group.query', $component->getQueries()); $request->addParam('group.limit', $component->getLimit()); $request->addParam('group.offset', $component->getOffset()); $request->addParam('group.sort', $component->getSort()); $request->addParam('group.main', $component->getMainResult()); $request->addParam('group.ngroups', $component->getNumberOfGroups()); $request->addParam('group.cache.percent', $component->getCachePercentage()); return $request; }
public function testSetAndGetQueriesArray() { $values = array('cat:5', 'cat:6'); $this->_grouping->setQueries($values); $this->assertEquals($values, $this->_grouping->getQueries()); }