LucyX-Simple

 view release on metacpan or  search on metacpan

lib/LucyX/Simple.pm  view on Meta::CPAN

    'default' => sub{ return 100 },
);

sub sorted_search{
    my ( $self, $query, $criteria, $page ) = @_;

    my @rules;
    foreach my $key ( keys( %{$criteria} ) ){
        push( 
            @rules,  
            Lucy::Search::SortRule->new(
                field   => $key,
                reverse => $criteria->{ $key },
            )
        );
    }

    return $self->search( $query, $page, Lucy::Search::SortSpec->new( rules => \@rules ) );
}

sub search{
    my ( $self, $query_string, $page, $sort_spec ) = @_;

    Exception::Simple->throw('no query string') if !$query_string;
    $page ||= 1;

    my $query = $self->_query_parser->parse( $query_string );

    my $search_options = {
        'query' => $query,
        'offset' => ( ( $self->entries_per_page * $page ) - $self->entries_per_page ),
        'num_wanted' => $self->entries_per_page,
    };
    $search_options->{'sort_spec'} = $sort_spec if $sort_spec;

    my $hits = $self->_searcher->hits( %{$search_options} );
    my $pager = Data::Page->new($hits->total_hits, $self->entries_per_page, $page);

    my @results;
    while ( my $hit = $hits->next ) {
        my $result = {};
        foreach my $field ( @{$self->schema} ){
            $result->{ $field->{'name'} } = $hit->{ $field->{'name'} };
        }
        push( @results, $self->resultclass->new( $result ) );
    }

    return ( \@results, $pager ) if scalar(@results);
    Exception::Simple->throw('no results');

}

sub create{
    my ( $self, $document ) = @_;

    Exception::Simple->throw('no document') if ( !$document );

    $self->_indexer->add_doc( $document );
}

sub update_or_create{
    my ( $self, $document, $pk ) = @_;

    Exception::Simple->throw('no document') if !$document;
    $pk ||= 'id';
    my $pv = $document->{ $pk };

    Exception::Simple->throw('no primary key value') if !$pv;
    $self->delete( $pk, $pv );

    $self->create( $document );
}

sub delete{
    my ( $self, $key, $value ) = @_;

    Exception::Simple->throw( 'missing key' ) if !defined( $key );
    Exception::Simple->throw( 'missing value' ) if !defined( $value );

    #delete only works on finished indexes
    $self->commit;
    $self->_indexer->delete_by_term(
        'field' => $key,
        'term' => $value,
    );
}

sub commit{
    my ( $self, $optimise ) = @_;

    $self->_indexer->optimize if $optimise;
    $self->_indexer->commit;

    $self->_clear_indexer;
    $self->_clear_searcher;
}

__PACKAGE__->meta->make_immutable;



( run in 0.924 second using v1.01-cache-2.11-cpan-fe3c2283af0 )