/** * Parse result data into result objects. * * @param Query $query * @param GroupingComponent $grouping * @param array $data * * @return Result */ public function parse($query, $grouping, $data) { $groups = array(); if (isset($data['grouped'])) { // parse field groups $valueResultClass = $grouping->getOption('resultvaluegroupclass'); $documentClass = $query->getOption('documentclass'); 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; $maxScore = isset($valueGroupResult['doclist']['maxScore']) ? $valueGroupResult['doclist']['maxScore'] : null; // create document instances $documents = array(); if (isset($valueGroupResult['doclist']['docs']) && is_array($valueGroupResult['doclist']['docs'])) { foreach ($valueGroupResult['doclist']['docs'] as $doc) { $documents[] = new $documentClass($doc); } } $valueGroups[] = new $valueResultClass($value, $numFound, $start, $documents, $maxScore, $query); } $groups[$field] = new FieldGroup($matches, $groupCount, $valueGroups); } } // parse query groups $groupResultClass = $grouping->getOption('resultquerygroupclass'); 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 $groupResultClass($matches, $numFound, $start, $maxScore, $documents, $query); $groups[$groupQuery] = $group; } } } return new Result($groups); }
public function setUp() { $this->parser = new Parser(); $this->query = new Query(); $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); }
public function testSetAndGetFacet() { $value = true; $this->grouping->setFacet($value); $this->assertEquals($value, $this->grouping->getFacet()); }
public function testBuildComponent() { $builder = new RequestBuilder(); $request = new Request(); $component = new Component(); $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); $component->setTruncate(true); $component->setFunction('log(foo)'); $component->setFacet(true); $component->setFormat('grouped'); $request = $builder->buildComponent($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, 'group.truncate' => 'true', 'group.func' => 'log(foo)', 'group.facet' => 'true', 'group.format' => 'grouped'), $request->getParams()); }
/** * Add request settings for Grouping. * * @param GroupingComponent $component * @param Request $request * * @return Request */ public function buildComponent($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()); $request->addParam('group.func', $component->getFunction()); $request->addParam('group.facet', $component->getFacet()); $request->addParam('group.format', $component->getFormat()); return $request; }