87 $this->connection =
$resource->getConnection();
89 $this->scopeResolvers[$this->dataTypes[0]] = $indexScopeResolver;
90 $this->scopeResolvers[$this->dataTypes[1]] = $flatScopeResolver;
95 $this->prepareFields();
101 public function saveIndex($dimensions, \Traversable $documents)
103 foreach ($this->batch->getItems($documents, $this->batchSize) as $batchDocuments) {
104 $this->insertDocumentsForSearchable($batchDocuments, $dimensions);
114 foreach ($this->dataTypes as $dataType) {
115 foreach ($this->batch->getItems($documents, $this->batchSize) as $batchDocuments) {
116 $documentsId = array_column($batchDocuments,
'id');
117 $this->connection->delete($this->
getTableName($dataType, $dimensions), [
'id' => $documentsId]);
127 $this->indexStructure->delete($this->
getIndexName(), $dimensions);
128 $this->indexStructure->create($this->
getIndexName(), $this->fields, $dimensions);
148 return $this->scopeResolvers[$dataType]->resolve($this->
getIndexName(), $dimensions);
158 return $this->data[
'indexer_id'];
168 private function insertDocumentsForSearchable(array $documents, array $dimensions)
170 $this->connection->insertOnDuplicate(
172 $this->prepareSearchableFields($documents),
187 foreach ($this->fields as $field) {
188 if ($field[
'type'] === $this->dataTypes[1]) {
189 $onDuplicate[] = $field[
'name'];
193 $this->connection->insertOnDuplicate(
208 $insertDocuments = [];
209 foreach ($documents as $entityId => $document) {
210 $documentFlat = [
'entity_id' => $entityId];
211 foreach ($this->fields as $field) {
212 if ($field[
'type'] == $this->dataTypes[1]) {
213 $documentFlat[$field[
'name']] = $document[$field[
'name']];
216 $insertDocuments[] = $documentFlat;
218 return $insertDocuments;
227 private function prepareSearchableFields(array $documents)
229 $insertDocuments = [];
230 foreach ($documents as $entityId => $document) {
231 foreach ($this->fields as $field) {
232 if ($field[
'type'] === $this->dataTypes[0]) {
233 $insertDocuments[] = [
234 'entity_id' => $entityId,
235 'attribute_id' => $field[
'name'],
236 'data_index' => $document[$field[
'name']],
242 return $insertDocuments;
250 private function prepareFields()
252 foreach ($this->data[
'fieldsets'] as $fieldset) {
253 $this->fields = array_merge($this->fields, array_values($fieldset[
'fields']));
saveIndex($dimensions, \Traversable $documents)
getTableName($dataType, $dimensions)
deleteIndex($dimensions, \Traversable $documents)
prepareFilterableFields(array $documents)
isAvailable($dimensions=[])
insertDocumentsForFilterable(array $documents, array $dimensions)
__construct(IndexStructureInterface $indexStructure, ResourceConnection $resource, Batch $batch, IndexScopeResolver $indexScopeResolver, FlatScopeResolver $flatScopeResolver, array $data, $batchSize=100)