77use FOS \ElasticaBundle \Persister \ObjectPersisterInterface ;
88use FOS \ElasticaBundle \Provider \AbstractProvider as BaseAbstractProvider ;
99use FOS \ElasticaBundle \Provider \IndexableInterface ;
10+ use Symfony \Component \OptionsResolver \OptionsResolver ;
1011
1112abstract class AbstractProvider extends BaseAbstractProvider
1213{
@@ -26,79 +27,114 @@ abstract class AbstractProvider extends BaseAbstractProvider
2627 * @param ObjectPersisterInterface $objectPersister
2728 * @param IndexableInterface $indexable
2829 * @param string $objectClass
29- * @param array $options
30+ * @param array $baseOptions
3031 * @param ManagerRegistry $managerRegistry
3132 * @param SliceFetcherInterface $sliceFetcher
3233 */
3334 public function __construct (
3435 ObjectPersisterInterface $ objectPersister ,
3536 IndexableInterface $ indexable ,
3637 $ objectClass ,
37- array $ options ,
38+ array $ baseOptions ,
3839 ManagerRegistry $ managerRegistry ,
3940 SliceFetcherInterface $ sliceFetcher = null
4041 ) {
41- parent ::__construct ($ objectPersister , $ indexable , $ objectClass , array_merge (array (
42- 'clear_object_manager ' => true ,
43- 'debug_logging ' => false ,
44- 'ignore_errors ' => false ,
45- 'query_builder_method ' => 'createQueryBuilder ' ,
46- ), $ options ));
42+ parent ::__construct ($ objectPersister , $ indexable , $ objectClass , $ baseOptions );
4743
4844 $ this ->managerRegistry = $ managerRegistry ;
4945 $ this ->sliceFetcher = $ sliceFetcher ;
5046 }
5147
48+ /**
49+ * Counts objects that would be indexed using the query builder.
50+ *
51+ * @param object $queryBuilder
52+ *
53+ * @return integer
54+ */
55+ abstract protected function countObjects ($ queryBuilder );
56+
57+ /**
58+ * Creates the query builder, which will be used to fetch objects to index.
59+ *
60+ * @param string $method
61+ *
62+ * @return object
63+ */
64+ abstract protected function createQueryBuilder ($ method );
65+
66+ /**
67+ * Fetches a slice of objects using the query builder.
68+ *
69+ * @param object $queryBuilder
70+ * @param integer $limit
71+ * @param integer $offset
72+ *
73+ * @return array
74+ */
75+ abstract protected function fetchSlice ($ queryBuilder , $ limit , $ offset );
76+
5277 /**
5378 * {@inheritDoc}
5479 */
55- public function populate ( \Closure $ loggerClosure = null , array $ options = array () )
80+ protected function doPopulate ( $ options , \Closure $ loggerClosure = null )
5681 {
57- if (!$ this ->options ['debug_logging ' ]) {
58- $ logger = $ this ->disableLogging ();
59- }
82+ $ manager = $ this ->managerRegistry ->getManagerForClass ($ this ->objectClass );
6083
61- $ queryBuilder = $ this ->createQueryBuilder ();
84+ $ queryBuilder = $ this ->createQueryBuilder ($ options [ ' query_builder_method ' ] );
6285 $ nbObjects = $ this ->countObjects ($ queryBuilder );
63- $ offset = isset ($ options ['offset ' ]) ? intval ($ options ['offset ' ]) : 0 ;
64- $ sleep = isset ($ options ['sleep ' ]) ? intval ($ options ['sleep ' ]) : 0 ;
65- $ batchSize = isset ($ options ['batch-size ' ]) ? intval ($ options ['batch-size ' ]) : $ this ->options ['batch_size ' ];
66- $ ignoreErrors = isset ($ options ['ignore-errors ' ]) ? $ options ['ignore-errors ' ] : $ this ->options ['ignore_errors ' ];
67- $ manager = $ this ->managerRegistry ->getManagerForClass ($ this ->objectClass );
86+ $ offset = $ options ['offset ' ];
6887
6988 $ objects = array ();
70- for (; $ offset < $ nbObjects ; $ offset += $ batchSize ) {
71- $ objects = $ this ->getSlice ($ queryBuilder , $ batchSize , $ offset , $ objects );
72- $ objects = array_filter ($ objects , array ($ this , 'isObjectIndexable ' ));
89+ for (; $ offset < $ nbObjects ; $ offset += $ options ['batch_size ' ]) {
90+ try {
91+ $ objects = $ this ->getSlice ($ queryBuilder , $ options ['batch_size ' ], $ offset , $ objects );
92+ $ objects = $ this ->filterObjects ($ options , $ objects );
7393
74- if (!empty ($ objects )) {
75- if (!$ ignoreErrors ) {
94+ if (!empty ($ objects )) {
7695 $ this ->objectPersister ->insertMany ($ objects );
77- } else {
78- try {
79- $ this ->objectPersister ->insertMany ($ objects );
80- } catch (BulkResponseException $ e ) {
81- if ($ loggerClosure ) {
82- $ loggerClosure ($ batchSize , $ nbObjects , sprintf ('<error>%s</error> ' , $ e ->getMessage ()));
83- }
84- }
96+ }
97+ } catch (BulkResponseException $ e ) {
98+ if (!$ options ['ignore_errors ' ]) {
99+ throw $ e ;
100+ }
101+
102+ if (null !== $ loggerClosure ) {
103+ $ loggerClosure (
104+ $ options ['batch_size ' ],
105+ $ nbObjects ,
106+ sprintf ('<error>%s</error> ' , $ e ->getMessage ())
107+ );
85108 }
86109 }
87110
88- if ($ this -> options ['clear_object_manager ' ]) {
111+ if ($ options ['clear_object_manager ' ]) {
89112 $ manager ->clear ();
90113 }
91114
92- usleep ($ sleep );
115+ usleep ($ options [ ' sleep ' ] );
93116
94- if ($ loggerClosure ) {
95- $ loggerClosure ($ batchSize , $ nbObjects );
117+ if (null !== $ loggerClosure ) {
118+ $ loggerClosure ($ options [ ' batch_size ' ] , $ nbObjects );
96119 }
97120 }
121+ }
98122
99- if (!$ this ->options ['debug_logging ' ]) {
100- $ this ->enableLogging ($ logger );
101- }
123+ /**
124+ * {@inheritDoc}
125+ */
126+ protected function configureOptions ()
127+ {
128+ parent ::configureOptions ();
129+
130+ $ this ->resolver ->setDefaults (array (
131+ 'clear_object_manager ' => true ,
132+ 'debug_logging ' => false ,
133+ 'ignore_errors ' => false ,
134+ 'offset ' => 0 ,
135+ 'query_builder_method ' => 'createQueryBuilder ' ,
136+ 'sleep ' => 0
137+ ));
102138 }
103139
104140 /**
@@ -112,7 +148,7 @@ public function populate(\Closure $loggerClosure = null, array $options = array(
112148 *
113149 * @return array
114150 */
115- protected function getSlice ($ queryBuilder , $ limit , $ offset , $ lastSlice )
151+ private function getSlice ($ queryBuilder , $ limit , $ offset , $ lastSlice )
116152 {
117153 if (!$ this ->sliceFetcher ) {
118154 return $ this ->fetchSlice ($ queryBuilder , $ limit , $ offset );
@@ -131,47 +167,4 @@ protected function getSlice($queryBuilder, $limit, $offset, $lastSlice)
131167 $ identifierFieldNames
132168 );
133169 }
134-
135- /**
136- * Counts objects that would be indexed using the query builder.
137- *
138- * @param object $queryBuilder
139- *
140- * @return integer
141- */
142- abstract protected function countObjects ($ queryBuilder );
143-
144- /**
145- * Disables logging and returns the logger that was previously set.
146- *
147- * @return mixed
148- */
149- abstract protected function disableLogging ();
150-
151- /**
152- * Reenables the logger with the previously returned logger from disableLogging();.
153- *
154- * @param mixed $logger
155- *
156- * @return mixed
157- */
158- abstract protected function enableLogging ($ logger );
159-
160- /**
161- * Fetches a slice of objects using the query builder.
162- *
163- * @param object $queryBuilder
164- * @param integer $limit
165- * @param integer $offset
166- *
167- * @return array
168- */
169- abstract protected function fetchSlice ($ queryBuilder , $ limit , $ offset );
170-
171- /**
172- * Creates the query builder, which will be used to fetch objects to index.
173- *
174- * @return object
175- */
176- abstract protected function createQueryBuilder ();
177170}
0 commit comments