Passed
Push — Firesphere-funding-yml ( ab824b...2bf34e )
by Simon
18:25 queued 11:53
created

ClearDirtyClassesTask::createDeleteList()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 5
nc 2
nop 2
dl 0
loc 10
rs 10
c 1
b 0
f 0
1
<?php
2
3
4
namespace Firesphere\SolrSearch\Tasks;
5
6
use Exception;
7
use Firesphere\SolrSearch\Extensions\DataObjectExtension;
8
use Firesphere\SolrSearch\Helpers\SolrLogger;
9
use Firesphere\SolrSearch\Models\DirtyClass;
10
use Firesphere\SolrSearch\Services\SolrCoreService;
11
use Firesphere\SolrSearch\Traits\LoggerTrait;
12
use GuzzleHttp\Exception\GuzzleException;
13
use SilverStripe\Control\HTTPRequest;
14
use SilverStripe\Dev\BuildTask;
15
use SilverStripe\ORM\ArrayList;
16
use SilverStripe\ORM\DataList;
17
use SilverStripe\ORM\ValidationException;
18
19
/**
20
 * Class ClearDirtyClasses
21
 * Clear out classes that were not succesfully updated or deleted in Solr.
22
 *
23
 * Any classes that failed to index properly or be removed properly need to be cleaned out regularly
24
 * This task takes care of doing this. It can be run directly via /dev/tasks, or via a queued job
25
 *
26
 * @package Firesphere\SolrSearch\Tasks
27
 */
28
class ClearDirtyClassesTask extends BuildTask
29
{
30
    use LoggerTrait;
31
    /**
32
     * @var string URLSegment
33
     */
34
    private static $segment = 'SolrClearDirtyClasses';
35
    /**
36
     * @var string Title
37
     */
38
    protected $title = 'Fix broken items in the Solr cores';
39
    /**
40
     * @var string Description
41
     */
42
    protected $description = 'Clear out classes that are marked as dirty on Solr.';
43
44
    /**
45
     * Clean up Dirty Classes in the index
46
     *
47
     * @param HTTPRequest $request
48
     * @return void
49
     * @throws GuzzleException
50
     * @throws \ReflectionException
51
     * @throws ValidationException
52
     */
53
    public function run($request)
54
    {
55
        /** @var DataList|DirtyClass $dirtyObjectList */
56
        $dirtyObjectList = DirtyClass::get();
57
        /** @var SolrCoreService $service */
58
        $service = new SolrCoreService();
59
        $solrLogger = new SolrLogger();
60
        foreach ($dirtyObjectList as $dirtyObject) {
61
            $dirtyClass = $dirtyObject->Class;
62
            $ids = json_decode($dirtyObject->IDs, true);
63
            try {
64
                $type = SolrCoreService::UPDATE_TYPE;
65
                $dirtyClasses = ArrayList::create();
66
                if ($dirtyObject->Type === SolrCoreService::UPDATE_TYPE) {
67
                    $dirtyClasses = $dirtyClass::get()->byIDs($ids);
68
                }
69
                if ($dirtyObject->Type === SolrCoreService::DELETE_TYPE) {
70
                    $dirtyClasses = $this->createDeleteList($ids, $dirtyClass);
71
                    $type = SolrCoreService::DELETE_TYPE;
72
                }
73
                $service->updateItems($dirtyClasses, $type);
74
                $dirtyObject->delete();
75
            } catch (Exception $exception) {
76
                $this->getLogger()->error($exception->getMessage());
77
                continue;
78
            }
79
        }
80
        $solrLogger->saveSolrLog('Index');
81
    }
82
83
    /**
84
     * Create an ArrayList of the dirty items to be deleted from Solr
85
     * Uses the given class name to generate stub objects
86
     *
87
     * @param array $items
88
     * @param string $dirtyClass
89
     * @return ArrayList
90
     */
91
    protected function createDeleteList($items, $dirtyClass): ArrayList
92
    {
93
        /** @var ArrayList $deletions */
94
        $deletions = ArrayList::create();
95
        foreach ($items as $item) {
96
            $dirtItem = $dirtyClass::create(['ID' => $item]);
97
            $deletions->push($dirtItem);
98
        }
99
100
        return $deletions;
101
    }
102
}
103