PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.36.0
MailPoet – Newsletters, Email Marketing, and Automation v5.36.0
5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor-prefixed / doctrine / orm / src / Query / Exec / MultiTableUpdateExecutor.php
mailpoet / vendor-prefixed / doctrine / orm / src / Query / Exec Last commit date
AbstractSqlExecutor.php 9 months ago FinalizedSelectExecutor.php 9 months ago MultiTableDeleteExecutor.php 9 months ago MultiTableUpdateExecutor.php 9 months ago PreparedExecutorFinalizer.php 9 months ago SingleSelectExecutor.php 9 months ago SingleSelectSqlFinalizer.php 9 months ago SingleTableDeleteUpdateExecutor.php 9 months ago SqlFinalizer.php 9 months ago index.php 9 months ago
MultiTableUpdateExecutor.php
115 lines
1 <?php
2 declare (strict_types=1);
3 namespace MailPoetVendor\Doctrine\ORM\Query\Exec;
4 if (!defined('ABSPATH')) exit;
5 use MailPoetVendor\Doctrine\DBAL\Connection;
6 use MailPoetVendor\Doctrine\DBAL\Connections\PrimaryReadReplicaConnection;
7 use MailPoetVendor\Doctrine\DBAL\Types\Type;
8 use MailPoetVendor\Doctrine\ORM\Query\AST;
9 use MailPoetVendor\Doctrine\ORM\Query\AST\UpdateStatement;
10 use MailPoetVendor\Doctrine\ORM\Query\ParameterTypeInferer;
11 use MailPoetVendor\Doctrine\ORM\Query\SqlWalker;
12 use MailPoetVendor\Doctrine\ORM\Utility\PersisterHelper;
13 use function array_merge;
14 use function array_reverse;
15 use function array_slice;
16 use function implode;
17 class MultiTableUpdateExecutor extends AbstractSqlExecutor
18 {
19 private $createTempTableSql;
20 private $dropTempTableSql;
21 private $insertSql;
22 private $sqlParameters = [];
23 private $numParametersInUpdateClause = 0;
24 public function __construct(AST\Node $AST, $sqlWalker)
25 {
26 parent::__construct();
27 $em = $sqlWalker->getEntityManager();
28 $conn = $em->getConnection();
29 $platform = $conn->getDatabasePlatform();
30 $quoteStrategy = $em->getConfiguration()->getQuoteStrategy();
31 if ($conn instanceof PrimaryReadReplicaConnection) {
32 $conn->ensureConnectedToPrimary();
33 }
34 $updateClause = $AST->updateClause;
35 $primaryClass = $sqlWalker->getEntityManager()->getClassMetadata($updateClause->abstractSchemaName);
36 $rootClass = $em->getClassMetadata($primaryClass->rootEntityName);
37 $updateItems = $updateClause->updateItems;
38 $tempTable = $platform->getTemporaryTableName($rootClass->getTemporaryIdTableName());
39 $idColumnNames = $rootClass->getIdentifierColumnNames();
40 $idColumnList = implode(', ', $idColumnNames);
41 // 1. Create an INSERT INTO temptable ... SELECT identifiers WHERE $AST->getWhereClause()
42 $sqlWalker->setSQLTableAlias($primaryClass->getTableName(), 't0', $updateClause->aliasIdentificationVariable);
43 $this->insertSql = 'INSERT INTO ' . $tempTable . ' (' . $idColumnList . ')' . ' SELECT t0.' . implode(', t0.', $idColumnNames);
44 $rangeDecl = new AST\RangeVariableDeclaration($primaryClass->name, $updateClause->aliasIdentificationVariable);
45 $fromClause = new AST\FromClause([new AST\IdentificationVariableDeclaration($rangeDecl, null, [])]);
46 $this->insertSql .= $sqlWalker->walkFromClause($fromClause);
47 // 2. Create ID subselect statement used in UPDATE ... WHERE ... IN (subselect)
48 $idSubselect = 'SELECT ' . $idColumnList . ' FROM ' . $tempTable;
49 // 3. Create and store UPDATE statements
50 $classNames = array_merge($primaryClass->parentClasses, [$primaryClass->name], $primaryClass->subClasses);
51 foreach (array_reverse($classNames) as $className) {
52 $affected = \false;
53 $class = $em->getClassMetadata($className);
54 $updateSql = 'UPDATE ' . $quoteStrategy->getTableName($class, $platform) . ' SET ';
55 $sqlParameters = [];
56 foreach ($updateItems as $updateItem) {
57 $field = $updateItem->pathExpression->field;
58 if (isset($class->fieldMappings[$field]) && !isset($class->fieldMappings[$field]['inherited']) || isset($class->associationMappings[$field]) && !isset($class->associationMappings[$field]['inherited'])) {
59 $newValue = $updateItem->newValue;
60 if (!$affected) {
61 $affected = \true;
62 } else {
63 $updateSql .= ', ';
64 }
65 $updateSql .= $sqlWalker->walkUpdateItem($updateItem);
66 if ($newValue instanceof AST\InputParameter) {
67 $sqlParameters[] = $newValue->name;
68 ++$this->numParametersInUpdateClause;
69 }
70 }
71 }
72 if ($affected) {
73 $this->sqlParameters[] = $sqlParameters;
74 $this->sqlStatements[] = $updateSql . ' WHERE (' . $idColumnList . ') IN (' . $idSubselect . ')';
75 }
76 }
77 // Append WHERE clause to insertSql, if there is one.
78 if ($AST->whereClause) {
79 $this->insertSql .= $sqlWalker->walkWhereClause($AST->whereClause);
80 }
81 // 4. Store DDL for temporary identifier table.
82 $columnDefinitions = [];
83 foreach ($idColumnNames as $idColumnName) {
84 $columnDefinitions[$idColumnName] = ['notnull' => \true, 'type' => Type::getType(PersisterHelper::getTypeOfColumn($idColumnName, $rootClass, $em))];
85 }
86 $this->createTempTableSql = $platform->getCreateTemporaryTableSnippetSQL() . ' ' . $tempTable . ' (' . $platform->getColumnDeclarationListSQL($columnDefinitions) . ', PRIMARY KEY(' . implode(',', $idColumnNames) . '))';
87 $this->dropTempTableSql = $platform->getDropTemporaryTableSQL($tempTable);
88 }
89 public function execute(Connection $conn, array $params, array $types)
90 {
91 // Create temporary id table
92 $conn->executeStatement($this->createTempTableSql);
93 try {
94 // Insert identifiers. Parameters from the update clause are cut off.
95 $numUpdated = $conn->executeStatement($this->insertSql, array_slice($params, $this->numParametersInUpdateClause), array_slice($types, $this->numParametersInUpdateClause));
96 // Execute UPDATE statements
97 foreach ($this->sqlStatements as $key => $statement) {
98 $paramValues = [];
99 $paramTypes = [];
100 if (isset($this->sqlParameters[$key])) {
101 foreach ($this->sqlParameters[$key] as $parameterKey => $parameterName) {
102 $paramValues[] = $params[$parameterKey];
103 $paramTypes[] = $types[$parameterKey] ?? ParameterTypeInferer::inferType($params[$parameterKey]);
104 }
105 }
106 $conn->executeStatement($statement, $paramValues, $paramTypes);
107 }
108 } finally {
109 // Drop temporary table
110 $conn->executeStatement($this->dropTempTableSql);
111 }
112 return $numUpdated;
113 }
114 }
115