Skip to content

Commit eb1ead3

Browse files
authored
ENGCOM-4344: 2.2.6 Use batches and direct queries to fix sales address upgrade #19098
2 parents dd1b43d + 943a27b commit eb1ead3

File tree

1 file changed

+84
-35
lines changed

1 file changed

+84
-35
lines changed

app/code/Magento/Sales/Setup/UpgradeData.php

Lines changed: 84 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Magento\Framework\Setup\ModuleDataSetupInterface;
1616
use Magento\Framework\Setup\UpgradeDataInterface;
1717
use Magento\Quote\Model\QuoteFactory;
18+
use Magento\Sales\Model\Order\Address;
1819
use Magento\Sales\Model\OrderFactory;
1920
use Magento\Sales\Model\ResourceModel\Order\Address\CollectionFactory as AddressCollectionFactory;
2021

@@ -42,27 +43,14 @@ class UpgradeData implements UpgradeDataInterface
4243
*/
4344
private $aggregatedFieldConverter;
4445

45-
/**
46-
* @var AddressCollectionFactory
47-
*/
48-
private $addressCollectionFactory;
49-
50-
/**
51-
* @var OrderFactory
52-
*/
53-
private $orderFactory;
54-
55-
/**
56-
* @var QuoteFactory
57-
*/
58-
private $quoteFactory;
59-
6046
/**
6147
* @var State
6248
*/
6349
private $state;
6450

6551
/**
52+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
53+
*
6654
* @param SalesSetupFactory $salesSetupFactory
6755
* @param Config $eavConfig
6856
* @param AggregatedFieldDataConverter $aggregatedFieldConverter
@@ -83,9 +71,6 @@ public function __construct(
8371
$this->salesSetupFactory = $salesSetupFactory;
8472
$this->eavConfig = $eavConfig;
8573
$this->aggregatedFieldConverter = $aggregatedFieldConverter;
86-
$this->addressCollectionFactory = $addressCollFactory;
87-
$this->orderFactory = $orderFactory;
88-
$this->quoteFactory = $quoteFactory;
8974
$this->state = $state;
9075
}
9176

@@ -125,6 +110,7 @@ public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface
125110
* @param string $setupVersion
126111
* @param SalesSetup $salesSetup
127112
* @return void
113+
* @throws \Magento\Framework\DB\FieldDataConversionException
128114
*/
129115
private function convertSerializedDataToJson($setupVersion, SalesSetup $salesSetup)
130116
{
@@ -173,32 +159,95 @@ private function convertSerializedDataToJson($setupVersion, SalesSetup $salesSet
173159

174160
/**
175161
* Fill quote_address_id in table sales_order_address if it is empty.
176-
*
177162
* @param ModuleDataSetupInterface $setup
178163
*/
179164
public function fillQuoteAddressIdInSalesOrderAddress(ModuleDataSetupInterface $setup)
180165
{
181-
$addressTable = $setup->getTable('sales_order_address');
182-
$updateOrderAddress = $setup->getConnection()
166+
$this->fillQuoteAddressIdInSalesOrderAddressByType($setup, Address::TYPE_SHIPPING);
167+
$this->fillQuoteAddressIdInSalesOrderAddressByType($setup, Address::TYPE_BILLING);
168+
}
169+
170+
/**
171+
* @param ModuleDataSetupInterface $setup
172+
* @param string $addressType
173+
*/
174+
private function fillQuoteAddressIdInSalesOrderAddressByType(ModuleDataSetupInterface $setup, $addressType)
175+
{
176+
$salesConnection = $setup->getConnection('sales');
177+
178+
$orderTable = $setup->getTable('sales_order', 'sales');
179+
$orderAddressTable = $setup->getTable('sales_order_address', 'sales');
180+
181+
$query = $salesConnection
183182
->select()
183+
->from(
184+
['sales_order_address' => $orderAddressTable],
185+
['entity_id', 'address_type']
186+
)
184187
->joinInner(
185-
['sales_order' => $setup->getTable('sales_order')],
186-
$addressTable . '.parent_id = sales_order.entity_id',
187-
['quote_address_id' => 'quote_address.address_id']
188+
['sales_order' => $orderTable],
189+
'sales_order_address.parent_id = sales_order.entity_id',
190+
['quote_id' => 'sales_order.quote_id']
191+
)
192+
->where('sales_order_address.quote_address_id IS NULL')
193+
->where('sales_order_address.address_type = ?', $addressType)
194+
->order('sales_order_address.entity_id');
195+
196+
$batchSize = 5000;
197+
$result = $salesConnection->query($query);
198+
$count = $result->rowCount();
199+
$batches = ceil($count / $batchSize);
200+
201+
for ($batch = $batches; $batch > 0; $batch--) {
202+
$query->limitPage($batch, $batchSize);
203+
$result = $salesConnection->fetchAssoc($query);
204+
205+
$this->fillQuoteAddressIdInSalesOrderAddressProcessBatch($setup, $result, $addressType);
206+
}
207+
}
208+
209+
/**
210+
* @param ModuleDataSetupInterface $setup
211+
* @param array $orderAddresses
212+
* @param string $addressType
213+
*/
214+
private function fillQuoteAddressIdInSalesOrderAddressProcessBatch(
215+
ModuleDataSetupInterface $setup,
216+
array $orderAddresses,
217+
$addressType
218+
) {
219+
$salesConnection = $setup->getConnection('sales');
220+
$quoteConnection = $setup->getConnection('checkout');
221+
222+
$quoteAddressTable = $setup->getTable('quote_address', 'checkout');
223+
$quoteTable = $setup->getTable('quote', 'checkout');
224+
$salesOrderAddressTable = $setup->getTable('sales_order_address', 'sales');
225+
226+
$query = $quoteConnection
227+
->select()
228+
->from(
229+
['quote_address' => $quoteAddressTable],
230+
['quote_id', 'address_id']
188231
)
189232
->joinInner(
190-
['quote_address' => $setup->getTable('quote_address')],
191-
'sales_order.quote_id = quote_address.quote_id
192-
AND ' . $addressTable . '.address_type = quote_address.address_type',
233+
['quote' => $quoteTable],
234+
'quote_address.quote_id = quote.entity_id',
193235
[]
194236
)
195-
->where(
196-
$addressTable . '.quote_address_id IS NULL'
197-
);
198-
$updateOrderAddress = $setup->getConnection()->updateFromSelect(
199-
$updateOrderAddress,
200-
$addressTable
201-
);
202-
$setup->getConnection()->query($updateOrderAddress);
237+
->where('quote.entity_id in (?)', array_column($orderAddresses, 'quote_id'))
238+
->where('address_type = ?', $addressType);
239+
240+
$quoteAddresses = $quoteConnection->fetchAssoc($query);
241+
242+
foreach ($orderAddresses as $orderAddress) {
243+
$bind = [
244+
'quote_address_id' => $quoteAddresses[$orderAddress['quote_id']]['address_id'] ?? null,
245+
];
246+
$where = [
247+
'entity_id = ?' => $orderAddress['entity_id']
248+
];
249+
250+
$salesConnection->update($salesOrderAddressTable, $bind, $where);
251+
}
203252
}
204253
}

0 commit comments

Comments
 (0)