* @license http://github.com/basdenooijer/solarium/raw/master/COPYING * @link http://www.solarium-project.org/ * * @package Solarium * @subpackage Client */ /** * Add select component FacetSet to the request * * @package Solarium * @subpackage Client */ class Solarium_Client_RequestBuilder_Select_Component_FacetSet extends Solarium_Client_RequestBuilder { /** * Add request settings for FacetSet * * @param Solarium_Query_Select_Component_FacetSet $component * @param Solarium_Client_Request $request * @return Solarium_Client_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.missing', $component->getMissing()); $request->addParam('facet.mincount', $component->getMinCount()); $request->addParam('facet.limit', $component->getLimit()); foreach ($facets AS $facet) { switch ($facet->getType()) { case Solarium_Query_Select_Component_FacetSet::FACET_FIELD: $this->addFacetField($request, $facet); break; case Solarium_Query_Select_Component_FacetSet::FACET_QUERY: $this->addFacetQuery($request, $facet); break; case Solarium_Query_Select_Component_FacetSet::FACET_MULTIQUERY: $this->addFacetMultiQuery($request, $facet); break; case Solarium_Query_Select_Component_FacetSet::FACET_RANGE: $this->addFacetRange($request, $facet); break; default: throw new Solarium_Exception('Unknown facet type'); } } } return $request; } /** * Add params for a field facet to request * * @param Solarium_Client_Request $request * @param Solarium_Query_Select_Component_Facet_Field $facet * @return void */ public function addFacetField($request, $facet) { $field = $facet->getField(); $request->addParam( 'facet.field', $this->renderLocalParams( $field, array('key' => $facet->getKey(), 'ex' => $facet->getExcludes()) ) ); $request->addParam("f.$field.facet.limit", $facet->getLimit()); $request->addParam("f.$field.facet.sort", $facet->getSort()); $request->addParam("f.$field.facet.prefix", $facet->getPrefix()); $request->addParam("f.$field.facet.offset", $facet->getOffset()); $request->addParam("f.$field.facet.mincount", $facet->getMinCount()); $request->addParam("f.$field.facet.missing", $facet->getMissing()); $request->addParam("f.$field.facet.method", $facet->getMethod()); } /** * Add params for a facet query to request * * @param Solarium_Client_Request $request * @param Solarium_Query_Select_Component_Facet_Query $facet * @return void */ public function addFacetQuery($request, $facet) { $request->addParam( 'facet.query', $this->renderLocalParams( $facet->getQuery(), array('key' => $facet->getKey(), 'ex' => $facet->getExcludes()) ) ); } /** * Add params for a multiquery facet to request * * @param Solarium_Client_Request $request * @param Solarium_Query_Select_Component_Facet_MultiQuery $facet * @return void */ public function addFacetMultiQuery($request, $facet) { foreach ($facet->getQueries() AS $facetQuery) { $this->addFacetQuery($request, $facetQuery); } } /** * Add params for a range facet to request * * @param Solarium_Client_Request $request * @param Solarium_Query_Select_Component_Facet_Range $facet * @return void */ public function addFacetRange($request, $facet) { $field = $facet->getField(); $request->addParam( 'facet.range', $this->renderLocalParams( $field, array('key' => $facet->getKey(), 'ex' => $facet->getExcludes()) ) ); $request->addParam("f.$field.facet.range.start", $facet->getStart()); $request->addParam("f.$field.facet.range.end", $facet->getEnd()); $request->addParam("f.$field.facet.range.gap", $facet->getGap()); $request->addParam("f.$field.facet.range.hardend", $facet->getHardend()); if (null !== $facet->getOther()) { $other = explode(',', $facet->getOther()); foreach ($other AS $otherValue) { $request->addParam("f.$field.facet.range.other", trim($otherValue)); } } if (null !== $facet->getOther()) { $include = explode(',', $facet->getInclude()); foreach ($include AS $includeValue) { $request->addParam("f.$field.facet.range.include", trim($includeValue)); } } } }