referencias_reciprocas

#my $DEBUG=1;

use DBI;
use Data::Dumper;

our $dbh = DBI->connect('DBI:mysql:ri-intermedio','ri','ri') or die $DBI::errstr ;

my $recorrer_base = "SELECT * FROM todo ORDER BY nombre";


my $st_todo = $dbh->prepare($recorrer_base);


my %reciproco = (
        "r_referente_de" => "r_referente",
        "r_referente" => "r_referente_de",
        "r_integrante_de" => "r_integrado_por",
        "r_integrado_por" => "r_integrante_de",
        "r_linea_accion_con" => "r_linea_accion_con",
        "r_actividad_puntual_con" => "r_actividad_puntual_con",
        "r_apoyo_de" => "r_apoyo_a",
        "r_apoyo_a" => "r_apoyo_de",
        "r_menciona_a" => "r_mencionado_en",
        "r_mencionado_en" => "r_menciona_a",
);

my @rfields = (
        "r_referente_de",
        "r_referente",
        "r_integrante_de",
        "r_integrado_por",
        "r_linea_accion_con",
        "r_actividad_puntual_con",
        "r_apoyo_de",
        "r_apoyo_a",
        "r_menciona_a",
        "r_mencionado_en",
);

my %r_referente_de,
        %r_referente,
        %r_integrante_de,
        %r_integrado_por,
        %r_linea_accion_con,
        %r_actividad_puntual_con,
        %r_apoyo_de,
        %r_apoyo_a,
        %r_menciona_a,
        %r_mencionado_en;


my $campo;
my $r_field;
my $query;
my $new_id;
my %actor;
my %actores;
my %actores_id;
my $actorref;

$st_todo->execute();
# me armo hashes para referencias cruzadas (para no estar haciendo mil queries a la base de datos)...
while ( $actorref = $st_todo->fetchrow_hashref ) {
        %actor = %$actorref;

        $nombre = $actor{nombre};
        $old_id = $actor{id};
        $new_id = $actor{new_id};

        $actores{$nombre} = $new_id;
        $actores_id{$new_id} = $nombre;

        foreach $campo (@rfields) {
                # si no hay nada, en el campo, lo ignoro
                next unless $actor{$campo};
                $ids = $actor{$campo};
                $recip = $reciproco{$campo};

                ${$campo}{$new_id} .= "$ids,";

                @destinos = split(/\s*,\s*/, $ids);
                foreach $destino (@destinos) {
                        next unless $destino;
                        ${$recip}{$destino} .= "$new_id,";
                }
        }
}

# limpiemos las referencias cruzadas
foreach $campo (@rfields) {
        $DEBUG && print STDERR "$campo ==>" . Dumper(\{%$campo});
        foreach $id (keys %$campo) {
                $lista = ${$campo}{$id};

                # saco las comas superfluas
                $lista =~ s/,+/,/g;
                $lista =~ s/,+/,/g;

                # ordeno
                @lista = sort {$a <=> $b} split(/,/, $lista);

                # saco las repetidas
                %aparecio=();
                @lista_ok=();
                foreach $elem (@lista){
                        push (@lista_ok, $elem) unless $aparecio{$elem}++;
                }
                ${$campo}{$id} = join(",",@lista_ok);
        }
}

# hago el mismo query nuevamente, pero ahora, para generar los updates necesarios
$st_todo->execute();
while ( $actorref = $st_todo->fetchrow_hashref ) {
        %actor = %$actorref;

        $nombre = $actor{nombre};
        $old_id = $actor{id};
        $new_id = $actor{new_id}; # este deberia estar ya cargado (en la vuelta anterior)

        my $query = "";
        my $coma = 0;


        foreach $campo (@rfields) {
                # si no hay nada para poner en el campo, lo ignoro
                # no me fijo en lo que hay antes porque lo voy a pisar
                # todo y aparte, si habia algo, seguro voy a tener
                # que poner algo (al menos lo mismo)
                next unless ${$campo}{$new_id};
                $quoted = $dbh->quote(${$campo}{$new_id});
                $query .= ($coma++?", ":"") . "$campo = $quoted";
        }
        next unless $query;
        $query = "UPDATE todo SET $query WHERE new_id = $new_id";
        print  "$query;\n";

}

ResponsabilidadSocialEmpresaria/CargaDeDatosEnDrupal/GeneradorDeReciprocos (última edición 2008-01-29 14:14:47 efectuada por localhost)