sparql 1.0.8 → 1.1.0p0

Sign up to get free protection for your applications and to get access to all the features.
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'