Refactor to use migration helper for better re-usability.
This commit is contained in:
parent
aa00d7af68
commit
6b70afc731
|
@ -5,6 +5,8 @@
|
||||||
|
|
||||||
namespace Automattic\WooCommerce\DataBase\Migrations\CustomOrderTable;
|
namespace Automattic\WooCommerce\DataBase\Migrations\CustomOrderTable;
|
||||||
|
|
||||||
|
use MigrationHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class MetaToCustomTableMigrator.
|
* Class MetaToCustomTableMigrator.
|
||||||
*
|
*
|
||||||
|
@ -33,20 +35,6 @@ class MetaToCustomTableMigrator {
|
||||||
*/
|
*/
|
||||||
private $core_column_mapping;
|
private $core_column_mapping;
|
||||||
|
|
||||||
/**
|
|
||||||
* Placeholders that we will use in building $wpdb queries.
|
|
||||||
*
|
|
||||||
* @var string[]
|
|
||||||
*/
|
|
||||||
private $wpdb_placeholder_for_type = array(
|
|
||||||
'int' => '%d',
|
|
||||||
'decimal' => '%f',
|
|
||||||
'string' => '%s',
|
|
||||||
'date' => '%s',
|
|
||||||
'date_epoch' => '%s',
|
|
||||||
'bool' => '%d',
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MetaToCustomTableMigrator constructor.
|
* MetaToCustomTableMigrator constructor.
|
||||||
*
|
*
|
||||||
|
@ -120,24 +108,13 @@ class MetaToCustomTableMigrator {
|
||||||
|
|
||||||
// TODO: Add code to validate params.
|
// TODO: Add code to validate params.
|
||||||
$table = $this->schema_config['destination_table'];
|
$table = $this->schema_config['destination_table'];
|
||||||
|
$insert_query = MigrationHelper::get_insert_switch( $insert_switch );
|
||||||
switch ( $insert_switch ) {
|
|
||||||
case 'insert_ignore':
|
|
||||||
$insert_query = 'INSERT IGNORE';
|
|
||||||
break;
|
|
||||||
case 'replace':
|
|
||||||
$insert_query = 'REPLACE';
|
|
||||||
break;
|
|
||||||
case 'insert':
|
|
||||||
default:
|
|
||||||
$insert_query = 'INSERT';
|
|
||||||
}
|
|
||||||
|
|
||||||
$columns = array();
|
$columns = array();
|
||||||
$placeholders = array();
|
$placeholders = array();
|
||||||
foreach ( array_merge( $this->core_column_mapping, $this->meta_column_mapping ) as $prev_column => $schema ) {
|
foreach ( array_merge( $this->core_column_mapping, $this->meta_column_mapping ) as $prev_column => $schema ) {
|
||||||
$columns[] = $schema['destination'];
|
$columns[] = $schema['destination'];
|
||||||
$placeholders[] = $this->wpdb_placeholder_for_type[ $schema['type'] ];
|
$placeholders[] = MigrationHelper::get_wpdb_placeholder_for_type( $schema['type'] );
|
||||||
}
|
}
|
||||||
$placeholders = "'" . implode( "', '", $placeholders ) . "'";
|
$placeholders = "'" . implode( "', '", $placeholders ) . "'";
|
||||||
|
|
||||||
|
@ -147,14 +124,14 @@ class MetaToCustomTableMigrator {
|
||||||
foreach ( $columns as $column ) {
|
foreach ( $columns as $column ) {
|
||||||
$query_params[] = $row[ $column ] ?? null;
|
$query_params[] = $row[ $column ] ?? null;
|
||||||
}
|
}
|
||||||
// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- $placeholders can only contain combination of placeholders described in $this->>wpdb_placeholder_for_type.
|
// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- $placeholders can only contain combination of placeholders described in MigrationHelper::get_wpdb_placeholder_for_type
|
||||||
$value_string = '(' . $wpdb->prepare( $placeholders, $query_params ) . ')';
|
$value_string = '(' . $wpdb->prepare( $placeholders, $query_params ) . ')';
|
||||||
$values[] = $value_string;
|
$values[] = $value_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
$value_sql = implode( ',', $values );
|
$value_sql = implode( ',', $values );
|
||||||
|
|
||||||
$column_sql = implode( '`, `', $this->escape_backtick( $columns ) );
|
$column_sql = implode( '`, `', MigrationHelper::escape_backtick( $columns ) );
|
||||||
|
|
||||||
return "$insert_query INTO $table (`$column_sql`) VALUES $value_sql;"; // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, -- $insert_query is hardcoded, $value_sql is already escaped.
|
return "$insert_query INTO $table (`$column_sql`) VALUES $value_sql;"; // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, -- $insert_query is hardcoded, $value_sql is already escaped.
|
||||||
}
|
}
|
||||||
|
@ -210,16 +187,16 @@ class MetaToCustomTableMigrator {
|
||||||
*/
|
*/
|
||||||
private function build_entity_table_query( $where_clause, $batch_size, $order_by ) {
|
private function build_entity_table_query( $where_clause, $batch_size, $order_by ) {
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
$entity_table = $this->escape_backtick( $this->schema_config['entity_schema']['table_name'] );
|
$entity_table = MigrationHelper::escape_backtick( $this->schema_config['entity_schema']['table_name'] );
|
||||||
$primary_id_column = $this->escape_backtick( $this->schema_config['entity_schema']['primary_id'] );
|
$primary_id_column = MigrationHelper::escape_backtick( $this->schema_config['entity_schema']['primary_id'] );
|
||||||
$entity_rel_column = $this->escape_backtick( $this->schema_config['entity_meta_relation']['entity_rel_column'] );
|
$entity_rel_column = MigrationHelper::escape_backtick( $this->schema_config['entity_meta_relation']['entity_rel_column'] );
|
||||||
$entity_keys = array();
|
$entity_keys = array();
|
||||||
foreach ( $this->core_column_mapping as $column_name => $column_schema ) {
|
foreach ( $this->core_column_mapping as $column_name => $column_schema ) {
|
||||||
if ( isset( $column_schema['select_clause'] ) ) {
|
if ( isset( $column_schema['select_clause'] ) ) {
|
||||||
$select_clause = $column_schema['select_clause'];
|
$select_clause = $column_schema['select_clause'];
|
||||||
$entity_keys[] = "$select_clause AS $column_name";
|
$entity_keys[] = "$select_clause AS $column_name";
|
||||||
} else {
|
} else {
|
||||||
$entity_keys[] = '`' . $this->escape_backtick( $column_name ) . '`';
|
$entity_keys[] = '`' . MigrationHelper::escape_backtick( $column_name ) . '`';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$entity_column_string = implode( ', ', $entity_keys );
|
$entity_column_string = implode( ', ', $entity_keys );
|
||||||
|
@ -238,18 +215,6 @@ SELECT `$primary_id_column` as primary_key_id, `$entity_rel_column` AS entity_re
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper method to escape backtick in column and table names.
|
|
||||||
* WP does not provide a method to escape table/columns names yet, but hopefully soon in @link https://core.trac.wordpress.org/ticket/52506
|
|
||||||
*
|
|
||||||
* @param string|array $identifier Column or table name.
|
|
||||||
*
|
|
||||||
* @return array|string|string[] Escaped identifier.
|
|
||||||
*/
|
|
||||||
private function escape_backtick( $identifier ) {
|
|
||||||
return str_replace( '`', '``', $identifier );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method to build query that will be used to fetch data from source meta table.
|
* Helper method to build query that will be used to fetch data from source meta table.
|
||||||
*
|
*
|
||||||
|
@ -259,11 +224,11 @@ SELECT `$primary_id_column` as primary_key_id, `$entity_rel_column` AS entity_re
|
||||||
*/
|
*/
|
||||||
private function build_meta_data_query( $entity_ids ) {
|
private function build_meta_data_query( $entity_ids ) {
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
$meta_table = $this->escape_backtick( $this->schema_config['entity_meta_schema']['table_name'] );
|
$meta_table = MigrationHelper::escape_backtick( $this->schema_config['entity_meta_schema']['table_name'] );
|
||||||
$meta_keys = array_keys( $this->meta_column_mapping );
|
$meta_keys = array_keys( $this->meta_column_mapping );
|
||||||
$meta_key_column = $this->escape_backtick( $this->schema_config['entity_meta_schema']['meta_key_column'] );
|
$meta_key_column = MigrationHelper::escape_backtick( $this->schema_config['entity_meta_schema']['meta_key_column'] );
|
||||||
$meta_value_column = $this->escape_backtick( $this->schema_config['entity_meta_schema']['meta_value_column'] );
|
$meta_value_column = MigrationHelper::escape_backtick( $this->schema_config['entity_meta_schema']['meta_value_column'] );
|
||||||
$meta_table_relational_key = $this->escape_backtick( $this->schema_config['entity_meta_relation']['meta_rel_column'] );
|
$meta_table_relational_key = MigrationHelper::escape_backtick( $this->schema_config['entity_meta_relation']['meta_rel_column'] );
|
||||||
|
|
||||||
$meta_column_string = implode( ', ', array_fill( 0, count( $meta_keys ), '%s' ) );
|
$meta_column_string = implode( ', ', array_fill( 0, count( $meta_keys ), '%s' ) );
|
||||||
$entity_id_string = implode( ', ', array_fill( 0, count( $entity_ids ), '%d' ) );
|
$entity_id_string = implode( ', ', array_fill( 0, count( $entity_ids ), '%d' ) );
|
||||||
|
|
Loading…
Reference in New Issue