Skip to content
Merged
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
15 changes: 11 additions & 4 deletions src/DataSource/ProcessDataSource.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

class ProcessDataSource
{
public mixed $datasource = null;

public function __construct(
public PowerGridComponent $component,
public array $properties = [],
Expand All @@ -25,20 +27,25 @@ public static function make(PowerGridComponent $powerGridComponent, array $prope
*/
public function get(bool $isExport = false): array
{
if (is_null($this->datasource)) {
$this->datasource = $this->component->datasource($this->properties);
}

$datasource = is_object($this->datasource) ? clone $this->datasource : $this->datasource;

$processors = [
CollectionProcessor::class,
ScoutBuilderProcessor::class,
];

foreach ($processors as $processor) {
// @phpstan-ignore-next-line
if ($processor::match($this->component->datasource($this->properties))) {
if ($processor::match($datasource)) {
$instance = new $processor($this->component, $isExport);

return $instance->process($this->properties);
return $instance->process($this->properties, $datasource);
}
}

return (new ModelProcessor($this->component, $isExport))->process($this->properties);
return (new ModelProcessor($this->component, $isExport))->process($this->properties, $datasource);
}
}
4 changes: 2 additions & 2 deletions src/DataSource/Processors/CollectionProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ public static function match(mixed $key): bool
|| is_iterable($key);
}

public function process(array $properties = []): array
public function process(array $properties = [], mixed $datasource = null): array
{
$datasource = $this->component->datasource($properties);
$datasource = $datasource ?? $this->component->datasource($properties);

$collection = new BaseCollection($datasource);

Expand Down
4 changes: 2 additions & 2 deletions src/DataSource/Processors/ModelProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ public static function match(mixed $key): bool
return true;
}

public function process(array $properties = []): array
public function process(array $properties = [], mixed $datasource = null): array
{
$datasource = $this->component->datasource($properties);
$datasource = $datasource ?? $this->component->datasource($properties);

$this->setCurrentTable($datasource);

Expand Down
4 changes: 2 additions & 2 deletions src/DataSource/Processors/ScoutBuilderProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ public static function match(mixed $key): bool
return $key instanceof ScoutBuilder;
}

public function process(array $properties = []): array
public function process(array $properties = [], mixed $datasource = null): array
{
/** @var ScoutBuilder $datasource */
$datasource = $this->component->datasource($properties);
$datasource = $datasource ?? $this->component->datasource($properties);

/** @var ScoutBuilder $query */
$query = app(Pipeline::class)
Expand Down
8 changes: 7 additions & 1 deletion src/PowerGridComponent.php
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,13 @@ private function getRecordsFromCache(): mixed
$customTag = strval(data_get($this->setUp, 'cache.tag'));
$ttl = intval(data_get($this->setUp, 'cache.ttl'));

$tag = $prefix.($customTag ?: 'powergrid-'.$this->datasource()->getModel()->getTable().'-'.$this->tableName);
if (filled($customTag)) {
$tag = $prefix.$customTag;
} else {
$datasource = $this->datasource();
$table = method_exists($datasource, 'getModel') ? $datasource->getModel()->getTable() : $this->tableName;
$tag = $prefix.'powergrid-'.$table.'-'.$this->tableName;
}
$cacheKey = implode('-', $this->getCacheKeys());

/** @var array $results */
Expand Down
2 changes: 1 addition & 1 deletion src/Traits/ExportableJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ private function prepareToExport(array $properties = []): Eloquent\Collection|Co
: $currentTable.'.'.$property;
};

$results = $this->componentTable->datasource($this->properties ?? []) // @phpstan-ignore-line
$results = $processDataSource->datasource
->where(function ($query) {
app()->makeWith(SearchHandlerContract::class, [
'component' => $this->componentTable,
Expand Down
6 changes: 3 additions & 3 deletions src/Traits/WithExport.php
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ public function prepareToExport(bool $selected = false): Eloquent\Collection|Col
$filtered = $processDataSource->component->checkboxValues;
}

if ($processDataSource->component->datasource() instanceof Collection) {
if ($processDataSource->datasource instanceof Collection) {
if ($filtered) {
$results = $processDataSource->get(isExport: true)['results']
->whereIn($this->primaryKey, $filtered);
Expand All @@ -179,7 +179,7 @@ public function prepareToExport(bool $selected = false): Eloquent\Collection|Col

$dataTransformer = new DataTransformer($processDataSource->component);

return $dataTransformer->transform($processDataSource->component->datasource())->collection;
return $dataTransformer->transform($processDataSource->datasource)->collection;
}

/** @phpstan-ignore-next-line */
Expand All @@ -195,7 +195,7 @@ public function prepareToExport(bool $selected = false): Eloquent\Collection|Col

$queryOptions = data_get($this->setUp, 'exportable.queryOptions', []);

$results = $processDataSource->component->datasource()
$results = $processDataSource->datasource
->where(function ($query) {
app()->makeWith(SearchHandlerContract::class, [
'component' => $this,
Expand Down
107 changes: 107 additions & 0 deletions tests/Feature/DatasourceCallCountTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
<?php

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
use PowerComponents\LivewirePowerGrid\{Column, Facades\PowerGrid, PowerGridComponent, PowerGridFields};
use PowerComponents\LivewirePowerGrid\Tests\Concerns\Models\Dish;

use function PowerComponents\LivewirePowerGrid\Tests\Plugins\livewire;

class DatasourceCountTable extends PowerGridComponent
{
public string $tableName = 'datasource-count-table';

public static int $calls = 0;

public function datasource(): Collection
{
self::$calls++;

return collect([
['id' => 1, 'name' => 'Name 1'],
['id' => 2, 'name' => 'Name 2'],
]);
}

public function fields(): PowerGridFields
{
return PowerGrid::fields()
->add('id')
->add('name');
}

public function columns(): array
{
return [
Column::make('ID', 'id'),
Column::make('Name', 'name'),
];
}
}

class EloquentDatasourceCountTable extends PowerGridComponent
{
public string $tableName = 'eloquent-datasource-count-table';

public static int $calls = 0;

public function datasource(): Builder
{
self::$calls++;

return Dish::query();
}

public function fields(): PowerGridFields
{
return PowerGrid::fields()
->add('id')
->add('name');
}

public function columns(): array
{
return [
Column::make('ID', 'id'),
Column::make('Name', 'name'),
];
}
}

it('calls collection datasource() only once', function () {
DatasourceCountTable::$calls = 0;

livewire(DatasourceCountTable::class)
->assertOk();

expect(DatasourceCountTable::$calls)->toBe(1);
});

it('calls collection datasource() only once when searching', function () {
DatasourceCountTable::$calls = 0;

livewire(DatasourceCountTable::class)
->set('search', 'Name 1')
->assertOk();

expect(DatasourceCountTable::$calls)->toBe(2);
});

it('calls eloquent datasource() only once', function () {
EloquentDatasourceCountTable::$calls = 0;

livewire(EloquentDatasourceCountTable::class)
->assertOk();

expect(EloquentDatasourceCountTable::$calls)->toBe(1);
});

it('calls eloquent datasource() only once when searching', function () {
EloquentDatasourceCountTable::$calls = 0;

livewire(EloquentDatasourceCountTable::class)
->set('search', 'Dish 1')
->assertOk();

expect(EloquentDatasourceCountTable::$calls)->toBe(2);
});
Loading