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

Commit

Permalink
Merge 943b57a into 73065ce
Browse files Browse the repository at this point in the history
  • Loading branch information
cyberwolf committed Jul 17, 2018
2 parents 73065ce + 943b57a commit 90bc421
Show file tree
Hide file tree
Showing 15 changed files with 408 additions and 863 deletions.
6 changes: 5 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,15 @@
{
"name": "Bert Ramakers",
"email": "bert@2dotstwice.be"
},
{
"name": "Kristof Coomans",
"email": "kristof@2dotstwice.be"
}
],
"require": {
"cultuurnet/udb3": "~0.1",
"cultuurnet/udb3-search": "~0.1",
"cultuurnet/udb3-search": "dev-feature/III-2642 as 0.1",
"cultuurnet/valueobjects": "~3.0",
"ongr/elasticsearch-dsl": "~5.0.1",
"elasticsearch/elasticsearch": "~5.2",
Expand Down
16 changes: 13 additions & 3 deletions src/AbstractElasticSearchQueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,9 @@ public function withTextQuery(StringLiteral $text, Language ...$textLanguages)

return $this->withQueryStringQuery(
str_replace(':', '\\:', $text->toNative()),
$this->getPredefinedQueryStringFields(...$textLanguages)
$this->getPredefinedQueryStringFields(...$textLanguages),
BoolQuery::MUST,
'AND'
);
}

Expand Down Expand Up @@ -290,14 +292,22 @@ protected function withDateRangeQuery($fieldName, \DateTimeImmutable $from = nul
* @param string $queryString
* @param string[] $fields
* @param string $type
* @param string $defaultOperator
* @return AbstractElasticSearchQueryBuilder
*/
protected function withQueryStringQuery($queryString, array $fields = [], $type = BoolQuery::MUST)
{
protected function withQueryStringQuery(
$queryString,
array $fields = [],
$type = BoolQuery::MUST,
$defaultOperator = 'OR'
) {
$parameters = [];
if (!empty($fields)) {
$parameters['fields'] = $fields;
}
if ('OR' != \strtoupper($defaultOperator)) {
$parameters['default_operator'] = $defaultOperator;
}

$queryStringQuery = new QueryStringQuery($queryString, $parameters);

Expand Down
77 changes: 77 additions & 0 deletions src/Aggregation/LabelsAggregationTransformer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?php

namespace CultuurNet\UDB3\Search\ElasticSearch\Aggregation;

use CultuurNet\UDB3\Language;
use CultuurNet\UDB3\Search\Facet\FacetFilter;
use CultuurNet\UDB3\Search\Facet\FacetNode;
use CultuurNet\UDB3\Search\Facet\FacetTreeInterface;
use CultuurNet\UDB3\Search\Offer\FacetName;
use CultuurNet\UDB3\ValueObject\MultilingualString;
use ValueObjects\StringLiteral\StringLiteral;

class LabelsAggregationTransformer implements AggregationTransformerInterface
{
/**
* @var FacetName
*/
private $facetName;

public function __construct(
FacetName $facetName
) {
$this->facetName = $facetName;
}

/**
* @param Aggregation $aggregation
* @return bool
*/
public function supports(Aggregation $aggregation)
{
return $aggregation->getName()->sameValueAs($this->facetName);
}

/**
* @param Aggregation $aggregation
* @return FacetTreeInterface
*/
public function toFacetTree(Aggregation $aggregation)
{
if (!$this->supports($aggregation)) {
$name = $aggregation->getName()->toNative();
throw new \LogicException("Aggregation $name not supported for transformation.");
}

$nodes = [];
foreach ($aggregation->getBuckets() as $bucket) {
if ($bucket->getCount() == 0) {
continue;
}

// For labels we use the bucket key for all 4 supported
// languages, because labels are currently not multilingual.
$translatedName = new StringLiteral($bucket->getKey());

$name = new MultilingualString(
new Language('nl'),
$translatedName
);

foreach (['fr', 'de', 'en'] as $langCode) {
$name = $name->withTranslation(
new Language($langCode),
$translatedName
);
}

$nodes[] = new FacetNode(
$bucket->getKey(),
$name,
$bucket->getCount()
);
}

return new FacetFilter($this->facetName->toNative(), $nodes);
}
}
44 changes: 17 additions & 27 deletions src/Offer/ElasticSearchOfferQueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,38 +31,27 @@
class ElasticSearchOfferQueryBuilder extends AbstractElasticSearchQueryBuilder implements
OfferQueryBuilderInterface
{
/**
* @var \CultuurNet\UDB3\Search\ElasticSearch\PredefinedQueryFieldsInterface
*/
private $predefinedQueryStringFields;

/**
* @inheritdoc
*/
protected function getPredefinedQueryStringFields(Language ...$languages)
public function __construct()
{
$fields = [
'id',
'labels_free_text',
'terms_free_text.id',
'terms_free_text.label',
'performer_free_text.name',
'addressLocality',
'postalCode',
'streetAddress',
'location.id',
'organizer.id',
];

foreach ($languages as $language) {
$langCode = $language->getCode();
$fields = array_merge(
$fields,
[
"name.{$langCode}",
"description.{$langCode}",
"location.name.{$langCode}",
"organizer.name.{$langCode}",
]
);
}
parent::__construct();

$this->predefinedQueryStringFields = new OfferPredefinedQueryStringFields();
}

return $fields;
/**
* @inheritdoc
*/
protected function getPredefinedQueryStringFields(Language ...$languages)
{
return $this->predefinedQueryStringFields->getPredefinedFields(...$languages);
}

/**
Expand Down Expand Up @@ -410,6 +399,7 @@ public function withFacet(FacetName $facetName)
FacetName::TYPES()->toNative() => 'typeIds',
FacetName::THEMES()->toNative() => 'themeIds',
FacetName::FACILITIES()->toNative() => 'facilityIds',
FacetName::LABELS()->toNative() => 'labels.keyword',
];

if (!isset($facetFields[$facetName])) {
Expand Down
40 changes: 40 additions & 0 deletions src/Offer/OfferPredefinedQueryStringFields.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace CultuurNet\UDB3\Search\ElasticSearch\Offer;

use CultuurNet\UDB3\Language;
use CultuurNet\UDB3\Search\ElasticSearch\PredefinedQueryFieldsInterface;

class OfferPredefinedQueryStringFields implements PredefinedQueryFieldsInterface
{
public function getPredefinedFields(Language ...$languages)
{
$fields = [
'id',
'labels_free_text',
'terms_free_text.id',
'terms_free_text.label',
'performer_free_text.name',
'location.id',
'organizer.id',
];

foreach ($languages as $language) {
$langCode = $language->getCode();
$fields = array_merge(
$fields,
[
"name.{$langCode}",
"description.{$langCode}",
"address.{$langCode}.addressLocality",
"address.{$langCode}.postalCode",
"address.{$langCode}.streetAddress",
"location.name.{$langCode}",
"organizer.name.{$langCode}",
]
);
}

return $fields;
}
}
8 changes: 7 additions & 1 deletion src/Operations/json/mapping_event.json
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,13 @@
"labels": {
"type": "string",
"analyzer": "lowercase_exact_match_analyzer",
"search_analyzer": "lowercase_exact_match_analyzer"
"search_analyzer": "lowercase_exact_match_analyzer",
"fields": {
"keyword": {
"type": "keyword"
}
}

},
"labels_free_text": {
"type": "string"
Expand Down
7 changes: 6 additions & 1 deletion src/Operations/json/mapping_place.json
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,12 @@
"labels": {
"type": "string",
"analyzer": "lowercase_exact_match_analyzer",
"search_analyzer": "lowercase_exact_match_analyzer"
"search_analyzer": "lowercase_exact_match_analyzer",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"labels_free_text": {
"type": "string"
Expand Down
14 changes: 14 additions & 0 deletions src/PredefinedQueryFieldsInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace CultuurNet\UDB3\Search\ElasticSearch;

use CultuurNet\UDB3\Language;

interface PredefinedQueryFieldsInterface
{
/**
* @param Language[] $languages
* @return string[]
*/
public function getPredefinedFields(Language ...$languages);
}
26 changes: 26 additions & 0 deletions tests/AbstractElasticSearchQueryBuilderTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace CultuurNet\UDB3\Search\ElasticSearch;

use PHPUnit_Framework_TestCase;

abstract class AbstractElasticSearchQueryBuilderTest extends PHPUnit_Framework_TestCase
{
/**
* @param $value
* @return array
*/
protected function expectedTextQuery($value, array $fields = [])
{
$textQuery = [
'query' => $value,
'default_operator' => 'AND',
];

if (!empty($fields)) {
$textQuery += ['fields' => $fields];
}

return $textQuery;
}
}

0 comments on commit 90bc421

Please sign in to comment.