mainTableName = $mainTableName; $this->gridTableName = $gridTableName; $this->orderIdField = $orderIdField; $this->joins = $joins; $this->columns = $columns; $this->notSyncedDataProvider = $notSyncedDataProvider ?: ObjectManager::getInstance()->get(NotSyncedDataProviderInterface::class); parent::__construct($context, $connectionName); } /** * Adds new orders to the grid. * * Only orders that correspond to $value and $field parameters will be added. * * @param int|string $value * @param null|string $field * @return \Zend_Db_Statement_Interface */ public function refresh($value, $field = null) { $select = $this->getGridOriginSelect() ->where(($field ?: $this->mainTableName . '.entity_id') . ' = ?', $value); $sql = $this->getConnection() ->insertFromSelect( $select, $this->getTable($this->gridTableName), array_keys($this->columns), AdapterInterface::INSERT_ON_DUPLICATE ); $this->addCommitCallback(function () use ($sql) { $this->getConnection()->query($sql); }); // need for backward compatibility return $this->getConnection()->query($sql); } /** * Adds new orders to the grid. * * Only orders created/updated since the last method call will be added. * * @return void */ public function refreshBySchedule() { $notSyncedIds = $this->notSyncedDataProvider->getIds($this->mainTableName, $this->gridTableName); foreach (array_chunk($notSyncedIds, self::BATCH_SIZE) as $bunch) { $select = $this->getGridOriginSelect()->where($this->mainTableName . '.entity_id IN (?)', $bunch); $fetchResult = $this->getConnection()->fetchAll($select); $this->getConnection()->insertOnDuplicate( $this->getTable($this->gridTableName), $fetchResult, array_keys($this->columns) ); } } /** * Get order id field. * * @return string */ public function getOrderIdField() { return $this->orderIdField; } /** * Returns select object * * @return \Magento\Framework\DB\Select */ protected function getGridOriginSelect() { $select = $this->getConnection()->select() ->from([$this->mainTableName => $this->getTable($this->mainTableName)], []); foreach ($this->joins as $joinName => $data) { $select->joinLeft( [$joinName => $this->getTable($data['table'])], sprintf( '%s.%s = %s.%s', $this->mainTableName, $data['origin_column'], $joinName, $data['target_column'] ), [] ); } $columns = []; foreach ($this->columns as $key => $value) { if ($value instanceof \Zend_Db_Expr) { $columns[$key] = $value; } else { $columns[$key] = new \Zend_Db_Expr($value); } } $select->columns($columns); return $select; } }