Tip: Create a base builder

You might find it useful to create a "base" builder, for you application. Doing so will allow you to specify common processors and configuration. The following shows a possible abstract builder, using the predefined processors that are available in this package.

Example: abstract builder

use Aedart\Filters\BaseBuilder as Builder;
use Aedart\Filters\Processors\MatchingProcessor;
use Aedart\Filters\Processors\SearchProcessor;
use Aedart\Filters\Processors\ConstraintsProcessor;
use Aedart\Filters\Processors\SortingProcessor;

abstract class BaseFiltersBuilder extends Builder
{
    public function processors(): array
    {
        return [
            'match' => MatchingProcessor::make(),

            'search' => SearchProcessor::make()
                ->columns($this->searchColumns()),

            'filter' => ConstraintsProcessor::make()
                ->filters($this->filters())
                ->propertiesToColumns($this->propertiesColumnsMap()),

            'sort' => SortingProcessor::make()
                ->sortable($this->sortable())
                ->propertiesToColumns($this->sortingPropertiesColumnsMap())
                ->defaultSort($this->defaultSorting())
                ->force()
        ];
    }

    /**
     * Get list of table columns that the search filter
     * must match search terms against
     *
     * @return string[]
     */
    abstract public function searchColumns(): array;

    /**
     * Get list of allowed filterable properties and
     * their corresponding filter to be used.
     *
     * @return array
     */
    abstract public function filters(): array;

    /**
     * Get map of properties and their corresponding table
     * column name.
     *
     * @return array
     */
    abstract public function propertiesColumnsMap(): array;

    /**
     * Map of properties and their corresponding table column name,
     * to be used for sorting.
     *
     * @see propertiesColumnsMap
     *
     * @return array
     */
    public function sortingPropertiesColumnsMap(): array
    {
        return $this->propertiesColumnsMap();
    }

    /**
     * Get list of sortable properties
     *
     * @return string[]
     */
    public function sortable(): array
    {
        return array_keys($this->filters());
    }

    /**
     * Get the default sorting value to be used, when
     * none is requested.
     *
     * @return string
     */
    abstract public function defaultSorting(): string;
} 

Example: concrete builder

class UsersFiltersBuilder extends BaseFiltersBuilder
{
    public function searchColumns(): array
    {
        return [
            'id',
            'name',
            'email',
        ];
    }

    public function filters(): array
    {
        return [
            'id' => NumericFilter::class,
            'name' => StringFilter::class,
            'email' => StringFilter::class,
            'administrator' => BooleanFilter::class,
            'email_verified_at' => DatetimeFilter::class,
            'created_at' => DatetimeFilter::class,
            'updated_at' => DatetimeFilter::class,
        ];
    }

    public function propertiesColumnsMap(): array
    {
        return [
            'administrator' => 'is_admin'
        ];
    }

    public function defaultSorting(): string
    {
        return 'id desc';
    }
}