/** * Parse result data into result objects * * @throws RuntimeException * @param Query $query * @param QueryFacetSet $facetSet * @param array $data * @return ResultFacetSet */ public function parse($query, $facetSet, $data) { if ($facetSet->getExtractFromResponse() === true) { if (empty($data['facet_counts']) === false) { foreach ($data['facet_counts'] as $key => $facets) { switch ($key) { case 'facet_fields': $method = 'createFacetField'; break; case 'facet_queries': $method = 'createFacetQuery'; break; case 'facet_ranges': $method = 'createFacetRange'; break; case 'facet_pivot': $method = 'createFacetPivot'; break; default: throw new RuntimeException('Unknown facet class identifier'); } foreach ($facets as $k => $facet) { $facetObject = $facetSet->{$method}($k); if ($key == 'facet_pivot') { /** @var \Solarium\QueryType\Select\Query\Component\Facet\Pivot $facetObject */ $facetObject->setFields($k); } } } } } $facets = array(); foreach ($facetSet->getFacets() as $key => $facet) { switch ($facet->getType()) { case QueryFacetSet::FACET_FIELD: $result = $this->facetField($query, $facet, $data); break; case QueryFacetSet::FACET_QUERY: $result = $this->facetQuery($facet, $data); break; case QueryFacetSet::FACET_MULTIQUERY: $result = $this->facetMultiQuery($facet, $data); break; case QueryFacetSet::FACET_RANGE: $result = $this->facetRange($query, $facet, $data); break; case QueryFacetSet::FACET_PIVOT: $result = $this->facetPivot($query, $facet, $data); break; default: throw new RuntimeException('Unknown facet type'); } if ($result !== null) { $facets[$key] = $result; } } return $this->createFacetSet($facets); }
public function testBuildWithPivotFacet() { $this->component->addFacet(new FacetPivot(array('key' => 'f1', 'fields' => 'cat,inStock', 'mincount' => 123))); $request = $this->builder->buildComponent($this->component, $this->request); $this->assertEquals(null, $request->getRawData()); $this->assertEquals('?facet=true&facet.pivot=cat,inStock&facet.pivot.mincount=123', urldecode($request->getUri())); }
public function testBuildeWithIntervalFacet() { $facet = new FacetInterval(array('key' => 'f1', 'fields' => 'cat,inStock', 'set' => array(0 => 'int1', 'one' => 'int2'))); $this->component->addFacet($facet); $request = $this->builder->buildComponent($this->component, $this->request); $this->assertEquals(null, $request->getRawData()); $this->assertEquals('?facet=true&f..facet.interval.set=int1&f..facet.interval.set={!key="one"}int2', urldecode($request->getUri())); }
public function testBuildWithPivotStatFacet() { $facet = new FacetPivot(array('key' => 'f1', 'fields' => 'cat,inStock', 'stats' => 'piv1')); $this->component->addFacet($facet); $request = $this->builder->buildComponent($this->component, $this->request); $this->assertEquals(null, $request->getRawData()); $this->assertEquals('?facet=true&facet.pivot={!stats=piv1}cat,inStock', urldecode($request->getUri())); }
public function testBuildWithContainsSettings() { $facet = new FacetField(array('key' => 'f1', 'field' => 'owner', 'contains' => 'foo', 'containsignorecase' => true)); $this->component->addFacet($facet); $this->component->setContains('bar'); $this->component->setContainsIgnoreCase(false); $request = $this->builder->buildComponent($this->component, $this->request); $this->assertEquals(null, $request->getRawData()); $this->assertEquals('?facet=true&facet.contains=bar&facet.contains.ignoreCase=false&facet.field={!key=f1}owner&f.owner.facet.contains=foo&f.owner.facet.contains.ignoreCase=true', urldecode($request->getUri())); }
public function testParseExtractFromResponse() { $data = array('facet_counts' => array('facet_fields' => array('keyA' => array('value1', 12, 'value2', 3)), 'facet_queries' => array('keyB' => 23, 'keyC_A' => 25, 'keyC_B' => 16), 'facet_ranges' => array('keyD' => array('before' => 3, 'after' => 5, 'between' => 4, 'counts' => array('1.0', 1, '101.0', 2, '201.0', 1))), 'facet_pivot' => array('cat,price' => array(array('field' => 'cat', 'value' => 'abc', 'count' => '123', 'pivot' => array(array('field' => 'price', 'value' => 1, 'count' => 12), array('field' => 'price', 'value' => 2, 'count' => 8))))))); $facetSet = new FacetSet(); $facetSet->setExtractFromResponse(true); $result = $this->parser->parse($this->query, $facetSet, $data); $facets = $result->getFacets(); $this->assertEquals(array('keyA', 'keyB', 'keyC_A', 'keyC_B', 'keyD', 'cat,price'), array_keys($facets)); $this->assertEquals(array('value1' => 12, 'value2' => 3), $facets['keyA']->getValues()); $this->assertEquals(23, $facets['keyB']->getValue()); // As the multiquery facet is a Solarium virtual facet type, it cannot be detected based on Solr response data $this->assertEquals(25, $facets['keyC_A']->getValue()); $this->assertEquals(16, $facets['keyC_B']->getValue()); $this->assertEquals(array('1.0' => 1, '101.0' => 2, '201.0' => 1), $facets['keyD']->getValues()); $this->assertEquals(3, $facets['keyD']->getBefore()); $this->assertEquals(4, $facets['keyD']->getBetween()); $this->assertEquals(5, $facets['keyD']->getAfter()); $this->assertEquals(1, count($facets['cat,price'])); $this->query = new Query(); }
/** * Add request settings for FacetSet. * * @throws UnexpectedValueException * * @param FacetsetComponent $component * @param Request $request * * @return Request */ public function buildComponent($component, $request) { $facets = $component->getFacets(); if (count($facets) !== 0) { // enable faceting $request->addParam('facet', 'true'); // global facet params $request->addParam('facet.sort', $component->getSort()); $request->addParam('facet.prefix', $component->getPrefix()); $request->addParam('facet.contains', $component->getContains()); $request->addParam('facet.contains.ignoreCase', is_null($ignoreCase = $component->getContainsIgnoreCase()) ? null : ($ignoreCase ? 'true' : 'false')); $request->addParam('facet.missing', $component->getMissing()); $request->addParam('facet.mincount', $component->getMinCount()); $request->addParam('facet.limit', $component->getLimit()); foreach ($facets as $facet) { switch ($facet->getType()) { case FacetsetComponent::FACET_FIELD: $this->addFacetField($request, $facet); break; case FacetsetComponent::FACET_QUERY: $this->addFacetQuery($request, $facet); break; case FacetsetComponent::FACET_MULTIQUERY: $this->addFacetMultiQuery($request, $facet); break; case FacetsetComponent::FACET_RANGE: $this->addFacetRange($request, $facet); break; case FacetsetComponent::FACET_PIVOT: $this->addFacetPivot($request, $facet); break; case FacetsetComponent::FACET_INTERVAL: $this->addFacetInterval($request, $facet); break; default: throw new UnexpectedValueException('Unknown facet type'); } } } return $request; }
public function testSetAndGetExtractFromResponse() { $this->facetSet->setExtractFromResponse(true); $this->assertEquals(true, $this->facetSet->getExtractFromResponse()); }