CheckDataObjectStatics   A
last analyzed

Complexity

Total Complexity 12

Size/Duplication

Total Lines 95
Duplicated Lines 0 %

Importance

Changes 2
Bugs 1 Features 0
Metric Value
wmc 12
eloc 48
c 2
b 1
f 0
dl 0
loc 95
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A performMigration() 0 13 2
B summaryAndSearchableCheck() 0 40 10
1
<?php
2
3
namespace Sunnysideup\MigrateData\Tasks;
4
5
use SilverStripe\Core\ClassInfo;
6
use SilverStripe\Core\Config\Config;
7
use SilverStripe\Core\Injector\Injector;
8
use SilverStripe\ORM\DataObject;
9
use SilverStripe\ORM\DataObjectSchema;
10
11
class CheckDataObjectStatics extends MigrateDataTaskBase
12
{
13
    /**
14
     * @var mixed
15
     */
16
    public $dataObjectSchema;
17
18
    protected $title = 'Data Object Statics Check';
19
20
    protected $description = 'Goes through all Data Object classes and checks for missing statics';
21
22
    protected $enabled = true;
23
24
    protected $objectClassNames = [];
25
26
    protected $listOfAllClasses = [];
27
28
    protected $countsOfAllClasses = [];
29
30
    protected $onlyRunFor = [];
31
32
    /**
33
     * example:
34
     *     [
35
     *         ClassName => [
36
     *             FieldA,
37
     *             FieldB,
38
     *     ].
39
     *
40
     * @var array
41
     */
42
    private static $no_searchable_fields = [
43
        'Sort',
44
        'SortOrder',
45
        'ID',
46
        'Version',
47
    ];
48
49
    private static $other_fields_to_check = [];
50
51
    protected function performMigration()
52
    {
53
        $this->dataObjectSchema = Injector::inst()->get(DataObjectSchema::class);
54
55
        // make a list of all classes
56
        // include baseclass = false
57
        $this->objectClassNames = ClassInfo::subclassesFor(DataObject::class, false);
58
        foreach ($this->objectClassNames as $objectClassName) {
59
            $slashed = addslashes($objectClassName);
60
            $this->listOfAllClasses[$slashed] = ClassInfo::shortName($objectClassName);
61
        }
62
        $this->countsOfAllClasses = array_count_values($this->listOfAllClasses);
63
        $this->summaryAndSearchableCheck();
64
    }
65
66
    protected function summaryAndSearchableCheck()
67
    {
68
        $values = [];
69
        //check all classes
70
        foreach ($this->objectClassNames as $objectClassName) {
71
            if (count($this->onlyRunFor) && ! in_array($objectClassName, $this->onlyRunFor, true)) {
72
                continue;
73
            }
74
75
            $summaryFields = Config::inst()->get($objectClassName, 'summary_fields');
76
            // $searchableFields = Config::inst()->get($objectClassName, 'searchable_fields');
77
            if (! empty($summaryFields)) {
78
                $dbFields = array_keys(Config::inst()->get($objectClassName, 'db'));
79
                if (count($dbFields) > 5) {
80
                    $recommended = array_intersect($dbFields, $summaryFields);
81
                    if (count($recommended) < 2) {
82
                        $recommended = $dbFields;
83
                    }
84
                } else {
85
                    $recommended = $dbFields;
86
                }
87
                if (count($recommended) > 0) {
88
                    foreach ($recommended as $k => $v) {
89
                        if (in_array($v, $this->Config()->no_searchable_fields, true)) {
90
                            unset($recommended[$k]);
91
                        }
92
                    }
93
                    $values[$objectClassName] = $objectClassName . ':' .
94
                        "\n  searchable_fields:\n    - " .
95
                        implode("\n    - ", $recommended)
96
                        . "\n\n";
97
                    $this->flushNow('... Error in ' . $objectClassName . ' there are summary fields, but no searchable fields', 'error');
98
                }
99
            }
100
            // $this->flushNow('... OK', 'created');
101
        }
102
        echo '<pre>';
103
        echo "\n# Autocreated from: Sunnysideup-MigrateData-Tasks-CheckDataObjectStatics\n\n";
104
        echo implode('', $values);
105
        echo '</pre>';
106
    }
107
}
108