Dezi-App
view release on metacpan or search on metacpan
lib/Dezi/Lucy/Indexer.pm view on Meta::CPAN
push( @{ $doc{$key} }, @{ $metas->{$fname} } );
}
else {
croak "field '$fname' is neither a PropertyName nor MetaName";
}
}
}
# serialize the doc with our tokenpos_bump char
for my $k ( keys %doc ) {
$doc{$k} = to_utf8( join( SWISH_TOKENPOS_BUMPER(), @{ $doc{$k} } ) );
}
$self->debug and carp dump \%doc;
# make sure we delete any existing doc with same URI
$self->{lucy}->delete_by_term(
field => 'swishdocpath',
term => $doc{swishdocpath}
);
$self->{lucy}->add_doc( \%doc );
}
=head2 finish
Calls commit() on the internal Lucy::Indexer object,
writes the C<swish.xml> header file and calls the superclass finish()
method.
=cut
my @chars = ( 'a' .. 'z', 'A' .. 'Z', 0 .. 9 );
around finish => sub {
my $super_method = shift;
my $self = shift;
return 0 if $self->{_is_finished};
my $doc_count = $self->_finish_lucy();
$super_method->( $self, @_ );
$self->{_is_finished} = 1;
return $doc_count;
};
sub _finish_lucy {
my $self = shift;
# get a lock on our header file till
# this entire transaction is complete.
# Note that we trust the Lucy locking feature
# to have prevented any other process
# from getting a lock on the invindex itself,
# but we want to make sure nothing interrupts
# us from writing our own header after calling ->commit().
my $invindex = $self->invindex;
my $header = $invindex->header_file->stringify;
my $lock_file = Path::Class::File::Lockable->new($header);
if ( $lock_file->locked ) {
croak "Lock file found on $header -- cannot commit indexing changes";
}
$lock_file->lock;
# commit our changes
$self->{lucy}->commit();
# get total doc count
my $polyreader = Lucy::Index::PolyReader->open( index => "$invindex", );
my $doc_count = $polyreader->doc_count();
# write header
# the current config should contain any existing header + runtime config
my $idx_cfg = $self->swish3->config->get_index;
# poor man's uuid
my $uuid = Digest::MD5::md5_hex(
time() . join( "", @chars[ map { rand @chars } ( 1 .. 24 ) ] ) );
$idx_cfg->set( SWISH_INDEX_NAME(), "$invindex" );
$idx_cfg->set( SWISH_INDEX_FORMAT(), 'Lucy' );
$idx_cfg->set( SWISH_INDEX_STEMMER_LANG(), $self->{_lang} );
$idx_cfg->set( 'DeziVersion', $invindex->version );
$idx_cfg->set( "DocCount", $doc_count );
$idx_cfg->set( "UUID", $uuid );
$self->swish3->config->write($header);
# transaction complete
$lock_file->unlock;
$self->debug and carp "wrote $header with uuid $uuid";
$self->debug and carp "$doc_count docs indexed";
$self->swish3(undef); # invalidate this indexer
return $doc_count;
}
=head2 get_lucy
Returns the internal Lucy::Index::Indexer object.
=cut
sub get_lucy {
return shift->{lucy};
}
=head2 abort
Sets the internal Lucy::Index::Indexer to undef,
which should release any locks on the index.
Also flags the Dezi::Lucy::Indexer object
as stale.
=cut
sub abort {
my $self = shift;
$self->{lucy} = undef;
( run in 2.444 seconds using v1.01-cache-2.11-cpan-e1769b4cff6 )