Verified Commit d67efa58 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 71316c13
Loading
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -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;
  }

  /**
+38 −2
Original line number Diff line number Diff line
@@ -625,6 +625,42 @@ public static 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 = [];