Skip to content

Commit b0e91d9

Browse files
committed
IDBPR-2554 Добавлены тесты на новые методы
1 parent f475bb8 commit b0e91d9

File tree

10 files changed

+99
-20
lines changed

10 files changed

+99
-20
lines changed

src/Concerns/DecoratesBoolQuery.php

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

55
use Closure;
6+
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreItem;
67
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreOptions;
78
use Ensi\LaravelElasticQuery\Contracts\MatchOptions;
89
use Ensi\LaravelElasticQuery\Contracts\MoreLikeOptions;
10+
use Ensi\LaravelElasticQuery\Contracts\MoreLikeThis;
911
use Ensi\LaravelElasticQuery\Contracts\MultiMatchOptions;
1012
use Ensi\LaravelElasticQuery\Contracts\WildcardOptions;
1113
use Ensi\LaravelElasticQuery\Filtering\BoolQueryBuilder;
12-
use Ensi\LaravelElasticQuery\Filtering\Criterias\FunctionScoreItem;
13-
use Ensi\LaravelElasticQuery\Filtering\Criterias\MoreLikeThis;
1414
use Illuminate\Contracts\Support\Arrayable;
1515
use Illuminate\Support\Traits\ForwardsCalls;
1616

src/Contracts/BoolQuery.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,12 @@ public function whereWildcard(string $field, string $query, ?WildcardOptions $op
4242
public function orWhereWildcard(string $field, string $query, ?WildcardOptions $options = null): static;
4343

4444
public function addMustBool(callable $fn): static;
45+
46+
public function whereMoreLikeThis(array $fields, MoreLikeThis $likeThis, ?MoreLikeOptions $options = null): static;
47+
48+
/**
49+
* @param array<FunctionScoreItem> $functions
50+
* @param ?FunctionScoreOptions $options
51+
*/
52+
public function addFunctionScore(array $functions, ?FunctionScoreOptions $options = null): static;
4553
}

src/Filtering/Criterias/FunctionScoreItem.php renamed to src/Contracts/FunctionScoreItem.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
<?php
22

3-
namespace Ensi\LaravelElasticQuery\Filtering\Criterias;
3+
namespace Ensi\LaravelElasticQuery\Contracts;
44

5-
use Ensi\LaravelElasticQuery\Contracts\Criteria;
5+
use Illuminate\Contracts\Support\Arrayable;
66

7-
class FunctionScoreItem implements Criteria
7+
class FunctionScoreItem implements Arrayable
88
{
99
public function __construct(
1010
private int $weight,
1111
private Criteria $filter,
1212
) {
1313
}
1414

15-
public function toDSL(): array
15+
public function toArray(): array
1616
{
1717
return [
1818
'weight' => $this->weight,

src/Contracts/FunctionScoreOptions.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ public static function make(
1515
?string $scoreMode = null,
1616
?string $boostMode = null,
1717
): static {
18-
Assert::oneOf($scoreMode, ScoreMode::cases());
19-
Assert::oneOf($boostMode, BoostMode::cases());
18+
Assert::nullOrOneOf($scoreMode, ScoreMode::cases());
19+
Assert::nullOrOneOf($boostMode, BoostMode::cases());
2020

2121
return new static(array_filter([
2222
'score_mode' => $scoreMode,

src/Contracts/MoreLikeOptions.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,26 @@ public function __construct(private array $options = [])
1111
}
1212

1313
public static function make(
14-
?int $minTermFreq = null,
1514
?int $maxQueryTerms = null,
15+
?int $minTermFreq = null,
16+
?int $minDocFreq = null,
17+
?int $maxDocFreq = null,
18+
?int $minWordLength = null,
19+
?int $maxWordLength = null,
20+
?array $stopWords = null,
21+
?string $analyzer = null,
1622
?string $minimumShouldMatch = null,
1723
): static {
1824

1925
return new static(array_filter([
20-
'min_term_freq' => $minTermFreq,
2126
'max_query_terms' => $maxQueryTerms,
27+
'min_term_freq' => $minTermFreq,
28+
'min_doc_freq' => $minDocFreq,
29+
'max_doc_freq' => $maxDocFreq,
30+
'min_word_length' => $minWordLength,
31+
'max_word_length' => $maxWordLength,
32+
'stop_words' => $stopWords,
33+
'analyzer' => $analyzer,
2234
'minimum_should_match' => $minimumShouldMatch,
2335
]));
2436
}

src/Filtering/Criterias/MoreLikeThis.php renamed to src/Contracts/MoreLikeThis.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<?php
22

3-
namespace Ensi\LaravelElasticQuery\Filtering\Criterias;
3+
namespace Ensi\LaravelElasticQuery\Contracts;
44

5-
use Ensi\LaravelElasticQuery\Contracts\Criteria;
5+
use Illuminate\Contracts\Support\Arrayable;
66

7-
class MoreLikeThis implements Criteria
7+
class MoreLikeThis implements Arrayable
88
{
99
private array $this = [];
1010

@@ -25,7 +25,7 @@ public function addString(string $token): static
2525
return $this;
2626
}
2727

28-
public function toDSL(): array
28+
public function toArray(): array
2929
{
3030
return $this->this;
3131
}

src/Filtering/BoolQueryBuilder.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
use Ensi\LaravelElasticQuery\Concerns\SupportsPath;
77
use Ensi\LaravelElasticQuery\Contracts\BoolQuery;
88
use Ensi\LaravelElasticQuery\Contracts\Criteria;
9+
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreItem;
910
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreOptions;
1011
use Ensi\LaravelElasticQuery\Contracts\MatchOptions;
1112
use Ensi\LaravelElasticQuery\Contracts\MoreLikeOptions;
13+
use Ensi\LaravelElasticQuery\Contracts\MoreLikeThis;
1214
use Ensi\LaravelElasticQuery\Contracts\MultiMatchOptions;
1315
use Ensi\LaravelElasticQuery\Contracts\WildcardOptions;
14-
use Ensi\LaravelElasticQuery\Filtering\Criterias\FunctionScoreItem;
15-
use Ensi\LaravelElasticQuery\Filtering\Criterias\MoreLikeThis;
1616
use Ensi\LaravelElasticQuery\Filtering\Criterias\Exists;
1717
use Ensi\LaravelElasticQuery\Filtering\Criterias\FunctionScore;
1818
use Ensi\LaravelElasticQuery\Filtering\Criterias\MoreLike;

src/Filtering/Criterias/FunctionScore.php

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

55
use Ensi\LaravelElasticQuery\Contracts\Criteria;
6+
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreItem;
67
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreOptions;
7-
use Ensi\LaravelElasticQuery\Filtering\Criterias\FunctionScoreItem;
88
use stdClass;
99
use Webmozart\Assert\Assert;
1010

@@ -25,7 +25,7 @@ public function toDSL(): array
2525
{
2626
$body = [
2727
'query' => ['match_all' => new stdClass()],
28-
'functions' => array_map(fn (FunctionScoreItem $function) => $function->toDSL(), $this->functions),
28+
'functions' => array_map(fn (FunctionScoreItem $function) => $function->toArray(), $this->functions),
2929
];
3030

3131
if ($this->options) {

src/Filtering/Criterias/MoreLike.php

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

55
use Ensi\LaravelElasticQuery\Contracts\Criteria;
66
use Ensi\LaravelElasticQuery\Contracts\MoreLikeOptions;
7-
use Ensi\LaravelElasticQuery\Filtering\Criterias\MoreLikeThis;
7+
use Ensi\LaravelElasticQuery\Contracts\MoreLikeThis;
88
use Webmozart\Assert\Assert;
99

1010
class MoreLike implements Criteria
@@ -22,7 +22,7 @@ public function toDSL(): array
2222
{
2323
$body = [
2424
'fields' => $this->fields,
25-
'like' => $this->likeThis->toDSL(),
25+
'like' => $this->likeThis->toArray(),
2626
];
2727

2828
if ($this->options) {

tests/IntegrationTests/Search/SearchQueryIntegrationTest.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
11
<?php
22

33
use Ensi\LaravelElasticQuery\Contracts\BoolQuery;
4+
use Ensi\LaravelElasticQuery\Contracts\BoostMode;
5+
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreItem;
6+
use Ensi\LaravelElasticQuery\Contracts\FunctionScoreOptions;
7+
use Ensi\LaravelElasticQuery\Contracts\MoreLikeOptions;
8+
use Ensi\LaravelElasticQuery\Contracts\MoreLikeThis;
9+
use Ensi\LaravelElasticQuery\Contracts\ScoreMode;
410
use Ensi\LaravelElasticQuery\Contracts\SortableQuery;
11+
use Ensi\LaravelElasticQuery\Filtering\Criterias\Terms;
512
use Ensi\LaravelElasticQuery\Tests\Data\Models\ProductsIndex;
613
use Ensi\LaravelElasticQuery\Tests\IntegrationTestCase;
714
use Ensi\LaravelElasticQuery\Tests\IntegrationTests\Search\TestCases\SearchIntegrationTestCase;
815

916
use function PHPUnit\Framework\assertArrayNotHasKey;
17+
use function PHPUnit\Framework\assertContains;
1018
use function PHPUnit\Framework\assertCount;
1119
use function PHPUnit\Framework\assertEquals;
20+
use function PHPUnit\Framework\assertEqualsCanonicalizing;
1221

1322
uses(SearchIntegrationTestCase::class);
1423

@@ -111,3 +120,53 @@
111120

112121
assertCount(2, $result);
113122
});
123+
124+
test('search query more like this', function (array $fields, MoreLikeThis $likeThis, array $expectedIds) {
125+
/** @var SearchIntegrationTestCase $this */
126+
127+
$result = ProductsIndex::query()
128+
->whereMoreLikeThis(
129+
$fields,
130+
$likeThis,
131+
MoreLikeOptions::make(
132+
minTermFreq: 1,
133+
minDocFreq: 1,
134+
)
135+
)
136+
->get();
137+
138+
assertEqualsCanonicalizing($expectedIds, $result->pluck('_id')->all());
139+
})->with([
140+
'array id' => [['tags'], (new MoreLikeThis())->addId('405'), ['150']],
141+
'array string' => [['tags'], (new MoreLikeThis())->addString('drinks'), ['150', '405']],
142+
'full text id' => [['description'], (new MoreLikeThis())->addId('1'), ['150', '328', '471']],
143+
'full text string' => [['description'], (new MoreLikeThis())->addString('description'), ['1', '150', '471']],
144+
'full text combine' => [['description'], (new MoreLikeThis())->addId('1')->addString('water'), ['150', '328', '405', '471']],
145+
]);
146+
147+
test('search query add function score', function () {
148+
/** @var SearchIntegrationTestCase $this */
149+
150+
$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+
],
161+
FunctionScoreOptions::make(
162+
scoreMode: ScoreMode::SUM,
163+
boostMode: BoostMode::SUM
164+
)
165+
)
166+
->get();
167+
168+
assertCount(6, $result);
169+
170+
assertContains('drinks', $result[0]['_source']['tags']);
171+
assertContains('drinks', $result[1]['_source']['tags']);
172+
});

0 commit comments

Comments
 (0)