sparql 3.2.4 → 3.2.5
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/VERSION +1 -1
- data/lib/sparql/algebra/aggregate.rb +1 -1
- data/lib/sparql/algebra/evaluatable.rb +1 -1
- data/lib/sparql/algebra/expression.rb +2 -2
- data/lib/sparql/algebra/operator/alt.rb +1 -1
- data/lib/sparql/algebra/operator/and.rb +2 -2
- data/lib/sparql/algebra/operator/asc.rb +1 -1
- data/lib/sparql/algebra/operator/ask.rb +1 -1
- data/lib/sparql/algebra/operator/base.rb +1 -1
- data/lib/sparql/algebra/operator/bnode.rb +1 -1
- data/lib/sparql/algebra/operator/coalesce.rb +1 -1
- data/lib/sparql/algebra/operator/concat.rb +1 -1
- data/lib/sparql/algebra/operator/construct.rb +1 -1
- data/lib/sparql/algebra/operator/dataset.rb +2 -2
- data/lib/sparql/algebra/operator/delete_where.rb +1 -1
- data/lib/sparql/algebra/operator/distinct.rb +1 -1
- data/lib/sparql/algebra/operator/exprlist.rb +1 -1
- data/lib/sparql/algebra/operator/extend.rb +2 -3
- data/lib/sparql/algebra/operator/filter.rb +1 -1
- data/lib/sparql/algebra/operator/group.rb +1 -1
- data/lib/sparql/algebra/operator/group_concat.rb +1 -1
- data/lib/sparql/algebra/operator/if.rb +3 -3
- data/lib/sparql/algebra/operator/in.rb +1 -1
- data/lib/sparql/algebra/operator/join.rb +2 -2
- data/lib/sparql/algebra/operator/left_join.rb +26 -2
- data/lib/sparql/algebra/operator/minus.rb +2 -2
- data/lib/sparql/algebra/operator/modify.rb +2 -2
- data/lib/sparql/algebra/operator/notin.rb +2 -2
- data/lib/sparql/algebra/operator/notoneof.rb +1 -1
- data/lib/sparql/algebra/operator/or.rb +2 -2
- data/lib/sparql/algebra/operator/order.rb +3 -3
- data/lib/sparql/algebra/operator/path.rb +1 -2
- data/lib/sparql/algebra/operator/path_plus.rb +1 -1
- data/lib/sparql/algebra/operator/path_star.rb +1 -1
- data/lib/sparql/algebra/operator/prefix.rb +1 -1
- data/lib/sparql/algebra/operator/project.rb +1 -1
- data/lib/sparql/algebra/operator/reduced.rb +1 -1
- data/lib/sparql/algebra/operator/sequence.rb +2 -2
- data/lib/sparql/algebra/operator/slice.rb +1 -1
- data/lib/sparql/algebra/operator/union.rb +1 -1
- data/lib/sparql/algebra/operator/update.rb +1 -1
- data/lib/sparql/algebra/operator/using.rb +1 -1
- data/lib/sparql/algebra/operator/with.rb +2 -2
- data/lib/sparql/grammar/terminals11.rb +2 -2
- data/lib/sparql/results.rb +2 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eaf1d4f46a557ae2b96d66c5a8fc8b774eb9819a71304fa2d25ada151ba39671
|
4
|
+
data.tar.gz: e61f360e22fcaf413e71be501368ef36fa8860c71e7a714222a59ec021e44bbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee8251bc196d3851505802091dbcfbc206a26ac01d86eecaa5c90ebaa4b6d2f8ce23b5f9fd4b8e6b8cce5ca7e4a588ef90f981d7c950538986fb3fbf953cc324
|
7
|
+
data.tar.gz: 7392fb08ce46900aea2792bb565c880349e4c2f1f19d42d90e6ada7058d501a18bc5acce45728207800bd74356a331107a20a70ac7ba25497dec9eb3a6a9fd3c
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.2.
|
1
|
+
3.2.5
|
@@ -29,7 +29,7 @@ module SPARQL; module Algebra
|
|
29
29
|
args_enum = solutions.map do |solution|
|
30
30
|
operands.map do |operand|
|
31
31
|
begin
|
32
|
-
operand.evaluate(solution, depth: options[:depth].to_i + 1
|
32
|
+
operand.evaluate(solution, **options.merge(depth: options[:depth].to_i + 1))
|
33
33
|
rescue TypeError
|
34
34
|
# Ignore errors
|
35
35
|
nil
|
@@ -14,7 +14,7 @@ module SPARQL; module Algebra
|
|
14
14
|
# @return [RDF::Term]
|
15
15
|
# @abstract
|
16
16
|
def evaluate(bindings, **options)
|
17
|
-
args = operands.map { |operand| operand.evaluate(bindings, depth: options[:depth].to_i + 1
|
17
|
+
args = operands.map { |operand| operand.evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1)) }
|
18
18
|
options[:memoize] ? memoize(*args, **options) : apply(*args, **options)
|
19
19
|
end
|
20
20
|
|
@@ -112,7 +112,7 @@ module SPARQL; module Algebra
|
|
112
112
|
return case sse.first
|
113
113
|
when Array
|
114
114
|
debug(options) {"Map array elements #{sse}"}
|
115
|
-
sse.map {|s| self.new(s, parent_operator: parent_operator, depth: options[:depth].to_i + 1
|
115
|
+
sse.map {|s| self.new(s, parent_operator: parent_operator, **options.merge(depth: options[:depth].to_i + 1))}
|
116
116
|
else
|
117
117
|
debug(options) {"No operator found for #{sse.first}"}
|
118
118
|
sse.map do |s|
|
@@ -127,7 +127,7 @@ module SPARQL; module Algebra
|
|
127
127
|
debug(options) {"Operator=#{operator.inspect}, Operand=#{operand.inspect}"}
|
128
128
|
case operand
|
129
129
|
when Array
|
130
|
-
self.new(operand, parent_operator: operator, depth: options[:depth].to_i + 1
|
130
|
+
self.new(operand, parent_operator: operator, **options.merge(depth: options[:depth].to_i + 1))
|
131
131
|
when Operator, Variable, RDF::Term, RDF::Query, Symbol
|
132
132
|
operand
|
133
133
|
when TrueClass, FalseClass, Numeric, String, DateTime, Date, Time
|
@@ -52,13 +52,13 @@ module SPARQL; module Algebra
|
|
52
52
|
# @raise [TypeError] if the operands could not be coerced to boolean literals
|
53
53
|
def evaluate(bindings, **options)
|
54
54
|
begin
|
55
|
-
left = boolean(operand(0).evaluate(bindings, depth: options[:depth].to_i + 1
|
55
|
+
left = boolean(operand(0).evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))).true?
|
56
56
|
rescue TypeError
|
57
57
|
left = nil
|
58
58
|
end
|
59
59
|
|
60
60
|
begin
|
61
|
-
right = boolean(operand(1).evaluate(bindings, depth: options[:depth].to_i + 1
|
61
|
+
right = boolean(operand(1).evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))).true?
|
62
62
|
rescue TypeError
|
63
63
|
right = nil
|
64
64
|
end
|
@@ -33,7 +33,7 @@ module SPARQL; module Algebra
|
|
33
33
|
# options passed from query
|
34
34
|
# @return [RDF::Term]
|
35
35
|
def evaluate(bindings, **options)
|
36
|
-
operand(0).evaluate(bindings, depth: options[:depth].to_i + 1
|
36
|
+
operand(0).evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))
|
37
37
|
end
|
38
38
|
|
39
39
|
##
|
@@ -37,7 +37,7 @@ module SPARQL; module Algebra
|
|
37
37
|
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
38
38
|
def execute(queryable, **options)
|
39
39
|
debug(options) {"Ask #{operands.first}"}
|
40
|
-
res = boolean(!queryable.query(operands.last, depth: options[:depth].to_i + 1
|
40
|
+
res = boolean(!queryable.query(operands.last, **options.merge(depth: options[:depth].to_i + 1)).empty?)
|
41
41
|
yield res if block_given?
|
42
42
|
res
|
43
43
|
end
|
@@ -38,7 +38,7 @@ module SPARQL; module Algebra
|
|
38
38
|
def execute(queryable, **options, &block)
|
39
39
|
debug(options) {"Base #{operands.first}"}
|
40
40
|
Operator.base_uri = operands.first
|
41
|
-
queryable.query(operands.last, depth: options[:depth].to_i + 1,
|
41
|
+
queryable.query(operands.last, **options.merge(depth: options[:depth].to_i + 1), &block)
|
42
42
|
end
|
43
43
|
|
44
44
|
##
|
@@ -57,7 +57,7 @@ module SPARQL; module Algebra
|
|
57
57
|
# options passed from query
|
58
58
|
# @return [RDF::Term]
|
59
59
|
def evaluate(bindings, **options)
|
60
|
-
args = operands.map { |operand| operand.evaluate(bindings, depth: options[:depth].to_i + 1
|
60
|
+
args = operands.map { |operand| operand.evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1)) }
|
61
61
|
apply(args.first, bindings)
|
62
62
|
end
|
63
63
|
|
@@ -57,7 +57,7 @@ module SPARQL; module Algebra
|
|
57
57
|
def evaluate(bindings, **options)
|
58
58
|
operands.each do |op|
|
59
59
|
begin
|
60
|
-
return op.evaluate(bindings, depth: options[:depth].to_i + 1
|
60
|
+
return op.evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))
|
61
61
|
rescue
|
62
62
|
end
|
63
63
|
end
|
@@ -48,7 +48,7 @@ module SPARQL; module Algebra
|
|
48
48
|
# @return [RDF::Term]
|
49
49
|
# @raise [TypeError] if any operand is not a literal
|
50
50
|
def evaluate(bindings, **options)
|
51
|
-
ops = operands.map {|op| op.evaluate(bindings, depth: options[:depth].to_i + 1
|
51
|
+
ops = operands.map {|op| op.evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))}
|
52
52
|
|
53
53
|
raise TypeError, "expected all plain literal operands" unless ops.all? {|op| op.literal? && op.plain?}
|
54
54
|
|
@@ -51,7 +51,7 @@ module SPARQL; module Algebra
|
|
51
51
|
patterns = operands.first
|
52
52
|
query = operands.last
|
53
53
|
|
54
|
-
queryable.query(query, depth: options[:depth].to_i + 1
|
54
|
+
queryable.query(query, **options.merge(depth: options[:depth].to_i + 1)).each do |solution|
|
55
55
|
debug(options) {"(construct apply) #{solution.inspect} to BGP"}
|
56
56
|
|
57
57
|
# Create a mapping from BNodes within the pattern list to newly constructed BNodes
|
@@ -149,7 +149,7 @@ module SPARQL; module Algebra
|
|
149
149
|
debug(options) {"Dataset"}
|
150
150
|
if %i(default-graph-uri named-graph-uri).any? {|k| options.key?(k)}
|
151
151
|
debug("=> Skip constructing merge repo due to options", options)
|
152
|
-
return queryable.query(operands.last, depth: options[:depth].to_i + 1,
|
152
|
+
return queryable.query(operands.last, **options.merge(depth: options[:depth].to_i + 1), &base)
|
153
153
|
end
|
154
154
|
|
155
155
|
default_datasets = []
|
@@ -180,7 +180,7 @@ module SPARQL; module Algebra
|
|
180
180
|
aggregate = RDF::AggregateRepo.new(queryable)
|
181
181
|
named_datasets.each {|name| aggregate.named(name) if queryable.has_graph?(name)}
|
182
182
|
aggregate.default(*default_datasets.select {|name| queryable.has_graph?(name)})
|
183
|
-
aggregate.query(operands.last, depth: options[:depth].to_i + 1,
|
183
|
+
aggregate.query(operands.last, **options.merge(depth: options[:depth].to_i + 1), &base)
|
184
184
|
end
|
185
185
|
|
186
186
|
##
|
@@ -53,7 +53,7 @@ module SPARQL; module Algebra
|
|
53
53
|
end
|
54
54
|
query = RDF::Query.new(*patterns, **{}) # FIXME: added hash argument needed until Statement#to_hash removed.
|
55
55
|
debug(options) {"DeleteWhere query #{query.to_sse}"}
|
56
|
-
query.execute(queryable, depth: options[:depth].to_i + 1
|
56
|
+
query.execute(queryable, **options.merge(depth: options[:depth].to_i + 1)) do |solution|
|
57
57
|
debug(options) {"DeleteWhere solution #{solution.to_sse}"}
|
58
58
|
query.each_statement do |pattern|
|
59
59
|
pattern = pattern.dup.bind(solution)
|
@@ -40,7 +40,7 @@ module SPARQL; module Algebra
|
|
40
40
|
# the resulting solution sequence
|
41
41
|
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
42
42
|
def execute(queryable, **options, &block)
|
43
|
-
@solutions = queryable.query(operands.last, depth: options[:depth].to_i + 1
|
43
|
+
@solutions = queryable.query(operands.last, **options.merge(depth: options[:depth].to_i + 1)).distinct
|
44
44
|
@solutions.each(&block) if block_given?
|
45
45
|
@solutions
|
46
46
|
end
|
@@ -50,7 +50,7 @@ module SPARQL; module Algebra
|
|
50
50
|
# @return [RDF::Literal::Boolean] `true` or `false`
|
51
51
|
# @raise [TypeError] if the operands could not be coerced to a boolean literal
|
52
52
|
def evaluate(bindings, **options)
|
53
|
-
res = operands.all? {|op| boolean(op.evaluate(bindings, depth: options[:depth].to_i + 1
|
53
|
+
res = operands.all? {|op| boolean(op.evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))).true? }
|
54
54
|
RDF::Literal(res) # FIXME: error handling
|
55
55
|
end
|
56
56
|
end # Exprlist
|
@@ -82,7 +82,7 @@ module SPARQL; module Algebra
|
|
82
82
|
# @see https://www.w3.org/TR/sparql11-query/#evaluation
|
83
83
|
def execute(queryable, **options, &block)
|
84
84
|
debug(options) {"Extend"}
|
85
|
-
@solutions = operand(1).execute(queryable, depth: options[:depth].to_i + 1
|
85
|
+
@solutions = operand(1).execute(queryable, **options.merge(depth: options[:depth].to_i + 1))
|
86
86
|
@solutions.each do |solution|
|
87
87
|
# Re-bind to bindings, if defined, as they might not be found in solution
|
88
88
|
options[:bindings].each_binding do |name, value|
|
@@ -93,8 +93,7 @@ module SPARQL; module Algebra
|
|
93
93
|
operand(0).each do |(var, expr)|
|
94
94
|
begin
|
95
95
|
val = expr.evaluate(solution, queryable: queryable,
|
96
|
-
depth: options[:depth].to_i + 1
|
97
|
-
**options)
|
96
|
+
**options.merge(depth: options[:depth].to_i + 1))
|
98
97
|
debug(options) {"===> + #{var} => #{val.inspect}"}
|
99
98
|
val = val.dup.bind(solution) if val.is_a?(RDF::Query::Pattern)
|
100
99
|
solution.bindings[var.to_sym] = val
|
@@ -48,7 +48,7 @@ module SPARQL; module Algebra
|
|
48
48
|
debug(options) {"Filter #{operands.first.to_sxp}"}
|
49
49
|
opts = options.merge(queryable: queryable, depth: options[:depth].to_i + 1)
|
50
50
|
@solutions = RDF::Query::Solutions()
|
51
|
-
queryable.query(operands.last, depth: options[:depth].to_i + 1
|
51
|
+
queryable.query(operands.last, **options.merge(depth: options[:depth].to_i + 1)) do |solution|
|
52
52
|
# Re-bind to bindings, if defined, as they might not be found in solution
|
53
53
|
options[:bindings].each_binding do |name, value|
|
54
54
|
solution[name] ||= value if operands.first.variables.include?(name)
|
@@ -82,7 +82,7 @@ module SPARQL; module Algebra
|
|
82
82
|
exprlist = operands.first
|
83
83
|
query = operands.last
|
84
84
|
aggregates = operands.length == 3 ? operand(1) : []
|
85
|
-
solutions = queryable.query(query, depth: options[:depth].to_i + 1
|
85
|
+
solutions = queryable.query(query, **options.merge(depth: options[:depth].to_i + 1))
|
86
86
|
|
87
87
|
groups = solutions.group_by do |solution|
|
88
88
|
# Evaluate each exprlist operand to get groups where each key is a new solution
|
@@ -55,7 +55,7 @@ module SPARQL; module Algebra
|
|
55
55
|
sep = operands.length == 2 ? operand(0).last : RDF::Literal(' ')
|
56
56
|
args_enum = solutions.map do |solution|
|
57
57
|
begin
|
58
|
-
operands.last.evaluate(solution, depth: options[:depth].to_i + 1
|
58
|
+
operands.last.evaluate(solution, **options.merge(depth: options[:depth].to_i + 1))
|
59
59
|
rescue TypeError
|
60
60
|
# Ignore errors
|
61
61
|
nil
|
@@ -42,9 +42,9 @@ module SPARQL; module Algebra
|
|
42
42
|
# @return [RDF::Term]
|
43
43
|
# @raise [TypeError]
|
44
44
|
def evaluate(bindings, **options)
|
45
|
-
operand(0).evaluate(bindings, depth: options[:depth].to_i + 1
|
46
|
-
operand(1).evaluate(bindings, depth: options[:depth].to_i + 1
|
47
|
-
operand(2).evaluate(bindings, depth: options[:depth].to_i + 1
|
45
|
+
operand(0).evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1)) == RDF::Literal::TRUE ?
|
46
|
+
operand(1).evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1)) :
|
47
|
+
operand(2).evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))
|
48
48
|
rescue
|
49
49
|
raise TypeError
|
50
50
|
end
|
@@ -48,7 +48,7 @@ module SPARQL; module Algebra
|
|
48
48
|
error_found = false
|
49
49
|
found = operands[1..-1].any? do |op|
|
50
50
|
begin
|
51
|
-
lhs == op.evaluate(bindings, depth: options[:depth].to_i + 1
|
51
|
+
lhs == op.evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))
|
52
52
|
rescue TypeError
|
53
53
|
error_found = true
|
54
54
|
end
|
@@ -66,10 +66,10 @@ module SPARQL; module Algebra
|
|
66
66
|
# Generate solutions independently, merge based on solution compatibility
|
67
67
|
debug(options) {"Join #{operands.to_sse}"}
|
68
68
|
|
69
|
-
left = queryable.query(operand(0), depth: options[:depth].to_i + 1
|
69
|
+
left = queryable.query(operand(0), **options.merge(depth: options[:depth].to_i + 1))
|
70
70
|
debug(options) {"(join)=>(left) #{left.map(&:to_h).to_sse}"}
|
71
71
|
|
72
|
-
right = queryable.query(operand(1), depth: options[:depth].to_i + 1
|
72
|
+
right = queryable.query(operand(1), **options.merge(depth: options[:depth].to_i + 1))
|
73
73
|
debug(options) {"(join)=>(right) #{right.map(&:to_h).to_sse}"}
|
74
74
|
|
75
75
|
@solutions = RDF::Query::Solutions(left.map do |s1|
|
@@ -54,10 +54,10 @@ module SPARQL; module Algebra
|
|
54
54
|
operands.length < 2 || operands.length > 3
|
55
55
|
|
56
56
|
debug(options) {"LeftJoin"}
|
57
|
-
left = queryable.query(operand(0), depth: options[:depth].to_i + 1
|
57
|
+
left = queryable.query(operand(0), **options.merge(depth: options[:depth].to_i + 1))
|
58
58
|
debug(options) {"=>(leftjoin left) #{left.inspect}"}
|
59
59
|
|
60
|
-
right = queryable.query(operand(1), depth: options[:depth].to_i + 1
|
60
|
+
right = queryable.query(operand(1), **options.merge(depth: options[:depth].to_i + 1))
|
61
61
|
debug(options) {"=>(leftjoin right) #{right.inspect}"}
|
62
62
|
|
63
63
|
# LeftJoin(Ω1, Ω2, expr) =
|
@@ -71,6 +71,30 @@ module SPARQL; module Algebra
|
|
71
71
|
s[name] = value if filter.variables.include?(name)
|
72
72
|
end if options[:bindings] && filter.respond_to?(:variables)
|
73
73
|
|
74
|
+
# See https://github.com/w3c/rdf-tests/pull/83#issuecomment-1324220844 for @afs's discussion of the simplified/not-simplified issue.
|
75
|
+
#
|
76
|
+
# The difference is when simplification is applied. It matters for OPTIONAL because OPTIONAL { ... FILTER(...) } puts the filter into the LeftJoin expressions. In LeftJoin, the FILTER can see the left-hand-side variables. (SQL: LEFT JOIN ... ON ...)
|
77
|
+
#
|
78
|
+
# For OPTIONAL { { ... FILTER(...) } }, the inner part is Join({}, {.... FILTER }).
|
79
|
+
#
|
80
|
+
# if simplify happens while coming back up the tree generating algebra operations, it removes the join i.e. the inner of {{ }}, and passes "... FILTER()" to the OPTIONAL. The effect of the extra nesting in {{ }} is lost and it exposes the filter to the OPTIONAL rule.
|
81
|
+
#
|
82
|
+
# if simplification happens as a step after the whole algebra is converted, this does not happen. Compiling the OPTIONAL see a join and the filter is not at the top level of the OPTIONAl block and so not handled in the LeftJoin.
|
83
|
+
#
|
84
|
+
# Use case:
|
85
|
+
#
|
86
|
+
# # Include name if person over 18
|
87
|
+
# SELECT *
|
88
|
+
# { ?person :age ?age
|
89
|
+
# OPTIONAL { ?person :name ?name. FILTER(?age > 18) }
|
90
|
+
# }
|
91
|
+
# Hindsight: a better syntax would be call out if the filter needed access to the LHS.
|
92
|
+
#
|
93
|
+
# OPTIONAL FILTER(....) { }
|
94
|
+
#
|
95
|
+
# But we are where we are.
|
96
|
+
#
|
97
|
+
# (a "no conditions on LeftJoin" approach would mean users having to duplicate parts of their query - possibly quite large parts.)
|
74
98
|
expr = filter ? boolean(filter.evaluate(s)).true? : true rescue false
|
75
99
|
debug(options) {"===>(evaluate) #{s.inspect}"} if filter
|
76
100
|
|
@@ -71,9 +71,9 @@ module SPARQL; module Algebra
|
|
71
71
|
#
|
72
72
|
# card[Minus(Ω1, Ω2)](μ) = card[Ω1](μ)
|
73
73
|
debug(options) {"Minus"}
|
74
|
-
left = queryable.query(operand(0), depth: options[:depth].to_i + 1
|
74
|
+
left = queryable.query(operand(0), **options.merge(depth: options[:depth].to_i + 1))
|
75
75
|
debug(options) {"(minus left) #{left.inspect}"}
|
76
|
-
right = queryable.query(operand(1), depth: options[:depth].to_i + 1
|
76
|
+
right = queryable.query(operand(1), **options.merge(depth: options[:depth].to_i + 1))
|
77
77
|
debug(options) {"(minus right) #{right.inspect}"}
|
78
78
|
@solutions = left.minus(right)
|
79
79
|
@solutions.each(&block) if block_given?
|
@@ -71,12 +71,12 @@ module SPARQL; module Algebra
|
|
71
71
|
query = Operator::Using.new((defaults + named), query, **options)
|
72
72
|
end
|
73
73
|
|
74
|
-
queryable.query(query, depth: options[:depth].to_i + 1
|
74
|
+
queryable.query(query, **options.merge(depth: options[:depth].to_i + 1)) do |solution|
|
75
75
|
debug(options) {"(solution)=>#{solution.inspect}"}
|
76
76
|
|
77
77
|
# Execute each operand with queryable and solution
|
78
78
|
operands.each do |op|
|
79
|
-
op.execute(queryable, solutions: solution, depth: options[:depth].to_i + 1
|
79
|
+
op.execute(queryable, solutions: solution, **options.merge(depth: options[:depth].to_i + 1))
|
80
80
|
end
|
81
81
|
end
|
82
82
|
queryable
|
@@ -48,11 +48,11 @@ module SPARQL; module Algebra
|
|
48
48
|
# @return [RDF::Literal::Boolean] `true` or `false`
|
49
49
|
# @raise [TypeError] if term is not found and any operand raises an error
|
50
50
|
def evaluate(bindings, **options)
|
51
|
-
lhs = operands.first.evaluate(bindings, depth: options[:depth].to_i + 1
|
51
|
+
lhs = operands.first.evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))
|
52
52
|
error_found = false
|
53
53
|
found = operands[1..-1].any? do |op|
|
54
54
|
begin
|
55
|
-
lhs == op.evaluate(bindings, depth: options[:depth].to_i + 1
|
55
|
+
lhs == op.evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))
|
56
56
|
rescue TypeError
|
57
57
|
error_found = true
|
58
58
|
end
|
@@ -50,7 +50,7 @@ module SPARQL; module Algebra
|
|
50
50
|
q.pattern [subject, v, object]
|
51
51
|
end
|
52
52
|
query = Filter.new(NotIn.new(v, *operands), bgp)
|
53
|
-
queryable.query(query, depth: options[:depth].to_i + 1
|
53
|
+
queryable.query(query, **options.merge(depth: options[:depth].to_i + 1)) do |solution|
|
54
54
|
solution.bindings.delete(v.to_sym)
|
55
55
|
debug(options) {"(solution)-> #{solution.to_h.to_sse}"}
|
56
56
|
block.call(solution)
|
@@ -56,13 +56,13 @@ module SPARQL; module Algebra
|
|
56
56
|
# @raise [TypeError] if the operands could not be coerced to a boolean literal
|
57
57
|
def evaluate(bindings, **options)
|
58
58
|
begin
|
59
|
-
left = boolean(operand(0).evaluate(bindings, depth: options[:depth].to_i + 1
|
59
|
+
left = boolean(operand(0).evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))).true?
|
60
60
|
rescue TypeError
|
61
61
|
left = nil
|
62
62
|
end
|
63
63
|
|
64
64
|
begin
|
65
|
-
right = boolean(operand(1).evaluate(bindings, depth: options[:depth].to_i + 1
|
65
|
+
right = boolean(operand(1).evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))).true?
|
66
66
|
rescue TypeError
|
67
67
|
right = nil
|
68
68
|
end
|
@@ -86,12 +86,12 @@ module SPARQL; module Algebra
|
|
86
86
|
def execute(queryable, **options, &block)
|
87
87
|
|
88
88
|
debug(options) {"Order"}
|
89
|
-
@solutions = queryable.query(operands.last, depth: options[:depth].to_i + 1
|
89
|
+
@solutions = queryable.query(operands.last, **options.merge(depth: options[:depth].to_i + 1)).order do |a, b|
|
90
90
|
operand(0).inject(0) do |memo, op|
|
91
91
|
debug(options) {"(order) #{op.inspect}"}
|
92
92
|
memo = begin
|
93
|
-
a_eval = op.evaluate(a, queryable: queryable, depth: options[:depth].to_i + 1
|
94
|
-
b_eval = op.evaluate(b, queryable: queryable, depth: options[:depth].to_i + 1
|
93
|
+
a_eval = op.evaluate(a, queryable: queryable, **options.merge(depth: options[:depth].to_i + 1)) rescue nil
|
94
|
+
b_eval = op.evaluate(b, queryable: queryable, **options.merge(depth: options[:depth].to_i + 1)) rescue nil
|
95
95
|
comp = begin
|
96
96
|
Operator::Compare.evaluate(a_eval, b_eval, order_by: true).to_s.to_i
|
97
97
|
rescue TypeError
|
@@ -50,8 +50,7 @@ module SPARQL; module Algebra
|
|
50
50
|
subject: subject,
|
51
51
|
object: object,
|
52
52
|
graph_name: options.fetch(:graph_name, false),
|
53
|
-
depth: options[:depth].to_i + 1
|
54
|
-
**options
|
53
|
+
**options.merge(depth: options[:depth].to_i + 1)
|
55
54
|
) do |solution|
|
56
55
|
@solutions << solution
|
57
56
|
end
|
@@ -73,7 +73,7 @@ module SPARQL; module Algebra
|
|
73
73
|
# Keep track of solutions
|
74
74
|
# Recurse into query
|
75
75
|
immediate_solutions =
|
76
|
-
query.execute(queryable, depth: options[:depth].to_i + 1
|
76
|
+
query.execute(queryable, **options.merge(depth: options[:depth].to_i + 1))
|
77
77
|
|
78
78
|
# For all solutions, if they are not in the accumulator, add them and recurse, otherwise skip
|
79
79
|
recursive_solutions = RDF::Query::Solutions.new
|
@@ -48,7 +48,7 @@ module SPARQL; module Algebra
|
|
48
48
|
|
49
49
|
# (:x :p* :y) => (:x (:p+)? :y)
|
50
50
|
query = PathOpt.new(PathPlus.new(*operands))
|
51
|
-
query.execute(queryable, depth: options[:depth].to_i + 1,
|
51
|
+
query.execute(queryable, **options.merge(depth: options[:depth].to_i + 1), &block)
|
52
52
|
end
|
53
53
|
##
|
54
54
|
#
|
@@ -37,7 +37,7 @@ module SPARQL; module Algebra
|
|
37
37
|
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
38
38
|
def execute(queryable, **options, &block)
|
39
39
|
debug(options) {"Prefix"}
|
40
|
-
@solutions = queryable.query(operands.last, depth: options[:depth].to_i + 1,
|
40
|
+
@solutions = queryable.query(operands.last, **options.merge(depth: options[:depth].to_i + 1), &block)
|
41
41
|
end
|
42
42
|
|
43
43
|
##
|
@@ -101,7 +101,7 @@ module SPARQL; module Algebra
|
|
101
101
|
# the resulting solution sequence
|
102
102
|
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
103
103
|
def execute(queryable, **options, &block)
|
104
|
-
@solutions = queryable.query(operands.last, depth: options[:depth].to_i + 1
|
104
|
+
@solutions = queryable.query(operands.last, **options.merge(depth: options[:depth].to_i + 1))
|
105
105
|
@solutions.variable_names = self.variables.keys
|
106
106
|
@solutions = @solutions.project(*(operands.first)) unless operands.first.empty?
|
107
107
|
@solutions.each(&block) if block_given?
|
@@ -41,7 +41,7 @@ module SPARQL; module Algebra
|
|
41
41
|
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
42
42
|
def execute(queryable, **options, &block)
|
43
43
|
@solutions = operands.last.
|
44
|
-
execute(queryable, depth: options[:depth].to_i + 1
|
44
|
+
execute(queryable, **options.merge(depth: options[:depth].to_i + 1)).reduced
|
45
45
|
@solutions.each(&block) if block_given?
|
46
46
|
@solutions
|
47
47
|
end
|
@@ -31,11 +31,11 @@ module SPARQL; module Algebra
|
|
31
31
|
def execute(queryable, **options)
|
32
32
|
debug(options) {"Sequence #{operands.to_sse}"}
|
33
33
|
|
34
|
-
last = queryable.query(operands.shift, depth: options[:depth].to_i + 1
|
34
|
+
last = queryable.query(operands.shift, **options.merge(depth: options[:depth].to_i + 1))
|
35
35
|
debug(options) {"(sequence)=>(last) #{last.map(&:to_h).to_sse}"}
|
36
36
|
|
37
37
|
operands.each do |op|
|
38
|
-
this = queryable.query(op, depth: options[:depth].to_i + 1
|
38
|
+
this = queryable.query(op, **options.merge(depth: options[:depth].to_i + 1))
|
39
39
|
debug(options) {"(sequence)=>(this) #{this.map(&:to_h).to_sse}"}
|
40
40
|
|
41
41
|
last = last.map do |s1|
|
@@ -57,7 +57,7 @@ module SPARQL; module Algebra
|
|
57
57
|
def execute(queryable, **options, &block)
|
58
58
|
offset = operands[0] == :_ ? 0 : operands[0].to_i
|
59
59
|
limit = operands[1] == :_ ? -1 : operands[1].to_i
|
60
|
-
@solutions = operands.last. execute(queryable, depth: options[:depth].to_i + 1
|
60
|
+
@solutions = operands.last. execute(queryable, **options.merge(depth: options[:depth].to_i + 1))
|
61
61
|
@solutions.offset(operands[0]) unless operands[0] == :_
|
62
62
|
@solutions.limit(operands[1]) unless operands[1] == :_
|
63
63
|
@solutions.each(&block) if block_given?
|
@@ -41,7 +41,7 @@ module SPARQL; module Algebra
|
|
41
41
|
def execute(queryable, **options, &block)
|
42
42
|
debug(options) {"Union"}
|
43
43
|
@solutions = RDF::Query::Solutions(operands.inject([]) do |memo, op|
|
44
|
-
solns = op.execute(queryable, depth: options[:depth].to_i + 1
|
44
|
+
solns = op.execute(queryable, **options.merge(depth: options[:depth].to_i + 1))
|
45
45
|
debug(options) {"=> (op) #{solns.inspect}"}
|
46
46
|
memo + solns
|
47
47
|
end)
|
@@ -68,7 +68,7 @@ module SPARQL; module Algebra
|
|
68
68
|
debug(options) {"Update"}
|
69
69
|
raise IOError, "queryable is not mutable" unless queryable.mutable?
|
70
70
|
operands.each do |op|
|
71
|
-
op.execute(queryable, depth: options[:depth].to_i + 1
|
71
|
+
op.execute(queryable, **options.merge(depth: options[:depth].to_i + 1))
|
72
72
|
end
|
73
73
|
queryable
|
74
74
|
end
|
@@ -67,7 +67,7 @@ module SPARQL; module Algebra
|
|
67
67
|
# @see https://www.w3.org/TR/sparql11-update/
|
68
68
|
def execute(queryable, **options, &block)
|
69
69
|
debug(options) {"Using"}
|
70
|
-
Dataset.new(*operands).execute(queryable, depth: options[:depth].to_i + 1,
|
70
|
+
Dataset.new(*operands).execute(queryable, **options.merge(depth: options[:depth].to_i + 1), &block)
|
71
71
|
end
|
72
72
|
|
73
73
|
##
|
@@ -69,12 +69,12 @@ module SPARQL; module Algebra
|
|
69
69
|
query = operands.shift
|
70
70
|
|
71
71
|
# Restrict query portion to this graph
|
72
|
-
queryable.query(query, depth: options[:depth].to_i + 1
|
72
|
+
queryable.query(query, **options.merge(depth: options[:depth].to_i + 1)) do |solution|
|
73
73
|
debug(options) {"(solution)=>#{solution.inspect}"}
|
74
74
|
|
75
75
|
# Execute each operand with queryable and solution
|
76
76
|
operands.each do |op|
|
77
|
-
op.execute(queryable, solutions: solution, depth: options[:depth].to_i + 1
|
77
|
+
op.execute(queryable, solutions: solution, **options.merge(depth: options[:depth].to_i + 1))
|
78
78
|
end
|
79
79
|
end
|
80
80
|
end
|
@@ -94,10 +94,10 @@ module SPARQL::Grammar
|
|
94
94
|
STR_EXPR = %r(ABS|ADD|ADJUST|ALL|ASC|ASK|AS|AVG|BASE|BINDINGS|BIND
|
95
95
|
|BNODE|BOUND|BY|CEIL|CLEAR|COALESCE|CONCAT
|
96
96
|
|CONSTRUCT|CONTAINS|COPY|COUNT|CREATE|DATATYPE|DAY
|
97
|
-
|DEFAULT|DELETE
|
97
|
+
|DEFAULT|DELETE\s+DATA|DELETE\s+WHERE|DELETE
|
98
98
|
|DESCRIBE|DESC|DISTINCT|DROP|ENCODE_FOR_URI|EXISTS
|
99
99
|
|FILTER|FLOOR|FROM|GRAPH|GROUP_CONCAT|GROUP|HAVING
|
100
|
-
|HOURS|IF|INSERT
|
100
|
+
|HOURS|IF|INSERT\s+DATA|INSERT|INTO|IN|IRI
|
101
101
|
|LANGMATCHES|LANGTAG|LANG|LCASE|LIMIT|LOAD
|
102
102
|
|MAX|MD5|MINUS|MINUTES|MIN|MONTH|MOVE
|
103
103
|
|NAMED|NOT|NOW|OFFSET|OPTIONAL
|
data/lib/sparql/results.rb
CHANGED
@@ -280,7 +280,8 @@ module SPARQL
|
|
280
280
|
end
|
281
281
|
|
282
282
|
content_type ||= SPARQL::Results::MIME_TYPES[format] if format
|
283
|
-
|
283
|
+
|
284
|
+
serialization = serialization.dup if serialization.frozen?
|
284
285
|
serialization.instance_eval do
|
285
286
|
define_singleton_method(:content_type) { content_type }
|
286
287
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sparql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.
|
4
|
+
version: 3.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregg Kellogg
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-01-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdf
|
@@ -455,7 +455,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
455
455
|
- !ruby/object:Gem::Version
|
456
456
|
version: '0'
|
457
457
|
requirements: []
|
458
|
-
rubygems_version: 3.3.
|
458
|
+
rubygems_version: 3.3.7
|
459
459
|
signing_key:
|
460
460
|
specification_version: 4
|
461
461
|
summary: SPARQL Query and Update library for Ruby.
|