use Test::More 'no_plan';
use strict;
use warnings;
BEGIN {
use_ok( 'WebService::Solr::Query' );
}
{ # (un)escape
is( WebService::Solr::Query->escape( '(1+1):2' ),
'\(1\+1\)\:2', 'escape' );
is( WebService::Solr::Query->unescape( '\(1\+1\)\:2' ),
'(1+1):2', 'unescape' );
}
{ # basic queries
# default field
_check( query => { -default => 'space' }, expect => '("space")' );
_check(
query => { -default => [ 'star trek', 'star wars' ] },
expect => '(("star trek" OR "star wars"))'
);
# scalarref pass-through
_check( query => { '*' => \'*' }, expect => '(*:*)' );
# field
_check(
query => { title => 'Spaceballs' },
expect => '(title:"Spaceballs")'
);
_check(
query => { first => 'Roger', last => 'Moore' },
expect => '(first:"Roger" AND last:"Moore")'
);
_check(
query => { first => [ 'Roger', 'Dodger' ] },
expect => '((first:"Roger" OR first:"Dodger"))'
);
_check(
query => { first => [ 'Roger', 'Dodger' ], last => 'Moore' },
expect => '((first:"Roger" OR first:"Dodger") AND last:"Moore")'
);
_check(
query => [ { first => [ 'Roger', 'Dodger' ] }, { last => 'Moore' } ],
expect => '((first:"Roger" OR first:"Dodger") OR last:"Moore")'
);
_check(
query => {
first => [ 'Roger', 'Dodger' ],
-default => [ 'star trek', 'star wars' ]
},
expect =>
'(("star trek" OR "star wars") AND (first:"Roger" OR first:"Dodger"))'
);
}
{ # basic query with escape
_check( query => { -default => 'sp(a)ce' }, expect => '("sp\(a\)ce")' );
_check(
query => { title => 'Spaceb(a)lls' },
expect => '(title:"Spaceb\(a\)lls")'
);
}
{ # simple ops
# range (inc)
_check(
query => { title => { -range => [ 'a', 'z' ] } },
expect => '(title:[a TO z])'
);
_check(
query => {
first => [ 'Roger', 'Dodger' ],
title => { -range => [ 'a', 'z' ] }
},
expect => '((first:"Roger" OR first:"Dodger") AND title:[a TO z])'
);
# range (exc)
_check(
query => { title => { -range_exc => [ 'a', 'z' ] } },
expect => '(title:{a TO z})'
);
_check(
query => {
first => [ 'Roger', 'Dodger' ],
title => { -range_exc => [ 'a', 'z' ] }
},
expect => '((first:"Roger" OR first:"Dodger") AND title:{a TO z})'
);
# boost
_check(
query => { title => { -boost => [ 'Space', '2.0' ] } },
expect => '(title:"Space"^2.0)'
);
_check(
query => {
first => [ 'Roger', 'Dodger' ],
title => { -boost => [ 'Space', '2.0' ] }
},
expect => '((first:"Roger" OR first:"Dodger") AND title:"Space"^2.0)'
);
# proximity
_check(
query => { title => { -proximity => [ 'space balls', '10' ] } },
expect => '(title:"space balls"~10)'
);
_check(
query => {
first => [ 'Roger', 'Dodger' ],
title => { -proximity => [ 'space balls', '10' ] }
},
expect =>
'((first:"Roger" OR first:"Dodger") AND title:"space balls"~10)'
);
# fuzzy
_check(
query => { title => { -fuzzy => [ 'space', '0.8' ] } },
expect => '(title:space~0.8)'
);
_check(
query => {
first => [ 'Roger', 'Dodger' ],
title => { -fuzzy => [ 'space', '0.8' ] }
},
expect => '((first:"Roger" OR first:"Dodger") AND title:space~0.8)'
);
}
{ # ops with escape
_check(
query => { title => { -boost => [ 'Sp(a)ce', '2.0' ] } },
expect => '(title:"Sp\(a\)ce"^2.0)'
);
_check(
query => { title => { -proximity => [ 'sp(a)ce balls', '10' ] } },
expect => '(title:"sp\(a\)ce balls"~10)'
);
_check(
query => { title => { -fuzzy => [ 'sp(a)ce', '0.8' ] } },
expect => '(title:sp\(a\)ce~0.8)'
);
}
{ # require and prohibit
_check(
query => { title => { -require => 'star' } },
expect => '(+title:"star")'
);
_check(
query => {
first => [ 'Roger', 'Dodger' ],
title => { -require => 'star' }
},
expect => '((first:"Roger" OR first:"Dodger") AND +title:"star")'
);
_check(
query => { title => { -prohibit => 'star' } },
expect => '(-title:"star")'
);
_check(
query => { default => { -prohibit => 'foo' } },
expect => '(-default:"foo")'
);
_check(
query => {
first => [ 'Roger', 'Dodger' ],
title => { -prohibit => 'star' }
},
expect => '((first:"Roger" OR first:"Dodger") AND -title:"star")'
);
}
### nested and/or operators
{
_check(
query => {
title =>
[ -and => { -require => 'star' }, { -require => 'wars' } ],
},
expect => q[(((+title:"star") AND (+title:"wars")))],
);
_check(
query => {
title => [
-or => { -range_exc => [ 'a', 'c' ] },
{ -range_exc => [ 'e', 'k' ] }
],
},
expect => q[(((title:{a TO c}) OR (title:{e TO k})))],
);
}
sub _check {
my %t = @_;
my $q = WebService::Solr::Query->new( $t{ query } );
isa_ok( $q, 'WebService::Solr::Query' );
is( $q->stringify, $t{ expect }, $t{ expect } );
}