Skip to content

Commit 334f052

Browse files
committed
#107572
1 parent d37c14e commit 334f052

File tree

5 files changed

+92
-0
lines changed

5 files changed

+92
-0
lines changed

src/Concerns/DecoratesBoolQuery.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Closure;
66
use Ensi\LaravelElasticQuery\Contracts\MatchOptions;
77
use Ensi\LaravelElasticQuery\Contracts\MultiMatchOptions;
8+
use Ensi\LaravelElasticQuery\Contracts\WildcardOptions;
89
use Ensi\LaravelElasticQuery\Filtering\BoolQueryBuilder;
910
use Illuminate\Contracts\Support\Arrayable;
1011
use Illuminate\Support\Traits\ForwardsCalls;
@@ -84,4 +85,11 @@ public function whereMultiMatch(array $fields, string $query, string|MultiMatchO
8485

8586
return $this;
8687
}
88+
89+
public function whereWildcard(string $field, string $query, ?WildcardOptions $options = null): static
90+
{
91+
$this->forwardCallTo($this->boolQuery(), __FUNCTION__, func_get_args());
92+
93+
return $this;
94+
}
8795
}

src/Contracts/WildcardOptions.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Ensi\LaravelElasticQuery\Contracts;
4+
5+
class WildcardOptions
6+
{
7+
public function __construct(private array $options = [])
8+
{
9+
}
10+
11+
public static function make(
12+
?float $boost = null,
13+
?bool $caseInsensitive = null,
14+
?string $rewrite = null,
15+
): static {
16+
$options = [];
17+
if (!is_null($boost)) {
18+
$options['boost'] = $boost;
19+
}
20+
if (!is_null($caseInsensitive)) {
21+
$options['case_insensitive'] = $caseInsensitive;
22+
}
23+
if (!is_null($rewrite)) {
24+
$options['rewrite'] = $rewrite;
25+
}
26+
return new static($options);
27+
}
28+
29+
public function toArray(): array
30+
{
31+
return $this->options;
32+
}
33+
}

src/Filtering/BoolQueryBuilder.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
use Ensi\LaravelElasticQuery\Contracts\Criteria;
99
use Ensi\LaravelElasticQuery\Contracts\MatchOptions;
1010
use Ensi\LaravelElasticQuery\Contracts\MultiMatchOptions;
11+
use Ensi\LaravelElasticQuery\Contracts\WildcardOptions;
1112
use Ensi\LaravelElasticQuery\Filtering\Criterias\Exists;
1213
use Ensi\LaravelElasticQuery\Filtering\Criterias\MultiMatch;
1314
use Ensi\LaravelElasticQuery\Filtering\Criterias\Nested;
1415
use Ensi\LaravelElasticQuery\Filtering\Criterias\OneMatch;
1516
use Ensi\LaravelElasticQuery\Filtering\Criterias\RangeBound;
1617
use Ensi\LaravelElasticQuery\Filtering\Criterias\Term;
1718
use Ensi\LaravelElasticQuery\Filtering\Criterias\Terms;
19+
use Ensi\LaravelElasticQuery\Filtering\Criterias\Wildcard;
1820
use Illuminate\Contracts\Support\Arrayable;
1921
use stdClass;
2022

@@ -165,6 +167,13 @@ public function whereMultiMatch(array $fields, string $query, string|MultiMatchO
165167
return $this;
166168
}
167169

170+
public function whereWildcard(string $field, string $query, ?WildcardOptions $options = null): static
171+
{
172+
$this->must->add(new Wildcard($this->absolutePath($field), $query, $options ?: new WildcardOptions()));
173+
174+
return $this;
175+
}
176+
168177
protected function addNestedCriteria(string $nested, Closure $filter, CriteriaCollection $target): static
169178
{
170179
$path = $this->absolutePath($nested);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace Ensi\LaravelElasticQuery\Filtering\Criterias;
4+
5+
use Ensi\LaravelElasticQuery\Contracts\Criteria;
6+
use Ensi\LaravelElasticQuery\Contracts\WildcardOptions;
7+
8+
class Wildcard implements Criteria
9+
{
10+
public function __construct(private string $field, private string $query, private WildcardOptions $options)
11+
{
12+
}
13+
14+
public function toDSL(): array
15+
{
16+
return ['wildcard' => [
17+
$this->field => array_merge($this->options->toArray(), [
18+
'value' => $this->query,
19+
])
20+
]];
21+
}
22+
}

tests/Unit/Filtering/BoolQueryTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Ensi\LaravelElasticQuery\Contracts\MatchOptions;
77
use Ensi\LaravelElasticQuery\Contracts\MatchType;
88
use Ensi\LaravelElasticQuery\Contracts\MultiMatchOptions;
9+
use Ensi\LaravelElasticQuery\Contracts\WildcardOptions;
910
use Ensi\LaravelElasticQuery\Filtering\BoolQueryBuilder;
1011
use Ensi\LaravelElasticQuery\Tests\AssertsArray;
1112
use Ensi\LaravelElasticQuery\Tests\Unit\UnitTestCase;
@@ -181,4 +182,23 @@ public function provideMultiMatch(): array
181182
],
182183
];
183184
}
185+
186+
/**
187+
* @dataProvider provideWildcard
188+
*/
189+
public function testWildcard(?WildcardOptions $options, array $expected): void
190+
{
191+
$dsl = BoolQueryBuilder::make()->whereWildcard('foo', '%value%', $options)->toDSL();
192+
193+
$this->assertArrayFragment(['wildcard' => ['foo' => array_merge(['value' => '%value%'], $expected)]], $dsl);
194+
}
195+
196+
public function provideWildcard(): array
197+
{
198+
return [
199+
'empty options' => [WildcardOptions::make(0, false), ['boost' => 0, 'case_insensitive' => false]],
200+
'full options' => [WildcardOptions::make(0.5, true), ['boost' => 0.5, 'case_insensitive' => true]],
201+
'rewrite options' => [WildcardOptions::make(rewrite: 'constant_score'), ['rewrite' => 'constant_score']],
202+
];
203+
}
184204
}

0 commit comments

Comments
 (0)