The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#
# This file is part of ElasticSearchX-Model
#
# This software is Copyright (c) 2013 by Moritz Onken.
#
# This is free software, licensed under:
#
#   The (three-clause) BSD License
#
package ElasticSearchX::Model::Scroll;
{
  $ElasticSearchX::Model::Scroll::VERSION = '0.1.6';
}
use Moose;
use ElasticSearch::ScrolledSearch;

has scroll => ( is => 'ro', isa => 'Str', required => 1, default => '1m' );

has set => (
    is       => 'ro',
    isa      => 'ElasticSearchX::Model::Document::Set',
    required => 1,
    handles  => [qw(type index inflate inflate_result)],
);

has _scrolled_search => (
    is         => 'ro',
    isa        => 'ElasticSearch::ScrolledSearch',
    lazy_build => 1,
    handles    => {
        _next     => 'next',
        total     => 'total',
        max_score => 'max_score',
        eof       => 'eof'
    }
);

has qs => (
    is  => 'ro',
    isa => 'HashRef',
);

sub _build__scrolled_search {
    my $self = shift;
    ElasticSearch::ScrolledSearch->new(
        $self->set->es,
        {   %{ $self->set->_build_query },
            scroll => $self->scroll,
            index  => $self->index->name,
            type   => $self->type->short_name,
            %{ $self->qs || {} },
        }
    );
}

sub next {
    my $self = shift;
    return undef unless ( my $next = $self->_next );
    return $next unless ( $self->inflate );
    return $self->inflate_result($next);
}

__PACKAGE__->meta->make_immutable;

__END__

=pod

=head1 NAME

ElasticSearchX::Model::Scroll

=head1 VERSION

version 0.1.6

=head1 SYNOPSIS

 my $iterator = $twitter->type('tweet')->scroll( '5m' );
 while(my $tweet = $iterator->next) {
     # do something with $tweet
 }
 
 my $iterator = $twitter->type('tweet')->raw->scroll;
 $iterator->max_score;
 $iterator->total;

=head1 ATTRIBUTES

=head2 scroll

This string indicated how long ElasticSearch should keep the scrolled
search around. This attribute is set by passing it to
L<ElasticSearchX::Model::Document::Set/scroll>.

=head2 set

The L<ElasticSearchX::Model::Document::Set> this instance was build
from.

=head1 METHODS

=head2 total

=head2 eof

=head2 max_score

Delegates to L<ElasticSearch::ScrolledSearch>.

=head2 next

Returns the next result in the search. If you set the query to not
inflate the results (e.g. using L<ElasticSearchX::Model::Document::Set/raw>)
it returns the raw HashRef, otherwise the result is inflated to
the correct document class.

=head1 AUTHOR

Moritz Onken

=head1 COPYRIGHT AND LICENSE

This software is Copyright (c) 2013 by Moritz Onken.

This is free software, licensed under:

  The (three-clause) BSD License

=cut