Spamworldpro Mini Shell
Spamworldpro


Server : Apache
System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64
User : corals ( 1002)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/corals/old/vendor/mirasvit/module-report-api/src/ReportApi/Config/Loader/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/old/vendor/mirasvit/module-report-api/src/ReportApi/Config/Loader/Map.php
<?php
/**
 * Mirasvit
 *
 * This source file is subject to the Mirasvit Software License, which is available at https://mirasvit.com/license/.
 * Do not edit or add to this file if you wish to upgrade the to newer versions in the future.
 * If you wish to customize this module for your needs.
 * Please refer to http://www.magentocommerce.com for more information.
 *
 * @category  Mirasvit
 * @package   mirasvit/module-report-api
 * @version   1.0.64
 * @copyright Copyright (C) 2023 Mirasvit (https://mirasvit.com/)
 */



namespace Mirasvit\ReportApi\Config\Loader;

use Magento\Framework\ObjectManagerInterface;
use Mirasvit\ReportApi\Config\Entity\Column;
use Mirasvit\ReportApi\Config\Entity\EavTable;
use Mirasvit\ReportApi\Config\Entity\Relation;
use Mirasvit\ReportApi\Config\Entity\Table;
use Mirasvit\ReportApi\Config\Schema;
use Mirasvit\ReportApi\Service\TableService;

class Map
{
    /**
     * @var Data
     */
    private $data;

    /**
     * @var Schema
     */
    private $schema;

    /**
     * @var ObjectManagerInterface
     */
    private $objectManager;

    /**
     * @var TableService
     */
    private $tableService;

    /**
     * Map constructor.
     * @param Schema $schema
     * @param ObjectManagerInterface $objectManager
     * @param TableService $tableService
     * @param Data $data
     */
    public function __construct(
        Schema $schema,
        ObjectManagerInterface $objectManager,
        TableService $tableService,
        Data $data
    ) {
        $this->schema        = $schema;
        $this->objectManager = $objectManager;
        $this->tableService  = $tableService;
        $this->data          = $data;
    }

    /**
     * @return $this
     */
    public function load()
    {
        $config = $this->data->get('config');

        if (is_array($config['table'])) {
            foreach ($config['table'] as $data) {
                $this->initTable($data);
            }
        }

        if (is_array($config['eavTable'])) {
            foreach ($config['eavTable'] as $data) {
                $this->initEavTable($data);
            }
        }

        foreach ($config['table'] as $data) {
            $this->initColumns($data);
        }

        foreach ($config['eavTable'] as $data) {
            $this->initColumns($data);
        }

        $this->initRelations($config);

        return $this;
    }

    /**
     * @param array $data
     *
     * @return void
     */
    private function initTable($data)
    {
        $attributes             = $data[Converter::DATA_ATTRIBUTES_KEY];
        $attributes['label']    = isset($attributes['label']) ? $attributes['label'] : false;
        $attributes['group']    = isset($attributes['group']) ? $attributes['group'] : false;
        $attributes['isNative'] = true;

        $table = $this->objectManager->create(Table::class, $attributes);

        $this->schema->addTable($table);
    }

    /**
     * @param array $data
     *
     * @return void
     */
    private function initEavTable($data)
    {
        $attributes             = $data[Converter::DATA_ATTRIBUTES_KEY];
        $attributes['label']    = isset($attributes['label']) ? $attributes['label'] : false;
        $attributes['group']    = isset($attributes['group']) ? $attributes['group'] : false;
        $attributes['isNative'] = true;

        $table = $this->objectManager->create(EavTable::class, $attributes);

        $this->schema->addTable($table);
    }

    /**
     * @param array $data
     *
     * @return void
     */
    private function initColumns($data)
    {
        $table = $this->schema->getTable($data[Converter::DATA_ATTRIBUTES_KEY]['name']);

        $data['column'] = isset($data['column']) ? $data['column'] : [];

        $data['pk'] = isset($data['pk']) ? $data['pk'] : [];
        $data['fk'] = isset($data['fk']) ? $data['fk'] : [];

        $columns = $data['column'];

        foreach ($data['pk'] as $column) {
            $column[Converter::DATA_ATTRIBUTES_KEY]['type'] = 'pk';
            // rewrite PK column to match actual IDENTITY field from the table (entity_id => row_id)
            if (!in_array($column[Converter::DATA_ATTRIBUTES_KEY]['name'], array_keys($table->getFields()), true)) {
                foreach ($table->getFields() as $field) {
                    if ($field->isIdentity()) {
                        $column[Converter::DATA_ATTRIBUTES_KEY]['name'] = $field->getName();
                        break;
                    }
                }
            }

            $columns[] = $column;
        }

        foreach ($data['fk'] as $column) {
            $column[Converter::DATA_ATTRIBUTES_KEY]['type'] = 'fk';

            $columns[] = $column;
        }

        foreach ($columns as $data) {
            $data[Converter::DATA_ATTRIBUTES_KEY]['table'] = $table;

            if (isset($data[Converter::DATA_ATTRIBUTES_KEY]['tables'])) {
                $tables = explode(',', $data[Converter::DATA_ATTRIBUTES_KEY]['tables']);
                foreach ($tables as $idx => $tbl) {
                    $tables[$idx] = $this->schema->getTable($tbl);
                }

                $data[Converter::DATA_ATTRIBUTES_KEY]['tables'] = $tables;
            } else {
                $data[Converter::DATA_ATTRIBUTES_KEY]['tables'] = [];
            }

            $this->initColumn($data[Converter::DATA_ATTRIBUTES_KEY]);
        }
    }

    /**
     * @param array $data
     *
     * @throws \Exception
     */
    public function initColumn($data)
    {
        if (isset($data['fields']) && $data['fields'] == $data['name']) {
            throw new \Exception("Fields should be different from name or not set: {$data['fields']}");
        }

        $name = $data['name'];

        $data['fields'] = !isset($data['fields']) ? [$data['name']] : explode(',', $data['fields']);
        $data['type']   = !isset($data['type']) ? 'string' : $data['type'];
        $data['label']  = !isset($data['label']) ? ucwords(str_replace('_', ' ', $name)) : $data['label'];

        $type = $this->objectManager->create(
            $this->schema->getType($data['type']),
            $data
        );

        foreach ($type->getAggregators() as $aggregatorName) {
            $aggregator = $this->objectManager->create(
                $this->schema->getAggregator($aggregatorName)
            );

            $columnData = [
                'name'       => $name . ($aggregatorName !== 'none' ? "__$aggregatorName" : ''),
                'type'       => $type,
                'aggregator' => $aggregator,
                'data'       => $data,
            ];

            $this->objectManager->create(Column::class, $columnData);
        }
    }

    /**
     * @param array $config
     *
     * @return void
     */
    private function initRelations($config)
    {
        // init explicitly declared relations
        $config['relation'] = isset($config['relation']) ? $config['relation'] : [];

        foreach ($config['relation'] as $relation) {
            $data = [
                'leftTable'  => $this->schema->getTable($relation[Converter::DATA_ARGUMENTS_KEY]['leftTable']),
                'rightTable' => $this->schema->getTable($relation[Converter::DATA_ARGUMENTS_KEY]['rightTable']),
                'leftField'  => null,
                'rightField' => null,
                'type'       => $relation[Converter::DATA_ATTRIBUTES_KEY]['type'],
                'condition'  => $relation[Converter::DATA_ARGUMENTS_KEY]['condition'],
            ];

            $relation = $this->objectManager->create(Relation::class, $data);

            $this->schema->addRelation($relation);
        }

        // init implicit relations between tables
        $tables = array_merge_recursive($config['table'], $config['eavTable']);

        foreach ($tables as $table) {
            if (!isset($table['fk'])) {
                continue;
            }
            foreach ($table['fk'] as $fk) {
                $leftTableName  = $table[Converter::DATA_ATTRIBUTES_KEY]['name'];
                $rightTableName = $fk[Converter::DATA_ATTRIBUTES_KEY]['table'];

                if (!$this->schema->hasTable($leftTableName)
                    || !$this->schema->hasTable($rightTableName)) {
                    continue;
                }

                $leftTable  = $this->schema->getTable($leftTableName);
                $rightTable = $this->schema->getTable($rightTableName);

                $leftFieldName = $fk[Converter::DATA_ATTRIBUTES_KEY]['name'];

                $leftField  = $leftTable->getField($leftFieldName);
                $rightField = $rightTable->getPkField();

                $type = isset($fk[Converter::DATA_ATTRIBUTES_KEY]['uniq']) ? 1 : 'n';

                $data = [
                    'leftTable'  => $this->schema->getTable($leftTableName),
                    'leftField'  => $leftField,
                    'rightTable' => $this->schema->getTable($rightTableName),
                    'rightField' => $rightField,
                    'type'       => '1' . $type,
                ];

                $relation = $this->objectManager->create(Relation::class, $data);

                $this->schema->addRelation($relation);
            }
        }
    }
}

Spamworldpro Mini