Skip to content

Commit ace1005

Browse files
nmalevanecp-bystritsky
authored andcommitted
ENGCOM-3449: Fix/add expresion.
1 parent 09692bc commit ace1005

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

dev/tests/integration/testsuite/Magento/Framework/Model/ResourceModel/Db/Collection/AbstractTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,42 @@ public function testGetAllIdsWithBind()
7272
$this->_model->addBindParam('code', 'admin');
7373
$this->assertEquals(['0'], $this->_model->getAllIds());
7474
}
75+
76+
/**
77+
* Check add field to select doesn't remove expression field from select.
78+
*
79+
* @return void
80+
*/
81+
public function testAddExpressionFieldToSelectWithAdditionalFields()
82+
{
83+
$expectedColumns = ['code', 'test_field'];
84+
$actualColumns = [];
85+
86+
$testExpression = new \Zend_Db_Expr('(sort_order + group_id)');
87+
$this->_model->addExpressionFieldToSelect('test_field', $testExpression, ['sort_order', 'group_id']);
88+
$this->_model->addFieldToSelect('code', 'code');
89+
$columns = $this->_model->getSelect()->getPart(\Magento\Framework\DB\Select::COLUMNS);
90+
foreach ($columns as $columnEntry) {
91+
$actualColumns[] = $columnEntry[2];
92+
}
93+
94+
$this->assertEquals($expectedColumns, $actualColumns);
95+
}
96+
97+
/**
98+
* Check add expression field doesn't remove all fields from select.
99+
*
100+
* @return void
101+
*/
102+
public function testAddExpressionFieldToSelectWithoutAdditionalFields()
103+
{
104+
$expectedColumns = ['*', 'test_field'];
105+
106+
$testExpression = new \Zend_Db_Expr('(sort_order + group_id)');
107+
$this->_model->addExpressionFieldToSelect('test_field', $testExpression, ['sort_order', 'group_id']);
108+
$columns = $this->_model->getSelect()->getPart(\Magento\Framework\DB\Select::COLUMNS);
109+
$actualColumns = [$columns[0][1], $columns[1][2]];
110+
111+
$this->assertEquals($expectedColumns, $actualColumns);
112+
}
75113
}

lib/internal/Magento/Framework/Model/ResourceModel/Db/Collection/AbstractCollection.php

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ abstract class AbstractCollection extends AbstractDb implements SourceProviderIn
4545
*/
4646
protected $_fieldsToSelect = null;
4747

48+
/**
49+
* Expression fields to select in query.
50+
*
51+
* @var array
52+
*/
53+
private $expressionFieldsToSelect = [];
54+
4855
/**
4956
* Fields initial fields to select like id_field
5057
*
@@ -205,7 +212,7 @@ protected function _initSelectFields()
205212
$columnsToSelect = [];
206213
foreach ($columns as $columnEntry) {
207214
list($correlationName, $column, $alias) = $columnEntry;
208-
if ($correlationName !== 'main_table') {
215+
if ($correlationName !== 'main_table' || isset($this->expressionFieldsToSelect[$alias])) {
209216
// Add joined fields to select
210217
if ($column instanceof \Zend_Db_Expr) {
211218
$column = $column->__toString();
@@ -346,9 +353,8 @@ public function addExpressionFieldToSelect($alias, $expression, $fields)
346353
$fullExpression = str_replace('{{' . $fieldKey . '}}', $fieldItem, $fullExpression);
347354
}
348355

349-
$fullExpression = new \Zend_Db_Expr($fullExpression);
350-
$this->_fieldsToSelect[$alias] = $fullExpression;
351-
$this->_fieldsToSelectChanged = true;
356+
$this->getSelect()->columns([$alias => $fullExpression]);
357+
$this->expressionFieldsToSelect[$alias] = $fullExpression;
352358

353359
return $this;
354360
}

lib/internal/Magento/Framework/Model/Test/Unit/ResourceModel/Db/Collection/AbstractCollectionTest.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,8 @@ public function addFieldToSelectDataProvider()
269269
*/
270270
public function testAddExpressionFieldToSelect($alias, $expression, $fields, $expected)
271271
{
272+
$this->selectMock->expects($this->once())->method('columns')->with($expected);
272273
$this->assertTrue($this->uut->addExpressionFieldToSelect($alias, $expression, $fields) instanceof Uut);
273-
$this->assertEquals($expected, $this->uut->getFieldsToSelect());
274-
$this->assertTrue($this->uut->wereFieldsToSelectChanged());
275274
}
276275

277276
/**

0 commit comments

Comments
 (0)