Projet

Général

Profil

Actions

Bug #1473

fermé

ERREUR Import de la deuxième base

Ajouté par Marion Maguer il y a plus de 7 ans. Mis à jour il y a plus de 6 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
Début:
05/09/2016
Echéance:
15/09/2017
% réalisé:

100%

Temps estimé:

Description

Finalement un premier bug, certaines stations ont été crées 2 fois, avec des collections différentes, par exemple :
Maerl - Molène 1 - 2014 10 14


Fichiers


Demandes liées 2 (0 ouverte2 fermées)

Lié à Feature #1420: Import de la deuxième base /db/seed.rbFermé16/03/2016

Actions
Lié à Bug #1477: ERREUR Import de la deuxième base #2FerméJonathan Schaeffer07/09/2016

Actions

Mis à jour par Marion Maguer il y a plus de 7 ans

  • Lié à Feature #1420: Import de la deuxième base /db/seed.rb ajouté

Mis à jour par Jonathan Schaeffer il y a plus de 7 ans

On peut repérer les doublons de cette façon :

marben=> SELECT site_id,point_id, date_trunc('day',date) as d, count(1) as count FROM stations GROUP BY d, point_id, site_id HAVING count(1) > 1;

Ensuite il faut identifier les stations qui correspondent au point et à la date et les "fusionner" :

pour la station d'identifiant le plus grand, prendre ses collections et les connecter à l'autre station. Supprimer la station sans collections

Mis à jour par Marion Maguer il y a plus de 7 ans

  • Priorité changé de Haut à Normal

Mis à jour par Marion Maguer il y a plus de 7 ans

  • Lié à Bug #1477: ERREUR Import de la deuxième base #2 ajouté

Mis à jour par Jonathan Schaeffer il y a plus de 6 ans

  • Echéance mis à 15/09/2017
  • Assigné à mis à Jonathan Schaeffer
  • Version cible mis à Cabestana

Mis à jour par Jonathan Schaeffer il y a plus de 6 ans

  • Statut changé de Nouveau à Fermé
  • % réalisé changé de 0 à 100

J'ai corrigé la base de donnée en fusionnant les stations doublon.

J'ai appliqué ce script pour cela :

query = "SELECT site_id,point_id, date_trunc('day',date) as d, count(1) as count FROM stations GROUP BY d, point_id, site_id HAVING count(1) > 1;" 
results = ActiveRecord::Base.connection.execute(query)
# {"site_id"=>nil, "point_id"=>"72", "d"=>"2014-09-10 00:00:00", "count"=>"2"}

results.each do |r|
  day = r['d'].to_date
  if r['site_id'].nil?
    stations = Station.where(point_id: r['point_id']).to_a
  else
    stations = Station.where(site_id: r['site_id']).to_a
  end
  stations.select!{|s| s.date.to_date == day}
  stations.sort!{|a,b| a.collections.count <=> b.collections.count}
  # Normalement on n'a plus que 2 stations
  puts "Pour le point #{r['point_id']}, on a #{stations.count} stations à la date #{day}: " 
  puts "#{stations[0].collections.count} collections le #{stations[0].date} et" 
  puts "#{stations[1].collections.count} collections le #{stations[1].date}" 

  # Déplacer les collections
  stations[0].collections.each do |c|
    c.station = stations[1]
    c.save
  end
  stations[0].delete
end

Mis à jour par Jonathan Schaeffer il y a plus de 6 ans

Il faut aussi fusionner les collections en double au sein d'une station.

query = "SELECT name,station_id,count(1), string_agg(id::text, ',') FROM collections GROUP BY name, station_id HAVING count(1) > 1;" 

results = ActiveRecord::Base.connection.execute(query)

results.each do |r|
  collection_ids = r['string_agg'].split(/,/)
  c1 = Collection.find(collection_ids[0])
  c2 = Collection.find(collection_ids[1])

  puts "Collection 1 : #{c1.id} :: #{c1.name} :: #{c1.results.count}" 
  puts "Collection 2 : #{c2.id} :: #{c2.name} :: #{c2.results.count}" 
  c2.results.each do |res|
    res.collection = c1
    res.save
  end
  c2.delete
end

Actions

Formats disponibles : Atom PDF