Skip to content

Commit

Permalink
Merge pull request ezsystems#1054 from ezsystems/impl-EZP-23397-es-fi…
Browse files Browse the repository at this point in the history
…eld-filters

EZP-23397: Elasticsearch: Implement language filters
  • Loading branch information
pspanja committed Oct 27, 2014
2 parents 15c63cc + df538aa commit feddffd
Show file tree
Hide file tree
Showing 66 changed files with 4,849 additions and 155 deletions.
4,263 changes: 4,263 additions & 0 deletions eZ/Publish/API/Repository/Tests/SearchServiceFieldFiltersTest.php

Large diffs are not rendered by default.

Expand Up @@ -35,17 +35,18 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
/** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
return array(
"and" => array_map(
function ( $value ) use ( $dispatcher )
function ( $value ) use ( $dispatcher, $fieldFilters )
{
return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_FILTER );
return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_FILTER, $fieldFilters );
},
$criterion->criteria
)
Expand All @@ -57,19 +58,20 @@ function ( $value ) use ( $dispatcher )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
/** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
return array(
"bool" => array(
"must" => array(
array_map(
function ( $value ) use ( $dispatcher )
function ( $value ) use ( $dispatcher, $fieldFilters )
{
return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_QUERY );
return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_QUERY, $fieldFilters );
},
$criterion->criteria
),
Expand Down
Expand Up @@ -52,16 +52,17 @@ protected function validateCriterionInput( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$this->validateCriterionInput( $criterion );

/** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
return array(
"not" => $dispatcher->dispatch( $criterion->criteria[0], Dispatcher::CONTEXT_FILTER )
"not" => $dispatcher->dispatch( $criterion->criteria[0], Dispatcher::CONTEXT_FILTER, $fieldFilters )
);
}

Expand All @@ -70,17 +71,22 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$this->validateCriterionInput( $criterion );

/** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
return array(
"bool" => array(
"must_not" => $dispatcher->dispatch( $criterion->criteria[0], Dispatcher::CONTEXT_FILTER ),
"must_not" => $dispatcher->dispatch(
$criterion->criteria[0],
Dispatcher::CONTEXT_FILTER,
$fieldFilters
),
),
);
}
Expand Down
Expand Up @@ -35,17 +35,18 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
/** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
return array(
"or" => array_map(
function ( $value ) use ( $dispatcher )
function ( $value ) use ( $dispatcher, $fieldFilters )
{
return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_FILTER );
return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_FILTER, $fieldFilters );
},
$criterion->criteria
)
Expand All @@ -57,18 +58,19 @@ function ( $value ) use ( $dispatcher )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
/** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
return array(
"bool" => array(
"should" => array_map(
function ( $value ) use ( $dispatcher )
function ( $value ) use ( $dispatcher, $fieldFilters )
{
return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_FILTER );
return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_FILTER, $fieldFilters );
},
$criterion->criteria
),
Expand Down
Expand Up @@ -36,10 +36,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"match_all" => new ArrayObject(),
Expand Down
Expand Up @@ -35,10 +35,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"terms" => array(
Expand All @@ -52,10 +53,11 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"terms" => array(
Expand Down
Expand Up @@ -32,10 +32,15 @@ abstract public function canVisit( Criterion $criterion );
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed Hash representation of Elasticsearch filter abstract syntax tree
*/
abstract public function visitFilter( Criterion $criterion, CriterionVisitorDispatcher $dispatcher = null );
abstract public function visitFilter(
Criterion $criterion,
CriterionVisitorDispatcher $dispatcher,
array $fieldFilters
);

/**
* Map field value to a proper Elasticsearch query representation
Expand All @@ -44,12 +49,13 @@ abstract public function visitFilter( Criterion $criterion, CriterionVisitorDisp
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed Hash representation of Elasticsearch query abstract syntax tree
*/
public function visitQuery( Criterion $criterion, CriterionVisitorDispatcher $dispatcher = null )
public function visitQuery( Criterion $criterion, CriterionVisitorDispatcher $dispatcher, array $fieldFilters )
{
return $this->visitFilter( $criterion, $dispatcher );
return $this->visitFilter( $criterion, $dispatcher, $fieldFilters );
}

/**
Expand Down
Expand Up @@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"ids" => array(
Expand Down
Expand Up @@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
Expand Down
Expand Up @@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
Expand Down
Expand Up @@ -59,10 +59,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
Expand Down
Expand Up @@ -16,7 +16,7 @@
/**
* Base class for CustomField criterion visitors
*/
abstract class CustomField extends CriterionVisitor
abstract class CustomField extends FieldFilterBase
{
/**
* Returns nested condition common for filter and query contexts.
Expand All @@ -34,21 +34,45 @@ abstract protected function getCondition( Criterion $criterion );
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
"path" => "fields_doc",
"query" => array(
"bool" => array(
"should" => $this->getCondition( $criterion ),
"minimum_should_match" => 1,
),
),
$query = array(
"bool" => array(
"should" => $this->getCondition( $criterion ),
"minimum_should_match" => 1,
),
);

$fieldFilter = $this->getFieldFilter( $fieldFilters );

if ( $fieldFilter === null )
{
$query = array(
"nested" => array(
"path" => "fields_doc",
"query" => $query,
),
);
}
else
{
$query = array(
"nested" => array(
"path" => "fields_doc",
"query" => array(
"filtered" => array(
"query" => $query,
"filter" => $fieldFilter,
),
),
),
);
}

return $query;
}
}
Expand Up @@ -71,12 +71,13 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
$filter = array(
"nested" => array(
"path" => "fields_doc",
"filter" => array(
Expand All @@ -89,5 +90,21 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
),
),
);

$fieldFilter = $this->getFieldFilter( $fieldFilters );

if ( $fieldFilter !== null )
{
$filter["nested"]["filter"] = array(
"bool" => array(
"must" => array(
$fieldFilter,
$filter["nested"]["filter"],
),
),
);
}

return $filter;
}
}
Expand Up @@ -69,18 +69,31 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
* @param array $fieldFilters
*
* @return mixed
*/
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
$filter = array(
"nested" => array(
"path" => "fields_doc",
"filter" => array(
"or" => $this->getCondition( $criterion ),
),
"filter" => $this->getCondition( $criterion ),
),
);

$fieldFilter = $this->getFieldFilter( $fieldFilters );

if ( $fieldFilter !== null )
{
$filter["nested"]["filter"] = array(
"and" => array(
$fieldFilter,
$filter["nested"]["filter"],
),
);
}

return $filter;
}
}

0 comments on commit feddffd

Please sign in to comment.