Completed
Pull Request — master (#1333)
by Maksim
04:20
created

InPlacePagerPersister::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

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