gnugat/search-engine

This package is abandoned and no longer maintained. No replacement package was suggested.

Component that tries to help you get the Query part in CQRS right

Maintainers

Package info

github.com/gnugat/search-engine

Homepage

Issues

pkg:composer/gnugat/search-engine

Statistics

Installs: 106

Dependents: 2

Suggesters: 0

Stars: 2

v0.3.0 2016-05-19 17:07 UTC

This package is auto-updated.

Last update: 2022-02-01 12:50:29 UTC


README

A Proof Of Concept demonstrating how to handle Interrogatory Messages (Query in CQRS).

The Command / Query Responsibility Segregation principle explains that Imperative and Interrogatory messages shouldn't be mixed together.

Note: Learn more about the different messaging flavours.

Usually imperative messages are handled using the CommandBus pattern, which leaves us with the following question: how Interrogatory Messages should be handled?

This component tries to explore one of the possible answers: a SearchEngine that would try to return results matching a given criteria.

Caution: this component does not provide actual SearchEngine features, if you're looking for one you should rather have a look at ElasticSearch, Solr, etc.

Installation

Download SearchEngine using Composer:

composer require gnugat/search-engine:^0.3

You'll also need to choose one of the following implementations:

Other possible implementations: PDO, Doctrine DBAL, Doctrine ORM, etc. In the tests directory you'll find an Array implementation example.

More information about implementations

Usage

SearchEngine expects a Criteria object which describes:

  • the resource to query
  • relations to embed
  • filters to apply
  • orderings instructions
  • pagination parameters

It can be built from query parameters as follow:

// ...
$criteria = $criteriaFactory->fromQueryParameters('blog', [
    // Filters
    'title' => 'IG',
    'author_ids' => '1,3',

    // Pagination
    'page' => '2',
    'per_page' => '3',

    // Ordering
    'sort' => 'author_id,-title',

    // Relation embeding
    'embed' => 'author',
]);
print_r(iterator_to_array(
    $searchEngine
        ->match($criteria)
        ->take(
            $criteria->paginating->offset,
            $criteria->paginating->itemsPerPage
        )
        ->getIterator()
));

In a web context, this $queryParameters array could actually be $_GET, corresponding to the following URL:

/v1/blogs?title=IG&author_ids=1,2&page=1&per_page=3&sort=author_id,-title&embed=author

The result could be the following:

[
    'items' => [
        [
            'id' => 1,
            'title' => 'Big Title',
            'author_id' => 1,
        ],
        [
            'id' => 2,
            'title' => 'Big Header',
            'author_id' => 2,
        ],
    ],
    'page' => [
        'current_page' => 1,
        'per_page' => 3,
        'total_elements' => 2,
        'total_pages' => 1,
    ],
]

Further documentation

You can see the current and past versions using one of the following:

You can find more documentation at the following links:

Next readings: