scout icon indicating copy to clipboard operation
scout copied to clipboard

Typesense integration malforms boolean filters into integers.

Open bredmor opened this issue 1 year ago • 2 comments

Scout Version

10.11.3

Scout Driver

Typesense

Laravel Version

10.48.22

PHP Version

8.2.23

Database Driver & Version

No response

SDK Version

No response

Meilisearch CLI Version

No response

Description

While searching with a boolean filter (e.g. Model::search($query)->where('myFilter', true)->get), TypesenseEngine.php will transform the true value into 1 before passing it into the typesense-php SDK to be sent to the Typsense server. This results in a Typesense\Exceptions\RequestMalformed exception with a message of "Value of filter field myFilter must be true or false."

I believe I have narrowed the issue down to the method TypesenseEngine::filters(), specifically the calls to Collection::map() here:

protected function filters(Builder $builder): string
    {
        $whereFilter = collect($builder->wheres)
            ->map(fn ($value, $key) => $this->parseWhereFilter($value, $key))
            ->values()
            ->implode(' && ');

        $whereInFilter = collect($builder->whereIns)
            ->map(fn ($value, $key) => $this->parseWhereInFilter($value, $key))
            ->values()
            ->implode(' && ');

        return $whereFilter.(
            ($whereFilter !== '' && $whereInFilter !== '') ? ' && ' : ''
        ).$whereInFilter;
    }

Looking at the data within the Builder instance passed into this function, I see boolean values for the filter parameters. However when I look at the $value parameter passed into parseWhereFilter() I see a 1 where the Builder contained true.

Steps To Reproduce

  1. Install and configure Laravel Scout in a Laravel Project
  2. Configure a searchable model with a boolean field
  3. Sync any models necessary
  4. Attempt to perform a search on that model, filtering the boolean field to true
  5. Observe a RequestMalformed exception.

bredmor avatar Oct 18 '24 18:10 bredmor

Thinking on this, I wonder if it might be undesired functionality for the Collection/Array map() function to do this in general, or if it's expected and understood.

If the latter, I would be happy to write a PR to fix this issue for scout.

bredmor avatar Oct 18 '24 18:10 bredmor

I'll investigate as soon as possible and report back

tharropoulos avatar Oct 18 '24 18:10 tharropoulos

This has been merged, thanks @tharropoulos

crynobone avatar Nov 07 '24 03:11 crynobone