sparql 1.0.8 → 1.1.0p0
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 +14 -6
- data/README.md +57 -25
- data/VERSION +1 -1
- data/lib/sinatra/sparql.rb +5 -3
- data/lib/sparql/algebra/aggregate.rb +67 -0
- data/lib/sparql/algebra/evaluatable.rb +49 -4
- data/lib/sparql/algebra/expression.rb +6 -4
- data/lib/sparql/algebra/extensions.rb +99 -9
- data/lib/sparql/algebra/operator/and.rb +7 -4
- data/lib/sparql/algebra/operator/asc.rb +6 -3
- data/lib/sparql/algebra/operator/avg.rb +36 -0
- data/lib/sparql/algebra/operator/bnode.rb +5 -4
- data/lib/sparql/algebra/operator/bound.rb +5 -2
- data/lib/sparql/algebra/operator/coalesce.rb +6 -3
- data/lib/sparql/algebra/operator/concat.rb +6 -3
- data/lib/sparql/algebra/operator/count.rb +30 -0
- data/lib/sparql/algebra/operator/exists.rb +39 -0
- data/lib/sparql/algebra/operator/exprlist.rb +6 -3
- data/lib/sparql/algebra/operator/extend.rb +3 -1
- data/lib/sparql/algebra/operator/filter.rb +2 -1
- data/lib/sparql/algebra/operator/group.rb +101 -0
- data/lib/sparql/algebra/operator/group_concat.rb +55 -0
- data/lib/sparql/algebra/operator/if.rb +5 -5
- data/lib/sparql/algebra/operator/in.rb +7 -4
- data/lib/sparql/algebra/operator/max.rb +38 -0
- data/lib/sparql/algebra/operator/min.rb +38 -0
- data/lib/sparql/algebra/operator/minus.rb +51 -16
- data/lib/sparql/algebra/operator/negate.rb +31 -0
- data/lib/sparql/algebra/operator/notexists.rb +37 -0
- data/lib/sparql/algebra/operator/notin.rb +7 -4
- data/lib/sparql/algebra/operator/or.rb +7 -4
- data/lib/sparql/algebra/operator/order.rb +2 -2
- data/lib/sparql/algebra/operator/sample.rb +32 -0
- data/lib/sparql/algebra/operator/strlang.rb +1 -1
- data/lib/sparql/algebra/operator/sum.rb +36 -0
- data/lib/sparql/algebra/operator/table.rb +44 -0
- data/lib/sparql/algebra/operator.rb +37 -2
- data/lib/sparql/algebra.rb +1 -0
- data/lib/sparql/grammar/meta.rb +1143 -696
- data/lib/sparql/grammar/parser11.rb +178 -32
- data/lib/sparql/grammar/terminals11.rb +2 -2
- data/lib/sparql/grammar.rb +0 -2
- data/lib/sparql/results.rb +55 -0
- metadata +78 -81
|
@@ -21,7 +21,7 @@ module SPARQL; module Algebra
|
|
|
21
21
|
#
|
|
22
22
|
# @param [RDF::Literal] value
|
|
23
23
|
# a literal
|
|
24
|
-
# @param [RDF::Literal]
|
|
24
|
+
# @param [RDF::Literal] langTag
|
|
25
25
|
# datatype
|
|
26
26
|
# @return [RDF::Literal] a datatyped literal
|
|
27
27
|
# @see http://www.w3.org/TR/sparql11-query/#func-strlang
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module SPARQL; module Algebra
|
|
2
|
+
class Operator
|
|
3
|
+
##
|
|
4
|
+
# The SPARQL `sum` set function.
|
|
5
|
+
#
|
|
6
|
+
# @example
|
|
7
|
+
# (prefix ((: <http://www.example.org/>))
|
|
8
|
+
# (project (?sum)
|
|
9
|
+
# (extend ((?sum ?.0))
|
|
10
|
+
# (group () ((?.0 (sum ?o)))
|
|
11
|
+
# (bgp (triple ?s :dec ?o))))))
|
|
12
|
+
#
|
|
13
|
+
# @see http://www.w3.org/TR/sparql11-query/#defn_aggSum
|
|
14
|
+
class Sum < Operator::Unary
|
|
15
|
+
include Aggregate
|
|
16
|
+
|
|
17
|
+
NAME = :sum
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
# Sum is a SPARQL set function that will return the numeric value obtained by summing the values within the aggregate group. Type promotion happens as per the op:numeric-add function, applied transitively, (see definition below) so the value of SUM(?x), in an aggregate group where ?x has values 1 (integer), 2.0e0 (float), and 3.0 (decimal) will be 6.0 (float).
|
|
21
|
+
#
|
|
22
|
+
# @param [Enumerable<Array<RDF::Term>>] enum
|
|
23
|
+
# enum of evaluated operand
|
|
24
|
+
# @return [RDF::Literal::Numeric] The sum of the terms
|
|
25
|
+
def apply(enum)
|
|
26
|
+
if enum.empty?
|
|
27
|
+
RDF::Literal(0)
|
|
28
|
+
elsif enum.flatten.all? {|n| n.is_a?(RDF::Literal::Numeric)}
|
|
29
|
+
enum.flatten.reduce(:+)
|
|
30
|
+
else
|
|
31
|
+
raise TypeError, "Averaging non-numeric types: #{enum.flatten}"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end # Sum
|
|
35
|
+
end # Operator
|
|
36
|
+
end; end # SPARQL::Algebra
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module SPARQL; module Algebra
|
|
2
|
+
class Operator
|
|
3
|
+
##
|
|
4
|
+
# The SPARQL Table operator.
|
|
5
|
+
#
|
|
6
|
+
# This is used to provide inline values. Each row becomes
|
|
7
|
+
# a solution.
|
|
8
|
+
#
|
|
9
|
+
# @example
|
|
10
|
+
# (table (vars ?book ?title)
|
|
11
|
+
# (row (?title "SPARQL Tutorial"))
|
|
12
|
+
# (row (?book :book2)))
|
|
13
|
+
#
|
|
14
|
+
# @see http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#inline-data
|
|
15
|
+
class Table < Operator
|
|
16
|
+
include Query
|
|
17
|
+
|
|
18
|
+
NAME = [:table]
|
|
19
|
+
|
|
20
|
+
##
|
|
21
|
+
# Returns solutions for each row
|
|
22
|
+
#
|
|
23
|
+
# @param [RDF::Queryable] queryable
|
|
24
|
+
# the graph or repository to query
|
|
25
|
+
# @param [Hash{Symbol => Object}] options
|
|
26
|
+
# any additional keyword options
|
|
27
|
+
# @return [RDF::Query::Solutions]
|
|
28
|
+
# the resulting solution sequence
|
|
29
|
+
# @see http://www.w3.org/TR/rdf-sparql-query/#sparqlAlgebra
|
|
30
|
+
def execute(queryable, options = {})
|
|
31
|
+
@solutions = RDF::Query::Solutions.new
|
|
32
|
+
operands[1..-1].each do |row|
|
|
33
|
+
next unless row.is_a?(Array)
|
|
34
|
+
bindings = row[1..-1].inject({}) do |memo, (var, value)|
|
|
35
|
+
memo[var.to_sym] = value
|
|
36
|
+
memo
|
|
37
|
+
end
|
|
38
|
+
@solutions << RDF::Query::Solution.new(bindings)
|
|
39
|
+
end
|
|
40
|
+
@solutions
|
|
41
|
+
end
|
|
42
|
+
end # Table
|
|
43
|
+
end # Operator
|
|
44
|
+
end; end # SPARQL::Algebra
|
|
@@ -14,12 +14,15 @@ module SPARQL; module Algebra
|
|
|
14
14
|
|
|
15
15
|
# Unary operators
|
|
16
16
|
autoload :Abs, 'sparql/algebra/operator/abs'
|
|
17
|
+
autoload :Avg, 'sparql/algebra/operator/avg'
|
|
17
18
|
autoload :BNode, 'sparql/algebra/operator/bnode'
|
|
18
19
|
autoload :Bound, 'sparql/algebra/operator/bound'
|
|
19
20
|
autoload :Ceil, 'sparql/algebra/operator/ceil'
|
|
21
|
+
autoload :Count, 'sparql/algebra/operator/count'
|
|
20
22
|
autoload :Datatype, 'sparql/algebra/operator/datatype'
|
|
21
23
|
autoload :Day, 'sparql/algebra/operator/day'
|
|
22
24
|
autoload :EncodeForURI, 'sparql/algebra/operator/encode_for_uri'
|
|
25
|
+
autoload :Exists, 'sparql/algebra/operator/exists'
|
|
23
26
|
autoload :Floor, 'sparql/algebra/operator/floor'
|
|
24
27
|
autoload :Hours, 'sparql/algebra/operator/hours'
|
|
25
28
|
autoload :IsBlank, 'sparql/algebra/operator/is_blank'
|
|
@@ -30,14 +33,20 @@ module SPARQL; module Algebra
|
|
|
30
33
|
autoload :IRI, 'sparql/algebra/operator/iri'
|
|
31
34
|
autoload :Lang, 'sparql/algebra/operator/lang'
|
|
32
35
|
autoload :LCase, 'sparql/algebra/operator/lcase'
|
|
36
|
+
autoload :Max, 'sparql/algebra/operator/max'
|
|
33
37
|
autoload :MD5, 'sparql/algebra/operator/md5'
|
|
38
|
+
autoload :Min, 'sparql/algebra/operator/min'
|
|
34
39
|
autoload :Minus, 'sparql/algebra/operator/minus'
|
|
35
40
|
autoload :Minutes, 'sparql/algebra/operator/minutes'
|
|
36
41
|
autoload :Month, 'sparql/algebra/operator/month'
|
|
42
|
+
autoload :Negate, 'sparql/algebra/operator/negate'
|
|
37
43
|
autoload :Not, 'sparql/algebra/operator/not'
|
|
44
|
+
autoload :NotExists, 'sparql/algebra/operator/notexists'
|
|
38
45
|
autoload :Plus, 'sparql/algebra/operator/plus'
|
|
39
46
|
autoload :Round, 'sparql/algebra/operator/round'
|
|
47
|
+
autoload :Sample, 'sparql/algebra/operator/sample'
|
|
40
48
|
autoload :Seconds, 'sparql/algebra/operator/seconds'
|
|
49
|
+
autoload :Sum, 'sparql/algebra/operator/sum'
|
|
41
50
|
autoload :SHA1, 'sparql/algebra/operator/sha1'
|
|
42
51
|
autoload :SHA256, 'sparql/algebra/operator/sha256'
|
|
43
52
|
autoload :SHA512, 'sparql/algebra/operator/sha512'
|
|
@@ -82,6 +91,7 @@ module SPARQL; module Algebra
|
|
|
82
91
|
autoload :Coalesce, 'sparql/algebra/operator/coalesce'
|
|
83
92
|
autoload :Desc, 'sparql/algebra/operator/desc'
|
|
84
93
|
autoload :Exprlist, 'sparql/algebra/operator/exprlist'
|
|
94
|
+
autoload :GroupConcat, 'sparql/algebra/operator/group_concat'
|
|
85
95
|
autoload :In, 'sparql/algebra/operator/in'
|
|
86
96
|
autoload :NotIn, 'sparql/algebra/operator/notin'
|
|
87
97
|
|
|
@@ -96,13 +106,16 @@ module SPARQL; module Algebra
|
|
|
96
106
|
autoload :Extend, 'sparql/algebra/operator/extend'
|
|
97
107
|
autoload :Filter, 'sparql/algebra/operator/filter'
|
|
98
108
|
autoload :Graph, 'sparql/algebra/operator/graph'
|
|
109
|
+
autoload :Group, 'sparql/algebra/operator/group'
|
|
99
110
|
autoload :Join, 'sparql/algebra/operator/join'
|
|
100
111
|
autoload :LeftJoin, 'sparql/algebra/operator/left_join'
|
|
112
|
+
autoload :Minus, 'sparql/algebra/operator/minus'
|
|
101
113
|
autoload :Order, 'sparql/algebra/operator/order'
|
|
102
114
|
autoload :Prefix, 'sparql/algebra/operator/prefix'
|
|
103
115
|
autoload :Project, 'sparql/algebra/operator/project'
|
|
104
116
|
autoload :Reduced, 'sparql/algebra/operator/reduced'
|
|
105
117
|
autoload :Slice, 'sparql/algebra/operator/slice'
|
|
118
|
+
autoload :Table, 'sparql/algebra/operator/table'
|
|
106
119
|
autoload :Union, 'sparql/algebra/operator/union'
|
|
107
120
|
|
|
108
121
|
##
|
|
@@ -119,7 +132,7 @@ module SPARQL; module Algebra
|
|
|
119
132
|
when :'=' then Equal
|
|
120
133
|
when :* then Multiply
|
|
121
134
|
when :+ then arity.eql?(1) ? Plus : Add
|
|
122
|
-
when :- then arity.eql?(1) ?
|
|
135
|
+
when :- then arity.eql?(1) ? Negate : Subtract
|
|
123
136
|
when :< then LessThan
|
|
124
137
|
when :<= then LessThanOrEqual
|
|
125
138
|
when :<=> then Compare # non-standard
|
|
@@ -128,17 +141,21 @@ module SPARQL; module Algebra
|
|
|
128
141
|
when :abs then Abs
|
|
129
142
|
when :add then Add
|
|
130
143
|
when :and, :'&&' then And
|
|
144
|
+
when :avg then Avg
|
|
131
145
|
when :bnode then BNode
|
|
132
146
|
when :bound then Bound
|
|
133
147
|
when :coalesce then Coalesce
|
|
134
148
|
when :ceil then Ceil
|
|
135
149
|
when :concat then Concat
|
|
136
150
|
when :contains then Contains
|
|
151
|
+
when :count then Count
|
|
137
152
|
when :datatype then Datatype
|
|
138
153
|
when :day then Day
|
|
139
154
|
when :encode_for_uri then EncodeForURI
|
|
140
155
|
when :divide then Divide
|
|
156
|
+
when :exists then Exists
|
|
141
157
|
when :floor then Floor
|
|
158
|
+
when :group_concat then GroupConcat
|
|
142
159
|
when :hours then Hours
|
|
143
160
|
when :if then If
|
|
144
161
|
when :in then In
|
|
@@ -152,11 +169,14 @@ module SPARQL; module Algebra
|
|
|
152
169
|
when :langmatches then LangMatches
|
|
153
170
|
when :lcase then LCase
|
|
154
171
|
when :md5 then MD5
|
|
172
|
+
when :max then Max
|
|
173
|
+
when :min then Min
|
|
155
174
|
when :minus then Minus
|
|
156
175
|
when :minutes then Minutes
|
|
157
176
|
when :month then Month
|
|
158
177
|
when :multiply then Multiply
|
|
159
178
|
when :not, :'!' then Not
|
|
179
|
+
when :notexists then NotExists
|
|
160
180
|
when :notin then NotIn
|
|
161
181
|
when :now then Now
|
|
162
182
|
when :or, :'||' then Or
|
|
@@ -166,6 +186,7 @@ module SPARQL; module Algebra
|
|
|
166
186
|
when :replace then Replace
|
|
167
187
|
when :round then Round
|
|
168
188
|
when :sameterm then SameTerm
|
|
189
|
+
when :sample then Sample
|
|
169
190
|
when :seconds then Seconds
|
|
170
191
|
when :sha1 then SHA1
|
|
171
192
|
when :sha256 then SHA256
|
|
@@ -181,6 +202,7 @@ module SPARQL; module Algebra
|
|
|
181
202
|
when :struuid then StrUUID
|
|
182
203
|
when :substr then SubStr
|
|
183
204
|
when :subtract then Subtract
|
|
205
|
+
when :sum then Sum
|
|
184
206
|
when :timezone then Timezone
|
|
185
207
|
when :tz then TZ
|
|
186
208
|
when :ucase then UCase
|
|
@@ -205,13 +227,16 @@ module SPARQL; module Algebra
|
|
|
205
227
|
when :extend then Extend
|
|
206
228
|
when :filter then Filter
|
|
207
229
|
when :graph then Graph
|
|
230
|
+
when :group then Group
|
|
208
231
|
when :join then Join
|
|
209
232
|
when :leftjoin then LeftJoin
|
|
210
233
|
when :order then Order
|
|
234
|
+
when :minus then Minus
|
|
211
235
|
when :prefix then Prefix
|
|
212
236
|
when :project then Project
|
|
213
237
|
when :reduced then Reduced
|
|
214
238
|
when :slice then Slice
|
|
239
|
+
when :table then Table
|
|
215
240
|
when :triple then RDF::Query::Pattern
|
|
216
241
|
when :union then Union
|
|
217
242
|
else nil # not found
|
|
@@ -386,6 +411,16 @@ module SPARQL; module Algebra
|
|
|
386
411
|
!(variable?)
|
|
387
412
|
end
|
|
388
413
|
|
|
414
|
+
##
|
|
415
|
+
# Returns `true` if this is an aggregate
|
|
416
|
+
#
|
|
417
|
+
# Overridden in evaluatables which are aggregates
|
|
418
|
+
#
|
|
419
|
+
# @return [Boolean] `true` or `false`
|
|
420
|
+
def aggregate?
|
|
421
|
+
respond_to?(:aggregate)
|
|
422
|
+
end
|
|
423
|
+
|
|
389
424
|
##
|
|
390
425
|
# Returns an optimized version of this expression.
|
|
391
426
|
#
|
|
@@ -402,7 +437,7 @@ module SPARQL; module Algebra
|
|
|
402
437
|
if constant?
|
|
403
438
|
# Note that if evaluation results in a `TypeError` or other error,
|
|
404
439
|
# we must return `self` so that the error is conserved at runtime:
|
|
405
|
-
evaluate rescue self
|
|
440
|
+
evaluate(RDF::Query::Solution.new) rescue self
|
|
406
441
|
else
|
|
407
442
|
super # returns `self`
|
|
408
443
|
end
|
data/lib/sparql/algebra.rb
CHANGED
|
@@ -283,6 +283,7 @@ module SPARQL
|
|
|
283
283
|
module Algebra
|
|
284
284
|
include RDF
|
|
285
285
|
|
|
286
|
+
autoload :Aggregate, 'sparql/algebra/aggregate'
|
|
286
287
|
autoload :Evaluatable, 'sparql/algebra/evaluatable'
|
|
287
288
|
autoload :Expression, 'sparql/algebra/expression'
|
|
288
289
|
autoload :Operator, 'sparql/algebra/operator'
|