Automattic\WooCommerce\Database\Migrations

MetaToMetaTableMigrator::classify_update_insert_recordsprivateWC 1.0

Classify each record on whether to migrate or update.

Method of the class: MetaToMetaTableMigrator{}

No Hooks.

Returns

Array[]. Returns two arrays, first for records to migrate, and second for records to upgrade.

Usage

// private - for code of main (parent) class only
$result = $this->classify_update_insert_records( $to_migrate, $already_migrated ): array;
$to_migrate(array) (required)
Records to migrate.
$already_migrated(array) (required)
Records already migrated.

MetaToMetaTableMigrator::classify_update_insert_records() code WC 10.5.0

private function classify_update_insert_records( array $to_migrate, array $already_migrated ): array {
	$to_update = array();
	$to_insert = array();
	$to_delete = array();

	foreach ( $to_migrate as $entity_id => $rows ) {
		// Meta keys we need to fully delete because they don't exist in the source data.
		$no_longer_exist = array_diff_key(
			$already_migrated[ $entity_id ] ?? array(),
			$rows
		);

		if ( $no_longer_exist ) {
			$to_delete[ $entity_id ] = array_merge( $to_delete[ $entity_id ] ?? array(), $no_longer_exist );
		}

		foreach ( $rows as $meta_key => $meta_values ) {
			// If there is no corresponding record in the destination table then insert.
			// If there is single value in both already migrated and current then update.
			// If there are multiple values in either already_migrated records or in to_migrate_records, then insert instead of updating.
			if ( ! isset( $already_migrated[ $entity_id ][ $meta_key ] ) ) {
				if ( ! isset( $to_insert[ $entity_id ] ) ) {
					$to_insert[ $entity_id ] = array();
				}
				$to_insert[ $entity_id ][ $meta_key ] = $meta_values;
			} else {
				if ( 1 === count( $meta_values ) && 1 === count( $already_migrated[ $entity_id ][ $meta_key ] ) ) {
					if ( $meta_values[0] === $already_migrated[ $entity_id ][ $meta_key ][0]['meta_value'] ) {
						continue;
					}
					if ( ! isset( $to_update[ $entity_id ] ) ) {
						$to_update[ $entity_id ] = array();
					}
					$to_update[ $entity_id ][ $meta_key ] = array(
						'id'         => $already_migrated[ $entity_id ][ $meta_key ][0]['id'],
						// phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
						'meta_value' => $meta_values[0],
					);
					continue;
				}

				// There might be multiple entries with the same value, or destination entries that no longer exist in the source data.
				// It is easier to delete all existing entries with this meta key and insert fresh new ones to honor multiplicity, etc.
				$to_delete[ $entity_id ][ $meta_key ] = $already_migrated[ $entity_id ][ $meta_key ];

				if ( ! isset( $to_insert[ $entity_id ] ) ) {
					$to_insert[ $entity_id ] = array();
				}

				$to_insert[ $entity_id ][ $meta_key ] = $meta_values;
			}
		}
	}

	return array( $to_insert, $to_update, $to_delete );
}