sub get_records
{
# Possible parameters: min_date, max_date, list of speaker_ids, # body_regex, title_regex, chamber. For now, min_date and max_date are # required.
my $self = shift;
my $dbh = $self->{dbh};
my %params = @_;
my $min_date = $params{min_date} || die "min_date required";
my $max_date = $params{max_date} || die "max_date required";
# First find a bunch of matching record_ids and then load them my %record_ids;
my $sel_rec = "SELECT record_id FROM records WHERE "
. "unix_timestamp(record_date) >= unix_timestamp('$min_date') "
. "AND "
. "unix_timestamp(record_date) <= unix_timestamp('$max_date') ";
if (defined $params{title_regex}) {
$params{title_regex} =~ s/'/''/g;
$sel_rec .= "AND record_title REGEXP '$params{title_regex}' ";
}
if (defined $params{chamber}) {
my $chamber_id = $self->{chamber_map}->{$params{chamber}} || 1;
$sel_rec .= "AND chamber_id = $chamber_id ";
}
if (defined $params{record_id}) {
$sel_rec .= "AND record_id = $params{record_id} ";
}
my $statement_rec = $dbh->prepare($sel_rec);
$statement_rec->execute();
while (my $id = $statement_rec->fetchrow_array()) {
$record_ids{$id} = 1;
}
if (keys %record_ids && ( $params{body_regex} || $params{speakers} )) {
my $ids_str = _to_sql_list(keys %record_ids);
my $sel_graf = "SELECT DISTINCT record_id FROM grafs WHERE "
. "record_id IN ($ids_str) ";
if ($params{body_regex}) {
$params{body_regex} =~ s/'/''/;
$sel_graf .= "AND graf_content REGEXP '$params{body_regex}' ";
}
if ($params{speakers}) {
$ids_str = _to_sql_list(@{$params{speakers}});
$sel_graf = "AND speaker_id IN ($ids_str) ";
}
my $statement_graf = $dbh->prepare($sel_graf);
$statement_graf->execute();
%record_ids = ();
while (my $id = $statement_graf->fetchrow_array()) {
$record_ids{$id} = 1;
}
}
my %speakers;
my @records;
foreach my $record_id (keys %record_ids) {
my $sel = "SELECT * FROM records WHERE record_id=$record_id";
my $sth = $dbh->prepare($sel);
$sth->execute();
my $rrow = $sth->fetchrow_hashref();
my $record = Clair::Polisci::Record->new(
source => $self->{source},
%$rrow
);
$sel = "SELECT * FROM grafs WHERE record_id=$record_id ORDER BY "
. "graf_index ASC";
$sth = $dbh->prepare($sel);
$sth->execute();
while (my $grow = $sth->fetchrow_hashref()) {
# Get the speaker from the cache or load a new one my $speaker_id = $grow->{speaker_id};
my $speaker;
if (exists $speakers{$speaker_id}) {
$speaker = $speakers{$speaker_id};
} else {
$sel = "SELECT * FROM speakers WHERE speaker_id=$speaker_id";
my $sth_speaker = $dbh->prepare($sel);
$sth_speaker->execute();
my $srow = $sth_speaker->fetchrow_hashref();
$speaker = Clair::Polisci::Speaker->new(
source => $self->{source},
id => $srow->{speaker_id},
%$srow
);
$speakers{$speaker_id} = $speaker;
}
my $graf = Clair::Polisci::Graf->new(
source => $self->{source},
index => $grow->{graf_index},
content => $grow->{graf_content},
speaker => $speaker,
%$grow
);
$record->add_graf($graf);
}
push @records, $record;
}
return @records;} |