use strict; use warnings; package KinoSearch::Search::Filter; use KinoSearch::Util::ToolSet; use base qw( KinoSearch::Util::Class ); our %instance_vars = ( # members cached_bits => {}, ); =begin comment my $bit_vector = $filter->bits($reader); Returns a BitVector where set bits correspond to allowed doc nums. TODO: Maybe rename this method and have it return an IntSet (a superclass of BitVector which would allow for compact representations). =end comment =cut sub bits { shift->abstract_death } # Create a wrapping HitCollector which only allows the inner collector to # "see" documents which pass the filter. sub make_collector { my ( $self, $inner_coll, $reader ) = @_; my $filter_bits = $self->bits($reader); return $inner_coll unless defined $filter_bits; return KinoSearch::Search::HitCollector->new_filt_coll( filter_bits => $filter_bits, collector => $inner_coll, ); } # Store a cached BitVector associated with a particular reader. Store a weak # reference to the reader as an indicator of cache validity. sub store_cached_bits { my ( $self, $reader, $bits ) = @_; my $pair = { reader => $reader, bits => $bits }; weaken( $pair->{reader} ); $self->{cached_bits}{ $reader->hash_code } = $pair; } # Retrieve a cached BitVector associated with a particular reader. As a side # effect, clear away any BitVectors which are no longer valid because their # readers have gone away. sub fetch_cached_bits { my ( $self, $reader ) = @_; my $cached_bits = $self->{cached_bits}; # sweep while ( my ( $hash_code, $pair ) = each %$cached_bits ) { # if weak ref has decomposed into undef, reader is gone... so delete next if defined $pair->{reader}; delete $cached_bits->{$hash_code}; } # fetch my $pair = $cached_bits->{ $reader->hash_code }; return $pair->{bits} if defined $pair; return; } 1; __END__ =head1 NAME KinoSearch::Search::Filter - Base Filter class =head1 DESCRIPTION Filter is an abstract base class, with no public methods. Subclasses of Filter include L, L, and L. =head1 COPYRIGHT Copyright 2005-2007 Marvin Humphrey =head1 LICENSE, DISCLAIMER, BUGS, etc. See L version 0.20. =cut