sparql 3.0.1 → 3.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +188 -73
- data/UNLICENSE +1 -1
- data/VERSION +1 -1
- data/bin/sparql +44 -24
- data/lib/rack/sparql.rb +1 -1
- data/lib/rack/sparql/conneg.rb +3 -3
- data/lib/sinatra/sparql.rb +5 -5
- data/lib/sparql.rb +17 -16
- data/lib/sparql/algebra.rb +15 -23
- data/lib/sparql/algebra/aggregate.rb +4 -4
- data/lib/sparql/algebra/evaluatable.rb +2 -2
- data/lib/sparql/algebra/expression.rb +63 -40
- data/lib/sparql/algebra/extensions.rb +180 -33
- data/lib/sparql/algebra/operator.rb +37 -16
- data/lib/sparql/algebra/operator/abs.rb +2 -2
- data/lib/sparql/algebra/operator/add.rb +3 -3
- data/lib/sparql/algebra/operator/alt.rb +4 -4
- data/lib/sparql/algebra/operator/and.rb +7 -7
- data/lib/sparql/algebra/operator/asc.rb +3 -3
- data/lib/sparql/algebra/operator/ask.rb +4 -14
- data/lib/sparql/algebra/operator/avg.rb +6 -4
- data/lib/sparql/algebra/operator/base.rb +10 -10
- data/lib/sparql/algebra/operator/bgp.rb +1 -1
- data/lib/sparql/algebra/operator/bnode.rb +5 -5
- data/lib/sparql/algebra/operator/bound.rb +3 -3
- data/lib/sparql/algebra/operator/ceil.rb +2 -2
- data/lib/sparql/algebra/operator/clear.rb +3 -3
- data/lib/sparql/algebra/operator/coalesce.rb +3 -13
- data/lib/sparql/algebra/operator/compare.rb +8 -8
- data/lib/sparql/algebra/operator/concat.rb +4 -4
- data/lib/sparql/algebra/operator/construct.rb +4 -14
- data/lib/sparql/algebra/operator/contains.rb +2 -2
- data/lib/sparql/algebra/operator/copy.rb +3 -3
- data/lib/sparql/algebra/operator/count.rb +3 -3
- data/lib/sparql/algebra/operator/create.rb +3 -3
- data/lib/sparql/algebra/operator/dataset.rb +6 -17
- data/lib/sparql/algebra/operator/datatype.rb +1 -1
- data/lib/sparql/algebra/operator/day.rb +1 -1
- data/lib/sparql/algebra/operator/delete.rb +9 -7
- data/lib/sparql/algebra/operator/delete_data.rb +3 -3
- data/lib/sparql/algebra/operator/delete_where.rb +6 -6
- data/lib/sparql/algebra/operator/desc.rb +1 -1
- data/lib/sparql/algebra/operator/describe.rb +3 -13
- data/lib/sparql/algebra/operator/distinct.rb +4 -14
- data/lib/sparql/algebra/operator/divide.rb +1 -1
- data/lib/sparql/algebra/operator/drop.rb +3 -3
- data/lib/sparql/algebra/operator/encode_for_uri.rb +3 -3
- data/lib/sparql/algebra/operator/equal.rb +2 -2
- data/lib/sparql/algebra/operator/exists.rb +5 -5
- data/lib/sparql/algebra/operator/exprlist.rb +3 -13
- data/lib/sparql/algebra/operator/extend.rb +19 -18
- data/lib/sparql/algebra/operator/filter.rb +6 -16
- data/lib/sparql/algebra/operator/floor.rb +2 -2
- data/lib/sparql/algebra/operator/graph.rb +6 -17
- data/lib/sparql/algebra/operator/greater_than.rb +5 -5
- data/lib/sparql/algebra/operator/greater_than_or_equal.rb +5 -5
- data/lib/sparql/algebra/operator/group.rb +25 -25
- data/lib/sparql/algebra/operator/group_concat.rb +6 -6
- data/lib/sparql/algebra/operator/hours.rb +1 -1
- data/lib/sparql/algebra/operator/if.rb +5 -15
- data/lib/sparql/algebra/operator/in.rb +4 -14
- data/lib/sparql/algebra/operator/insert.rb +7 -5
- data/lib/sparql/algebra/operator/insert_data.rb +3 -3
- data/lib/sparql/algebra/operator/iri.rb +1 -1
- data/lib/sparql/algebra/operator/is_blank.rb +1 -1
- data/lib/sparql/algebra/operator/is_iri.rb +1 -1
- data/lib/sparql/algebra/operator/is_literal.rb +1 -1
- data/lib/sparql/algebra/operator/is_numeric.rb +1 -1
- data/lib/sparql/algebra/operator/join.rb +12 -10
- data/lib/sparql/algebra/operator/lang.rb +1 -1
- data/lib/sparql/algebra/operator/lang_matches.rb +3 -3
- data/lib/sparql/algebra/operator/lcase.rb +2 -2
- data/lib/sparql/algebra/operator/left_join.rb +15 -12
- data/lib/sparql/algebra/operator/less_than.rb +5 -5
- data/lib/sparql/algebra/operator/less_than_or_equal.rb +5 -5
- data/lib/sparql/algebra/operator/load.rb +3 -3
- data/lib/sparql/algebra/operator/max.rb +6 -4
- data/lib/sparql/algebra/operator/md5.rb +1 -1
- data/lib/sparql/algebra/operator/min.rb +6 -4
- data/lib/sparql/algebra/operator/minus.rb +12 -11
- data/lib/sparql/algebra/operator/minutes.rb +1 -1
- data/lib/sparql/algebra/operator/modify.rb +4 -4
- data/lib/sparql/algebra/operator/month.rb +1 -1
- data/lib/sparql/algebra/operator/move.rb +3 -3
- data/lib/sparql/algebra/operator/multiply.rb +1 -1
- data/lib/sparql/algebra/operator/negate.rb +1 -1
- data/lib/sparql/algebra/operator/not.rb +1 -1
- data/lib/sparql/algebra/operator/not_equal.rb +2 -2
- data/lib/sparql/algebra/operator/notexists.rb +4 -4
- data/lib/sparql/algebra/operator/notin.rb +4 -14
- data/lib/sparql/algebra/operator/notoneof.rb +5 -6
- data/lib/sparql/algebra/operator/now.rb +1 -1
- data/lib/sparql/algebra/operator/or.rb +7 -7
- data/lib/sparql/algebra/operator/order.rb +6 -16
- data/lib/sparql/algebra/operator/path.rb +6 -5
- data/lib/sparql/algebra/operator/path_opt.rb +16 -16
- data/lib/sparql/algebra/operator/path_plus.rb +8 -8
- data/lib/sparql/algebra/operator/path_star.rb +4 -4
- data/lib/sparql/algebra/operator/plus.rb +3 -3
- data/lib/sparql/algebra/operator/prefix.rb +10 -10
- data/lib/sparql/algebra/operator/project.rb +4 -14
- data/lib/sparql/algebra/operator/rand.rb +1 -1
- data/lib/sparql/algebra/operator/reduced.rb +4 -14
- data/lib/sparql/algebra/operator/regex.rb +6 -6
- data/lib/sparql/algebra/operator/replace.rb +4 -4
- data/lib/sparql/algebra/operator/reverse.rb +4 -4
- data/lib/sparql/algebra/operator/round.rb +2 -2
- data/lib/sparql/algebra/operator/same_term.rb +8 -5
- data/lib/sparql/algebra/operator/sample.rb +3 -3
- data/lib/sparql/algebra/operator/seconds.rb +1 -1
- data/lib/sparql/algebra/operator/seq.rb +5 -6
- data/lib/sparql/algebra/operator/sequence.rb +4 -4
- data/lib/sparql/algebra/operator/sha1.rb +1 -1
- data/lib/sparql/algebra/operator/sha256.rb +1 -1
- data/lib/sparql/algebra/operator/sha384.rb +1 -1
- data/lib/sparql/algebra/operator/sha512.rb +1 -1
- data/lib/sparql/algebra/operator/slice.rb +4 -14
- data/lib/sparql/algebra/operator/str.rb +1 -1
- data/lib/sparql/algebra/operator/strafter.rb +2 -2
- data/lib/sparql/algebra/operator/strbefore.rb +2 -2
- data/lib/sparql/algebra/operator/strdt.rb +2 -2
- data/lib/sparql/algebra/operator/strends.rb +2 -2
- data/lib/sparql/algebra/operator/strlang.rb +2 -2
- data/lib/sparql/algebra/operator/strlen.rb +2 -2
- data/lib/sparql/algebra/operator/strstarts.rb +2 -2
- data/lib/sparql/algebra/operator/struuid.rb +1 -1
- data/lib/sparql/algebra/operator/substr.rb +4 -4
- data/lib/sparql/algebra/operator/subtract.rb +1 -1
- data/lib/sparql/algebra/operator/sum.rb +6 -4
- data/lib/sparql/algebra/operator/table.rb +3 -3
- data/lib/sparql/algebra/operator/timezone.rb +1 -1
- data/lib/sparql/algebra/operator/tz.rb +1 -1
- data/lib/sparql/algebra/operator/ucase.rb +2 -2
- data/lib/sparql/algebra/operator/union.rb +9 -8
- data/lib/sparql/algebra/operator/update.rb +4 -4
- data/lib/sparql/algebra/operator/using.rb +4 -4
- data/lib/sparql/algebra/operator/uuid.rb +1 -1
- data/lib/sparql/algebra/operator/with.rb +7 -7
- data/lib/sparql/algebra/operator/year.rb +1 -1
- data/lib/sparql/algebra/query.rb +2 -2
- data/lib/sparql/algebra/update.rb +2 -2
- data/lib/sparql/algebra/version.rb +1 -1
- data/lib/sparql/extensions.rb +5 -5
- data/lib/sparql/grammar.rb +111 -11
- data/lib/sparql/grammar/meta.rb +2340 -907
- data/lib/sparql/grammar/parser11.rb +69 -69
- data/lib/sparql/grammar/terminals11.rb +2 -0
- data/lib/sparql/results.rb +73 -46
- data/lib/sparql/version.rb +1 -1
- metadata +38 -65
@@ -6,8 +6,8 @@ module SPARQL; module Algebra
|
|
6
6
|
# @example
|
7
7
|
# (abs ?x)
|
8
8
|
#
|
9
|
-
# @see
|
10
|
-
# @see
|
9
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-abs
|
10
|
+
# @see https://www.w3.org/TR/xpath-functions/#func-abs
|
11
11
|
class Abs < Operator::Unary
|
12
12
|
include Evaluatable
|
13
13
|
|
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
|
|
9
9
|
# @example
|
10
10
|
# (add default <a>)
|
11
11
|
#
|
12
|
-
# @see
|
12
|
+
# @see https://www.w3.org/TR/sparql11-update/#add
|
13
13
|
class Add < Operator
|
14
14
|
include SPARQL::Algebra::Update
|
15
15
|
|
@@ -28,8 +28,8 @@ module SPARQL; module Algebra
|
|
28
28
|
# Returns queryable.
|
29
29
|
# @raise [IOError]
|
30
30
|
# If `from` does not exist, unless the `silent` operator is present
|
31
|
-
# @see
|
32
|
-
def execute(queryable, options
|
31
|
+
# @see https://www.w3.org/TR/sparql11-update/
|
32
|
+
def execute(queryable, **options)
|
33
33
|
debug(options) {"Add"}
|
34
34
|
silent = operands.first == :silent
|
35
35
|
operands.shift if silent
|
@@ -10,7 +10,7 @@ module SPARQL; module Algebra
|
|
10
10
|
# @example
|
11
11
|
# (alt a b)
|
12
12
|
#
|
13
|
-
# @see
|
13
|
+
# @see https://www.w3.org/TR/sparql11-query/#defn_evalPP_alternative
|
14
14
|
class Alt < Operator::Binary
|
15
15
|
include Query
|
16
16
|
|
@@ -32,8 +32,8 @@ module SPARQL; module Algebra
|
|
32
32
|
# each matching solution
|
33
33
|
# @yieldparam [RDF::Query::Solution] solution
|
34
34
|
# @yieldreturn [void] ignored
|
35
|
-
# @see
|
36
|
-
def execute(queryable, options
|
35
|
+
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
36
|
+
def execute(queryable, **options, &block)
|
37
37
|
subject, object = options[:subject], options[:object]
|
38
38
|
debug(options) {"Alt #{[subject, operands, object].to_sse}"}
|
39
39
|
|
@@ -55,7 +55,7 @@ module SPARQL; module Algebra
|
|
55
55
|
end
|
56
56
|
|
57
57
|
query = Union.new(qa, qb)
|
58
|
-
queryable.query(query,
|
58
|
+
queryable.query(query, depth: options[:depth].to_i + 1, **options, &block)
|
59
59
|
end
|
60
60
|
end # Alt
|
61
61
|
end # Operator
|
@@ -7,8 +7,8 @@ module SPARQL; module Algebra
|
|
7
7
|
# (&& ?x ?y)
|
8
8
|
# (and ?x ?y)
|
9
9
|
#
|
10
|
-
# @see
|
11
|
-
# @see
|
10
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-logical-and
|
11
|
+
# @see https://www.w3.org/TR/sparql11-query/#evaluation
|
12
12
|
class And < Operator::Binary
|
13
13
|
include Evaluatable
|
14
14
|
|
@@ -24,7 +24,7 @@ module SPARQL; module Algebra
|
|
24
24
|
# @param [Hash{Symbol => Object}] options
|
25
25
|
# any additional options (see {Operator#initialize})
|
26
26
|
# @raise [TypeError] if any operand is invalid
|
27
|
-
def initialize(left, right, options
|
27
|
+
def initialize(left, right, **options)
|
28
28
|
super
|
29
29
|
end
|
30
30
|
|
@@ -37,20 +37,20 @@ module SPARQL; module Algebra
|
|
37
37
|
# options passed from query
|
38
38
|
# @return [RDF::Literal::Boolean] `true` or `false`
|
39
39
|
# @raise [TypeError] if the operands could not be coerced to boolean literals
|
40
|
-
def evaluate(bindings, options
|
40
|
+
def evaluate(bindings, **options)
|
41
41
|
begin
|
42
|
-
left = boolean(operand(0).evaluate(bindings,
|
42
|
+
left = boolean(operand(0).evaluate(bindings, depth: options[:depth].to_i + 1, **options)).true?
|
43
43
|
rescue TypeError
|
44
44
|
left = nil
|
45
45
|
end
|
46
46
|
|
47
47
|
begin
|
48
|
-
right = boolean(operand(1).evaluate(bindings,
|
48
|
+
right = boolean(operand(1).evaluate(bindings, depth: options[:depth].to_i + 1, **options)).true?
|
49
49
|
rescue TypeError
|
50
50
|
right = nil
|
51
51
|
end
|
52
52
|
|
53
|
-
# From
|
53
|
+
# From https://www.w3.org/TR/sparql11-query/#evaluation
|
54
54
|
# A logical-and that encounters an error on only one branch will return an error if the other branch is
|
55
55
|
# TRUE and FALSE if the other branch is FALSE.
|
56
56
|
case
|
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
|
|
9
9
|
# (order ((asc ?name))
|
10
10
|
# (bgp (triple ?x foaf:name ?name)))))
|
11
11
|
#
|
12
|
-
# @see
|
12
|
+
# @see https://www.w3.org/TR/sparql11-query/#modOrderBy
|
13
13
|
class Asc < Operator::Unary
|
14
14
|
include Evaluatable
|
15
15
|
|
@@ -24,8 +24,8 @@ module SPARQL; module Algebra
|
|
24
24
|
# @param [Hash{Symbol => Object}] options ({})
|
25
25
|
# options passed from query
|
26
26
|
# @return [RDF::Term]
|
27
|
-
def evaluate(bindings, options
|
28
|
-
operand(0).evaluate(bindings,
|
27
|
+
def evaluate(bindings, **options)
|
28
|
+
operand(0).evaluate(bindings, depth: options[:depth].to_i + 1, **options)
|
29
29
|
end
|
30
30
|
end # Asc
|
31
31
|
end # Operator
|
@@ -10,7 +10,7 @@ module SPARQL; module Algebra
|
|
10
10
|
# (ask
|
11
11
|
# (bgp (triple :x :p ?x))))
|
12
12
|
#
|
13
|
-
# @see
|
13
|
+
# @see https://www.w3.org/TR/sparql11-query/#ask
|
14
14
|
class Ask < Operator::Unary
|
15
15
|
include Query
|
16
16
|
|
@@ -28,23 +28,13 @@ module SPARQL; module Algebra
|
|
28
28
|
# @yieldparam [RDF::Query::Solution] solution
|
29
29
|
# @yieldreturn [void] ignored
|
30
30
|
# @return [RDF::Literal::Boolean]\
|
31
|
-
# @see
|
32
|
-
def execute(queryable, options
|
31
|
+
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
32
|
+
def execute(queryable, **options)
|
33
33
|
debug(options) {"Ask #{operands.first}"}
|
34
|
-
res = boolean(!queryable.query(operands.last,
|
34
|
+
res = boolean(!queryable.query(operands.last, depth: options[:depth].to_i + 1, **options).empty?)
|
35
35
|
yield res if block_given?
|
36
36
|
res
|
37
37
|
end
|
38
|
-
|
39
|
-
##
|
40
|
-
# Returns an optimized version of this query.
|
41
|
-
#
|
42
|
-
# Return optimized query
|
43
|
-
#
|
44
|
-
# @return [Union, RDF::Query] `self`
|
45
|
-
def optimize
|
46
|
-
operands = operands.map(&:optimize)
|
47
|
-
end
|
48
38
|
|
49
39
|
# Query results in a boolean result (e.g., ASK)
|
50
40
|
# @return [Boolean]
|
@@ -6,12 +6,12 @@ module SPARQL; module Algebra
|
|
6
6
|
# @example
|
7
7
|
# (prefix ((: <http://www.example.org/>))
|
8
8
|
# (project (?avg)
|
9
|
-
# (extend ((?avg
|
10
|
-
# (group () ((
|
9
|
+
# (extend ((?avg ??.0))
|
10
|
+
# (group () ((??.0 (avg ?o)))
|
11
11
|
# (bgp (triple ?s :dec ?o))))))
|
12
12
|
#
|
13
|
-
# @see
|
14
|
-
class Avg < Operator
|
13
|
+
# @see https://www.w3.org/TR/sparql11-query/#defn_aggAvg
|
14
|
+
class Avg < Operator
|
15
15
|
include Aggregate
|
16
16
|
|
17
17
|
NAME = :avg
|
@@ -23,6 +23,8 @@ module SPARQL; module Algebra
|
|
23
23
|
# enum of evaluated operand
|
24
24
|
# @return [RDF::Literal::Numeric] The numeric average of the terms
|
25
25
|
def apply(enum)
|
26
|
+
# FIXME: we don't actually do anything with distinct
|
27
|
+
operands.shift if distinct = (operands.first == :distinct)
|
26
28
|
if enum.empty?
|
27
29
|
RDF::Literal(0)
|
28
30
|
elsif enum.flatten.all? {|n| n.is_a?(RDF::Literal::Numeric)}
|
@@ -7,7 +7,7 @@ module SPARQL; module Algebra
|
|
7
7
|
# (base <http://example.org/>
|
8
8
|
# (bgp (triple <a> <b> 123.0)))
|
9
9
|
#
|
10
|
-
# @see
|
10
|
+
# @see https://www.w3.org/TR/sparql11-query/#QSynIRI
|
11
11
|
class Base < Binary
|
12
12
|
include Query
|
13
13
|
|
@@ -28,21 +28,21 @@ module SPARQL; module Algebra
|
|
28
28
|
# @yieldreturn [void] ignored
|
29
29
|
# @return [RDF::Queryable, RDF::Query::Solutions]
|
30
30
|
# the resulting solution sequence
|
31
|
-
# @see
|
32
|
-
def execute(queryable, options
|
31
|
+
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
32
|
+
def execute(queryable, **options, &block)
|
33
33
|
debug(options) {"Base #{operands.first}"}
|
34
34
|
Operator.base_uri = operands.first
|
35
|
-
queryable.query(operands.last,
|
35
|
+
queryable.query(operands.last, depth: options[:depth].to_i + 1, **options, &block)
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
##
|
39
|
-
# Returns an optimized version of this query.
|
40
|
-
#
|
41
39
|
# Return optimized query
|
42
40
|
#
|
43
|
-
# @return [
|
44
|
-
|
45
|
-
|
41
|
+
# @return [Base] a copy of `self`
|
42
|
+
# @see SPARQL::Algebra::Expression#optimize
|
43
|
+
def optimize(**options)
|
44
|
+
Operator.base_uri = operands.first
|
45
|
+
operands.last.optimize(**options)
|
46
46
|
end
|
47
47
|
|
48
48
|
# Query results in a boolean result (e.g., ASK)
|
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
|
|
9
9
|
# (prefix ((: <http://example/>))
|
10
10
|
# (bgp (triple ?s ?p ?o)))
|
11
11
|
#
|
12
|
-
# @see
|
12
|
+
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
13
13
|
class BGP < Operator
|
14
14
|
NAME = [:bgp]
|
15
15
|
##
|
@@ -16,7 +16,7 @@ module SPARQL; module Algebra
|
|
16
16
|
# (triple ?b :str ?s2)
|
17
17
|
# )))))
|
18
18
|
#
|
19
|
-
# @see
|
19
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-bnode
|
20
20
|
class BNode < Operator::Unary
|
21
21
|
include Evaluatable
|
22
22
|
|
@@ -30,7 +30,7 @@ module SPARQL; module Algebra
|
|
30
30
|
# @param [Hash{Symbol => Object}] options
|
31
31
|
# any additional options (see {Operator#initialize})
|
32
32
|
# @raise [TypeError] if any operand is invalid
|
33
|
-
def initialize(literal = false, options
|
33
|
+
def initialize(literal = false, **options)
|
34
34
|
super
|
35
35
|
end
|
36
36
|
|
@@ -42,8 +42,8 @@ module SPARQL; module Algebra
|
|
42
42
|
# @param [Hash{Symbol => Object}] options ({})
|
43
43
|
# options passed from query
|
44
44
|
# @return [RDF::Term]
|
45
|
-
def evaluate(bindings, options
|
46
|
-
args = operands.map { |operand| operand.evaluate(bindings,
|
45
|
+
def evaluate(bindings, **options)
|
46
|
+
args = operands.map { |operand| operand.evaluate(bindings, depth: options[:depth].to_i + 1, **options) }
|
47
47
|
apply(args.first, bindings)
|
48
48
|
end
|
49
49
|
|
@@ -82,7 +82,7 @@ module SPARQL; module Algebra
|
|
82
82
|
# Remove the optional argument.
|
83
83
|
#
|
84
84
|
# @return [Array] `self`
|
85
|
-
# @see
|
85
|
+
# @see https://openjena.org/wiki/SSE
|
86
86
|
def to_sxp_bin
|
87
87
|
[NAME] + operands.reject {|o| o == false}
|
88
88
|
end
|
@@ -11,7 +11,7 @@ module SPARQL; module Algebra
|
|
11
11
|
# (bgp (triple ?a :b ?c))
|
12
12
|
# (bgp (triple ?c :d ?e))))))
|
13
13
|
#
|
14
|
-
# @see
|
14
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-bound
|
15
15
|
class Bound < Operator::Unary
|
16
16
|
include Evaluatable
|
17
17
|
|
@@ -25,7 +25,7 @@ module SPARQL; module Algebra
|
|
25
25
|
# @param [Hash{Symbol => Object}] options
|
26
26
|
# any additional options (see {Operator#initialize})
|
27
27
|
# @raise [TypeError] if any operand is invalid
|
28
|
-
def initialize(var, options
|
28
|
+
def initialize(var, **options)
|
29
29
|
super
|
30
30
|
end
|
31
31
|
|
@@ -38,7 +38,7 @@ module SPARQL; module Algebra
|
|
38
38
|
# options passed from query
|
39
39
|
# @return [RDF::Literal::Boolean] `true` or `false`
|
40
40
|
# @raise [TypeError] if the operand is not a variable
|
41
|
-
def evaluate(bindings, options
|
41
|
+
def evaluate(bindings, **options)
|
42
42
|
case var = operand
|
43
43
|
when Variable
|
44
44
|
bindings.respond_to?(:bound?) && bindings.bound?(var) ?
|
@@ -6,8 +6,8 @@ module SPARQL; module Algebra
|
|
6
6
|
# @example
|
7
7
|
# (ceil ?x)
|
8
8
|
#
|
9
|
-
# @see
|
10
|
-
# @see
|
9
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-ceil
|
10
|
+
# @see https://www.w3.org/TR/xpath-functions/#func-ceil
|
11
11
|
class Ceil < Operator::Unary
|
12
12
|
include Evaluatable
|
13
13
|
|
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
|
|
9
9
|
# @example
|
10
10
|
# (clear silent default)
|
11
11
|
#
|
12
|
-
# @see
|
12
|
+
# @see https://www.w3.org/TR/sparql11-update/#clear
|
13
13
|
class Clear < Operator
|
14
14
|
include SPARQL::Algebra::Update
|
15
15
|
|
@@ -28,8 +28,8 @@ module SPARQL; module Algebra
|
|
28
28
|
# Returns queryable.
|
29
29
|
# @raise [IOError]
|
30
30
|
# If `from` does not exist, unless the `silent` operator is present
|
31
|
-
# @see
|
32
|
-
def execute(queryable, options
|
31
|
+
# @see https://www.w3.org/TR/sparql11-update/
|
32
|
+
def execute(queryable, **options)
|
33
33
|
debug(options) {"Clear"}
|
34
34
|
silent = operands.first == :silent
|
35
35
|
operands.shift if silent
|
@@ -15,7 +15,7 @@ module SPARQL; module Algebra
|
|
15
15
|
# (bgp (triple ?s :p ?o))
|
16
16
|
# (bgp (triple ?s :q ?x))))))
|
17
17
|
#
|
18
|
-
# @see
|
18
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-coalesce
|
19
19
|
class Coalesce < Operator
|
20
20
|
include Evaluatable
|
21
21
|
|
@@ -41,25 +41,15 @@ module SPARQL; module Algebra
|
|
41
41
|
# options passed from query
|
42
42
|
# @return [RDF::Term]
|
43
43
|
# @raise [TypeError] if none of the operands succeeds
|
44
|
-
def evaluate(bindings, options
|
44
|
+
def evaluate(bindings, **options)
|
45
45
|
operands.each do |op|
|
46
46
|
begin
|
47
|
-
return op.evaluate(bindings,
|
47
|
+
return op.evaluate(bindings, depth: options[:depth].to_i + 1, **options)
|
48
48
|
rescue
|
49
49
|
end
|
50
50
|
end
|
51
51
|
raise TypeError, "None of the operands evaluated"
|
52
52
|
end
|
53
|
-
|
54
|
-
##
|
55
|
-
# Returns an optimized version of this query.
|
56
|
-
#
|
57
|
-
# Return optimized query
|
58
|
-
#
|
59
|
-
# @return [Union, RDF::Query] `self`
|
60
|
-
def optimize
|
61
|
-
operands = operands.map(&:optimize)
|
62
|
-
end
|
63
53
|
end # Coalesce
|
64
54
|
end # Operator
|
65
55
|
end; end # SPARQL::Algebra
|
@@ -6,8 +6,8 @@ module SPARQL; module Algebra
|
|
6
6
|
# @example
|
7
7
|
# (<=> ?x ?y)
|
8
8
|
#
|
9
|
-
# @see
|
10
|
-
# @see
|
9
|
+
# @see https://www.w3.org/TR/sparql11-query/#OperatorMapping
|
10
|
+
# @see https://www.w3.org/TR/xpath-functions/#func-compare
|
11
11
|
class Compare < Operator::Binary
|
12
12
|
include Evaluatable
|
13
13
|
|
@@ -33,14 +33,14 @@ module SPARQL; module Algebra
|
|
33
33
|
# @raise [TypeError] if either operand is not a literal
|
34
34
|
def apply(left, right)
|
35
35
|
case
|
36
|
-
# @see
|
37
|
-
# @see
|
36
|
+
# @see https://www.w3.org/TR/sparql11-query/#OperatorMapping
|
37
|
+
# @see https://www.w3.org/TR/sparql11-query/#modOrderBy
|
38
38
|
when left.is_a?(RDF::Literal) && right.is_a?(RDF::Literal)
|
39
39
|
case
|
40
|
-
# @see
|
41
|
-
# @see
|
42
|
-
# @see
|
43
|
-
# @see
|
40
|
+
# @see https://www.w3.org/TR/xpath-functions/#string-compare
|
41
|
+
# @see https://www.w3.org/TR/xpath-functions/#comp.numeric
|
42
|
+
# @see https://www.w3.org/TR/xpath-functions/#op.boolean
|
43
|
+
# @see https://www.w3.org/TR/xpath-functions/#comp.duration.datetime
|
44
44
|
when (left.simple? && right.simple?) ||
|
45
45
|
(left.is_a?(RDF::Literal::Numeric) && right.is_a?(RDF::Literal::Numeric)) ||
|
46
46
|
(left.datatype == right.datatype && left.language == right.language)
|
@@ -8,8 +8,8 @@ module SPARQL; module Algebra
|
|
8
8
|
# @example
|
9
9
|
# (concat ?a ?b ...)
|
10
10
|
#
|
11
|
-
# @see
|
12
|
-
# @see
|
11
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-concat
|
12
|
+
# @see https://www.w3.org/TR/xpath-functions/#func-concat
|
13
13
|
class Concat < Operator
|
14
14
|
include Evaluatable
|
15
15
|
|
@@ -32,8 +32,8 @@ module SPARQL; module Algebra
|
|
32
32
|
# options passed from query
|
33
33
|
# @return [RDF::Term]
|
34
34
|
# @raise [TypeError] if any operand is not a literal
|
35
|
-
def evaluate(bindings, options
|
36
|
-
ops = operands.map {|op| op.evaluate(bindings,
|
35
|
+
def evaluate(bindings, **options)
|
36
|
+
ops = operands.map {|op| op.evaluate(bindings, depth: options[:depth].to_i + 1, **options)}
|
37
37
|
|
38
38
|
raise TypeError, "expected all plain literal operands" unless ops.all? {|op| op.literal? && op.plain?}
|
39
39
|
|
@@ -12,7 +12,7 @@ module SPARQL; module Algebra
|
|
12
12
|
# (project (?s ?p ?o)
|
13
13
|
# (bgp (triple ?s ?p ?o)))))
|
14
14
|
#
|
15
|
-
# @see
|
15
|
+
# @see https://www.w3.org/TR/sparql11-query/#construct
|
16
16
|
class Construct < Operator::Binary
|
17
17
|
include Query
|
18
18
|
|
@@ -34,14 +34,14 @@ module SPARQL; module Algebra
|
|
34
34
|
# @yieldreturn [void] ignored
|
35
35
|
# @return [RDF::Queryable]
|
36
36
|
# A Queryable with constructed triples
|
37
|
-
# @see
|
38
|
-
def execute(queryable, options
|
37
|
+
# @see https://www.w3.org/TR/sparql11-query/#construct
|
38
|
+
def execute(queryable, **options, &block)
|
39
39
|
debug(options) {"Construct #{operands.first}, #{options.inspect}"}
|
40
40
|
graph = RDF::Graph.new
|
41
41
|
patterns = operands.first
|
42
42
|
query = operands.last
|
43
43
|
|
44
|
-
queryable.query(query,
|
44
|
+
queryable.query(query, depth: options[:depth].to_i + 1, **options).each do |solution|
|
45
45
|
debug(options) {"(construct apply) #{solution.inspect} to BGP"}
|
46
46
|
|
47
47
|
# Create a mapping from BNodes within the pattern list to newly constructed BNodes
|
@@ -74,16 +74,6 @@ module SPARQL; module Algebra
|
|
74
74
|
graph.each(&block) if block_given?
|
75
75
|
graph
|
76
76
|
end
|
77
|
-
|
78
|
-
##
|
79
|
-
# Returns an optimized version of this query.
|
80
|
-
#
|
81
|
-
# Return optimized query
|
82
|
-
#
|
83
|
-
# @return [Union, RDF::Query] `self`
|
84
|
-
def optimize
|
85
|
-
operands = operands.map(&:optimize)
|
86
|
-
end
|
87
77
|
|
88
78
|
# Query results statements (e.g., CONSTRUCT, DESCRIBE, CREATE)
|
89
79
|
# @return [Boolean]
|