Skip to content
This repository has been archived by the owner on Aug 13, 2019. It is now read-only.

Commit

Permalink
III-1957: Add label term queries to offer search query
Browse files Browse the repository at this point in the history
  • Loading branch information
bertramakers committed Mar 14, 2017
1 parent d5bc101 commit 7f7cb74
Show file tree
Hide file tree
Showing 2 changed files with 159 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/Offer/ElasticSearchOfferQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

namespace CultuurNet\UDB3\Search\ElasticSearch\Offer;

use CultuurNet\UDB3\Label\ValueObjects\LabelName;
use CultuurNet\UDB3\Search\Offer\OfferSearchParameters;
use ONGR\ElasticsearchDSL\Query\Compound\BoolQuery;
use ONGR\ElasticsearchDSL\Query\FullText\QueryStringQuery;
use ONGR\ElasticsearchDSL\Query\Geo\GeoShapeQuery;
use ONGR\ElasticsearchDSL\Query\MatchAllQuery;
use ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery;
use ONGR\ElasticsearchDSL\Search;

class ElasticSearchOfferQuery
Expand Down Expand Up @@ -94,11 +96,38 @@ public static function fromSearchParameters(
$boolQuery->add($geoShapeQuery, BoolQuery::FILTER);
}

self::addLabelsQuery($boolQuery, 'labels', $searchParameters->getLabels());
self::addLabelsQuery($boolQuery, 'location.labels', $searchParameters->getLocationLabels());
self::addLabelsQuery($boolQuery, 'organizer.labels', $searchParameters->getOrganizerLabels());

$search = new Search();
$search->setFrom($searchParameters->getStart()->toNative());
$search->setSize($searchParameters->getLimit()->toNative());
$search->addQuery($boolQuery);

return new ElasticSearchOfferQuery($search->toArray());
}

/**
* @param BoolQuery $boolQuery
* @param string $field
* @param LabelName[] $labelNames
*/
private static function addLabelsQuery(BoolQuery $boolQuery, $field, array $labelNames)
{
if (empty($labelNames)) {
return;
}

$labels = array_map(
function (LabelName $labelName) {
return $labelName->toNative();
},
$labelNames
);

$labelQuery = new TermsQuery($field, $labels);

$boolQuery->add($labelQuery, BoolQuery::FILTER);
}
}
130 changes: 130 additions & 0 deletions tests/Offer/ElasticSearchOfferQueryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace CultuurNet\UDB3\Search\ElasticSearch\Offer;

use CultuurNet\UDB3\Label\ValueObjects\LabelName;
use CultuurNet\UDB3\Search\ElasticSearch\LuceneQueryString;
use CultuurNet\UDB3\Search\Offer\OfferSearchParameters;
use CultuurNet\UDB3\Search\Region\RegionId;
Expand Down Expand Up @@ -135,4 +136,133 @@ public function it_can_be_created_with_a_geoshape_query()

$this->assertEquals($expectedQueryArray, $actualQueryArray);
}

/**
* @test
*/
public function it_can_be_created_with_a_labels_query()
{
$searchParameters = (new OfferSearchParameters())
->withStart(new Natural(30))
->withLimit(new Natural(10))
->withLabels(
new LabelName('foo'),
new LabelName('bar')
);

$expectedQueryArray = [
'from' => 30,
'size' => 10,
'query' => [
'bool' => [
'must' => [
[
'match_all' => (object) [],
],
],
'filter' => [
[
'terms' => [
'labels' => [
'foo',
'bar',
],
],
],
],
],
],
];

$actualQueryArray = ElasticSearchOfferQuery::fromSearchParameters($searchParameters)
->toArray();

$this->assertEquals($expectedQueryArray, $actualQueryArray);
}

/**
* @test
*/
public function it_can_be_created_with_a_location_labels_query()
{
$searchParameters = (new OfferSearchParameters())
->withStart(new Natural(30))
->withLimit(new Natural(10))
->withLocationLabels(
new LabelName('foo'),
new LabelName('bar')
);

$expectedQueryArray = [
'from' => 30,
'size' => 10,
'query' => [
'bool' => [
'must' => [
[
'match_all' => (object) [],
],
],
'filter' => [
[
'terms' => [
'location.labels' => [
'foo',
'bar',
],
],
],
],
],
],
];

$actualQueryArray = ElasticSearchOfferQuery::fromSearchParameters($searchParameters)
->toArray();

$this->assertEquals($expectedQueryArray, $actualQueryArray);
}

/**
* @test
*/
public function it_can_be_created_with_an_organizer_labels_query()
{
$searchParameters = (new OfferSearchParameters())
->withStart(new Natural(30))
->withLimit(new Natural(10))
->withOrganizerLabels(
new LabelName('foo'),
new LabelName('bar')
);

$expectedQueryArray = [
'from' => 30,
'size' => 10,
'query' => [
'bool' => [
'must' => [
[
'match_all' => (object) [],
],
],
'filter' => [
[
'terms' => [
'organizer.labels' => [
'foo',
'bar',
],
],
],
],
],
],
];

$actualQueryArray = ElasticSearchOfferQuery::fromSearchParameters($searchParameters)
->toArray();

$this->assertEquals($expectedQueryArray, $actualQueryArray);
}
}

0 comments on commit 7f7cb74

Please sign in to comment.