Skip to content

Commit 70fb3da

Browse files
rikwillemsihor-sviziev
authored andcommitted
Use batches and direct queries to fix sales address upgrade
1 parent da1173a commit 70fb3da

File tree

1 file changed

+90
-40
lines changed

1 file changed

+90
-40
lines changed

app/code/Magento/Sales/Setup/Patch/Data/FillQuoteAddressIdInSalesOrderAddress.php

Lines changed: 90 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Magento\Eav\Model\Config;
1010
use Magento\Framework\App\State;
1111
use Magento\Quote\Model\QuoteFactory;
12+
use Magento\Sales\Model\Order\Address;
1213
use Magento\Sales\Model\OrderFactory;
1314
use Magento\Sales\Model\ResourceModel\Order\Address\CollectionFactory as AddressCollectionFactory;
1415
use Magento\Framework\App\ResourceConnection;
@@ -39,23 +40,11 @@ class FillQuoteAddressIdInSalesOrderAddress implements DataPatchInterface, Patch
3940
*/
4041
private $eavConfig;
4142

42-
/**
43-
* @var AddressCollectionFactory
44-
*/
45-
private $addressCollectionFactory;
46-
47-
/**
48-
* @var OrderFactory
49-
*/
50-
private $orderFactory;
51-
52-
/**
53-
* @var QuoteFactory
54-
*/
55-
private $quoteFactory;
56-
5743
/**
5844
* PatchInitial constructor.
45+
*
46+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
47+
*
5948
* @param ModuleDataSetupInterface $moduleDataSetup
6049
*/
6150
public function __construct(
@@ -71,9 +60,6 @@ public function __construct(
7160
$this->salesSetupFactory = $salesSetupFactory;
7261
$this->state = $state;
7362
$this->eavConfig = $eavConfig;
74-
$this->addressCollectionFactory = $addressCollectionFactory;
75-
$this->orderFactory = $orderFactory;
76-
$this->quoteFactory = $quoteFactory;
7763
}
7864

7965
/**
@@ -96,28 +82,8 @@ public function apply()
9682
*/
9783
public function fillQuoteAddressIdInSalesOrderAddress(ModuleDataSetupInterface $setup)
9884
{
99-
$addressTable = $setup->getTable('sales_order_address');
100-
$updateOrderAddress = $setup->getConnection()
101-
->select()
102-
->joinInner(
103-
['sales_order' => $setup->getTable('sales_order')],
104-
$addressTable . '.parent_id = sales_order.entity_id',
105-
['quote_address_id' => 'quote_address.address_id']
106-
)
107-
->joinInner(
108-
['quote_address' => $setup->getTable('quote_address')],
109-
'sales_order.quote_id = quote_address.quote_id
110-
AND ' . $addressTable . '.address_type = quote_address.address_type',
111-
[]
112-
)
113-
->where(
114-
$addressTable . '.quote_address_id IS NULL'
115-
);
116-
$updateOrderAddress = $setup->getConnection()->updateFromSelect(
117-
$updateOrderAddress,
118-
$addressTable
119-
);
120-
$setup->getConnection()->query($updateOrderAddress);
85+
$this->fillQuoteAddressIdInSalesOrderAddressByType($setup, Address::TYPE_SHIPPING);
86+
$this->fillQuoteAddressIdInSalesOrderAddressByType($setup, Address::TYPE_BILLING);
12187
}
12288

12389
/**
@@ -145,4 +111,88 @@ public function getAliases()
145111
{
146112
return [];
147113
}
114+
115+
/**
116+
* @param ModuleDataSetupInterface $setup
117+
* @param string $addressType
118+
*/
119+
private function fillQuoteAddressIdInSalesOrderAddressByType(ModuleDataSetupInterface $setup, $addressType)
120+
{
121+
$salesConnection = $setup->getConnection('sales');
122+
123+
$orderTable = $setup->getTable('sales_order', 'sales');
124+
$orderAddressTable = $setup->getTable('sales_order_address', 'sales');
125+
126+
$query = $salesConnection
127+
->select()
128+
->from(
129+
['sales_order_address' => $orderAddressTable],
130+
['entity_id', 'address_type']
131+
)
132+
->joinInner(
133+
['sales_order' => $orderTable],
134+
'sales_order_address.parent_id = sales_order.entity_id',
135+
['quote_id' => 'sales_order.quote_id']
136+
)
137+
->where('sales_order_address.quote_address_id IS NULL')
138+
->where('sales_order_address.address_type = ?', $addressType)
139+
->order('sales_order_address.entity_id');
140+
141+
$batchSize = 5000;
142+
$result = $salesConnection->query($query);
143+
$count = $result->rowCount();
144+
$batches = ceil($count / $batchSize);
145+
146+
for ($batch = $batches; $batch > 0; $batch--) {
147+
$query->limitPage($batch, $batchSize);
148+
$result = $salesConnection->fetchAssoc($query);
149+
150+
$this->fillQuoteAddressIdInSalesOrderAddressProcessBatch($setup, $result, $addressType);
151+
}
152+
}
153+
154+
/**
155+
* @param ModuleDataSetupInterface $setup
156+
* @param array $orderAddresses
157+
* @param string $addressType
158+
*/
159+
private function fillQuoteAddressIdInSalesOrderAddressProcessBatch(
160+
ModuleDataSetupInterface $setup,
161+
array $orderAddresses,
162+
$addressType
163+
) {
164+
$salesConnection = $setup->getConnection('sales');
165+
$quoteConnection = $setup->getConnection('checkout');
166+
167+
$quoteAddressTable = $setup->getTable('quote_address', 'checkout');
168+
$quoteTable = $setup->getTable('quote', 'checkout');
169+
$salesOrderAddressTable = $setup->getTable('sales_order_address', 'sales');
170+
171+
$query = $quoteConnection
172+
->select()
173+
->from(
174+
['quote_address' => $quoteAddressTable],
175+
['quote_id', 'address_id']
176+
)
177+
->joinInner(
178+
['quote' => $quoteTable],
179+
'quote_address.quote_id = quote.entity_id',
180+
[]
181+
)
182+
->where('quote.entity_id in (?)', array_column($orderAddresses, 'quote_id'))
183+
->where('address_type = ?', $addressType);
184+
185+
$quoteAddresses = $quoteConnection->fetchAssoc($query);
186+
187+
foreach ($orderAddresses as $orderAddress) {
188+
$bind = [
189+
'quote_address_id' => $quoteAddresses[$orderAddress['quote_id']]['address_id'] ?? null,
190+
];
191+
$where = [
192+
'orderAddressId' => $orderAddress['entity_id']
193+
];
194+
195+
$salesConnection->update($salesOrderAddressTable, $bind, $where);
196+
}
197+
}
148198
}

0 commit comments

Comments
 (0)