123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- /**
- * Reports Mysql resource helper model
- *
- * @author Magento Core Team <core@magentocommerce.com>
- */
- namespace Magento\Reports\Model\ResourceModel;
- class Helper extends \Magento\Framework\DB\Helper implements \Magento\Reports\Model\ResourceModel\HelperInterface
- {
- /**
- * @param \Magento\Framework\App\ResourceConnection $resource
- * @param string $modulePrefix
- */
- public function __construct(\Magento\Framework\App\ResourceConnection $resource, $modulePrefix = 'reports')
- {
- parent::__construct($resource, $modulePrefix);
- }
- /**
- * Merge Index data
- *
- * @param string $mainTable
- * @param array $data
- * @param mixed $matchFields
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- * @return string
- */
- public function mergeVisitorProductIndex($mainTable, $data, $matchFields)
- {
- $result = $this->getConnection()->insertOnDuplicate($mainTable, $data, array_keys($data));
- return $result;
- }
- /**
- * @inheritdoc
- */
- public function updateReportRatingPos($connection, $type, $column, $mainTable, $aggregationTable)
- {
- $periodSubSelect = $connection->select();
- $ratingSubSelect = $connection->select();
- $ratingSelect = $connection->select();
- switch ($type) {
- case 'year':
- $periodCol = $connection->getDateFormatSql('t.period', '%Y-01-01');
- break;
- case 'month':
- $periodCol = $connection->getDateFormatSql('t.period', '%Y-%m-01');
- break;
- default:
- $periodCol = 't.period';
- break;
- }
- $columns = [
- 'period' => 't.period',
- 'store_id' => 't.store_id',
- 'product_id' => 't.product_id',
- 'product_name' => 't.product_name',
- 'product_price' => 't.product_price',
- ];
- if ($type == 'day') {
- $columns['id'] = 't.id'; // to speed-up insert on duplicate key update
- }
- $cols = array_keys($columns);
- $cols['total_qty'] = new \Zend_Db_Expr('SUM(t.' . $column . ')');
- $periodSubSelect->from(
- ['t' => $mainTable],
- $cols
- )->group(
- ['t.store_id', $periodCol, 't.product_id']
- )->order(
- ['t.store_id', $periodCol, 'total_qty DESC']
- );
- $cols = $columns;
- $cols[$column] = 't.total_qty';
- $cols['rating_pos'] = new \Zend_Db_Expr(
- "(@pos := IF(t.`store_id` <> @prevStoreId OR {$periodCol} <> @prevPeriod, 1, @pos+1))"
- );
- $cols['prevStoreId'] = new \Zend_Db_Expr('(@prevStoreId := t.`store_id`)');
- $cols['prevPeriod'] = new \Zend_Db_Expr("(@prevPeriod := {$periodCol})");
- $ratingSubSelect->from($periodSubSelect, $cols);
- $cols = $columns;
- $cols['period'] = $periodCol;
- $cols[$column] = 't.' . $column;
- $cols['rating_pos'] = 't.rating_pos';
- $ratingSelect->from($ratingSubSelect, $cols);
- $sql = $ratingSelect->insertFromSelect($aggregationTable, array_keys($cols));
- $connection->query("SET @pos = 0, @prevStoreId = -1, @prevPeriod = '0000-00-00'");
- $connection->query($sql);
- return $this;
- }
- }
|