вторник, 20 сентября 2011 г.

Сортировка по данным в анонимном хеше

Задача: отсортировать данные разнесенные по множеству серверов Postgres.

С ходу придумал два решения:
  1. Собрать данные скриптом и обработать.
  2. Написать server side функцию, которая установит dblink-соединение со всеми необходимыми севрерами, прогонит запрос по ним и вернет агрегированные данные. Необходимый запрос передается параметром.
Решение задачи первым методом:

Есть небольшая сложность: полей данных более, чем два. В случае C я бы использовал структуры. Но в Perl нет структур в комплете (хотя можно подобрать модуль). Я предпочел складывать данные ссылкой на анонимный хеш в хеш ( переменная %result ) :) Правда потом немного сложно сортировать эти записи. Собственно поэтому и пишу пост, магия сортировки происходит в третьей с конца строке:

my %result;
foreach my $server (@servers) {
my $dbh = DBI->connect("host=$server,...");
my $sqlh = $dbh->prepare("...")
or die "Can't prepare statement: $DBI::errstr";
my $sqlh->execute(...)
or die "Can't execute statement: $DBI::errstr";
while (my $rwo = $sqlh->fetchrow_hashref) {
$result{ $row->{id} } = {
first => $row->{first_data},
second => $row->{second_data}
};
}
$sqlh->finish;
}
...
print "ID;FIRST_DATA;SECOND_DATA\n";
foreach my $val ( sort {($result{$a}->{first}) <=> ($result{$d}->{first}) } keys %result ) {
print "$val;$result{$val}->{first};$result{$val}->{second}\n";
}

Решение вторым методом пока не реализовывал. Сделаю - дополню пост.