sparql 3.2.3 → 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 +3 -3
- 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 +7 -3
- data/lib/sparql/algebra/operator/filter.rb +6 -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 +31 -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/service.rb +86 -0
- 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/algebra/operator.rb +2 -0
- data/lib/sparql/grammar/parser11.rb +13 -0
- data/lib/sparql/grammar/terminals11.rb +2 -2
- data/lib/sparql/results.rb +2 -1
- metadata +6 -5
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
|
|
@@ -140,7 +140,7 @@ module SPARQL; module Algebra
|
|
|
140
140
|
logger = options[:logger]
|
|
141
141
|
options.delete_if {|k, v| [:debug, :logger, :depth, :prefixes, :base_uri, :update, :validate].include?(k) }
|
|
142
142
|
begin
|
|
143
|
-
# Due to
|
|
143
|
+
# Due to confusion over (triple) and special-case for (qtriple)
|
|
144
144
|
if operator == RDF::Query::Pattern
|
|
145
145
|
options = options.merge(quoted: true) if sse.first == :qtriple
|
|
146
146
|
elsif operator == Operator::Triple && PATTERN_PARENTS.include?(parent_operator)
|
|
@@ -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,14 +82,18 @@ 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
|
+
# Re-bind to bindings, if defined, as they might not be found in solution
|
|
88
|
+
options[:bindings].each_binding do |name, value|
|
|
89
|
+
solution[name] = value if operands.first.variables.include?(name)
|
|
90
|
+
end if options[:bindings] && operands.first.respond_to?(:variables)
|
|
91
|
+
|
|
87
92
|
debug(options) {"===> soln #{solution.to_h.inspect}"}
|
|
88
93
|
operand(0).each do |(var, expr)|
|
|
89
94
|
begin
|
|
90
95
|
val = expr.evaluate(solution, queryable: queryable,
|
|
91
|
-
depth: options[:depth].to_i + 1
|
|
92
|
-
**options)
|
|
96
|
+
**options.merge(depth: options[:depth].to_i + 1))
|
|
93
97
|
debug(options) {"===> + #{var} => #{val.inspect}"}
|
|
94
98
|
val = val.dup.bind(solution) if val.is_a?(RDF::Query::Pattern)
|
|
95
99
|
solution.bindings[var.to_sym] = val
|
|
@@ -48,7 +48,12 @@ 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
|
+
# Re-bind to bindings, if defined, as they might not be found in solution
|
|
53
|
+
options[:bindings].each_binding do |name, value|
|
|
54
|
+
solution[name] ||= value if operands.first.variables.include?(name)
|
|
55
|
+
end if options[:bindings] && operands.first.respond_to?(:variables)
|
|
56
|
+
|
|
52
57
|
begin
|
|
53
58
|
pass = boolean(operands.first.evaluate(solution, **opts)).true?
|
|
54
59
|
debug(options) {"(filter) #{pass.inspect} #{solution.to_h.inspect}"}
|
|
@@ -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) =
|
|
@@ -66,6 +66,35 @@ module SPARQL; module Algebra
|
|
|
66
66
|
load_left = true
|
|
67
67
|
right.each do |s2|
|
|
68
68
|
s = s2.merge(s1)
|
|
69
|
+
# Re-bind to bindings, if defined, as they might not be found in solution
|
|
70
|
+
options[:bindings].each_binding do |name, value|
|
|
71
|
+
s[name] = value if filter.variables.include?(name)
|
|
72
|
+
end if options[:bindings] && filter.respond_to?(:variables)
|
|
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.)
|
|
69
98
|
expr = filter ? boolean(filter.evaluate(s)).true? : true rescue false
|
|
70
99
|
debug(options) {"===>(evaluate) #{s.inspect}"} if filter
|
|
71
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|
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module SPARQL; module Algebra
|
|
2
|
+
class Operator
|
|
3
|
+
##
|
|
4
|
+
# The SPARQL Service operator.
|
|
5
|
+
#
|
|
6
|
+
# [59] ServiceGraphPattern ::= 'SERVICE' 'SILENT'? VarOrIri GroupGraphPattern
|
|
7
|
+
#
|
|
8
|
+
# @example SPARQL Grammar
|
|
9
|
+
# PREFIX : <http://example.org/>
|
|
10
|
+
#
|
|
11
|
+
# SELECT ?s ?o1 ?o2 {
|
|
12
|
+
# ?s ?p1 ?o1 .
|
|
13
|
+
# SERVICE <http://example.org/sparql> {
|
|
14
|
+
# ?s ?p2 ?o2
|
|
15
|
+
# }
|
|
16
|
+
# }
|
|
17
|
+
#
|
|
18
|
+
# @example SSE
|
|
19
|
+
# (prefix ((: <http://example.org/>))
|
|
20
|
+
# (project (?s ?o1 ?o2)
|
|
21
|
+
# (join
|
|
22
|
+
# (bgp (triple ?s ?p1 ?o1))
|
|
23
|
+
# (service :sparql
|
|
24
|
+
# (bgp (triple ?s ?p2 ?o2))))))
|
|
25
|
+
#
|
|
26
|
+
# @see https://www.w3.org/TR/sparql11-query/#QSynIRI
|
|
27
|
+
class Service < Operator
|
|
28
|
+
include Query
|
|
29
|
+
|
|
30
|
+
NAME = [:service]
|
|
31
|
+
|
|
32
|
+
##
|
|
33
|
+
# Executes this query on the given `queryable` graph or repository.
|
|
34
|
+
# Really a pass-through, as this is a syntactic object used for providing
|
|
35
|
+
# graph_name for URIs.
|
|
36
|
+
#
|
|
37
|
+
# @param [RDF::Queryable] queryable
|
|
38
|
+
# the graph or repository to query
|
|
39
|
+
# @param [Hash{Symbol => Object}] options
|
|
40
|
+
# any additional keyword options
|
|
41
|
+
# @yield [solution]
|
|
42
|
+
# each matching solution, statement or boolean
|
|
43
|
+
# @yieldparam [RDF::Statement, RDF::Query::Solution, Boolean] solution
|
|
44
|
+
# @yieldreturn [void] ignored
|
|
45
|
+
# @return [RDF::Query::Solutions]
|
|
46
|
+
# the resulting solution sequence
|
|
47
|
+
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
|
48
|
+
def execute(queryable, **options, &block)
|
|
49
|
+
debug(options) {"Service"}
|
|
50
|
+
silent = operands.first == :silent
|
|
51
|
+
location, query = operands
|
|
52
|
+
query_sparql = query.to_sparql
|
|
53
|
+
debug(options) {"query: #{query_sparql}"}
|
|
54
|
+
raise NotImplementedError, "SERVICE operator not implemented"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
##
|
|
58
|
+
# Returns an optimized version of this query.
|
|
59
|
+
#
|
|
60
|
+
# Replace with the query with URIs having their lexical shortcut removed
|
|
61
|
+
#
|
|
62
|
+
# @return [Prefix] a copy of `self`
|
|
63
|
+
# @see SPARQL::Algebra::Expression#optimize
|
|
64
|
+
def optimize(**options)
|
|
65
|
+
operands.last.optimize(**options)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
##
|
|
69
|
+
#
|
|
70
|
+
# Returns a partial SPARQL grammar for this term.
|
|
71
|
+
#
|
|
72
|
+
# @return [String]
|
|
73
|
+
def to_sparql(**options)
|
|
74
|
+
silent = operands.first == :silent
|
|
75
|
+
ops = silent ? operands[1..-1] : operands
|
|
76
|
+
location, query = ops
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
str = "SERVICE "
|
|
80
|
+
str << "SILENT " if silent
|
|
81
|
+
str << location.to_sparql(**options) + " {" + query.to_sparql(**options) + "}"
|
|
82
|
+
str
|
|
83
|
+
end
|
|
84
|
+
end # Service
|
|
85
|
+
end # Operator
|
|
86
|
+
end; end # SPARQL::Algebra
|
|
@@ -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
|
|
@@ -134,6 +134,7 @@ module SPARQL; module Algebra
|
|
|
134
134
|
autoload :Prefix, 'sparql/algebra/operator/prefix'
|
|
135
135
|
autoload :Project, 'sparql/algebra/operator/project'
|
|
136
136
|
autoload :Reduced, 'sparql/algebra/operator/reduced'
|
|
137
|
+
autoload :Service, 'sparql/algebra/operator/service'
|
|
137
138
|
autoload :Slice, 'sparql/algebra/operator/slice'
|
|
138
139
|
autoload :Table, 'sparql/algebra/operator/table'
|
|
139
140
|
autoload :Union, 'sparql/algebra/operator/union'
|
|
@@ -236,6 +237,7 @@ module SPARQL; module Algebra
|
|
|
236
237
|
when :seconds then Seconds
|
|
237
238
|
when :seq then Seq
|
|
238
239
|
when :sequence then Sequence
|
|
240
|
+
when :service then Service
|
|
239
241
|
when :sha1 then SHA1
|
|
240
242
|
when :sha256 then SHA256
|
|
241
243
|
when :sha384 then SHA384
|
|
@@ -916,6 +916,19 @@ module SPARQL::Grammar
|
|
|
916
916
|
end
|
|
917
917
|
end
|
|
918
918
|
|
|
919
|
+
# [59] ServiceGraphPattern ::= 'SERVICE' 'SILENT'? VarOrIri GroupGraphPattern
|
|
920
|
+
#
|
|
921
|
+
# Input from `data` is TODO.
|
|
922
|
+
# Output to prod_data is TODO.
|
|
923
|
+
production(:ServiceGraphPattern) do |input, data, callback|
|
|
924
|
+
args = []
|
|
925
|
+
args << :silent if data[:silent]
|
|
926
|
+
args << (data[:VarOrIri]).last
|
|
927
|
+
args << data.fetch(:query, [SPARQL::Algebra::Operator::BGP.new]).first
|
|
928
|
+
service = SPARQL::Algebra::Expression.for(:service, *args)
|
|
929
|
+
add_prod_data(:query, service)
|
|
930
|
+
end
|
|
931
|
+
|
|
919
932
|
# [60] Bind ::= 'BIND' '(' Expression 'AS' Var ')'
|
|
920
933
|
#
|
|
921
934
|
# Input from `data` is TODO.
|
|
@@ -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
|
|
@@ -20,7 +20,7 @@ dependencies:
|
|
|
20
20
|
version: '3.2'
|
|
21
21
|
- - ">="
|
|
22
22
|
- !ruby/object:Gem::Version
|
|
23
|
-
version: 3.2.
|
|
23
|
+
version: 3.2.8
|
|
24
24
|
type: :runtime
|
|
25
25
|
prerelease: false
|
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -30,7 +30,7 @@ dependencies:
|
|
|
30
30
|
version: '3.2'
|
|
31
31
|
- - ">="
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: 3.2.
|
|
33
|
+
version: 3.2.8
|
|
34
34
|
- !ruby/object:Gem::Dependency
|
|
35
35
|
name: rdf-aggregate-repo
|
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -389,6 +389,7 @@ files:
|
|
|
389
389
|
- lib/sparql/algebra/operator/seconds.rb
|
|
390
390
|
- lib/sparql/algebra/operator/seq.rb
|
|
391
391
|
- lib/sparql/algebra/operator/sequence.rb
|
|
392
|
+
- lib/sparql/algebra/operator/service.rb
|
|
392
393
|
- lib/sparql/algebra/operator/sha1.rb
|
|
393
394
|
- lib/sparql/algebra/operator/sha256.rb
|
|
394
395
|
- lib/sparql/algebra/operator/sha384.rb
|
|
@@ -454,7 +455,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
454
455
|
- !ruby/object:Gem::Version
|
|
455
456
|
version: '0'
|
|
456
457
|
requirements: []
|
|
457
|
-
rubygems_version: 3.3.
|
|
458
|
+
rubygems_version: 3.3.7
|
|
458
459
|
signing_key:
|
|
459
460
|
specification_version: 4
|
|
460
461
|
summary: SPARQL Query and Update library for Ruby.
|