public function setUp() { $this->_parser = new Solarium_Client_ResponseParser_Select_Component_Grouping(); $this->_query = new Solarium_Query_Select(); $this->_grouping = $this->_query->getGrouping(); $this->_grouping->addField('fieldA'); $this->_grouping->addQuery('cat:1'); $data = array('grouped' => array('fieldA' => array('matches' => 25, 'ngroups' => 12, 'groups' => array(array('groupValue' => 'test value', 'doclist' => array('numFound' => 13, 'docs' => array(array('id' => 1, 'name' => 'test')))))), 'cat:1' => array('matches' => 40, 'doclist' => array('numFound' => 22, 'docs' => array(array('id' => 2, 'name' => 'dummy2'), array('id' => 5, 'name' => 'dummy5')))))); $this->_result = $this->_parser->parse($this->_query, $this->_grouping, $data); }
/** * 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()); $request->addParam('group.truncate', $component->getTruncate()); return $request; }
public function testBuild() { $builder = new Solarium_Client_RequestBuilder_Select_Component_Grouping(); $request = new Solarium_Client_Request(); $component = new Solarium_Query_Select_Component_Grouping(); $component->setFields(array('fieldA', 'fieldB')); $component->setQueries(array('cat:1', 'cat:2')); $component->setLimit(12); $component->setOffset(2); $component->setSort('score desc'); $component->setMainResult(true); $component->setNumberOfGroups(false); $component->setCachePercentage(50); $request = $builder->build($component, $request); $this->assertEquals(array('group' => 'true', 'group.field' => array('fieldA', 'fieldB'), 'group.query' => array('cat:1', 'cat:2'), 'group.limit' => 12, 'group.offset' => 2, 'group.sort' => 'score desc', 'group.main' => 'true', 'group.ngroups' => 'false', 'group.cache.percent' => 50), $request->getParams()); }
public function testSetAndGetCachePercentage() { $value = 40; $this->_grouping->setCachePercentage($value); $this->assertEquals($value, $this->_grouping->getCachePercentage()); }
public function testSetAndGetTruncate() { $value = true; $this->_grouping->setTruncate($value); $this->assertEquals($value, $this->_grouping->getTruncate()); }