Completed
Push — master ( 0aa154...6fc129 )
by Maksim
05:50
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
    /**
18
     * @var PersisterRegistry
19
     */
20
    private $registry;
21
    
22
    /**
23
     * @var EventDispatcherInterface
24
     */
25
    private $dispatcher;
26
27
    /**
28
     * @param PersisterRegistry $registry
29
     * @param EventDispatcherInterface $dispatcher
30
     */
31 9
    public function __construct(PersisterRegistry $registry, EventDispatcherInterface $dispatcher)
32
    {
33 9
        $this->registry = $registry;
34 9
        $this->dispatcher = $dispatcher;
35 9
    }
36
37
    /**
38
     * {@inheritdoc}
39
     */
40 8
    public function insert(PagerInterface $pager, array $options = array())
41
    {
42 8
        $objectPersister = $this->registry->getPersister($options['indexName'], $options['typeName']);
43
44
        try {
45 8
            $event = new PrePersistEvent($pager, $objectPersister, $options);
46 8
            $this->dispatcher->dispatch(Events::PRE_PERSIST, $event);
47 8
            $pager = $event->getPager();
48 8
            $options = $event->getOptions();
49
50 8
            $pager->setMaxPerPage($options['batch_size']);
51
52 8
            $page = $pager->getCurrentPage();
53 8
            while ($page <= $pager->getNbPages()) {
54 8
                $this->insertPage($page, $pager, $objectPersister, $options);
55
56 7
                $pager->setCurrentPage($page++);
57
            }
58 7
        } finally {
59 8
            $event = new PostPersistEvent($pager, $objectPersister, $options);
60 8
            $this->dispatcher->dispatch(Events::POST_PERSIST, $event);
61
        }
62
63 7
    }
64
65
    /**
66
     * @param int $page
67
     * @param PagerInterface $pager
68
     * @param ObjectPersisterInterface $objectPersister
69
     * @param array $options
70
     *
71
     * @throws \Exception
72
     */
73 8
    private function insertPage($page, PagerInterface $pager, ObjectPersisterInterface $objectPersister, array $options = array())
74
    {
75 8
        $pager->setCurrentPage($page);
76
77 8
        $event = new PreFetchObjectsEvent($pager, $objectPersister, $options);
78 8
        $this->dispatcher->dispatch(Events::PRE_FETCH_OBJECTS, $event);
79 8
        $pager = $event->getPager();
80 8
        $options = $event->getOptions();
81
82 8
        $objects = $pager->getCurrentPageResults();
83
84 8
        if ($objects instanceof \Traversable) {
85
            $objects = iterator_to_array($objects);
86
        }
87
88 8
        $event = new PreInsertObjectsEvent($pager, $objectPersister, $objects, $options);
89 8
        $this->dispatcher->dispatch(Events::PRE_INSERT_OBJECTS, $event);
90 8
        $pager = $event->getPager();
91 8
        $options = $event->getOptions();
92 8
        $objects = $event->getObjects();
93
94
        try {
95 8
            if (!empty($objects)) {
96 8
                $objectPersister->insertMany($objects);
97
            }
98
99 6
            $event = new PostInsertObjectsEvent($pager, $objectPersister, $objects, $options);
100 6
            $this->dispatcher->dispatch(Events::POST_INSERT_OBJECTS, $event);
101 2
        } catch (\Exception $e) {
102 2
            $event = new OnExceptionEvent($pager, $objectPersister, $e, $objects, $options);
103 2
            $this->dispatcher->dispatch(Events::ON_EXCEPTION, $event);
104
105 2
            if ($event->isIgnored()) {
106 1
                $event = new PostInsertObjectsEvent($pager, $objectPersister, $objects, $options);
107 1
                $this->dispatcher->dispatch(Events::POST_INSERT_OBJECTS, $event);
108
            } else {
109 1
                $e = $event->getException();
110
111 1
                throw $e;
112
            }
113
        }
114 7
    }
115
116
}
117