Skip to content

Commit

Permalink
Change Facet visitor logic to be able to inject FacetBuilder
Browse files Browse the repository at this point in the history
1. To be able to inject name
2. To be able to inject the builder itself eventualy

See planned api improvments on facets:
ezsystems/ezpublish-kernel#1960
  • Loading branch information
andrerom committed May 9, 2017
1 parent 37051a7 commit 6d67aef
Show file tree
Hide file tree
Showing 9 changed files with 148 additions and 152 deletions.
6 changes: 4 additions & 2 deletions lib/Handler.php
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,8 @@ public function findContent(Query $query, array $fieldFilters = array())
);

return $this->resultExtractor->extract(
$this->gateway->findContent($query, $fieldFilters)
$this->gateway->findContent($query, $fieldFilters),
$query->facetBuilders
);
}

Expand Down Expand Up @@ -196,7 +197,8 @@ public function findLocations(LocationQuery $query, array $fieldFilters = array(
);

return $this->resultExtractor->extract(
$this->gateway->findLocations($query, $fieldFilters)
$this->gateway->findLocations($query, $fieldFilters),
$query->facetBuilders
);
}

Expand Down
49 changes: 15 additions & 34 deletions lib/Query/Common/FacetBuilderVisitor/Aggregate.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,14 @@
namespace EzSystems\EzPlatformSolrSearchEngine\Query\Common\FacetBuilderVisitor;

use EzSystems\EzPlatformSolrSearchEngine\Query\FacetBuilderVisitor;
use EzSystems\EzPlatformSolrSearchEngine\Query\FacetFieldVisitor;
use eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder;
use eZ\Publish\API\Repository\Exceptions\NotImplementedException;

/**
* Visits the facet builder tree into a Solr query.
*/
class Aggregate extends FacetBuilderVisitor
class Aggregate extends FacetBuilderVisitor implements FacetFieldVisitor
{
/**
* Array of available visitors.
Expand Down Expand Up @@ -49,29 +50,17 @@ public function addVisitor(FacetBuilderVisitor $visitor)
}

/**
* Check if visitor is applicable to current facet result.
* {@inheritdoc}.
*
* @param string $field
*
* @return bool
*/
public function canMap($field)
{
return true;
}

/**
* Map Solr facet result back to facet objects.
*
* @param string $field
* @param array $data
*
* @return \eZ\Publish\API\Repository\Values\Content\Search\Facet
* @deprecated Internal support for nullable $facetBuilder will be removed in 2.0, here now to support facetBuilders
* that has not adapted yet.
*/
public function map($field, array $data)
public function mapField($field, array $data, FacetBuilder $facetBuilder = null)
{
foreach ($this->visitors as $visitor) {
if ($visitor->canMap($field)) {
if ($facetBuilder && $visitor instanceof FacetFieldVisitor && $visitor->canVisit($facetBuilder)) {
return $visitor->mapField($field, $data, $facetBuilder);
} elseif (!$facetBuilder && $visitor->canMap($field)) {
return $visitor->map($field, $data);
}
}
Expand All @@ -80,31 +69,23 @@ public function map($field, array $data)
}

/**
* CHeck if visitor is applicable to current facet builder.
*
* @param FacetBuilder $facetBuilder
*
* @return bool
* {@inheritdoc}.
*/
public function canVisit(FacetBuilder $facetBuilder)
{
return true;
}

/**
* Map field value to a proper Solr representation.
*
* @throws \eZ\Publish\API\Repository\Exceptions\NotImplementedException
*
* @param FacetBuilder $facetBuilder
*
* @return string
* {@inheritdoc}.
*/
public function visit(FacetBuilder $facetBuilder)
public function visitBuilder(FacetBuilder $facetBuilder, $fieldId)
{
foreach ($this->visitors as $visitor) {
if ($visitor->canVisit($facetBuilder)) {
return $visitor->visit($facetBuilder);
return $visitor instanceof FacetFieldVisitor ?
$visitor->visitBuilder($facetBuilder, $fieldId) :
$visitor->visit($facetBuilder);
}
}

Expand Down
42 changes: 9 additions & 33 deletions lib/Query/Common/FacetBuilderVisitor/ContentType.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,67 +11,43 @@
namespace EzSystems\EzPlatformSolrSearchEngine\Query\Common\FacetBuilderVisitor;

use EzSystems\EzPlatformSolrSearchEngine\Query\FacetBuilderVisitor;
use EzSystems\EzPlatformSolrSearchEngine\Query\FacetFieldVisitor;
use eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder;
use eZ\Publish\API\Repository\Values\Content\Search\Facet;

/**
* Visits the ContentType facet builder.
*/
class ContentType extends FacetBuilderVisitor
class ContentType extends FacetBuilderVisitor implements FacetFieldVisitor
{
/**
* Check if visitor is applicable to current facet result.
*
* @param string $field
*
* @return bool
* {@inheritdoc}.
*/
public function canMap($field)
{
return $field === 'content_type_id_id';
}

/**
* Map Solr facet result back to facet objects.
*
* @param string $field
* @param array $data
*
* @return Facet
*/
public function map($field, array $data)
public function mapField($field, array $data, FacetBuilder $facetBuilder)
{
return new Facet\ContentTypeFacet(
array(
'name' => 'type',
'name' => $facetBuilder->name,
'entries' => $this->mapData($data),
)
);
}

/**
* Check if visitor is applicable to current facet builder.
*
* @param FacetBuilder $facetBuilder
*
* @return bool
* {@inheritdoc}.
*/
public function canVisit(FacetBuilder $facetBuilder)
{
return $facetBuilder instanceof FacetBuilder\ContentTypeFacetBuilder;
}

/**
* Map field value to a proper Solr representation.
*
* @param FacetBuilder $facetBuilder;
*
* @return string
* {@inheritdoc}.
*/
public function visit(FacetBuilder $facetBuilder)
public function visitBuilder(FacetBuilder $facetBuilder, $fieldId)
{
return array(
'facet.field' => 'content_type_id_id',
'facet.field' => "{!ex=dt key=${fieldId}}content_type_id_id",
'f.content_type_id_id.facet.limit' => $facetBuilder->limit,
'f.content_type_id_id.facet.mincount' => $facetBuilder->minCount,
);
Expand Down
42 changes: 9 additions & 33 deletions lib/Query/Common/FacetBuilderVisitor/Section.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,67 +11,43 @@
namespace EzSystems\EzPlatformSolrSearchEngine\Query\Common\FacetBuilderVisitor;

use EzSystems\EzPlatformSolrSearchEngine\Query\FacetBuilderVisitor;
use EzSystems\EzPlatformSolrSearchEngine\Query\FacetFieldVisitor;
use eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder;
use eZ\Publish\API\Repository\Values\Content\Search\Facet;

/**
* Visits the Section facet builder.
*/
class Section extends FacetBuilderVisitor
class Section extends FacetBuilderVisitor implements FacetFieldVisitor
{
/**
* Check if visitor is applicable to current facet result.
*
* @param string $field
*
* @return bool
* {@inheritdoc}.
*/
public function canMap($field)
{
return $field === 'content_section_id_id';
}

/**
* Map Solr facet result back to facet objects.
*
* @param string $field
* @param array $data
*
* @return Facet
*/
public function map($field, array $data)
public function mapField($field, array $data, FacetBuilder $facetBuilder)
{
return new Facet\SectionFacet(
array(
'name' => 'section',
'name' => $facetBuilder->name,
'entries' => $this->mapData($data),
)
);
}

/**
* Check if visitor is applicable to current facet builder.
*
* @param FacetBuilder $facetBuilder
*
* @return bool
* {@inheritdoc}.
*/
public function canVisit(FacetBuilder $facetBuilder)
{
return $facetBuilder instanceof FacetBuilder\SectionFacetBuilder;
}

/**
* Map field value to a proper Solr representation.
*
* @param FacetBuilder $facetBuilder;
*
* @return string
* {@inheritdoc}.
*/
public function visit(FacetBuilder $facetBuilder)
public function visitBuilder(FacetBuilder $facetBuilder, $fieldId)
{
return array(
'facet.field' => 'content_section_id_id',
'facet.field' => "{!ex=dt key=${fieldId}}content_section_id_id",
'f.content_section_id_id.facet.limit' => $facetBuilder->limit,
'f.content_section_id_id.facet.mincount' => $facetBuilder->minCount,
);
Expand Down
42 changes: 9 additions & 33 deletions lib/Query/Common/FacetBuilderVisitor/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,67 +11,43 @@
namespace EzSystems\EzPlatformSolrSearchEngine\Query\Common\FacetBuilderVisitor;

use EzSystems\EzPlatformSolrSearchEngine\Query\FacetBuilderVisitor;
use EzSystems\EzPlatformSolrSearchEngine\Query\FacetFieldVisitor;
use eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder;
use eZ\Publish\API\Repository\Values\Content\Search\Facet;

/**
* Visits the User facet builder.
*/
class User extends FacetBuilderVisitor
class User extends FacetBuilderVisitor implements FacetFieldVisitor
{
/**
* Check if visitor is applicable to current facet result.
*
* @param string $field
*
* @return bool
* {@inheritdoc}.
*/
public function canMap($field)
{
return $field === 'content_version_creator_user_id_id';
}

/**
* Map Solr facet result back to facet objects.
*
* @param string $field
* @param array $data
*
* @return Facet
*/
public function map($field, array $data)
public function mapField($field, array $data, FacetBuilder $facetBuilder)
{
return new Facet\UserFacet(
array(
'name' => 'creator',
'name' => $facetBuilder->name,
'entries' => $this->mapData($data),
)
);
}

/**
* Check if visitor is applicable to current facet builder.
*
* @param FacetBuilder $facetBuilder
*
* @return bool
* {@inheritdoc}.
*/
public function canVisit(FacetBuilder $facetBuilder)
{
return $facetBuilder instanceof FacetBuilder\UserFacetBuilder;
}

/**
* Map field value to a proper Solr representation.
*
* @param FacetBuilder $facetBuilder;
*
* @return string
* {@inheritdoc}.
*/
public function visit(FacetBuilder $facetBuilder)
public function visitBuilder(FacetBuilder $facetBuilder, $fieldId)
{
return array(
'facet.field' => 'content_version_creator_user_id_id',
'facet.field' => "{!ex=dt key=${fieldId}}content_version_creator_user_id_id",
'f.content_version_creator_user_id_id.facet.limit' => $facetBuilder->limit,
'f.content_version_creator_user_id_id.facet.mincount' => $facetBuilder->minCount,
);
Expand Down
15 changes: 10 additions & 5 deletions lib/Query/Common/QueryConverter/NativeQueryConverter.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
use EzSystems\EzPlatformSolrSearchEngine\Query\QueryConverter;
use EzSystems\EzPlatformSolrSearchEngine\Query\CriterionVisitor;
use EzSystems\EzPlatformSolrSearchEngine\Query\SortClauseVisitor;
use EzSystems\EzPlatformSolrSearchEngine\Query\FacetBuilderVisitor;
use EzSystems\EzPlatformSolrSearchEngine\Query\FacetFieldVisitor;

/**
* Native implementation of Query Converter.
Expand All @@ -38,7 +38,7 @@ class NativeQueryConverter extends QueryConverter
/**
* Facet builder visitor.
*
* @var \EzSystems\EzPlatformSolrSearchEngine\Query\FacetBuilderVisitor
* @var \EzSystems\EzPlatformSolrSearchEngine\Query\FacetFieldVisitor
*/
protected $facetBuilderVisitor;

Expand All @@ -47,12 +47,12 @@ class NativeQueryConverter extends QueryConverter
*
* @param \EzSystems\EzPlatformSolrSearchEngine\Query\CriterionVisitor $criterionVisitor
* @param \EzSystems\EzPlatformSolrSearchEngine\Query\SortClauseVisitor $sortClauseVisitor
* @param \EzSystems\EzPlatformSolrSearchEngine\Query\FacetBuilderVisitor $facetBuilderVisitor
* @param \EzSystems\EzPlatformSolrSearchEngine\Query\FacetFieldVisitor $facetBuilderVisitor
*/
public function __construct(
CriterionVisitor $criterionVisitor,
SortClauseVisitor $sortClauseVisitor,
FacetBuilderVisitor $facetBuilderVisitor
FacetFieldVisitor $facetBuilderVisitor
) {
$this->criterionVisitor = $criterionVisitor;
$this->sortClauseVisitor = $sortClauseVisitor;
Expand Down Expand Up @@ -103,14 +103,19 @@ private function getSortClauses(array $sortClauses)
/**
* Converts an array of facet builder objects to a Solr query parameters representation.
*
* This method uses spl_object_hash() to get id of each and every facet builder, as this
* is expected by {@link \EzSystems\EzPlatformSolrSearchEngine\ResultExtractor}.
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder[] $facetBuilders
*
* @return array
*/
private function getFacetParams(array $facetBuilders)
{
$facetSets = array_map(
array($this->facetBuilderVisitor, 'visit'),
function ($facetBuilder) {
return $this->facetBuilderVisitor->visitBuilder($facetBuilder, spl_object_hash($facetBuilder));
},
$facetBuilders
);

Expand Down
Loading

0 comments on commit 6d67aef

Please sign in to comment.