Bug #1473
fermé
ERREUR Import de la deuxième base
Ajouté par Marion Maguer il y a plus de 8 ans.
Mis à jour il y a plus de 7 ans.
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
- Lié à Feature #1420: Import de la deuxième base /db/seed.rb ajouté
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
- Priorité changé de Haut à Normal
- Lié à Bug #1477: ERREUR Import de la deuxième base #2 ajouté
- Echéance mis à 15/09/2017
- Assigné à mis à Jonathan Schaeffer
- Version cible mis à Cabestana
- 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
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
Formats disponibles : Atom
PDF