Completed
Pull Request — master (#1583)
by Jeroen
41:02 queued 38:49
created

InPlacePagerPersister   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 114
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 11

Test Coverage

Coverage 98.11%

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 11
dl 0
loc 114
ccs 52
cts 53
cp 0.9811
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A insert() 0 34 3
B insertPage() 0 42 5
1
<?php
2
3
namespace FOS\ElasticaBundle\Persister;
4
5
use FOS\ElasticaBundle\EventDispatcher\LegacyEventDispatcherProxy;
6
use FOS\ElasticaBundle\Persister\Event\Events;
7
use FOS\ElasticaBundle\Persister\Event\OnExceptionEvent;
8
use FOS\ElasticaBundle\Persister\Event\PostInsertObjectsEvent;
9
use FOS\ElasticaBundle\Persister\Event\PostPersistEvent;
10
use FOS\ElasticaBundle\Persister\Event\PreFetchObjectsEvent;
11
use FOS\ElasticaBundle\Persister\Event\PreInsertObjectsEvent;
12
use FOS\ElasticaBundle\Persister\Event\PrePersistEvent;
13
use FOS\ElasticaBundle\Provider\PagerInterface;
14
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
15
16
final class InPlacePagerPersister implements PagerPersisterInterface
17
{
18
    const NAME = 'in_place';
19
    
20
    /**
21
     * @var PersisterRegistry
22
     */
23
    private $registry;
24
    
25
    /**
26
     * @var EventDispatcherInterface
27
     */
28
    private $dispatcher;
29
30
    /**
31
     * @param PersisterRegistry $registry
32
     * @param EventDispatcherInterface $dispatcher
33
     */
34 11
    public function __construct(PersisterRegistry $registry, EventDispatcherInterface $dispatcher)
35
    {
36 11
        $this->registry = $registry;
37 11
        $this->dispatcher = LegacyEventDispatcherProxy::decorate($dispatcher);
38 11
    }
39
40
    /**
41
     * {@inheritdoc}
42
     */
43 10
    public function insert(PagerInterface $pager, array $options = array())
44
    {
45 10
        $pager->setMaxPerPage(empty($options['max_per_page']) ? 100 : $options['max_per_page']);
46
47 10
        $options = array_replace([
48 10
            'max_per_page' => $pager->getMaxPerPage(),
49 10
            'first_page' => $pager->getCurrentPage(),
50 10
            'last_page' => $pager->getNbPages(),
51
        ], $options);
52
53 10
        $pager->setCurrentPage($options['first_page']);
54
55 10
        $objectPersister = $this->registry->getPersister($options['indexName'], $options['typeName']);
56
57
        try {
58 10
            $event = new PrePersistEvent($pager, $objectPersister, $options);
59 10
            $this->dispatcher->dispatch(Events::PRE_PERSIST, $event);
60 10
            $pager = $event->getPager();
61 10
            $options = $event->getOptions();
62
63 10
            $lastPage = min($options['last_page'], $pager->getNbPages());
64 10
            $page = $pager->getCurrentPage();
65
            do {
66 10
                $pager->setCurrentPage($page);
67
68 10
                $this->insertPage($page, $pager, $objectPersister, $options);
0 ignored issues
show
Bug introduced by
It seems like $objectPersister defined by $this->registry->getPers..., $options['typeName']) on line 55 can be null; however, FOS\ElasticaBundle\Persi...Persister::insertPage() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
69
70 9
                $page++;
71 9
            } while ($page <= $lastPage);
72 9
        } finally {
73 10
            $event = new PostPersistEvent($pager, $objectPersister, $options);
74 10
            $this->dispatcher->dispatch(Events::POST_PERSIST, $event);
75
        }
76 9
    }
77
78
    /**
79
     * @param int $page
80
     * @param PagerInterface $pager
81
     * @param ObjectPersisterInterface $objectPersister
82
     * @param array $options
83
     *
84
     * @throws \Exception
85
     */
86 10
    private function insertPage($page, PagerInterface $pager, ObjectPersisterInterface $objectPersister, array $options = array())
87
    {
88 10
        $pager->setCurrentPage($page);
89
90 10
        $event = new PreFetchObjectsEvent($pager, $objectPersister, $options);
91 10
        $this->dispatcher->dispatch(Events::PRE_FETCH_OBJECTS, $event);
92 10
        $pager = $event->getPager();
93 10
        $options = $event->getOptions();
94
95 10
        $objects = $pager->getCurrentPageResults();
96
97 10
        if ($objects instanceof \Traversable) {
98
            $objects = iterator_to_array($objects);
99
        }
100
101 10
        $event = new PreInsertObjectsEvent($pager, $objectPersister, $objects, $options);
102 10
        $this->dispatcher->dispatch(Events::PRE_INSERT_OBJECTS, $event);
103 10
        $pager = $event->getPager();
104 10
        $options = $event->getOptions();
105 10
        $objects = $event->getObjects();
106
107
        try {
108 10
            if (!empty($objects)) {
109 10
                $objectPersister->insertMany($objects);
110
            }
111
112 8
            $event = new PostInsertObjectsEvent($pager, $objectPersister, $objects, $options);
113 8
            $this->dispatcher->dispatch(Events::POST_INSERT_OBJECTS, $event);
114 2
        } catch (\Exception $e) {
115 2
            $event = new OnExceptionEvent($pager, $objectPersister, $e, $objects, $options);
116 2
            $this->dispatcher->dispatch(Events::ON_EXCEPTION, $event);
117
118 2
            if ($event->isIgnored()) {
119 1
                $event = new PostInsertObjectsEvent($pager, $objectPersister, $objects, $options);
120 1
                $this->dispatcher->dispatch(Events::POST_INSERT_OBJECTS, $event);
121
            } else {
122 1
                $e = $event->getException();
123
124 1
                throw $e;
125
            }
126
        }
127 9
    }
128
129
}
130