Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
100.00% |
22 / 22 |
|
100.00% |
1 / 1 |
CRAP | |
100.00% |
1 / 1 |
| RootObjectCodeGenerator | |
100.00% |
22 / 22 |
|
100.00% |
1 / 1 |
11 | |
100.00% |
1 / 1 |
| run | |
100.00% |
22 / 22 |
|
100.00% |
1 / 1 |
11 | |||
| 1 | <?php |
| 2 | namespace Apie\StorageMetadataBuilder\CodeGenerators; |
| 3 | |
| 4 | use Apie\Core\Attributes\SearchFilterOption; |
| 5 | use Apie\Core\Context\ApieContext; |
| 6 | use Apie\Core\Metadata\Fields\GetterMethod; |
| 7 | use Apie\Core\Metadata\Fields\PublicProperty; |
| 8 | use Apie\Core\Metadata\MetadataFactory; |
| 9 | use Apie\StorageMetadata\Attributes\GetSearchIndexAttribute; |
| 10 | use Apie\StorageMetadataBuilder\Factories\ClassTypeFactory; |
| 11 | use Apie\StorageMetadataBuilder\Interfaces\RootObjectInterface; |
| 12 | use Apie\StorageMetadataBuilder\Interfaces\RunGeneratedCodeContextInterface; |
| 13 | use Apie\StorageMetadataBuilder\Mediators\GeneratedCodeContext; |
| 14 | |
| 15 | /** |
| 16 | * Creates the root entities. |
| 17 | * - Has class RootObjectInterface |
| 18 | * - Has columns starting with search_ for search on columns. |
| 19 | */ |
| 20 | final class RootObjectCodeGenerator implements RunGeneratedCodeContextInterface |
| 21 | { |
| 22 | public function run(GeneratedCodeContext $generatedCodeContext): void |
| 23 | { |
| 24 | $currentObject = $generatedCodeContext->getCurrentObject(); |
| 25 | if (null === $currentObject || null !== $generatedCodeContext->getCurrentProperty()) { |
| 26 | return; |
| 27 | } |
| 28 | $tableName = $generatedCodeContext->getPrefix('apie_resource_'); |
| 29 | $table = ClassTypeFactory::createStorageTable($tableName, $currentObject); |
| 30 | $metadata = MetadataFactory::getResultMetadata($currentObject, new ApieContext()); |
| 31 | foreach ($metadata->getHashmap() as $fieldName => $fieldDefinition) { |
| 32 | if ($fieldDefinition instanceof GetterMethod || $fieldDefinition instanceof PublicProperty) { |
| 33 | $searchProperty = $table->addProperty('search_' . $fieldName); |
| 34 | $searchProperty->setType('array'); |
| 35 | $enabled = true; |
| 36 | foreach ($fieldDefinition->getAttributes(SearchFilterOption::class) as $attr) { |
| 37 | $enabled = $enabled && $attr->enabled; |
| 38 | } |
| 39 | if (!$enabled) { |
| 40 | $table->removeProperty($searchProperty->getName()); |
| 41 | continue; |
| 42 | } |
| 43 | if ($fieldDefinition instanceof GetterMethod) { |
| 44 | $searchProperty->addAttribute(GetSearchIndexAttribute::class, [$fieldDefinition->getReflectionMethod()->name]); |
| 45 | } elseif ($fieldDefinition instanceof PublicProperty) { |
| 46 | $searchProperty->addAttribute(GetSearchIndexAttribute::class, [$fieldName]); |
| 47 | } |
| 48 | } |
| 49 | } |
| 50 | |
| 51 | $table->addImplement(RootObjectInterface::class); |
| 52 | $generatedCodeContext->iterateOverTable($table); |
| 53 | } |
| 54 | } |