my $field = shift;
my $where = shift;
- my $sql = "select count(*) from index where name = ? and upper(item) like upper(?)||'%'";
+ my $filter = shift;
+
+ my $tables_sql = 'index';
+ my $where_sql = '';
+ my @sql_args = ( $field, $where );
+
+ if ($filter) {
+ $tables_sql .= ",filters";
+ $where_sql .= "
+ and index.ord = filters.ord
+ and filter = ?
+ ";
+ push @sql_args, $filter;
+ }
+
+ my $sql = qq{
+ select count(*)
+ from $tables_sql
+ where name = ? and upper(item) like upper(?)||'%'
+ $where_sql
+ };
- my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr();
- $sth->execute($field,$where) || die "sql: $sql; ".$self->{dbh}->errstr();
+ my $sth = $self->{dbh}->prepare($sql) || confess $self->{dbh}->errstr();
+ $sth->execute(@sql_args) || confess "sql: $sql; ".$self->{dbh}->errstr();
my ($total) = $sth->fetchrow_array();
# no results, count all
if (! $total) {
- my $sql = "select count(*) from index wheere name = ?";
-
- my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr();
- $sth->execute($field) || die "sql: $sql; ".$self->{dbh}->errstr();
+ my $sql = qq{
+ select count(*)
+ from $tables_sql
+ where index.name = ?
+ $where_sql
+ };
+
+ @sql_args = ( $field );
+ push @sql_args, $filter if ($filter);
+
+ my $sth = $self->{dbh}->prepare($sql) || confess $self->{dbh}->errstr();
+ $sth->execute(@sql_args) || confess "sql: $sql; ".$self->{dbh}->errstr();
$total = $sth->fetchrow_array();
}
- return $total || 1;
+ return $total || '0';
}
my $offset = shift || 0;
my $rows = shift || 10;
+ my $filter = shift;
+
my $from_ord = 0;
- my @sql_args;
+ my $tables_sql = 'index';
+ my $where_sql = '';
- my $sql = qq{
- select item,display,count
- from index
- where name = ?
- and ord > ?
- order by ord
- limit ? offset ?
- };
+ my @sql_args = ( $field, $where );
- if ($where) {
- my $sql2 = "select ord from index where name = ? and upper(item) like upper(?)||'%'";
- my $sth = $self->{dbh}->prepare($sql2) || die "sql2: $sql2; ".$self->{dbh}->errstr();
+ if ($filter) {
+ $tables_sql .= ",filters";
+ $where_sql .= "
+ and index.ord = filters.ord
+ and filter = ?
+ ";
+ push @sql_args, $filter;
+ }
- $sth->execute($field, $where) || die "sql2: $sql2; ".$self->{dbh}->errstr();
+ if ($where) {
+ my $sql2 = qq{
+ select index.ord as ord
+ from $tables_sql
+ where name = ? and upper(item) like upper(?)||'%'
+ $where_sql
+ };
+ my $sth = $self->{dbh}->prepare($sql2) || confess "sql2: $sql2; ".$self->{dbh}->errstr();
+
+ $sth->execute(@sql_args) || confess "sql2: $sql2; ".$self->{dbh}->errstr();
if (my $row = $sth->fetchrow_hashref) {
$from_ord += $row->{ord} - 1;
} else {
# if no match is found when searching from beginning
# of word in index, try substring match anywhere
- $sql2 = "select ord from index where name = ? and upper(item) like '% '||upper(?)||'%'";
- $sth = $self->{dbh}->prepare($sql2) || die "sql2: $sql2; ".$self->{dbh}->errstr();
- $sth->execute($field, $where) || die "sql2: $sql2; ".$self->{dbh}->errstr();
+ $sql2 = qq{
+ select index.ord as ord
+ from $tables_sql
+ where name = ? and upper(item) like '% '||upper(?)||'%'
+ $where_sql
+ };
+
+ $sth = $self->{dbh}->prepare($sql2) || confess "sql2: $sql2; ".$self->{dbh}->errstr();
+ $sth->execute(@sql_args) || confess "sql2: $sql2; ".$self->{dbh}->errstr();
+
if (my $row = $sth->fetchrow_hashref) {
$from_ord += $row->{ord} - 1;
}
}
}
- my $sth = $self->{dbh}->prepare($sql) || die "prepare: $sql; ".$self->{dbh}->errstr();
- $sth->execute($field,$from_ord,$rows,$offset) || die "execute: $sql; ".$self->{dbh}->errstr();
+ @sql_args = ( $field, $from_ord );
+ push @sql_args, $filter if ($filter);
+ push @sql_args, ( $rows, $offset );
+
+ my $sql = qq{
+ select item,display,index.count as count
+ from $tables_sql
+ where name = ?
+ and index.ord > ?
+ $where_sql
+ order by index.ord
+ limit ? offset ?
+ };
+
+ my $sth = $self->{dbh}->prepare($sql) || confess "prepare: $sql; ".$self->{dbh}->errstr();
+ $sth->execute(@sql_args) || confess "execute: $sql; ".$self->{dbh}->errstr();
my @arr;
while (my $row = $sth->fetchrow_hashref) {
$row->{item} = HTML::Entities::encode($row->{item},' <>&"');
return if (! $self->{dbh});
- $self->{dbh}->begin_work || die $self->{dbh}->errstr();
+ $self->{dbh}->begin_work || confess $self->{dbh}->errstr();
$self->delete_and_create('index', qq{
create table index (
}
- $self->{dbh}->commit || die $self->{dbh}->errstr();
+ $self->{dbh}->commit || confess $self->{dbh}->errstr();
$self->bench("vacuuming");