Skip to content
Snippets Groups Projects
Verified Commit a30616fb authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3422603 by b2f, godotislate: Fixing source IDs with spaces in Sql.php

(cherry picked from commit 56f8d759)
parent be95ea38
No related branches found
No related tags found
No related merge requests found
......@@ -590,14 +590,23 @@ public function getRowsNeedingUpdate($count) {
public function lookupSourceId(array $destination_id_values) {
$source_id_fields = $this->sourceIdFields();
$query = $this->getDatabase()->select($this->mapTableName(), 'map');
// To allow source field names to be defined with spaces and special
// characters, create an alias map of column alias to source field name,
// since SQL column aliases do not support spaces or special characters.
$alias_map = [];
foreach ($source_id_fields as $source_field_name => $id_map_field_name) {
$query->addField('map', $id_map_field_name, $source_field_name);
$alias = $query->addField('map', $id_map_field_name);
$alias_map[$alias] = $source_field_name;
}
foreach ($this->destinationIdFields() as $field_name => $destination_id) {
$query->condition("map.$destination_id", $destination_id_values[$field_name], '=');
}
$result = $query->execute();
return $result->fetchAssoc() ?: [];
$result = $query->execute()->fetchAssoc() ?: [];
$source_ids = [];
foreach ($result as $alias => $id) {
$source_ids[$alias_map[$alias]] = $id;
}
return $source_ids;
}
/**
......
......@@ -625,6 +625,42 @@ public function lookupSourceIdMappingDataProvider() {
* @dataProvider lookupSourceIdMappingDataProvider
*/
public function testLookupSourceIdMapping($num_source_fields, $num_destination_fields) {
$source_id_property_prefix = 'source_id_property_';
$this->doTestLookupSourceIdMapping($num_source_fields, $num_destination_fields, $source_id_property_prefix);
}
/**
* Performs the source ID test on source and destination fields.
*
* This performs same test as ::testLookupSourceIdMapping, except with source
* property names including spaces and special characters not allowed in SQL
* column aliases.
*
* @param int $num_source_fields
* Number of source fields to test.
* @param int $num_destination_fields
* Number of destination fields to test.
*
* @dataProvider lookupSourceIdMappingDataProvider
*/
public function testLookupSourceIdMappingNonSqlCharacters($num_source_fields, $num_destination_fields) {
$source_id_property_prefix = '$ource id property * ';
$this->doTestLookupSourceIdMapping($num_source_fields, $num_destination_fields, $source_id_property_prefix);
}
/**
* Performs the source ID test on source and destination fields.
*
* @param int $num_source_fields
* Number of source fields to test.
* @param int $num_destination_fields
* Number of destination fields to test.
* @param string $source_id_property_prefix
* Prefix for the source ID properties.
*
* @dataProvider lookupSourceIdMappingDataProvider
*/
public function doTestLookupSourceIdMapping(int $num_source_fields, int $num_destination_fields, string $source_id_property_prefix): void {
// Adjust the migration configuration according to the number of source and
// destination fields.
$this->sourceIds = [];
......@@ -635,8 +671,8 @@ public function testLookupSourceIdMapping($num_source_fields, $num_destination_f
for ($i = 1; $i <= $num_source_fields; $i++) {
$row["sourceid$i"] = "source_id_value_$i";
$source_ids_values = [$row["sourceid$i"]];
$expected_result["source_id_property_$i"] = "source_id_value_$i";
$this->sourceIds["source_id_property_$i"] = [];
$expected_result[$source_id_property_prefix . $i] = "source_id_value_$i";
$this->sourceIds[$source_id_property_prefix . $i] = [];
}
$destination_id_values = [];
$nonexistent_id_values = [];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment