Firesphere/silverstripe-solr-search

View on GitHub
src/Helpers/DataResolver.php

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
<?php
/**
 * class DataResolver|Firesphere\SolrSearch\Helpers\DataResolver Identify content or relational content of a DataObject
 *
 * @package Firesphere\Solr\Search
 * @author Simon `Firesphere` Erkelens; Marco `Sheepy` Hermo
 * @copyright Copyright (c) 2018 - now() Firesphere & Sheepy
 */

namespace Firesphere\SolrSearch\Helpers;

use Firesphere\SolrSearch\Traits\DataResolveTrait;
use LogicException;
use SilverStripe\Core\ClassInfo;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\SS_List;
use SilverStripe\View\ArrayData;

/**
 * Class DataResolver
 *
 * @package Firesphere\Solr\Search
 */
class DataResolver
{
    use DataResolveTrait;

    /**
     * Supported object types
     *
     * @var array map of objects to methods
     */
    private static $objTypes = [
        DataObject::class => 'DataObject',
        ArrayData::class  => 'ArrayData',
        SS_List::class    => 'List',
        DBField::class    => 'Field',
    ];

    /**
     * DataResolver constructor.
     *
     * @param DataObject|ArrayList|SS_List|DBField $component
     * @param array|string $columns
     */
    public function __construct($component, $columns = [])
    {
        if (!is_array($columns)) {
            $columns = str_replace('.', '_', $columns);
            $columns = array_filter(explode('_', $columns));
        }
        $this->columns = $columns;
        $this->component = $component;
        $this->columnName = $this->columns ? array_shift($this->columns) : null;
        $this->shortName = ClassInfo::shortName($component);
    }

    /**
     * Identify the given object's columns
     *
     * @param DataObject|ArrayData|SS_List|DBField $obj
     * @param array|string $columns
     *
     * @return mixed
     * @throws LogicException
     */
    public static function identify($obj, $columns = [])
    {
        /** @var {@link self::$objTypes} $type */
        foreach (self::$objTypes as $type => $method) {
            if ($obj instanceof $type) {
                $method = 'resolve' . $method;

                $self = new self($obj, $columns);
                $result = $self->{$method}();
                gc_collect_cycles();

                return $result;
            }
        }

        throw new LogicException(sprintf('Class: %s is not supported.', ClassInfo::shortName($obj)));
    }

    /**
     * An error occured, so log it
     *
     * @param DataObject|ArrayData|SS_List $component
     * @param array $columns
     *
     * @return void
     * @throws LogicException
     */
    protected function cannotIdentifyException($component, $columns = []): void
    {
        throw new LogicException(
            sprintf(
                'Cannot identify, "%s" from class "%s"',
                implode('.', $columns),
                ClassInfo::shortName($component)
            )
        );
    }
}