Skip to content

Decouple Builder from Elastic\Elasticsearch\Client #69

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 24 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@ use Spatie\ElasticsearchQueryBuilder\Queries\MatchQuery;

$client = Elastic\Elasticsearch\ClientBuilder::create()->build();

$companies = (new Builder($client))
$query = (new Builder())
->index('companies')
->addQuery(MatchQuery::create('name', 'spatie', fuzziness: 3))
->addAggregation(MaxAggregation::create('score'))
->search();
->params();
$companies = $client->search($query);
```

## Support us
Expand All @@ -43,21 +44,22 @@ composer require spatie/elasticsearch-query-builder

## Basic usage

The only class you really need to interact with is the `Spatie\ElasticsearchQueryBuilder\Builder` class. It requires an `\Elastic\Elasticsearch\Client` passed in the constructor. Take a look at the [ElasticSearch SDK docs](https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/installation.html) to learn more about connecting to your ElasticSearch cluster.
The only class you really need to interact with is the `Spatie\ElasticsearchQueryBuilder\Builder` class.

The `Builder` class contains some methods to [add queries](#adding-queries), [aggregations](#adding-aggregations), [sorts](#adding-sorts), [fields](#retrieve-specific-fields) and some extras for [pagination](#pagination). You can read more about these methods below. Once you've fully built-up the query you can use `$builder->search()` to execute the query or `$builder->getPayload()` to get the raw payload for ElasticSearch.
The `Builder` class contains some methods to [add queries](#adding-queries), [aggregations](#adding-aggregations), [sorts](#adding-sorts), [fields](#retrieve-specific-fields) and some extras for [pagination](#pagination). You can read more about these methods below. Once you've fully built-up the query you can use `$builder->params()` to get the full payload for ElasticSearch.

```php
use Spatie\ElasticsearchQueryBuilder\Queries\RangeQuery;
use Spatie\ElasticsearchQueryBuilder\Builder;

$client = Elastic\Elasticsearch\ClientBuilder::create()->build();

$builder = new Builder($client);
$builder = new Builder();

$builder->addQuery(RangeQuery::create('age')->gte(18));

$results = $builder->search(); // raw response from ElasticSearch
$params = $builder->params();
$results = $client->search($params); // raw response from ElasticSearch
```

#### Multi-Search Queries
Expand Down Expand Up @@ -212,7 +214,7 @@ use Spatie\ElasticsearchQueryBuilder\Sorts\Sort;
use Spatie\ElasticsearchQueryBuilder\Builder;

// Initialize ExtendedBuilder with an Elasticsearch client
$builder = new Builder($client);
$builder = new Builder();

// Apply collapse to group by 'user_id'
$builder->collapse(
Expand All @@ -229,7 +231,8 @@ $builder->collapse(
);

// Execute the search
$response = $builder->search();
$params = $builder->params();
$response = $client->search($params);
```

### Chaining multiple queries
Expand Down Expand Up @@ -257,9 +260,11 @@ The `$builder->addAggregation()` method can be used to add any of the available
use Spatie\ElasticsearchQueryBuilder\Aggregations\TermsAggregation;
use Spatie\ElasticsearchQueryBuilder\Builder;

$results = (new Builder(Elastic\Elasticsearch\ClientBuilder::create()->build()))
$client = Elastic\Elasticsearch\ClientBuilder::create()->build();
$params = (new Builder())
->addAggregation(TermsAggregation::create('genres', 'genre'))
->search();
->params();
$results = $client->search($params);

$genres = $results['aggregations']['genres']['buckets'];
```
Expand Down Expand Up @@ -460,11 +465,12 @@ use Spatie\ElasticsearchQueryBuilder\Builder;

$pageSize = 100;
$pageNumber = $_GET['page'] ?? 1;

$pageResults = (new Builder(Elastic\Elasticsearch\ClientBuilder::create()))
$client = Elastic\Elasticsearch\ClientBuilder::create();
$pageResults = (new Builder())
->size($pageSize)
->from(($pageNumber - 1) * $pageSize)
->search();
->params();
$pageResults = $client->search($params);
```

## Multi-Search Query Builder
Expand All @@ -478,18 +484,19 @@ use Spatie\ElasticsearchQueryBuilder\MultiBuilder;
use Spatie\ElasticsearchQueryBuilder\Builder;

$client = Elastic\Elasticsearch\ClientBuilder::create();
$multiBuilder = (new MultiBuilder($client));
$multiBuilder = (new MultiBuilder());

$multiBuilder->addBuilder(
(new Builder($client))->index('custom_index')->size(10)
(new Builder())->index('custom_index')->size(10)
);
// you can pass the index name to the addBuilder method second param
$multiBuilder->addBuilder(
(new Builder($client))->size(10)
(new Builder())->size(10)
'different_index'
);

$multiResults = $multiBuilder->search();
$params = $multiBuilder->search();
$multiResults = $client->msearch($params);
```

Returns the following response JSON shape:
Expand Down
2 changes: 0 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,7 @@
"php": "^8.0"
},
"require-dev": {
"elasticsearch/elasticsearch": "^8.0",
"friendsofphp/php-cs-fixer": "^2.17",
"php-http/mock-client": "^1.5",
"phpunit/phpunit": "^9.5",
"spatie/ray": "^1.10",
"vimeo/psalm": "^4.3"
Expand Down
9 changes: 3 additions & 6 deletions src/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@

namespace Spatie\ElasticsearchQueryBuilder;

use Elastic\Elasticsearch\Client;
use Elastic\Elasticsearch\Response\Elasticsearch;
use Http\Promise\Promise;
use Spatie\ElasticsearchQueryBuilder\Aggregations\Aggregation;
use Spatie\ElasticsearchQueryBuilder\Queries\BoolQuery;
use Spatie\ElasticsearchQueryBuilder\Queries\NestedQuery\InnerHits;
Expand Down Expand Up @@ -41,7 +38,7 @@ class Builder

protected ?array $collapse = null;

public function __construct(protected Client $client)
public function __construct()
{
}

Expand Down Expand Up @@ -78,7 +75,7 @@ public function addSort(Sorting $sort): static
return $this;
}

public function search(): Elasticsearch|Promise
public function params(): array
{
$payload = $this->getPayload();

Expand All @@ -102,7 +99,7 @@ public function search(): Elasticsearch|Promise
$params['track_total_hits'] = true;
}

return $this->client->search($params);
return $params;
}

public function index(string $searchIndex): static
Expand Down
12 changes: 2 additions & 10 deletions src/MultiBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,10 @@

namespace Spatie\ElasticsearchQueryBuilder;

use Elastic\Elasticsearch\Client;
use Elastic\Elasticsearch\Response\Elasticsearch;
use Http\Promise\Promise;

class MultiBuilder
{
protected ?array $builders = [];

public function __construct(protected Client $client)
{
}

public function addBuilder(Builder $builder, ?string $indexName = null): static
{
$this->builders[] = [
Expand All @@ -37,14 +29,14 @@ public function getPayload(): array
return $payload;
}

public function search(): Elasticsearch|Promise
public function params(): array
{
$payload = $this->getPayload();

$params = [
'body' => $payload,
];

return $this->client->msearch($params);
return $params;
}
}
21 changes: 3 additions & 18 deletions tests/Builders/BuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

namespace Spatie\ElasticsearchQueryBuilder\Tests\Builders;

use Elastic\Elasticsearch\Client;
use Elastic\Transport\TransportBuilder;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
use Spatie\ElasticsearchQueryBuilder\Builder;
Expand All @@ -12,19 +10,6 @@

class BuilderTest extends TestCase
{
protected Client $client;

public function setUp(): void
{
$transport = TransportBuilder::create()
->setClient(new \Http\Mock\Client())
->build();

$logger = $this->createStub(LoggerInterface::class);

$this->client = new Client($transport, $logger);
}

public function testGeneratesCollapseWithPlainArrayData(): void
{
$innerHits = [
Expand All @@ -35,7 +20,7 @@ public function testGeneratesCollapseWithPlainArrayData(): void
],
];

$builder = (new Builder($this->client))
$builder = (new Builder())
->collapse('group_id', $innerHits);

self::assertEquals(
Expand All @@ -50,7 +35,7 @@ public function testGeneratesCollapseWithInnerHitsObject(): void
->size(1)
->addSort(new Sort('name.keyword', 'asc'));

$builder = (new Builder($this->client))
$builder = (new Builder())
->collapse('group_id', $innerHits);

self::assertEquals(
Expand All @@ -75,7 +60,7 @@ public function testGeneratesCollapseWithInnerHitsObject(): void

public function testMinScoreIsAppliedToThePayload(): void
{
$payload = (new Builder($this->client))
$payload = (new Builder())
->minScore(0.1)
->getPayload();

Expand Down
18 changes: 4 additions & 14 deletions tests/Builders/MultiBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

namespace Spatie\ElasticsearchQueryBuilder\Tests\Builders;

use Elastic\Elasticsearch\Client;
use Elastic\Transport\TransportBuilder;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
use Spatie\ElasticsearchQueryBuilder\Builder;
Expand All @@ -18,15 +16,7 @@ class MultiBuilderTest extends TestCase

protected function setUp(): void
{
$transport = TransportBuilder::create()
->setClient(new \Http\Mock\Client())
->build();

$logger = $this->createStub(LoggerInterface::class);

$this->client = new Client($transport, $logger);

$this->multiBuilder = new MultiBuilder($this->client);
$this->multiBuilder = new MultiBuilder();
}

public function testEmptyPayloadGeneratesCorrectly(): void
Expand All @@ -37,7 +27,7 @@ public function testEmptyPayloadGeneratesCorrectly(): void
public function testSingleBuilderPayloadGeneratesCorrectly(): void
{
$this->multiBuilder->addBuilder(
(new Builder($this->client))->addQuery(TermQuery::create('test', 'value'))
(new Builder())->addQuery(TermQuery::create('test', 'value'))
);

$payload = $this->multiBuilder->getPayload();
Expand All @@ -62,12 +52,12 @@ public function testSingleBuilderPayloadGeneratesCorrectly(): void
public function testMultipleBuilderPayloadGeneratesCorrectly(): void
{
$this->multiBuilder->addBuilder(
(new Builder($this->client))
(new Builder())
->index('firstIndex')
->addQuery(TermQuery::create('keyword', 'value'), 'filter'),
);
$this->multiBuilder->addBuilder(
(new Builder($this->client))
(new Builder())
->addQuery(TermQuery::create('keyword', 'value'), 'filter'),
'secondIndex'
);
Expand Down
14 changes: 1 addition & 13 deletions tests/Queries/CollapseTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

namespace Spatie\ElasticsearchQueryBuilder\Tests\Queries;

use Elastic\Elasticsearch\Client;
use Elastic\Transport\TransportBuilder;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
use Spatie\ElasticsearchQueryBuilder\Builder;
Expand All @@ -13,19 +11,9 @@ class CollapseTest extends TestCase

private Builder $builder;

private Client $client;

protected function setUp(): void
{
$transport = TransportBuilder::create()
->setClient(new \Http\Mock\Client())
->build();

$logger = $this->createStub(LoggerInterface::class);

$this->client = new Client($transport, $logger);

$this->builder = new Builder($this->client);
$this->builder = new Builder();
}

public function testCollapseIsAddedToPayload()
Expand Down