83 lines
1.9 KiB
Perl
83 lines
1.9 KiB
Perl
|
|
package DBIx::FullTextSearch::BlobFast;
|
|
use DBIx::FullTextSearch::Blob;
|
|
use vars qw! @ISA !;
|
|
@ISA = qw! DBIx::FullTextSearch::Blob !;
|
|
use strict;
|
|
|
|
sub delete_document {
|
|
my $self = shift;
|
|
my $fts = $self->{'fts'};
|
|
my $dbh = $fts->{'dbh'};
|
|
my $data_table = $fts->{'data_table'};
|
|
|
|
my $packstring = $DBIx::FullTextSearch::BITS_TO_PACK{$fts->{'doc_id_bits'}}
|
|
. $DBIx::FullTextSearch::BITS_TO_PACK{$fts->{'count_bits'}};
|
|
my $value = '';
|
|
for my $id (@_) {
|
|
$value .= pack $packstring, $id, 0;
|
|
}
|
|
$dbh->do("
|
|
update $data_table set idx = concat(idx, ?)
|
|
", {}, $value);
|
|
1;
|
|
}
|
|
|
|
sub update_document {
|
|
my $self = shift;
|
|
$self->delete_document($_[0]);
|
|
$self->add_document(@_);
|
|
}
|
|
|
|
sub contains_hashref {
|
|
my $self = shift;
|
|
my $fts = $self->{'fts'};
|
|
my $dbh = $fts->{'dbh'};
|
|
my $data_table = $fts->{'data_table'};
|
|
|
|
my $packstring = $DBIx::FullTextSearch::BITS_TO_PACK{$fts->{'doc_id_bits'}}
|
|
. $DBIx::FullTextSearch::BITS_TO_PACK{$fts->{'count_bits'}};
|
|
my ($packnulls) = pack $packstring, 0, 0;
|
|
my $packlength = length $packnulls;
|
|
|
|
my $sth = ( defined $self->{'get_idx_sth'} ?
|
|
$self->{'get_idx_sth'} :
|
|
$self->{'get_idx_sth'} =
|
|
$dbh->prepare(
|
|
"select idx from $data_table where word like ?"
|
|
));
|
|
|
|
my $out = {};
|
|
for my $word (@_) {
|
|
$sth->execute($word);
|
|
while (my ($blob) = $sth->fetchrow_array) {
|
|
next unless defined $blob;
|
|
my %docs = ();
|
|
my @data;
|
|
my $i = length($blob) - $packlength;
|
|
while ($i >= 0) {
|
|
my ($doc_id, $count) =
|
|
unpack "\@$i$packstring", $blob;
|
|
### print STDERR "$doc_id $count\n";
|
|
$i -= $packlength;
|
|
next if exists $docs{$doc_id};
|
|
$docs{$doc_id} = 1;
|
|
next unless $count;
|
|
push @data, $doc_id, $count;
|
|
}
|
|
while (@data) {
|
|
my $doc = shift @data;
|
|
my $count = shift @data;
|
|
unless (defined $out->{$doc}) { $out->{$doc} = 0; }
|
|
$out->{$doc} += $count;
|
|
}
|
|
}
|
|
$sth->finish;
|
|
}
|
|
$out;
|
|
}
|
|
|
|
*parse_and_index_data = \&DBIx::FullTextSearch::parse_and_index_data_count;
|
|
|
|
1;
|
|
|