Skip to content

Commit a62dc7d

Browse files
author
Denys Rudchenko
committed
Merge remote-tracking branch 'nord/MAGETWO-36951' into nord_develop
2 parents ab6af20 + ab46844 commit a62dc7d

File tree

3 files changed

+188
-42
lines changed

3 files changed

+188
-42
lines changed

app/code/Magento/Review/Model/Resource/Review.php

Lines changed: 64 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,6 @@ public function getTotalReviews($entityPkValue, $approvedOnly = false, $storeId
322322
*/
323323
public function aggregate($object)
324324
{
325-
$readAdapter = $this->_getReadAdapter();
326-
$writeAdapter = $this->_getWriteAdapter();
327325
if (!$object->getEntityPkValue() && $object->getId()) {
328326
$object->load($object->getReviewId());
329327
}
@@ -332,48 +330,72 @@ public function aggregate($object)
332330
$ratingSummaries = $ratingModel->getEntitySummary($object->getEntityPkValue(), false);
333331

334332
foreach ($ratingSummaries as $ratingSummaryObject) {
335-
if ($ratingSummaryObject->getCount()) {
336-
$ratingSummary = round($ratingSummaryObject->getSum() / $ratingSummaryObject->getCount());
337-
} else {
338-
$ratingSummary = $ratingSummaryObject->getSum();
339-
}
333+
$this->aggregateReviewSummary($object, $ratingSummaryObject);
334+
}
335+
}
340336

341-
$reviewsCount = $this->getTotalReviews(
342-
$object->getEntityPkValue(),
343-
true,
344-
$ratingSummaryObject->getStoreId()
345-
);
346-
$select = $readAdapter->select()->from($this->_aggregateTable)
347-
->where('entity_pk_value = :pk_value')
348-
->where('entity_type = :entity_type')
349-
->where('store_id = :store_id');
350-
$bind = [
351-
':pk_value' => $object->getEntityPkValue(),
352-
':entity_type' => $object->getEntityId(),
353-
':store_id' => $ratingSummaryObject->getStoreId(),
354-
];
355-
$oldData = $readAdapter->fetchRow($select, $bind);
356-
357-
$data = new \Magento\Framework\Object();
358-
359-
$data->setReviewsCount($reviewsCount)
360-
->setEntityPkValue($object->getEntityPkValue())
361-
->setEntityType($object->getEntityId())
362-
->setRatingSummary($ratingSummary > 0 ? $ratingSummary : 0)
363-
->setStoreId($ratingSummaryObject->getStoreId());
364-
365-
$writeAdapter->beginTransaction();
366-
try {
367-
if ($oldData['primary_id'] > 0) {
368-
$condition = ["{$this->_aggregateTable}.primary_id = ?" => $oldData['primary_id']];
369-
$writeAdapter->update($this->_aggregateTable, $data->getData(), $condition);
370-
} else {
371-
$writeAdapter->insert($this->_aggregateTable, $data->getData());
372-
}
373-
$writeAdapter->commit();
374-
} catch (\Exception $e) {
375-
$writeAdapter->rollBack();
337+
/**
338+
* Aggregate review summary
339+
*
340+
* @param \Magento\Framework\Model\AbstractModel $object
341+
* @param $ratingSummaryObject
342+
*/
343+
protected function aggregateReviewSummary($object, $ratingSummaryObject)
344+
{
345+
$readAdapter = $this->_getReadAdapter();
346+
347+
if ($ratingSummaryObject->getCount()) {
348+
$ratingSummary = round($ratingSummaryObject->getSum() / $ratingSummaryObject->getCount());
349+
} else {
350+
$ratingSummary = $ratingSummaryObject->getSum();
351+
}
352+
353+
$reviewsCount = $this->getTotalReviews(
354+
$object->getEntityPkValue(),
355+
true,
356+
$ratingSummaryObject->getStoreId()
357+
);
358+
$select = $readAdapter->select()->from($this->_aggregateTable)
359+
->where('entity_pk_value = :pk_value')
360+
->where('entity_type = :entity_type')
361+
->where('store_id = :store_id');
362+
$bind = [
363+
':pk_value' => $object->getEntityPkValue(),
364+
':entity_type' => $object->getEntityId(),
365+
':store_id' => $ratingSummaryObject->getStoreId(),
366+
];
367+
$oldData = $readAdapter->fetchRow($select, $bind);
368+
$data = new \Magento\Framework\Object();
369+
370+
$data->setReviewsCount($reviewsCount)
371+
->setEntityPkValue($object->getEntityPkValue())
372+
->setEntityType($object->getEntityId())
373+
->setRatingSummary($ratingSummary > 0 ? $ratingSummary : 0)
374+
->setStoreId($ratingSummaryObject->getStoreId());
375+
376+
$this->writeReviewSummary($oldData, $data);
377+
}
378+
379+
/**
380+
* Write rating summary
381+
*
382+
* @param array|bool $oldData
383+
* @param \Magento\Framework\Object $data
384+
*/
385+
protected function writeReviewSummary($oldData, \Magento\Framework\Object $data)
386+
{
387+
$writeAdapter = $this->_getWriteAdapter();
388+
$writeAdapter->beginTransaction();
389+
try {
390+
if (isset($oldData['primary_id']) && $oldData['primary_id'] > 0) {
391+
$condition = ["{$this->_aggregateTable}.primary_id = ?" => $oldData['primary_id']];
392+
$writeAdapter->update($this->_aggregateTable, $data->getData(), $condition);
393+
} else {
394+
$writeAdapter->insert($this->_aggregateTable, $data->getData());
376395
}
396+
$writeAdapter->commit();
397+
} catch (\Exception $e) {
398+
$writeAdapter->rollBack();
377399
}
378400
}
379401

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
/**
3+
* Copyright © 2015 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Review\Model\Resource\Review;
7+
8+
/**
9+
* Class ReviewTest
10+
*/
11+
class ReviewTest extends \PHPUnit_Framework_TestCase
12+
{
13+
/**
14+
* @var \Magento\Framework\ObjectManagerInterface
15+
*/
16+
protected $objectManager;
17+
18+
/**
19+
* @var \Magento\Review\Model\Resource\Review
20+
*/
21+
protected $reviewResource;
22+
23+
/**
24+
* @var \Magento\Review\Model\Review
25+
*/
26+
protected $review;
27+
28+
/**
29+
* @var \Magento\Framework\App\Resource
30+
*/
31+
protected $resource;
32+
33+
/**
34+
* @var \Magento\Framework\DB\Adapter\AdapterInterface
35+
*/
36+
protected $adapter;
37+
38+
/**
39+
* @return void
40+
*/
41+
protected function setUp()
42+
{
43+
$this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
44+
$this->resource = $this->objectManager->get('Magento\Framework\App\Resource');
45+
$this->adapter = $this->resource->getConnection('core_read');
46+
$this->review = $this->objectManager->create('Magento\Review\Model\Review');
47+
$this->reviewResource = $this->objectManager->create('Magento\Review\Model\Resource\Review');
48+
}
49+
50+
/**
51+
* @magentoDataFixture Magento/Review/_files/customer_review_with_rating.php
52+
*/
53+
public function testAggregate()
54+
{
55+
$rating = $this->review->getCollection()->getFirstItem();
56+
$this->reviewResource->aggregate($rating);
57+
58+
$select = $this->adapter->select()->from($this->resource->getTableName('review_entity_summary'));
59+
$result = $this->adapter->fetchRow($select);
60+
61+
$this->assertEquals(1, $result['reviews_count']);
62+
$this->assertEquals(40, $result['rating_summary']);
63+
}
64+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
/**
3+
* Copyright © 2015 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
\Magento\TestFramework\Helper\Bootstrap::getInstance()->loadArea(
8+
\Magento\Backend\App\Area\FrontNameResolver::AREA_CODE
9+
);
10+
11+
require __DIR__ . '/../../../Magento/Customer/_files/customer.php';
12+
require __DIR__ . '/../../../Magento/Catalog/_files/product_simple.php';
13+
14+
$storeId = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Store\Model\StoreManagerInterface')
15+
->getStore()->getId();
16+
17+
$review = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
18+
'Magento\Review\Model\Review',
19+
['data' => [
20+
'customer_id' => $customer->getId(),
21+
'title' => 'Review Summary',
22+
'detail' => 'Review text',
23+
'nickname' => 'Nickname',
24+
]]
25+
);
26+
27+
$review
28+
->setEntityId($review->getEntityIdByCode(\Magento\Review\Model\Review::ENTITY_PRODUCT_CODE))
29+
->setEntityPkValue($product->getId())
30+
->setStatusId(\Magento\Review\Model\Review::STATUS_APPROVED)
31+
->setStoreId($storeId)
32+
->setStores([$storeId])
33+
->save();
34+
35+
\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry')->register(
36+
'review_data',
37+
$review
38+
);
39+
40+
$ratingCollection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
41+
'\Magento\Review\Model\Rating'
42+
)->getCollection()
43+
->setPageSize(2)
44+
->setCurPage(1);
45+
46+
foreach($ratingCollection as $rating) {
47+
$rating->setStores([$storeId])->setIsActive(1)->save();
48+
}
49+
50+
foreach($ratingCollection as $rating) {
51+
$ratingOption = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
52+
'\Magento\Review\Model\Rating\Option'
53+
)->getCollection()
54+
->setPageSize(1)
55+
->setCurPage(2)
56+
->addRatingFilter($rating->getId())
57+
->getFirstItem();
58+
$rating->setReviewId($review->getId())
59+
->addOptionVote($ratingOption->getId(), $product->getId());
60+
}

0 commit comments

Comments
 (0)