Completed
Push — master ( 0f71cc...99d0b0 )
by Karel
15:42
created

InPlacePagerPersister::insertPage()   B

Complexity

Conditions 5
Paths 24

Size

Total Lines 42
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 26
CRAP Score 5.0012

Importance

Changes 0
Metric Value
dl 0
loc 42
ccs 26
cts 27
cp 0.963
rs 8.439
c 0
b 0
f 0
cc 5
eloc 28
nc 24
nop 4
crap 5.0012
1
<?php
2
3
namespace FOS\ElasticaBundle\Persister;
4
5
use FOS\ElasticaBundle\Persister\Event\Events;
6
use FOS\ElasticaBundle\Persister\Event\OnExceptionEvent;
7
use FOS\ElasticaBundle\Persister\Event\PostInsertObjectsEvent;
8
use FOS\ElasticaBundle\Persister\Event\PostPersistEvent;
9
use FOS\ElasticaBundle\Persister\Event\PreFetchObjectsEvent;
10
use FOS\ElasticaBundle\Persister\Event\PreInsertObjectsEvent;
11
use FOS\ElasticaBundle\Persister\Event\PrePersistEvent;
12
use FOS\ElasticaBundle\Provider\PagerInterface;
13
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
14
15
final class InPlacePagerPersister implements PagerPersisterInterface
16
{
17
    const NAME = 'in_place';
18
    
19
    /**
20
     * @var PersisterRegistry
21
     */
22
    private $registry;
23
    
24
    /**
25
     * @var EventDispatcherInterface
26
     */
27
    private $dispatcher;
28
29
    /**
30
     * @param PersisterRegistry $registry
31
     * @param EventDispatcherInterface $dispatcher
32
     */
33 11
    public function __construct(PersisterRegistry $registry, EventDispatcherInterface $dispatcher)
34
    {
35 11
        $this->registry = $registry;
36 11
        $this->dispatcher = $dispatcher;
37 11
    }
38
39
    /**
40
     * {@inheritdoc}
41
     */
42 10
    public function insert(PagerInterface $pager, array $options = array())
43
    {
44 10
        $pager->setMaxPerPage(empty($options['max_per_page']) ? 100 : $options['max_per_page']);
45
46 10
        $options = array_replace([
47 10
            'max_per_page' => $pager->getMaxPerPage(),
48 10
            'first_page' => $pager->getCurrentPage(),
49 10
            'last_page' => $pager->getNbPages(),
50 10
        ], $options);
51
52 10
        $pager->setCurrentPage($options['first_page']);
53
54 10
        $objectPersister = $this->registry->getPersister($options['indexName'], $options['typeName']);
55
56
        try {
57 10
            $event = new PrePersistEvent($pager, $objectPersister, $options);
58 10
            $this->dispatcher->dispatch(Events::PRE_PERSIST, $event);
59 10
            $pager = $event->getPager();
60 10
            $options = $event->getOptions();
61
62 10
            $lastPage = min($options['last_page'], $pager->getNbPages());
63 10
            $page = $pager->getCurrentPage();
64
            do {
65 10
                $pager->setCurrentPage($page);
66
67 10
                $this->insertPage($page, $pager, $objectPersister, $options);
68
69 9
                $page++;
70 9
            } while ($page <= $lastPage);
71 9
        } finally {
72 10
            $event = new PostPersistEvent($pager, $objectPersister, $options);
73 10
            $this->dispatcher->dispatch(Events::POST_PERSIST, $event);
74
        }
75 9
    }
76
77
    /**
78
     * @param int $page
79
     * @param PagerInterface $pager
80
     * @param ObjectPersisterInterface $objectPersister
81
     * @param array $options
82
     *
83
     * @throws \Exception
84
     */
85 10
    private function insertPage($page, PagerInterface $pager, ObjectPersisterInterface $objectPersister, array $options = array())
86
    {
87 10
        $pager->setCurrentPage($page);
88
89 10
        $event = new PreFetchObjectsEvent($pager, $objectPersister, $options);
90 10
        $this->dispatcher->dispatch(Events::PRE_FETCH_OBJECTS, $event);
91 10
        $pager = $event->getPager();
92 10
        $options = $event->getOptions();
93
94 10
        $objects = $pager->getCurrentPageResults();
95
96 10
        if ($objects instanceof \Traversable) {
97
            $objects = iterator_to_array($objects);
98
        }
99
100 10
        $event = new PreInsertObjectsEvent($pager, $objectPersister, $objects, $options);
101 10
        $this->dispatcher->dispatch(Events::PRE_INSERT_OBJECTS, $event);
102 10
        $pager = $event->getPager();
103 10
        $options = $event->getOptions();
104 10
        $objects = $event->getObjects();
105
106
        try {
107 10
            if (!empty($objects)) {
108 10
                $objectPersister->insertMany($objects);
109
            }
110
111 8
            $event = new PostInsertObjectsEvent($pager, $objectPersister, $objects, $options);
112 8
            $this->dispatcher->dispatch(Events::POST_INSERT_OBJECTS, $event);
113 2
        } catch (\Exception $e) {
114 2
            $event = new OnExceptionEvent($pager, $objectPersister, $e, $objects, $options);
115 2
            $this->dispatcher->dispatch(Events::ON_EXCEPTION, $event);
116
117 2
            if ($event->isIgnored()) {
118 1
                $event = new PostInsertObjectsEvent($pager, $objectPersister, $objects, $options);
119 1
                $this->dispatcher->dispatch(Events::POST_INSERT_OBJECTS, $event);
120
            } else {
121 1
                $e = $event->getException();
122
123 1
                throw $e;
124
            }
125
        }
126 9
    }
127
128
}
129