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 31ce606
Show file tree
Hide file tree
Showing 8 changed files with 204 additions and 85 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
50 changes: 29 additions & 21 deletions lib/Query/Common/FacetBuilderVisitor/Aggregate.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@

use EzSystems\EzPlatformSolrSearchEngine\Query\FacetBuilderVisitor;
use eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder;
use EzSystems\EzPlatformSolrSearchEngine\Query\FacetFieldVisitor;
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,34 +50,41 @@ public function addVisitor(FacetBuilderVisitor $visitor)
}

/**
* Check if visitor is applicable to current facet result.
*
* @param string $field
*
* @return bool
* {@inheritdoc}.
*/
public function canMap($field)
public function getFieldVisitor($field)
{
return true;
foreach ($this->visitors as $visitor) {
if ($visitor instanceof FacetFieldVisitor) {
if ($visitor = $visitor->getFieldVisitor($field)) {
return $visitor;
}
} elseif ($visitor->canMap($field)) {
return $visitor;
}
}

throw new \OutOfRangeException('No visitor available for: ' . $field);
}

/**
* Map Solr facet result back to facet objects.
*
* @param string $field
* @param array $data
*
* @return \eZ\Publish\API\Repository\Values\Content\Search\Facet
* {@inheritdoc}.
*/
public function map($field, array $data)
public function canMapField($field, FacetBuilder $facetBuilder)
{
foreach ($this->visitors as $visitor) {
if ($visitor->canMap($field)) {
return $visitor->map($field, $data);
}
}
// Return false, as caller should call getFieldVisitor() and directly use that visitor.
return false;
}

throw new \OutOfRangeException('No visitor available for: ' . $field);
/**
* {@inheritdoc}.
*/
public function mapField($field, array $data, FacetBuilder $facetBuilder)
{
throw new \LogicException(
'mapField() should not be called on aggregate, call getFieldVisitor() and directly call mapField() ' .
'on returned once you picked the right FacetBuilder using canMapField().'
);
}

/**
Expand Down
34 changes: 18 additions & 16 deletions lib/Query/Common/FacetBuilderVisitor/ContentType.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,39 +11,41 @@
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)
public function getFieldVisitor($field)
{
return $field === 'content_type_id_id';
if ($field === 'content_type_id_id') {
return $this;
}
}

/**
* Map Solr facet result back to facet objects.
*
* @param string $field
* @param array $data
*
* @return Facet
* {@inheritdoc}.
*/
public function canMapField($field, FacetBuilder $facetBuilder)
{
return $facetBuilder instanceof FacetBuilder\ContentTypeFacetBuilder && $field === 'content_type_id_id';
}

/**
* {@inheritdoc}.
*/
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),
)
);
Expand Down
34 changes: 18 additions & 16 deletions lib/Query/Common/FacetBuilderVisitor/Section.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,39 +11,41 @@
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)
public function getFieldVisitor($field)
{
return $field === 'content_section_id_id';
if ($field === 'content_section_id_id') {
return $this;
}
}

/**
* Map Solr facet result back to facet objects.
*
* @param string $field
* @param array $data
*
* @return Facet
* {@inheritdoc}.
*/
public function canMapField($field, FacetBuilder $facetBuilder)
{
return $facetBuilder instanceof FacetBuilder\SectionFacetBuilder && $field === 'content_section_id_id';
}

/**
* {@inheritdoc}.
*/
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),
)
);
Expand Down
35 changes: 19 additions & 16 deletions lib/Query/Common/FacetBuilderVisitor/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,39 +11,42 @@
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)
public function getFieldVisitor($field)
{
return $field === 'content_version_creator_user_id_id';
if ($field === 'content_version_creator_user_id_id') {
return $this;
}
}

/**
* Map Solr facet result back to facet objects.
*
* @param string $field
* @param array $data
*
* @return Facet
* {@inheritdoc}.
*/
public function canMapField($field, FacetBuilder $facetBuilder)
{
return $facetBuilder instanceof FacetBuilder\UserFacetBuilder &&
$field === 'content_version_creator_user_id_id';
}

/**
* {@inheritdoc}.
*/
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),
)
);
Expand Down
20 changes: 15 additions & 5 deletions lib/Query/FacetBuilderVisitor.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,36 @@
abstract class FacetBuilderVisitor
{
/**
* CHeck if visitor is applicable to current facet result.
* Check if visitor is applicable to current facet result.
*
* @deprecated Instead implement {@link FacetFieldVisitor::canMapField()}
*
* @param string $field
*
* @return bool
*/
abstract public function canMap($field);
public function canMap($field)
{
return false;
}

/**
* Map Solr facet result back to facet objects.
*
* @deprecated Instead implement {@link FacetFieldVisitor::mapField()}
*
* @param string $field
* @param array $data
*
* @return Facet
* @return \eZ\Publish\API\Repository\Values\Content\Search\Facet
*/
abstract public function map($field, array $data);
public function map($field, array $data)
{
throw new \LogicException('Deprecated and not in use by default anymore, make sure to implement FacetFieldVisitor');
}

/**
* CHeck if visitor is applicable to current facet builder.
* Check if visitor is applicable to current facet builder.
*
* @param FacetBuilder $facetBuilder
*
Expand Down
56 changes: 56 additions & 0 deletions lib/Query/FacetFieldVisitor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php

/**
* This file is part of the eZ Platform Solr Search Engine package.
*
* @copyright Copyright (C) eZ Systems AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
namespace EzSystems\EzPlatformSolrSearchEngine\Query;

use eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder;

/**
* Visits solr results into correct facet and facet builder combination.
*
* Use:
* 1. Directly iterate (or indirectly via aggregate) and call getVistor to get right visitor for a field.
* 2. Match fac to the field with canMap.
* 3. Map.
*
* NOTE: Will be deprecated in 2.0 and methods will be moved into FacetBuilderVisitor.
*/
interface FacetFieldVisitor
{
/**
* Check if visitor is applicable to current facet result, if not return null.
*
* @param string $field
*
* @return FacetFieldVisitor|null
*/
public function getFieldVisitor($field);

/**
* Check if visitor is applicable to current facet result and facet builder combination.
*
* On result, typically call canMap() first and then iterate to figure out right facet builder that needs to be injected into map().
*
* @param string $field
* @param FacetBuilder $facetBuilder
*
* @return bool
*/
public function canMapField($field, FacetBuilder $facetBuilder);

/**
* Map Solr facet result back to facet objects.
*
* @param string $field
* @param array $data
* @param FacetBuilder $facetBuilder
*
* @return \eZ\Publish\API\Repository\Values\Content\Search\Facet
*/
public function mapField($field, array $data, FacetBuilder $facetBuilder);
}
Loading

0 comments on commit 31ce606

Please sign in to comment.