diff --git a/benchmarks/DataBench.php b/benchmarks/DataBench.php index c4ce33384..3b15d3f57 100644 --- a/benchmarks/DataBench.php +++ b/benchmarks/DataBench.php @@ -15,6 +15,7 @@ use Spatie\LaravelData\Tests\Fakes\MultiNestedData; use Spatie\LaravelData\Tests\Fakes\NestedData; use Spatie\LaravelData\Tests\Fakes\SimpleData; +use function Amp\Iterator\toArray; class DataBench { @@ -34,10 +35,10 @@ protected function getPackageProviders($app) public function setup() { - app(DataConfig::class)->getDataClass(ComplicatedData::class); - app(DataConfig::class)->getDataClass(SimpleData::class); - app(DataConfig::class)->getDataClass(MultiNestedData::class); - app(DataConfig::class)->getDataClass(NestedData::class); + app(DataConfig::class)->getDataClass(ComplicatedData::class)->prepareForCache(); + app(DataConfig::class)->getDataClass(SimpleData::class)->prepareForCache(); + app(DataConfig::class)->getDataClass(MultiNestedData::class)->prepareForCache(); + app(DataConfig::class)->getDataClass(NestedData::class)->prepareForCache(); } #[Revs(500), Iterations(2)] @@ -138,8 +139,8 @@ public function benchDataCollectionTransformation() ) )->all(); - $collection = ComplicatedData::collect($collection, DataCollection::class); + $dataCollection = (new DataCollection(ComplicatedData::class, $collection)); - $collection->toArray(); + $dataCollection->toArray(); } } diff --git a/benchmarks/SimpleDataCollectionBench.php b/benchmarks/SimpleDataCollectionBench.php new file mode 100644 index 000000000..75d7f9635 --- /dev/null +++ b/benchmarks/SimpleDataCollectionBench.php @@ -0,0 +1,77 @@ +createApplication(); + } + + protected function getPackageProviders($app) + { + return [ + LaravelDataServiceProvider::class, + ]; + } + + public function setup() + { + $collection = Collection::times( + 15, + fn () => new ComplicatedData( + 42, + 42, + true, + 3.14, + 'Hello World', + [1, 1, 2, 3, 5, 8], + null, + Optional::create(), + 42, + CarbonImmutable::create(1994, 05, 16), + new DateTime('1994-05-16T12:00:00+01:00'), + null, + null, + [] +// new SimpleData('hello'), +// new DataCollection(NestedData::class, [ +// new NestedData(new SimpleData('I')), +// new NestedData(new SimpleData('am')), +// new NestedData(new SimpleData('groot')), +// ]), +// [ +// new NestedData(new SimpleData('I')), +// new NestedData(new SimpleData('am')), +// new NestedData(new SimpleData('groot')), +// ], + )); + + $this->dataCollection = new DataCollection(ComplicatedData::class, $collection); + + app(DataConfig::class)->getDataClass(ComplicatedData::class); + app(DataConfig::class)->getDataClass(SimpleData::class); + } + + #[Revs(500), Iterations(5), BeforeMethods('setup')] + public function benchDataCollectionTransformation() + { + $this->dataCollection->toArray(); + } +} diff --git a/src/Enums/DataTypeKind.php b/src/Enums/DataTypeKind.php index f42fe82f0..553e1ab39 100644 --- a/src/Enums/DataTypeKind.php +++ b/src/Enums/DataTypeKind.php @@ -21,14 +21,6 @@ public function isDataObject(): bool public function isDataCollectable(): bool { - return in_array($this, [ - self::DataCollection, - self::DataPaginatedCollection, - self::DataCursorPaginatedCollection, - self::Array, - self::Enumerable, - self::Paginator, - self::CursorPaginator, - ]); + return $this !== self::Default && $this !== self::DataObject; } } diff --git a/src/Resolvers/TransformedDataResolver.php b/src/Resolvers/TransformedDataResolver.php index 11ab3d09d..7b359f824 100644 --- a/src/Resolvers/TransformedDataResolver.php +++ b/src/Resolvers/TransformedDataResolver.php @@ -10,6 +10,7 @@ use Spatie\LaravelData\Contracts\WrappableData; use Spatie\LaravelData\Enums\DataTypeKind; use Spatie\LaravelData\Lazy; +use Spatie\LaravelData\Support\DataClass; use Spatie\LaravelData\Support\DataConfig; use Spatie\LaravelData\Support\DataContainer; use Spatie\LaravelData\Support\DataProperty; @@ -30,7 +31,9 @@ public function execute( BaseData&TransformableData $data, TransformationContext $context, ): array { - $transformed = $this->transform($data, $context); + $dataClass = $this->dataConfig->getDataClass($data::class); + + $transformed = $this->transform($data, $context, $dataClass); if ($data instanceof WrappableData && $context->wrapExecutionType->shouldExecute()) { $transformed = $data->getWrap()->wrap($transformed); @@ -43,12 +46,13 @@ public function execute( return $transformed; } - private function transform(BaseData&TransformableData $data, TransformationContext $context): array - { + private function transform( + BaseData&TransformableData $data, + TransformationContext $context, + DataClass $dataClass, + ): array { $payload = []; - $dataClass = $this->dataConfig->getDataClass($data::class); - $visibleFields = $this->visibleDataFieldsResolver->execute($data, $dataClass, $context); foreach ($dataClass->properties as $property) {