$ENV
{ES_VERSION} =
'7_0'
;
our
$es
=
do
"es_sync.pl"
or
die
( $@ || $! );
$es
->indices->
delete
(
index
=>
'_all'
,
ignore
=> 404 );
test_scroll(
"No indices"
,
{},
total
=> 0,
max_score
=> 0,
steps
=> [
is_finished
=> 1,
next
=> [0],
refill_buffer
=> 0,
drain_buffer
=> [0],
]
);
do
"index_test_data_7.pl"
or
die
( $@ || $! );
test_scroll(
"Match all"
,
{},
total
=> 100,
max_score
=> 1,
steps
=> [
is_finished
=>
''
,
buffer_size
=> 10,
next
=> [1],
drain_buffer
=> [9],
refill_buffer
=> 10,
refill_buffer
=> 20,
is_finished
=>
''
,
next_81
=> [81],
next_20
=> [9],
next
=> [0],
is_finished
=> 1,
]
);
test_scroll(
"Query"
,
{
body
=> {
query
=> {
term
=> {
color
=>
'red'
} },
suggest
=> {
mysuggest
=> {
text
=>
'green'
,
term
=> {
field
=>
'color'
} }
},
aggs
=> {
switch
=> {
terms
=> {
field
=>
'switch'
} } },
}
},
total
=> 50,
max_score
=> num( 1, 0.5 ),
aggs
=> bool(1),
suggest
=> bool(1),
steps
=> [
next
=> [1],
next_50
=> [49],
is_finished
=> 1,
]
);
test_scroll(
"Finish"
,
{},
total
=> 100,
max_score
=> 1,
steps
=> [
is_finished
=>
''
,
next
=> [1],
finish
=> 1,
is_finished
=> 1,
buffer_size
=> 0,
next
=> [0]
]
);
my
$s
=
$es
->scroll_helper;
my
$d
=
$s
->
next
;
ok
ref
$d
&&
$d
->{_source},
'next() in scalar context'
;
{
my
$s
=
$es
->scroll_helper(
size
=> 5 );
my
$pid
=
fork
();
unless
(
defined
(
$pid
) ) {
die
"Cannot fork. Lack of resources?"
; }
unless
(
$pid
) {
$s
->finish();
exit
;
}
else
{
waitpid
(
$pid
, 0 );
is $?, 0,
"Child exited without errors"
;
}
ok !
$s
->is_finished(),
"Our Scroll is not finished"
;
my
$count
= 0;
while
(
$s
->
next
) {
$count
++ }
is
$count
, 100,
"All documents retrieved"
;
ok
$s
->is_finished,
"Our scroll is finished"
;
}
{
my
$s
=
$es
->scroll_helper(
size
=> 5 );
my
$pid
=
fork
();
unless
(
defined
(
$pid
) ) {
die
"Cannot fork. Lack of resources?"
; }
unless
(
$pid
) {
eval
{
while
(
$s
->
next
) { }
};
my
$err
= $@;
exit
(
eval
{
$err
->is(
'Illegal'
) && 123 } || 999 );
}
else
{
waitpid
(
$pid
, 0 );
is $? >> 8, 123,
"Child threw Illegal exception"
;
}
}
{
my
$pid
=
fork
();
unless
(
defined
(
$pid
) ) {
die
"Cannot fork. Lack of resources?"
; }
unless
(
$pid
) {
my
$s
=
$es
->scroll_helper(
size
=> 5 );
while
(
$s
->
next
) { }
exit
0;
}
else
{
waitpid
(
$pid
, 0 );
is $? , 0,
"Scroll completed successfully"
;
}
}
done_testing;
$es
->indices->
delete
(
index
=>
'test'
);
sub
test_scroll {
my
(
$title
,
$params
,
%tests
) =
@_
;
subtest
$title
=>
sub
{
my
$s
=
$es
->scroll_helper(
$params
);
is
$s
->total,
$tests
{total},
"$title - total"
;
cmp_deeply
$s
->max_score,
$tests
{max_score},
"$title - max_score"
;
cmp_deeply
$s
->suggest,
$tests
{suggest},
"$title - suggest"
;
cmp_deeply
$s
->aggregations,
$tests
{aggs},
"$title - aggs"
;
my
$i
= 1;
my
@steps
= @{
$tests
{steps} };
while
(
my
$name
=
shift
@steps
) {
my
$expect
=
shift
@steps
;
my
(
$method
,
$result
,
@p
);
if
(
$name
=~ /
next
(?:_(\d+))?/ ) {
$method
=
'next'
;
@p
= $1;
}
else
{
$method
=
$name
;
}
if
(
ref
$expect
eq
'ARRAY'
) {
my
@result
=
$s
->
$method
(
@p
);
$result
= 0 +
@result
;
$expect
=
$expect
->[0];
}
else
{
$result
=
$s
->
$method
(
@p
);
}
is
$result
,
$expect
,
"$title - Step $i: $name"
;
$i
++;
}
}
}