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

InPlacePagerPersister::insert()   A

Complexity

Conditions 3
Paths 9

Size

Total Lines 34

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 22
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 34
ccs 22
cts 22
cp 1
rs 9.376
c 0
b 0
f 0
cc 3
nc 9
nop 2
crap 3
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