Commit c729ef75 authored by Jürgen Enge's avatar Jürgen Enge Committed by Markus Kalkbrenner

Allow multiple factes for the same field (#622)

fixes #621
parent af5bf9c6
......@@ -37,11 +37,21 @@ class FacetSet extends RequestBuilder implements ComponentRequestBuilderInterfac
if (0 !== count($facets)) {
$non_json = false;
$json_facets = [];
// create a list of facet fields
// 1) filter for FACET_FIELD
// 2) get field name
// 3) count occurence
$facet_fields = array_count_values(array_map(function ($value) {
return $value->getField();
}, array_filter($facets, function ($value) {
return FacetSetInterface::FACET_FIELD == $value->getType();
})));
foreach ($facets as $key => $facet) {
switch ($facet->getType()) {
case FacetSetInterface::FACET_FIELD:
/* @var FacetField $facet */
$this->addFacetField($request, $facet);
$this->addFacetField($request, $facet, (1 < $facet_fields[$facet->getField()]));
$non_json = true;
break;
case FacetSetInterface::FACET_QUERY:
......@@ -108,19 +118,36 @@ class FacetSet extends RequestBuilder implements ComponentRequestBuilderInterfac
*
* @param Request $request
* @param FacetField $facet
* @param use_local_params $use_local_params TRUE, if local params instead of global field params should be used. Must be set if the same field is used in different facets. Default is keeping the global field params (https://issues.apache.org/jira/browse/SOLR-6193)
*/
public function addFacetField($request, $facet)
public function addFacetField($request, $facet, $use_local_params = false)
{
$field = $facet->getField();
if ($use_local_params) {
$local_params = ['key' => $facet->getKey(),
'ex' => $facet->getExcludes(),
'facet.limit' => $facet->getLimit(),
'facet.sort' => $facet->getSort(),
'facet.prefix' => $facet->getPrefix(),
'facet.contains' => $facet->getContains(),
'facet.contains.ignoreCase' => $facet->getContainsIgnoreCase(),
'facet.offset' => $facet->getOffset(),
'facet.mincount' => $facet->getMinCount(),
'facet.missing' => $facet->getMissing(),
'facet.method' => $facet->getMethod(),
];
} else {
$local_params = ['key' => $facet->getKey(), 'ex' => $facet->getExcludes()];
}
$request->addParam(
'facet.field',
$this->renderLocalParams(
$field,
['key' => $facet->getKey(), 'ex' => $facet->getExcludes()]
$local_params
)
);
if (!$use_local_params) {
$request->addParam("f.$field.facet.limit", $facet->getLimit());
$request->addParam("f.$field.facet.sort", $facet->getSort());
$request->addParam("f.$field.facet.prefix", $facet->getPrefix());
......@@ -131,6 +158,7 @@ class FacetSet extends RequestBuilder implements ComponentRequestBuilderInterfac
$request->addParam("f.$field.facet.missing", $facet->getMissing());
$request->addParam("f.$field.facet.method", $facet->getMethod());
}
}
/**
* Add params for a facet query to request.
......
......@@ -288,6 +288,25 @@ class FacetSetTest extends TestCase
$this->component->addFacet(
new FacetMultiQuery(['key' => 'f3', 'query' => ['f4' => ['query' => 'category:40']]])
);
$request = $this->builder->buildComponent($this->component, $this->request);
static::assertEquals(
null,
$request->getRawData()
);
static::assertEquals(
'?facet.field={!key=f1}owner&facet.query={!key=f2}category:23&facet.query={!key=f4}category:40&facet=true&facet.missing=true&facet.limit=10',
urldecode($request->getUri())
);
}
public function testBuildWithFacetsAndSameFieldMultiplePrefix()
{
$this->component->setMissing(true);
$this->component->setLimit(10);
$this->component->addFacet((new FacetField(['key' => 'f1', 'field' => 'owner']))->setPrefix('Y'));
// second use of field owner (with prefix)
$this->component->addFacet((new FacetField(['key' => 'f2', 'field' => 'owner']))->setPrefix('X'));
$request = $this->builder->buildComponent($this->component, $this->request);
......@@ -297,7 +316,7 @@ class FacetSetTest extends TestCase
);
static::assertEquals(
'?facet.field={!key=f1}owner&facet.query={!key=f2}category:23&facet.query={!key=f4}category:40&facet=true&facet.missing=true&facet.limit=10',
'?facet.field={!key=f1 facet.prefix=Y}owner&facet.field={!key=f2 facet.prefix=X}owner&facet=true&facet.missing=true&facet.limit=10',
urldecode($request->getUri())
);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment