Skip to content

Commit 379a152

Browse files
authored
Merge pull request #110 from ensi-platform/v7-ecs-1970
ECS-1970
2 parents 2dbc99e + bb578f0 commit 379a152

File tree

8 files changed

+60
-45
lines changed

8 files changed

+60
-45
lines changed

src/Concerns/DecoratesBoolQuery.php

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@
44

55
use Closure;
66
use Ensi\LaravelElasticQuery\Contracts\DSLAware;
7-
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreItem;
8-
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreOptions;
97
use Ensi\LaravelElasticQuery\Contracts\MatchOptions;
108
use Ensi\LaravelElasticQuery\Contracts\MoreLikeOptions;
119
use Ensi\LaravelElasticQuery\Contracts\MoreLikeThis;
1210
use Ensi\LaravelElasticQuery\Contracts\MultiMatchOptions;
1311
use Ensi\LaravelElasticQuery\Contracts\WildcardOptions;
1412
use Ensi\LaravelElasticQuery\Filtering\BoolQueryBuilder;
13+
use Ensi\LaravelElasticQuery\Filtering\Criterias\FunctionScore;
1514
use Illuminate\Contracts\Support\Arrayable;
1615
use Illuminate\Support\Traits\ForwardsCalls;
1716

@@ -161,12 +160,7 @@ public function whereBetween(string $field, mixed $from, mixed $to): static
161160
return $this;
162161
}
163162

164-
/**
165-
* @param array<FunctionScoreItem> $functions
166-
* @param ?DSLAware $query
167-
* @param ?FunctionScoreOptions $options
168-
*/
169-
public function addFunctionScore(array $functions, ?DSLAware $query = null, ?FunctionScoreOptions $options = null): static
163+
public function orFunctionScore(FunctionScore $functionScore): static
170164
{
171165
$this->forwardCallTo($this->boolQuery(), __FUNCTION__, func_get_args());
172166

src/Contracts/BoolQuery.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Ensi\LaravelElasticQuery\Contracts;
44

55
use Closure;
6+
use Ensi\LaravelElasticQuery\Filtering\Criterias\FunctionScore;
67
use Illuminate\Contracts\Support\Arrayable;
78

89
interface BoolQuery
@@ -47,12 +48,7 @@ public function whereMoreLikeThis(array $fields, MoreLikeThis $likeThis, ?MoreLi
4748

4849
public function whereBetween(string $field, mixed $from, mixed $to): static;
4950

50-
/**
51-
* @param array<FunctionScoreItem> $functions
52-
* @param ?DSLAware $query
53-
* @param ?FunctionScoreOptions $options
54-
*/
55-
public function addFunctionScore(array $functions, ?DSLAware $query = null, ?FunctionScoreOptions $options = null): static;
51+
public function orFunctionScore(FunctionScore $functionScore): static;
5652

5753
public function pinned(array $ids, ?DSLAware $query = null): static;
5854
}

src/Contracts/FunctionScoreItem.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@
77
class FunctionScoreItem implements Arrayable
88
{
99
public function __construct(
10-
private int $weight,
11-
private Criteria $filter,
10+
protected int $weight,
11+
protected Criteria $filter,
1212
) {
1313
}
1414

1515
public function toArray(): array
1616
{
1717
return [
18-
'weight' => $this->weight,
1918
'filter' => $this->filter->toDSL(),
19+
'weight' => $this->weight,
2020
];
2121
}
2222
}

src/Contracts/FunctionScoreOptions.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
class FunctionScoreOptions implements Arrayable
99
{
10-
public function __construct(private array $options = [])
10+
public function __construct(protected array $options = [])
1111
{
1212
}
1313

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Ensi\LaravelElasticQuery\Contracts;
4+
5+
class FunctionScoreScript implements DSLAware
6+
{
7+
public function __construct(
8+
protected string $source,
9+
protected array $params = [],
10+
) {
11+
}
12+
13+
public function toDSL(): array
14+
{
15+
return ['script' => array_filter([
16+
'source' => $this->source,
17+
'params' => $this->params,
18+
])];
19+
}
20+
}

src/Filtering/BoolQueryBuilder.php

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
use Ensi\LaravelElasticQuery\Contracts\BoolQuery;
88
use Ensi\LaravelElasticQuery\Contracts\Criteria;
99
use Ensi\LaravelElasticQuery\Contracts\DSLAware;
10-
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreItem;
11-
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreOptions;
1210
use Ensi\LaravelElasticQuery\Contracts\MatchOptions;
1311
use Ensi\LaravelElasticQuery\Contracts\MoreLikeOptions;
1412
use Ensi\LaravelElasticQuery\Contracts\MoreLikeThis;
@@ -268,14 +266,9 @@ public function whereBetween(string $field, mixed $from, mixed $to): static
268266
return $this;
269267
}
270268

271-
/**
272-
* @param array<FunctionScoreItem> $functions
273-
* @param ?DSLAware $query
274-
* @param ?FunctionScoreOptions $options
275-
*/
276-
public function addFunctionScore(array $functions, ?DSLAware $query = null, ?FunctionScoreOptions $options = null): static
269+
public function orFunctionScore(FunctionScore $functionScore): static
277270
{
278-
$this->should->add(new FunctionScore($functions, $query, $options));
271+
$this->should->add($functionScore);
279272

280273
return $this;
281274
}

src/Filtering/Criterias/FunctionScore.php

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,43 @@
66
use Ensi\LaravelElasticQuery\Contracts\DSLAware;
77
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreItem;
88
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreOptions;
9+
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreScript;
910
use stdClass;
1011
use Webmozart\Assert\Assert;
1112

1213
class FunctionScore implements Criteria
1314
{
1415
/**
1516
* @param array<FunctionScoreItem> $functions
16-
* @param FunctionScoreOptions|null $options
1717
*/
1818
public function __construct(
19-
private array $functions,
20-
private ?DSLAware $query = null,
21-
private ?FunctionScoreOptions $options = null,
19+
protected ?DSLAware $query = null,
20+
protected ?FunctionScoreOptions $options = null,
21+
protected array $functions = [],
22+
protected ?FunctionScoreScript $scriptScore = null,
23+
protected ?float $weight = null,
2224
) {
23-
array_map(fn ($function) => Assert::isInstanceOfAny($function, [FunctionScoreItem::class]), $functions);
25+
Assert::allIsInstanceOfAny($functions, [FunctionScoreItem::class]);
2426
}
2527

2628
public function toDSL(): array
2729
{
2830
$body = [
2931
'query' => $this->query?->toDSL() ?? ['match_all' => new stdClass()],
30-
'functions' => array_map(fn (FunctionScoreItem $function) => $function->toArray(), $this->functions),
3132
];
3233

34+
if ($this->functions) {
35+
$body['functions'] = array_map(fn (FunctionScoreItem $function) => $function->toArray(), $this->functions);
36+
}
37+
38+
if ($this->scriptScore) {
39+
$body['script_score'] = $this->scriptScore->toDSL();
40+
}
41+
42+
if (!is_null($this->weight)) {
43+
$body['weight'] = $this->weight;
44+
}
45+
3346
if ($this->options) {
3447
$body = array_merge($this->options->toArray(), $body);
3548
}

tests/IntegrationTests/Search/SearchQueryIntegrationTest.php

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Ensi\LaravelElasticQuery\Contracts\MoreLikeThis;
99
use Ensi\LaravelElasticQuery\Contracts\ScoreMode;
1010
use Ensi\LaravelElasticQuery\Contracts\SortableQuery;
11+
use Ensi\LaravelElasticQuery\Filtering\Criterias\FunctionScore;
1112
use Ensi\LaravelElasticQuery\Filtering\Criterias\Terms;
1213
use Ensi\LaravelElasticQuery\Tests\Data\Models\ProductsIndex;
1314
use Ensi\LaravelElasticQuery\Tests\IntegrationTestCase;
@@ -148,21 +149,19 @@
148149
/** @var SearchIntegrationTestCase $this */
149150

150151
$result = ProductsIndex::query()
151-
->addFunctionScore(
152-
[
153-
new FunctionScoreItem(
154-
weight: 10,
155-
filter: new Terms(
156-
field: "tags",
157-
values: ["drinks"],
158-
),
159-
),
160-
],
152+
->orFunctionScore(new FunctionScore(
161153
options: FunctionScoreOptions::make(
162154
scoreMode: ScoreMode::SUM,
163155
boostMode: BoostMode::SUM
164-
)
165-
)
156+
),
157+
functions: [new FunctionScoreItem(
158+
weight: 10,
159+
filter: new Terms(
160+
field: "tags",
161+
values: ["drinks"],
162+
),
163+
)],
164+
))
166165
->get();
167166

168167
assertCount(6, $result);

0 commit comments

Comments
 (0)