readded DBIx::FullTextSearch because it's almost impossible to add locally
This commit is contained in:
parent
a5b07a2599
commit
598ccd1766
12 changed files with 5558 additions and 0 deletions
83
lib/DBIx/FullTextSearch/BlobFast.pm
Normal file
83
lib/DBIx/FullTextSearch/BlobFast.pm
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
|
||||
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;
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue