Hide Show 115 lines of Pod
no
warnings
'redefine'
;
use
Carp
qw(carp croak confess)
;
if
(! Log::Log4perl::initialized()) {
Log::Log4perl->easy_init(
$ERROR
);
}
no
warnings
'numeric'
;
our
(
$VERSION
,
$DEFAULT_PARSER
);
BEGIN {
$VERSION
=
'2.908_01'
;
$DEFAULT_PARSER
=
'sparql11'
;
}
Hide Show 30 lines of Pod
sub
new {
my
$class
=
shift
;
my
$query
=
shift
;
my
(
$base_uri
,
$languri
,
$lang
,
%options
);
if
(
@_
and
ref
(
$_
[0])) {
%options
= %{
shift
() };
$lang
=
delete
$options
{ lang };
$base_uri
=
$options
{ base_uri } ||
$options
{ base } ;
delete
$options
{ base_uri };
delete
$options
{ base };
}
else
{
(
$base_uri
,
$languri
,
$lang
,
%options
) =
@_
;
}
$class
->clear_error;
my
$l
= Log::Log4perl->get_logger(
"rdf.query"
);
no
warnings
'uninitialized'
;
my
%names
= (
rdql
=>
'RDF::Query::Parser::RDQL'
,
sparql
=>
'RDF::Query::Parser::SPARQL'
,
sparql11
=>
'RDF::Query::Parser::SPARQL11'
,
);
my
%uris
= (
);
if
(
$base_uri
) {
$base_uri
= RDF::Query::Node::Resource->new(
$base_uri
);
}
my
%pargs
;
if
(
$options
{canonicalize}) {
$pargs
{canonicalize} = 1;
}
my
$update
= ((
delete
$options
{update}) ? 1 : 0);
my
$pclass
=
$names
{
$lang
} ||
$uris
{
$languri
} ||
$names
{
$DEFAULT_PARSER
};
my
$parser
=
$pclass
->new(
%pargs
);
my
$parsed
=
$parser
->parse(
$query
,
$base_uri
,
$update
);
my
$self
=
$class
->_new(
base_uri
=>
$base_uri
,
parser
=>
$parser
,
parsed
=>
$parsed
,
query_string
=>
$query
,
update
=>
$update
,
options
=> {
%options
},
);
if
(
exists
$options
{load_data}) {
$self
->{load_data} =
delete
$options
{load_data};
}
elsif
(
$pclass
=~ /^RDF::Query::Parser::(RDQL|SPARQL)$/) {
$self
->{load_data} = 1;
}
else
{
$self
->{load_data} = 0;
}
unless
(
$parsed
->{
'triples'
}) {
$class
->set_error(
$parser
->error );
$l
->debug(
$parser
->error);
return
;
}
if
(
defined
$options
{defines}) {
@{
$self
->{options} }{
keys
%{
$options
{defines} } } =
values
%{
delete
$options
{defines} };
}
if
(
$options
{logger}) {
$l
->debug(
"got external logger"
);
$self
->{logger} =
delete
$options
{logger};
}
if
(
my
$opt
=
delete
$options
{optimize}) {
$l
->debug(
"got optimization flag: $opt"
);
$self
->{optimize} =
$opt
;
}
else
{
$self
->{optimize} = 0;
}
if
(
my
$opt
=
delete
$options
{force_no_optimization}) {
$l
->debug(
"got force_no_optimization flag"
);
$self
->{force_no_optimization} = 1;
}
if
(
my
$time
=
delete
$options
{optimistic_threshold_time}) {
$l
->debug(
"got optimistic_threshold_time flag"
);
$self
->{optimistic_threshold_time} =
$time
;
}
if
(
$pclass
eq
'RDF::Query::Parser::RDQL'
) {
}
return
$self
;
}
sub
_new {
my
$class
=
shift
;
my
$self
=
bless
( {
@_
},
$class
);
return
$self
;
}
Hide Show 6 lines of Pod
sub
get {
my
$self
=
shift
;
my
$stream
=
$self
->execute(
@_
);
my
$row
=
$stream
->
next
;
if
(
ref
(
$row
)) {
return
@{
$row
}{
$self
->variables };
}
else
{
return
undef
;
}
}
Hide Show 8 lines of Pod
sub
prepare {
my
$self
=
shift
;
my
$_model
=
shift
;
my
%args
=
@_
;
my
$l
= Log::Log4perl->get_logger(
"rdf.query"
);
$self
->{_query_cache} = {};
my
%bound
;
if
(
$args
{
'bind'
}) {
%bound
= %{
$args
{
'bind'
} };
}
my
$delegate
;
if
(
defined
$args
{
'delegate'
}) {
$delegate
=
delete
$args
{
'delegate'
};
if
(
$delegate
and not blessed(
$delegate
)) {
$delegate
=
$delegate
->new();
}
}
my
$errors
= (
$args
{
'strict_errors'
}) ? 1 : 0;
my
$parsed
=
$self
->{parsed};
my
@vars
=
$self
->variables(
$parsed
);
local
(
$self
->{model}) =
$self
->{model};
my
$model
=
$self
->{model} ||
$self
->get_model(
$_model
,
%args
);
if
(
$model
) {
$self
->model(
$model
);
$l
->debug(
"got model $model"
);
}
else
{
throw RDF::Query::Error::ModelError (
-text
=>
"Could not create a model object."
);
}
if
(
$self
->{load_data}) {
$l
->trace(
"loading data"
);
$self
->load_data();
}
$model
=
$self
->model();
my
$dataset
= (
$model
->isa(
'RDF::Trine::Model::Dataset'
)) ?
$model
: RDF::Trine::Model::Dataset->new(
$model
);
$l
->trace(
"constructing ExecutionContext"
);
my
$context
= RDF::Query::ExecutionContext->new(
bound
=> \
%bound
,
model
=>
$dataset
,
query
=>
$self
,
base_uri
=>
$parsed
->{base_uri},
ns
=>
$parsed
->{namespaces},
logger
=>
$self
->logger,
optimize
=>
$self
->{optimize},
force_no_optimization
=>
$self
->{force_no_optimization},
optimistic_threshold_time
=>
$self
->{optimistic_threshold_time} || 0,
requested_variables
=> \
@vars
,
strict_errors
=>
$errors
,
options
=>
$self
->{options},
delegate
=>
$delegate
,
);
$self
->{model} =
$model
;
$l
->trace(
"getting QEP..."
);
my
%plan_args
= %{
$args
{ planner_args } || {} };
my
$plan
=
$self
->query_plan(
$context
,
%plan_args
);
$l
->trace(
"-> done."
);
unless
(
$plan
) {
throw RDF::Query::Error::CompilationError
-text
=>
"Query didn't produce a valid execution plan"
;
}
return
(
$plan
,
$context
);
}
Hide Show 15 lines of Pod
sub
execute {
my
$self
=
shift
;
my
$model
=
shift
;
my
%args
=
@_
;
my
$l
= Log::Log4perl->get_logger(
"rdf.query"
);
$l
->debug(
"executing query with model "
. (
$model
or
''
));
my
$lang_iri
=
''
;
my
$parser
=
$self
->{parser};
my
$name
;
if
(
$parser
->isa(
'RDF::Query::Parser::SPARQL11'
)) {
if
(
$self
->is_update) {
$name
=
'SPARQL 1.1 Update'
;
}
else
{
$name
=
'SPARQL 1.1 Query'
;
}
}
elsif
(
$parser
->isa(
'RDF::Query::Parser::SPARQL'
)) {
$name
=
'SPARQL 1.0 Query'
;
}
local
(
$self
->{model}) =
$self
->{model};
if
(
$self
->{options}{allow_passthrough} and
$model
->supports(
$lang_iri
)) {
$l
->info(
"delegating $name execution to the underlying model"
);
return
$model
->get_sparql(
$self
->{query_string} );
}
else
{
my
(
$plan
,
$context
) =
$self
->prepare(
$model
,
%args
);
if
(
$l
->is_trace) {
$l
->trace(
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
);
$l
->trace(
$self
->as_sparql);
$l
->trace(
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
);
}
return
$self
->execute_plan(
$plan
,
$context
);
}
}
Hide Show 8 lines of Pod
sub
execute_plan {
my
$self
=
shift
;
my
$plan
=
shift
;
my
$context
=
shift
;
my
$model
=
$context
->model;
my
$parsed
=
$self
->{parsed};
my
@vars
=
$self
->variables(
$parsed
);
my
$l
= Log::Log4perl->get_logger(
"rdf.query"
);
my
$pattern
=
$self
->pattern;
my
@funcs
=
$pattern
->referenced_functions;
foreach
my
$f
(
@funcs
) {
}
$l
->debug(
"executing the graph pattern"
);
my
$options
=
$parsed
->{options} || {};
if
(
$self
->{options}{plan}) {
warn
$plan
->sse({},
''
);
}
$plan
->execute(
$context
);
my
$stream
=
$plan
->as_iterator(
$context
);
if
(
$parsed
->{
'method'
} eq
'DESCRIBE'
) {
$stream
=
$self
->describe(
$stream
,
$context
);
}
elsif
(
$parsed
->{
'method'
} eq
'ASK'
) {
$stream
=
$self
->ask(
$stream
,
$context
);
}
$l
->debug(
"going to call post-execute hook"
);
if
(
wantarray
) {
return
$stream
->get_all();
}
else
{
return
$stream
;
}
}
Hide Show 4 lines of Pod
sub
prepare_with_named_graphs {
my
$self
=
shift
;
my
$_model
=
shift
;
my
@graphs
=
@_
;
my
$l
= Log::Log4perl->get_logger(
"rdf.query"
);
my
$model
=
$self
->get_model(
$_model
);
if
(
$model
) {
$self
->model(
$model
);
}
else
{
throw RDF::Query::Error::ModelError (
-text
=>
"Could not create a model object."
);
}
foreach
my
$gdata
(
@graphs
) {
my
$url
= (blessed(
$gdata
)) ?
$gdata
->uri_value :
$gdata
;
$l
->debug(
"-> adding graph data $url"
);
$self
->parse_url(
$url
, 1 );
}
return
$self
->prepare(
$model
);
}
Hide Show 8 lines of Pod
sub
execute_with_named_graphs {
my
$self
=
shift
;
my
$_model
=
shift
;
my
@graphs
;
my
@options
;
if
(
scalar
(
@_
)) {
if
(not(blessed(
$_
[0])) and reftype(
$_
[0]) eq
'ARRAY'
) {
@graphs
= @{
shift
(
@_
) };
@options
=
@_
;
}
else
{
@graphs
=
@_
;
}
}
my
(
$plan
,
$ctx
) =
$self
->prepare_with_named_graphs(
$_model
,
@graphs
);
return
$self
->execute_plan(
$plan
,
$ctx
);
}
Hide Show 11 lines of Pod
sub
query_plan {
my
$self
=
shift
;
my
$context
=
shift
;
my
%args
=
@_
;
my
$parsed
=
$self
->{parsed};
my
$bound
=
$context
->bound;
my
@bkeys
=
keys
%{
$bound
};
my
$model
=
$context
->model;
if
(not
exists
$self
->{options}{
'rdf.query.plan.delegate'
} or
$self
->{options}{
'rdf.query.plan.delegate'
}) {
my
$delegate_key
=
$self
->{update}
if
(
scalar
(
@bkeys
) == 0 and
$model
->supports(
$delegate_key
)) {
my
$plan
= RDF::Query::Plan::Iterator->new(
sub
{
my
$context
=
shift
;
my
$model
=
$context
->model;
my
$iter
=
$model
->get_sparql(
$self
->{query_string} );
return
$iter
;
} );
return
$plan
;
}
}
my
%constant_plan
;
if
(
my
$b
=
$self
->{parsed}{bindings}) {
my
$vars
=
$b
->{vars};
my
$values
=
$b
->{terms};
my
@names
=
map
{
$_
->name } @{
$vars
};
my
@constants
;
while
(
my
$values
=
shift
(@{
$b
->{terms} })) {
my
%bound
;
foreach
my
$i
(0 ..
$#names
) {
my
$k
=
$names
[
$i
];
my
$v
=
$values
->[
$i
];
next
unless
defined
(
$v
);
$bound
{
$k
} =
$v
;
}
my
$bound
= RDF::Query::VariableBindings->new( \
%bound
);
push
(
@constants
,
$bound
);
}
my
$constant_plan
= RDF::Query::Plan::Constant->new(
@constants
);
%constant_plan
= (
constants
=> [
$constant_plan
] );
}
my
$algebra
=
$self
->pattern;
my
$pclass
=
$self
->plan_class;
my
@plans
=
$pclass
->generate_plans(
$algebra
,
$context
,
%args
,
%constant_plan
);
my
$l
= Log::Log4perl->get_logger(
"rdf.query.plan"
);
if
(
wantarray
) {
return
@plans
;
}
else
{
my
(
$plan
) =
@plans
;
if
(
$l
->is_debug) {
$l
->debug(
"using query plan: "
.
$plan
->sse({},
''
));
}
return
$plan
;
}
}
Hide Show 12 lines of Pod
sub
plan_class {
return
'RDF::Query::Plan'
;
}
Hide Show 10 lines of Pod
sub
describe {
my
$self
=
shift
;
my
$stream
=
shift
;
my
$context
=
shift
;
my
$model
=
$context
->model;
my
@nodes
;
my
%seen
;
while
(
my
$row
=
$stream
->
next
) {
foreach
my
$v
(@{
$self
->{parsed}{variables} }) {
if
(
$v
->isa(
'RDF::Query::Node::Variable'
)) {
my
$node
=
$row
->{
$v
->name };
my
$string
= blessed(
$node
) ?
$node
->as_string :
''
;
push
(
@nodes
,
$node
)
unless
(
$seen
{
$string
}++);
}
elsif
(
$v
->isa(
'RDF::Query::Node::Resource'
)) {
my
$string
= blessed(
$v
) ?
$v
->as_string :
''
;
push
(
@nodes
,
$v
)
unless
(
$seen
{
$string
}++);
}
}
}
my
@streams
;
$self
->{
'describe_nodes'
} = [];
foreach
my
$node
(
@nodes
) {
push
(@{
$self
->{
'describe_nodes'
} },
$node
);
push
(
@streams
,
$model
->bounded_description(
$node
));
}
my
$ret
=
sub
{
while
(
@streams
) {
my
$val
=
$streams
[0]->
next
;
if
(
defined
$val
) {
return
$val
;
}
else
{
shift
(
@streams
);
return
undef
if
(not
@streams
);
}
}
};
return
RDF::Trine::Iterator::Graph->new(
$ret
);
}
Hide Show 10 lines of Pod
sub
ask {
my
$self
=
shift
;
my
$stream
=
shift
;
my
$context
=
shift
;
my
$value
=
$stream
->
next
;
my
$bool
= (
$value
) ? 1 : 0;
return
RDF::Trine::Iterator::Boolean->new( [
$bool
] );
}
Hide Show 6 lines of Pod
sub
pattern {
my
$self
=
shift
;
my
$parsed
=
$self
->parsed;
my
@triples
= @{
$parsed
->{triples} };
if
(
scalar
(
@triples
) == 1 and (
$triples
[0]->isa(
'RDF::Query::Algebra::GroupGraphPattern'
)
or
$triples
[0]->isa(
'RDF::Query::Algebra::Filter'
)
or
$triples
[0]->isa(
'RDF::Query::Algebra::Sort'
)
or
$triples
[0]->isa(
'RDF::Query::Algebra::Limit'
)
or
$triples
[0]->isa(
'RDF::Query::Algebra::Offset'
)
or
$triples
[0]->isa(
'RDF::Query::Algebra::Distinct'
)
or
$triples
[0]->isa(
'RDF::Query::Algebra::Project'
)
or
$triples
[0]->isa(
'RDF::Query::Algebra::Construct'
)
or
$triples
[0]->isa(
'RDF::Query::Algebra::Load'
)
or
$triples
[0]->isa(
'RDF::Query::Algebra::Clear'
)
or
$triples
[0]->isa(
'RDF::Query::Algebra::Create'
)
or
$triples
[0]->isa(
'RDF::Query::Algebra::Update'
)
)) {
my
$ggp
=
$triples
[0];
return
$ggp
;
}
else
{
return
RDF::Query::Algebra::GroupGraphPattern->new(
@triples
);
}
}
Hide Show 4 lines of Pod
sub
is_update {
my
$self
=
shift
;
my
$pat
=
$self
->pattern;
return
1
if
(
$pat
->subpatterns_of_type(
'RDF::Query::Algebra::Clear'
));
return
1
if
(
$pat
->subpatterns_of_type(
'RDF::Query::Algebra::Copy'
));
return
1
if
(
$pat
->subpatterns_of_type(
'RDF::Query::Algebra::Create'
));
return
1
if
(
$pat
->subpatterns_of_type(
'RDF::Query::Algebra::Move'
));
return
1
if
(
$pat
->subpatterns_of_type(
'RDF::Query::Algebra::Update'
));
return
0;
}
Hide Show 6 lines of Pod
sub
as_sparql {
my
$self
=
shift
;
my
$parsed
=
$self
->parsed || {};
my
$context
= {
namespaces
=> { %{
$parsed
->{namespaces} || {} } } };
my
$method
=
$parsed
->{method};
if
(
$method
=~ /^(DESCRIBE|ASK)$/i) {
$context
->{force_ggp_braces} = 1;
}
my
@vars
=
map
{
$_
->as_sparql(
$context
,
''
) } @{
$parsed
->{ variables } };
my
$vars
=
join
(
' '
,
@vars
);
my
$ggp
=
$self
->pattern;
if
(
$method
=~ /^(LOAD|CLEAR|CREATE|UPDATE)$/) {
return
$ggp
->as_sparql;
}
else
{
{
my
$pvars
=
join
(
' '
,
sort
$ggp
->referenced_variables);
my
$svars
=
join
(
' '
,
sort
map
{
$_
->isa(
'RDF::Query::Node::Resource'
) ?
$_
->as_string :
$_
->name } @{
$parsed
->{ variables } });
if
(
$pvars
eq
$svars
) {
$vars
=
'*'
;
}
}
my
@ns
=
map
{
"PREFIX "
. (
$_
eq
'__DEFAULT__'
?
''
:
$_
) .
": <$parsed->{namespaces}{$_}>"
} (
sort
keys
%{
$parsed
->{namespaces} });
my
@mod
;
if
(
my
$ob
=
$parsed
->{options}{orderby}) {
push
(
@mod
,
'ORDER BY '
.
join
(
' '
,
map
{
my
(
$dir
,
$v
) =
@$_
;
(
$dir
eq
'ASC'
)
?
$v
->as_sparql(
$context
,
''
)
:
"${dir}"
.
$v
->as_sparql(
$context
,
''
);
}
@$ob
));
}
if
(
my
$l
=
$parsed
->{options}{limit}) {
push
(
@mod
,
"LIMIT $l"
);
}
if
(
my
$o
=
$parsed
->{options}{offset}) {
push
(
@mod
,
"OFFSET $o"
);
}
my
$mod
=
join
(
"\n"
,
@mod
);
my
$methoddata
=
''
;
if
(
$method
eq
'SELECT'
) {
$methoddata
=
$method
;
}
elsif
(
$method
eq
'ASK'
) {
$methoddata
=
$method
;
}
elsif
(
$method
eq
'DESCRIBE'
) {
$methoddata
=
sprintf
(
"%s %s\nWHERE"
,
$method
,
$vars
);
}
my
$ns
=
scalar
(
@ns
) ?
join
(
"\n"
,
@ns
,
''
) :
''
;
my
$sparql
;
if
(
$methoddata
or
$ns
) {
$sparql
=
sprintf
(
"$ns%s %s\n%s"
,
$methoddata
,
$ggp
->as_sparql(
$context
,
''
),
$mod
,
);
}
else
{
$sparql
=
sprintf
(
"%s\n%s"
,
$ggp
->as_sparql(
$context
,
''
),
$mod
,
);
}
chomp
(
$sparql
);
return
$sparql
;
}
}
Hide Show 6 lines of Pod
sub
as_hash {
my
$self
=
shift
;
my
$pattern
=
$self
->pattern;
return
$pattern
->as_hash;
}
Hide Show 6 lines of Pod
sub
sse {
my
$self
=
shift
;
my
$parsed
=
$self
->parsed;
my
$ggp
=
$self
->pattern;
my
$ns
=
$parsed
->{namespaces};
my
$nscount
=
scalar
(@{ [
keys
%$ns
] });
my
$base_uri
=
$parsed
->{base};
my
$indent
=
' '
;
my
$context
= {
namespaces
=>
$ns
,
indent
=>
$indent
};
my
$indentcount
= 0;
$indentcount
++
if
(
$base_uri
);
$indentcount
++
if
(
$nscount
);
my
$prefix
=
$indent
x
$indentcount
;
my
$sse
=
$ggp
->sse(
$context
,
$prefix
);
if
(
$nscount
) {
$sse
=
sprintf
(
"(prefix (%s)\n${prefix}%s)"
,
join
(
"\n${indent}"
.
' '
x9,
map
{
"(${_}: <$ns->{$_}>)"
} (
sort
keys
%$ns
)),
$sse
);
}
if
(
$base_uri
) {
$sse
=
sprintf
(
"(base <%s>\n${indent}%s)"
,
$base_uri
->uri_value,
$sse
);
}
chomp
(
$sse
);
return
$sse
;
}
Hide Show 6 lines of Pod
sub
dateparser {
my
$self
=
shift
;
my
$parser
= (
$self
->{dateparser} ||= DateTime::Format::W3CDTF->new);
return
$parser
;
}
Hide Show 10 lines of Pod
sub
supports {
my
$self
=
shift
;
my
$obj
=
shift
;
my
$model
=
$self
->get_model(
$obj
);
return
$model
->supports(
@_
);
}
Hide Show 7 lines of Pod
sub
specifies_update_dataset {
my
$self
=
shift
;
no
warnings
'uninitialized'
;
return
$self
->{parsed}{custom_update_dataset} ? 1 : 0;
}
Hide Show 12 lines of Pod
sub
get_model {
my
$self
=
shift
;
my
$store
=
shift
;
my
%args
=
@_
;
my
$parsed
=
ref
(
$self
) ?
$self
->{parsed} :
undef
;
my
$model
;
if
(not
$store
) {
$model
= RDF::Trine::Model->temporary_model;
}
elsif
((
$store
->isa(
'RDF::Trine::Model'
))) {
$model
=
$store
;
}
elsif
(
$store
->isa(
'RDF::Redland::Model'
)) {
my
$s
= RDF::Trine::Store->new_with_object(
$store
);
$model
= RDF::Trine::Model->new(
$s
);
unless
(blessed(
$model
)) {
Carp::cluck
"Failed to construct an RDF::Trine model from $store"
;
return
;
}
}
elsif
(
$store
->isa(
'RDF::Core::Model'
)) {
Carp::croak
"RDF::Core is no longer supported"
;
}
else
{
Carp::confess
"unknown store type: $store"
;
}
return
$model
;
}
Hide Show 10 lines of Pod
sub
load_data {
my
$self
=
shift
;
my
$parsed
=
$self
->{parsed};
my
$sources
=
$parsed
->{
'sources'
};
if
(
ref
(
$sources
) and reftype(
$sources
) eq
'ARRAY'
and
scalar
(
@$sources
)) {
my
$model
= RDF::Trine::Model->temporary_model;
$self
->model(
$model
);
foreach
my
$source
(
@$sources
) {
my
$named_source
= (2 == @{
$source
} and
$source
->[1] eq
'NAMED'
);
my
$uri
=
$source
->[0]->uri_value;
$self
->parse_url(
$uri
,
$named_source
);
}
}
}
Hide Show 14 lines of Pod
sub
var_or_expr_value {
my
$self
=
shift
;
my
$bound
=
shift
;
my
$v
=
shift
;
my
$ctx
=
shift
;
Carp::confess
'not an object value in var_or_expr_value: '
. Dumper(
$v
)
unless
(blessed(
$v
));
if
(
$v
->isa(
'RDF::Query::Expression'
)) {
return
$v
->evaluate(
$self
,
$bound
,
$ctx
);
}
elsif
(
$v
->isa(
'RDF::Trine::Node::Variable'
)) {
return
$bound
->{
$v
->name };
}
elsif
(
$v
->isa(
'RDF::Query::Node'
)) {
return
$v
;
}
else
{
Carp::cluck
"not an expression or node value in var_or_expr_value: "
. Dumper(
$v
,
$bound
);
throw RDF::Query::Error
-text
=>
'Not an expression or node value'
;
}
}
Hide Show 7 lines of Pod
sub
add_function {
my
$self
=
shift
;
my
$uri
=
shift
;
my
$code
=
shift
;
if
(
ref
(
$self
)) {
$self
->{
'functions'
}{
$uri
} =
$code
;
}
else
{
our
%functions
;
$RDF::Query::functions
{
$uri
} =
$code
;
}
}
Hide Show 7 lines of Pod
sub
supported_extensions {
my
$self
=
shift
;
return
qw(
)
;
}
Hide Show 7 lines of Pod
sub
supported_functions {
my
$self
=
shift
;
my
@funcs
;
if
(blessed(
$self
)) {
push
(
@funcs
,
keys
%{
$self
->{
'functions'
} });
}
push
(
@funcs
,
keys
%RDF::Query::functions
);
return
grep
{ not(/^sparql:/) }
@funcs
;
}
Hide Show 11 lines of Pod
sub
get_function {
my
$self
=
shift
;
my
$uri
=
shift
;
my
%args
=
@_
;
my
$l
= Log::Log4perl->get_logger(
"rdf.query"
);
if
(blessed(
$uri
) and
$uri
->isa(
'RDF::Query::Node::Resource'
)) {
$uri
=
$uri
->uri_value;
}
$l
->debug(
"trying to get function from $uri"
);
if
(blessed(
$uri
) and
$uri
->isa(
'RDF::Query::Node::Resource'
)) {
$uri
=
$uri
->uri_value;
}
my
$func
;
if
(
ref
(
$self
)) {
$func
=
$self
->{
'functions'
}{
$uri
} ||
$RDF::Query::functions
{
$uri
};
}
else
{
$func
=
$RDF::Query::functions
{
$uri
};
}
if
(
$func
) {
return
$func
;
}
return
;
}
Hide Show 10 lines of Pod
sub
call_function {
my
$self
=
shift
;
my
$model
=
shift
;
my
$bound
=
shift
;
my
$uri
=
shift
;
my
$l
= Log::Log4perl->get_logger(
"rdf.query"
);
$l
->debug(
"trying to get function from $uri"
);
my
$filter
= RDF::Query::Expression::Function->new(
$uri
,
@_
);
return
$filter
->evaluate(
$self
,
$bound
);
}
Hide Show 10 lines of Pod
sub
add_computed_statement_generator {
my
$self
=
shift
;
if
(
scalar
(
@_
) == 1) {
throw RDF::Query::Error::MethodInvocationError
-text
=>
'RDF::Query::add_computed_statement_generator must now take two arguments: ( $predicate, \&generator ).'
;
}
my
$pred
=
shift
;
my
$gen
=
shift
;
if
(blessed(
$pred
)) {
if
(
$pred
->can(
'uri_value'
)) {
$pred
=
$pred
->uri_value;
}
else
{
$pred
=
"$pred"
;
}
}
push
( @{
$self
->{
'computed_statement_generators'
}{
$pred
} },
$gen
);
}
Hide Show 6 lines of Pod
sub
get_computed_statement_generators {
my
$self
=
shift
;
if
(
@_
) {
my
$pred
=
shift
;
if
(blessed(
$pred
)) {
if
(
$pred
->can(
'uri_value'
)) {
$pred
=
$pred
->uri_value;
}
else
{
$pred
=
"$pred"
;
}
}
return
$self
->{
'computed_statement_generators'
}{
$pred
} || [];
}
else
{
return
$self
->{
'computed_statement_generators'
} || {};
}
}
Hide Show 8 lines of Pod
sub
add_hook_once {
my
$self
=
shift
;
my
$uri
=
shift
;
my
$code
=
shift
;
my
$token
=
shift
;
unless
(
$self
->{
'hooks_once'
}{
$token
}++) {
$self
->add_hook(
$uri
,
$code
);
}
}
Hide Show 10 lines of Pod
sub
add_hook {
my
$self
=
shift
;
my
$uri
=
shift
;
my
$code
=
shift
;
if
(
ref
(
$self
)) {
push
(@{
$self
->{
'hooks'
}{
$uri
} },
$code
);
}
else
{
our
%hooks
;
push
(@{
$RDF::Query::hooks
{
$uri
} },
$code
);
}
}
Hide Show 12 lines of Pod
sub
get_hooks {
my
$self
=
shift
;
my
$uri
=
shift
;
my
$func
=
$self
->{
'hooks'
}{
$uri
}
||
$RDF::Query::hooks
{
$uri
}
|| [];
return
$func
;
}
Hide Show 12 lines of Pod
sub
run_hook {
my
$self
=
shift
;
my
$uri
=
shift
;
my
@args
=
@_
;
my
$hooks
=
$self
->get_hooks(
$uri
);
foreach
my
$hook
(
@$hooks
) {
$hook
->(
$self
,
@args
);
}
}
Hide Show 11 lines of Pod
sub
parse_url {
my
$self
=
shift
;
my
$url
=
shift
;
my
$named
=
shift
;
my
$model
=
$self
->model;
if
(
$named
) {
RDF::Trine::Parser->parse_url_into_model(
$url
,
$model
,
context
=> iri(
$url
) );
}
else
{
RDF::Trine::Parser->parse_url_into_model(
$url
,
$model
);
}
}
Hide Show 10 lines of Pod
sub
variables {
my
$self
=
shift
;
my
$parsed
=
shift
||
$self
->parsed;
my
@vars
=
map
{
$_
->name }
grep
{
$_
->isa(
'RDF::Query::Node::Variable'
) or
$_
->isa(
'RDF::Query::Expression::Alias'
)
} @{
$parsed
->{
'variables'
} };
return
@vars
;
}
Hide Show 6 lines of Pod
sub
parsed {
my
$self
=
shift
;
if
(
@_
) {
$self
->{parsed} =
shift
;
}
return
$self
->{parsed};
}
Hide Show 6 lines of Pod
sub
model {
my
$self
=
shift
;
if
(
@_
) {
$self
->{model} =
shift
;
}
my
$model
=
$self
->{model};
unless
(
defined
$model
) {
Carp::confess
"query->model shouldn't be calling get_model"
;
$model
=
$self
->get_model();
}
return
$model
;
}
Hide Show 6 lines of Pod
sub
useragent {
my
$self
=
shift
;
if
(
my
$ua
=
$self
->{useragent}) {
return
$ua
;
}
else
{
my
$ua
= LWP::UserAgent->new(
agent
=>
"RDF::Query/${VERSION}"
);
$ua
->default_headers->push_header(
'Accept'
=>
"application/sparql-results+xml;q=0.9,application/rdf+xml;q=0.5,text/turtle;q=0.7,text/xml"
);
$self
->{useragent} =
$ua
;
return
$ua
;
}
}
Hide Show 8 lines of Pod
sub
log
{
my
$self
=
shift
;
if
(blessed(
my
$l
=
$self
->{ logger })) {
$l
->
log
(
@_
);
}
}
Hide Show 6 lines of Pod
sub
logger {
my
$self
=
shift
;
return
$self
->{ logger };
}
Hide Show 6 lines of Pod
sub
error {
my
$self
=
shift
;
if
(blessed(
$self
)) {
return
$self
->{error};
}
else
{
our
$_ERROR
;
return
$_ERROR
;
}
}
sub
_uniq {
my
%seen
;
my
@data
;
foreach
(
@_
) {
push
(
@data
,
$_
)
unless
(
$seen
{
$_
}++);
}
return
@data
;
}
Hide Show 10 lines of Pod
sub
set_error {
my
$self
=
shift
;
my
$error
=
shift
;
my
$e
=
shift
;
if
(blessed(
$self
)) {
$self
->{error} =
$error
;
$self
->{exception} =
$e
;
}
our
$_ERROR
=
$error
;
our
$_EXCEPTION
=
$e
;
}
Hide Show 10 lines of Pod
sub
clear_error {
my
$self
=
shift
;
if
(blessed(
$self
)) {
$self
->{error} =
undef
;
$self
->{exception} =
undef
;
}
our
(
$_ERROR
,
$_EXCEPTION
);
undef
$_ERROR
;
undef
$_EXCEPTION
;
}
1;
Hide Show 47 lines of Pod