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.
Files changed (44) hide show
  1. checksums.yaml +14 -6
  2. data/README.md +57 -25
  3. data/VERSION +1 -1
  4. data/lib/sinatra/sparql.rb +5 -3
  5. data/lib/sparql/algebra/aggregate.rb +67 -0
  6. data/lib/sparql/algebra/evaluatable.rb +49 -4
  7. data/lib/sparql/algebra/expression.rb +6 -4
  8. data/lib/sparql/algebra/extensions.rb +99 -9
  9. data/lib/sparql/algebra/operator/and.rb +7 -4
  10. data/lib/sparql/algebra/operator/asc.rb +6 -3
  11. data/lib/sparql/algebra/operator/avg.rb +36 -0
  12. data/lib/sparql/algebra/operator/bnode.rb +5 -4
  13. data/lib/sparql/algebra/operator/bound.rb +5 -2
  14. data/lib/sparql/algebra/operator/coalesce.rb +6 -3
  15. data/lib/sparql/algebra/operator/concat.rb +6 -3
  16. data/lib/sparql/algebra/operator/count.rb +30 -0
  17. data/lib/sparql/algebra/operator/exists.rb +39 -0
  18. data/lib/sparql/algebra/operator/exprlist.rb +6 -3
  19. data/lib/sparql/algebra/operator/extend.rb +3 -1
  20. data/lib/sparql/algebra/operator/filter.rb +2 -1
  21. data/lib/sparql/algebra/operator/group.rb +101 -0
  22. data/lib/sparql/algebra/operator/group_concat.rb +55 -0
  23. data/lib/sparql/algebra/operator/if.rb +5 -5
  24. data/lib/sparql/algebra/operator/in.rb +7 -4
  25. data/lib/sparql/algebra/operator/max.rb +38 -0
  26. data/lib/sparql/algebra/operator/min.rb +38 -0
  27. data/lib/sparql/algebra/operator/minus.rb +51 -16
  28. data/lib/sparql/algebra/operator/negate.rb +31 -0
  29. data/lib/sparql/algebra/operator/notexists.rb +37 -0
  30. data/lib/sparql/algebra/operator/notin.rb +7 -4
  31. data/lib/sparql/algebra/operator/or.rb +7 -4
  32. data/lib/sparql/algebra/operator/order.rb +2 -2
  33. data/lib/sparql/algebra/operator/sample.rb +32 -0
  34. data/lib/sparql/algebra/operator/strlang.rb +1 -1
  35. data/lib/sparql/algebra/operator/sum.rb +36 -0
  36. data/lib/sparql/algebra/operator/table.rb +44 -0
  37. data/lib/sparql/algebra/operator.rb +37 -2
  38. data/lib/sparql/algebra.rb +1 -0
  39. data/lib/sparql/grammar/meta.rb +1143 -696
  40. data/lib/sparql/grammar/parser11.rb +178 -32
  41. data/lib/sparql/grammar/terminals11.rb +2 -2
  42. data/lib/sparql/grammar.rb +0 -2
  43. data/lib/sparql/results.rb +55 -0
  44. 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] datatypeIRI
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) ? Minus : Subtract
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
@@ -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'