use
Carp
qw(carp croak confess)
;
our
(
$VERSION
,
$BLOOM_FILTER_ERROR_RATE
);
BEGIN {
$BLOOM_FILTER_ERROR_RATE
= 0.1;
$VERSION
=
'2.919'
;
}
sub
new {
my
$class
=
shift
;
my
$endpoint
=
shift
;
my
$pattern
=
shift
;
my
$silent
=
shift
|| 0;
my
$ggp
=
shift
;
return
bless
( [
'SERVICE'
,
$endpoint
,
$pattern
,
$silent
,
$ggp
],
$class
);
}
sub
construct_args {
my
$self
=
shift
;
return
(
$self
->endpoint,
$self
->pattern,
$self
->silent,
$self
->lhs);
}
sub
endpoint {
my
$self
=
shift
;
if
(
@_
) {
my
$endpoint
=
shift
;
$self
->[1] =
$endpoint
;
}
my
$endpoint
=
$self
->[1];
return
$endpoint
;
}
sub
pattern {
my
$self
=
shift
;
if
(
@_
) {
my
$pattern
=
shift
;
$self
->[2] =
$pattern
;
}
return
$self
->[2];
}
sub
silent {
my
$self
=
shift
;
return
$self
->[3];
}
sub
lhs {
my
$self
=
shift
;
return
$self
->[4];
}
sub
sse {
my
$self
=
shift
;
my
$context
=
shift
;
my
$prefix
=
shift
||
''
;
my
$indent
=
$context
->{indent};
if
(
my
$ggp
=
$self
->lhs) {
return
sprintf
(
"(service\n${prefix}${indent}%s\n${prefix}${indent}%s\n${prefix}${indent}%s)"
,
$self
->lhs->sse(
$context
,
"${prefix}${indent}"
),
$self
->endpoint->sse(
$context
,
"${prefix}${indent}"
),
$self
->pattern->sse(
$context
,
"${prefix}${indent}"
)
);
}
else
{
return
sprintf
(
"(service\n${prefix}${indent}%s\n${prefix}${indent}%s)"
,
$self
->endpoint->sse(
$context
,
"${prefix}${indent}"
),
$self
->pattern->sse(
$context
,
"${prefix}${indent}"
)
);
}
}
sub
as_sparql {
my
$self
=
shift
;
my
$context
=
shift
;
my
$indent
=
shift
;
my
$op
= (
$self
->silent) ?
'SERVICE SILENT'
:
'SERVICE'
;
if
(
my
$ggp
=
$self
->lhs) {
local
(
$context
->{skip_filter}) = 0;
my
$string
=
sprintf
(
"%s\n${indent}%s %s %s"
,
$ggp
->as_sparql(
$context
,
$indent
),
$op
,
$self
->endpoint->as_sparql(
$context
,
$indent
),
$self
->pattern->as_sparql( {
%$context
,
force_ggp_braces
=> 1 },
$indent
),
);
return
$string
;
}
else
{
my
$string
=
sprintf
(
"%s %s %s"
,
$op
,
$self
->endpoint->as_sparql(
$context
,
$indent
),
$self
->pattern->as_sparql( {
%$context
,
force_ggp_braces
=> 1 },
$indent
),
);
return
$string
;
}
}
sub
as_hash {
my
$self
=
shift
;
my
$context
=
shift
;
return
{
type
=>
lc
(
$self
->type),
endpoint
=>
$self
->endpoint,
pattern
=>
$self
->pattern->as_hash,
lhs
=>
$self
->lhs->as_hash,
};
}
sub
type {
return
'SERVICE'
;
}
sub
referenced_variables {
my
$self
=
shift
;
my
@list
=
$self
->pattern->referenced_variables;
push
(
@list
,
$self
->lhs->referenced_variables)
if
(
$self
->lhs);
return
RDF::Query::_uniq(
@list
);
}
sub
potentially_bound {
my
$self
=
shift
;
my
@list
= RDF::Query::_uniq(
$self
->pattern->potentially_bound);
if
(
$self
->lhs) {
push
(
@list
,
$self
->lhs->potentially_bound);
}
return
@list
;
}
sub
definite_variables {
my
$self
=
shift
;
return
RDF::Query::_uniq(
map
{
$_
->name }
grep
{
$_
->isa(
'RDF::Query::Node::Variable'
) } (
$self
->graph),
$self
->pattern->definite_variables,
(
$self
->lhs ?
$self
->lhs->definite_variables : ()),
);
}
sub
qualify_uris {
my
$self
=
shift
;
my
$class
=
ref
(
$self
);
my
$ns
=
shift
;
my
$base_uri
=
shift
;
my
$pattern
=
$self
->pattern->qualify_uris(
$ns
,
$base_uri
);
my
$endpoint
=
$self
->endpoint;
my
$silent
=
$self
->silent;
my
$uri
=
$endpoint
->uri;
if
(
my
$ggp
=
$self
->lhs) {
return
$class
->new(
$endpoint
,
$pattern
,
$silent
,
$ggp
->qualify_uris(
$ns
,
$base_uri
) );
}
else
{
return
$class
->new(
$endpoint
,
$pattern
,
$silent
);
}
}
1;