no
warnings
'redefine'
;
use
Carp
qw(carp croak confess)
;
our
(
$VERSION
);
BEGIN {
$VERSION
=
'2.908'
;
}
sub
new {
my
$class
=
shift
;
my
$pattern
=
shift
;
my
$opt
=
shift
;
return
bless
( [
'OPTIONAL'
,
$pattern
,
$opt
],
$class
);
}
sub
construct_args {
my
$self
=
shift
;
return
(
$self
->pattern,
$self
->optional);
}
sub
pattern {
my
$self
=
shift
;
return
$self
->[1];
}
sub
optional {
my
$self
=
shift
;
return
$self
->[2];
}
sub
sse {
my
$self
=
shift
;
my
$context
=
shift
;
my
$prefix
=
shift
||
''
;
my
$indent
=
$context
->{indent} ||
' '
;
return
sprintf
(
"(leftjoin\n${prefix}${indent}%s\n${prefix}${indent}%s)"
,
$self
->pattern->sse(
$context
,
"${prefix}${indent}"
),
$self
->optional->sse(
$context
,
"${prefix}${indent}"
)
);
}
sub
as_sparql {
my
$self
=
shift
;
my
$context
=
shift
;
my
$indent
=
shift
;
my
$string
=
sprintf
(
"%s\n${indent}OPTIONAL %s"
,
$self
->pattern->as_sparql(
$context
,
$indent
),
$self
->optional->as_sparql( {
%$context
,
force_ggp_braces
=> 1 },
$indent
),
);
return
$string
;
}
sub
as_spin {
my
$self
=
shift
;
my
$model
=
shift
;
my
@lhs
=
$self
->pattern->as_spin(
$model
);
my
@rhs
=
$self
->optional->as_spin(
$model
);
my
$opt
= RDF::Query::Node::Blank->new();
my
$list
=
$model
->add_list(
@rhs
);
$model
->add_statement( RDF::Trine::Statement->new(
$opt
,
$rdf
->type,
$spin
->Optional) );
$model
->add_statement( RDF::Trine::Statement->new(
$opt
,
$spin
->elements,
$list
) );
return
(
@lhs
,
$opt
);
}
sub
as_hash {
my
$self
=
shift
;
my
$context
=
shift
;
return
{
type
=>
lc
(
$self
->type),
pattern
=>
$self
->pattern->as_hash,
optional
=>
$self
->optional->as_hash,
};
}
sub
type {
return
'OPTIONAL'
;
}
sub
referenced_variables {
my
$self
=
shift
;
return
RDF::Query::_uniq(
$self
->pattern->referenced_variables,
$self
->optional->referenced_variables);
}
sub
potentially_bound {
my
$self
=
shift
;
return
RDF::Query::_uniq(
$self
->pattern->potentially_bound,
$self
->optional->potentially_bound);
}
sub
definite_variables {
my
$self
=
shift
;
return
$self
->pattern->definite_variables;
}
1;