Example #1
0
 /**
  * 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()));
 }
Example #3
0
 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()));
 }
Example #4
0
 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()));
 }
Example #5
0
 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()));
 }
Example #6
0
 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();
 }
Example #7
0
 /**
  * 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;
 }
Example #8
0
 public function testSetAndGetExtractFromResponse()
 {
     $this->facetSet->setExtractFromResponse(true);
     $this->assertEquals(true, $this->facetSet->getExtractFromResponse());
 }