sparql 3.0.2 → 3.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +189 -74
  3. data/UNLICENSE +1 -1
  4. data/VERSION +1 -1
  5. data/bin/sparql +44 -24
  6. data/lib/rack/sparql.rb +1 -1
  7. data/lib/rack/sparql/conneg.rb +3 -3
  8. data/lib/sinatra/sparql.rb +5 -5
  9. data/lib/sparql.rb +17 -16
  10. data/lib/sparql/algebra.rb +15 -23
  11. data/lib/sparql/algebra/aggregate.rb +4 -4
  12. data/lib/sparql/algebra/evaluatable.rb +2 -2
  13. data/lib/sparql/algebra/expression.rb +70 -44
  14. data/lib/sparql/algebra/extensions.rb +181 -34
  15. data/lib/sparql/algebra/operator.rb +44 -23
  16. data/lib/sparql/algebra/operator/abs.rb +2 -2
  17. data/lib/sparql/algebra/operator/add.rb +3 -3
  18. data/lib/sparql/algebra/operator/alt.rb +4 -4
  19. data/lib/sparql/algebra/operator/and.rb +7 -7
  20. data/lib/sparql/algebra/operator/asc.rb +3 -3
  21. data/lib/sparql/algebra/operator/ask.rb +4 -14
  22. data/lib/sparql/algebra/operator/avg.rb +13 -4
  23. data/lib/sparql/algebra/operator/base.rb +10 -10
  24. data/lib/sparql/algebra/operator/bgp.rb +2 -2
  25. data/lib/sparql/algebra/operator/bnode.rb +5 -5
  26. data/lib/sparql/algebra/operator/bound.rb +3 -3
  27. data/lib/sparql/algebra/operator/ceil.rb +2 -2
  28. data/lib/sparql/algebra/operator/clear.rb +3 -3
  29. data/lib/sparql/algebra/operator/coalesce.rb +3 -13
  30. data/lib/sparql/algebra/operator/compare.rb +8 -8
  31. data/lib/sparql/algebra/operator/concat.rb +4 -4
  32. data/lib/sparql/algebra/operator/construct.rb +4 -14
  33. data/lib/sparql/algebra/operator/contains.rb +2 -2
  34. data/lib/sparql/algebra/operator/copy.rb +3 -3
  35. data/lib/sparql/algebra/operator/count.rb +3 -3
  36. data/lib/sparql/algebra/operator/create.rb +3 -3
  37. data/lib/sparql/algebra/operator/dataset.rb +6 -17
  38. data/lib/sparql/algebra/operator/datatype.rb +1 -1
  39. data/lib/sparql/algebra/operator/day.rb +1 -1
  40. data/lib/sparql/algebra/operator/delete.rb +9 -7
  41. data/lib/sparql/algebra/operator/delete_data.rb +3 -3
  42. data/lib/sparql/algebra/operator/delete_where.rb +6 -6
  43. data/lib/sparql/algebra/operator/desc.rb +1 -1
  44. data/lib/sparql/algebra/operator/describe.rb +3 -13
  45. data/lib/sparql/algebra/operator/distinct.rb +4 -14
  46. data/lib/sparql/algebra/operator/divide.rb +1 -1
  47. data/lib/sparql/algebra/operator/drop.rb +3 -3
  48. data/lib/sparql/algebra/operator/encode_for_uri.rb +3 -3
  49. data/lib/sparql/algebra/operator/equal.rb +2 -2
  50. data/lib/sparql/algebra/operator/exists.rb +5 -5
  51. data/lib/sparql/algebra/operator/exprlist.rb +3 -13
  52. data/lib/sparql/algebra/operator/extend.rb +19 -18
  53. data/lib/sparql/algebra/operator/filter.rb +6 -16
  54. data/lib/sparql/algebra/operator/floor.rb +2 -2
  55. data/lib/sparql/algebra/operator/graph.rb +6 -17
  56. data/lib/sparql/algebra/operator/greater_than.rb +5 -5
  57. data/lib/sparql/algebra/operator/greater_than_or_equal.rb +5 -5
  58. data/lib/sparql/algebra/operator/group.rb +25 -25
  59. data/lib/sparql/algebra/operator/group_concat.rb +6 -6
  60. data/lib/sparql/algebra/operator/hours.rb +1 -1
  61. data/lib/sparql/algebra/operator/if.rb +5 -15
  62. data/lib/sparql/algebra/operator/in.rb +4 -14
  63. data/lib/sparql/algebra/operator/insert.rb +7 -5
  64. data/lib/sparql/algebra/operator/insert_data.rb +3 -3
  65. data/lib/sparql/algebra/operator/iri.rb +1 -1
  66. data/lib/sparql/algebra/operator/is_blank.rb +1 -1
  67. data/lib/sparql/algebra/operator/is_iri.rb +1 -1
  68. data/lib/sparql/algebra/operator/is_literal.rb +1 -1
  69. data/lib/sparql/algebra/operator/is_numeric.rb +1 -1
  70. data/lib/sparql/algebra/operator/join.rb +12 -10
  71. data/lib/sparql/algebra/operator/lang.rb +1 -1
  72. data/lib/sparql/algebra/operator/lang_matches.rb +3 -3
  73. data/lib/sparql/algebra/operator/lcase.rb +2 -2
  74. data/lib/sparql/algebra/operator/left_join.rb +19 -12
  75. data/lib/sparql/algebra/operator/less_than.rb +5 -5
  76. data/lib/sparql/algebra/operator/less_than_or_equal.rb +5 -5
  77. data/lib/sparql/algebra/operator/load.rb +3 -3
  78. data/lib/sparql/algebra/operator/max.rb +13 -4
  79. data/lib/sparql/algebra/operator/md5.rb +1 -1
  80. data/lib/sparql/algebra/operator/min.rb +13 -4
  81. data/lib/sparql/algebra/operator/minus.rb +12 -11
  82. data/lib/sparql/algebra/operator/minutes.rb +1 -1
  83. data/lib/sparql/algebra/operator/modify.rb +4 -4
  84. data/lib/sparql/algebra/operator/month.rb +1 -1
  85. data/lib/sparql/algebra/operator/move.rb +3 -3
  86. data/lib/sparql/algebra/operator/multiply.rb +1 -1
  87. data/lib/sparql/algebra/operator/negate.rb +1 -1
  88. data/lib/sparql/algebra/operator/not.rb +1 -1
  89. data/lib/sparql/algebra/operator/not_equal.rb +2 -2
  90. data/lib/sparql/algebra/operator/notexists.rb +4 -4
  91. data/lib/sparql/algebra/operator/notin.rb +4 -14
  92. data/lib/sparql/algebra/operator/notoneof.rb +5 -6
  93. data/lib/sparql/algebra/operator/now.rb +1 -1
  94. data/lib/sparql/algebra/operator/or.rb +7 -7
  95. data/lib/sparql/algebra/operator/order.rb +6 -16
  96. data/lib/sparql/algebra/operator/path.rb +6 -5
  97. data/lib/sparql/algebra/operator/path_opt.rb +16 -16
  98. data/lib/sparql/algebra/operator/path_plus.rb +8 -8
  99. data/lib/sparql/algebra/operator/path_star.rb +4 -4
  100. data/lib/sparql/algebra/operator/plus.rb +3 -3
  101. data/lib/sparql/algebra/operator/prefix.rb +10 -10
  102. data/lib/sparql/algebra/operator/project.rb +4 -14
  103. data/lib/sparql/algebra/operator/rand.rb +1 -1
  104. data/lib/sparql/algebra/operator/reduced.rb +4 -14
  105. data/lib/sparql/algebra/operator/regex.rb +6 -6
  106. data/lib/sparql/algebra/operator/replace.rb +4 -4
  107. data/lib/sparql/algebra/operator/reverse.rb +4 -4
  108. data/lib/sparql/algebra/operator/round.rb +2 -2
  109. data/lib/sparql/algebra/operator/same_term.rb +8 -5
  110. data/lib/sparql/algebra/operator/sample.rb +11 -4
  111. data/lib/sparql/algebra/operator/seconds.rb +1 -1
  112. data/lib/sparql/algebra/operator/seq.rb +5 -6
  113. data/lib/sparql/algebra/operator/sequence.rb +4 -4
  114. data/lib/sparql/algebra/operator/sha1.rb +1 -1
  115. data/lib/sparql/algebra/operator/sha256.rb +1 -1
  116. data/lib/sparql/algebra/operator/sha384.rb +1 -1
  117. data/lib/sparql/algebra/operator/sha512.rb +1 -1
  118. data/lib/sparql/algebra/operator/slice.rb +4 -14
  119. data/lib/sparql/algebra/operator/str.rb +1 -1
  120. data/lib/sparql/algebra/operator/strafter.rb +2 -2
  121. data/lib/sparql/algebra/operator/strbefore.rb +2 -2
  122. data/lib/sparql/algebra/operator/strdt.rb +2 -2
  123. data/lib/sparql/algebra/operator/strends.rb +2 -2
  124. data/lib/sparql/algebra/operator/strlang.rb +2 -2
  125. data/lib/sparql/algebra/operator/strlen.rb +2 -2
  126. data/lib/sparql/algebra/operator/strstarts.rb +2 -2
  127. data/lib/sparql/algebra/operator/struuid.rb +1 -1
  128. data/lib/sparql/algebra/operator/substr.rb +4 -4
  129. data/lib/sparql/algebra/operator/subtract.rb +1 -1
  130. data/lib/sparql/algebra/operator/sum.rb +6 -4
  131. data/lib/sparql/algebra/operator/table.rb +3 -3
  132. data/lib/sparql/algebra/operator/timezone.rb +1 -1
  133. data/lib/sparql/algebra/operator/tz.rb +1 -1
  134. data/lib/sparql/algebra/operator/ucase.rb +2 -2
  135. data/lib/sparql/algebra/operator/union.rb +9 -8
  136. data/lib/sparql/algebra/operator/update.rb +4 -4
  137. data/lib/sparql/algebra/operator/using.rb +4 -4
  138. data/lib/sparql/algebra/operator/uuid.rb +1 -1
  139. data/lib/sparql/algebra/operator/with.rb +7 -7
  140. data/lib/sparql/algebra/operator/year.rb +1 -1
  141. data/lib/sparql/algebra/query.rb +2 -2
  142. data/lib/sparql/algebra/update.rb +2 -2
  143. data/lib/sparql/algebra/version.rb +1 -1
  144. data/lib/sparql/extensions.rb +11 -17
  145. data/lib/sparql/grammar.rb +113 -13
  146. data/lib/sparql/grammar/meta.rb +2340 -907
  147. data/lib/sparql/grammar/parser11.rb +57 -52
  148. data/lib/sparql/grammar/terminals11.rb +2 -0
  149. data/lib/sparql/results.rb +73 -46
  150. data/lib/sparql/version.rb +1 -1
  151. metadata +46 -63
@@ -6,8 +6,8 @@ module SPARQL; module Algebra
6
6
  # @example
7
7
  # (contains ?x ?y)
8
8
  #
9
- # @see http://www.w3.org/TR/sparql11-query/#func-contains
10
- # @see http://www.w3.org/TR/xpath-functions/#func-contains
9
+ # @see https://www.w3.org/TR/sparql11-query/#func-contains
10
+ # @see https://www.w3.org/TR/xpath-functions/#func-contains
11
11
  class Contains < Operator::Binary
12
12
  include Evaluatable
13
13
 
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
9
9
  # @example
10
10
  # (copy silent <iri> to default)
11
11
  #
12
- # @see http://www.w3.org/TR/sparql11-update/#copy
12
+ # @see https://www.w3.org/TR/sparql11-update/#copy
13
13
  class Copy < Operator
14
14
  include SPARQL::Algebra::Update
15
15
 
@@ -28,8 +28,8 @@ module SPARQL; module Algebra
28
28
  # Returns queryable.
29
29
  # @raise [IOError]
30
30
  # If `from` does not exist, unless the `silent` operator is present
31
- # @see http://www.w3.org/TR/sparql11-update/
32
- def execute(queryable, options = {})
31
+ # @see https://www.w3.org/TR/sparql11-update/
32
+ def execute(queryable, **options)
33
33
  debug(options) {"Copy"}
34
34
  silent = operands.first == :silent
35
35
  operands.shift if silent
@@ -6,11 +6,11 @@ module SPARQL; module Algebra
6
6
  # @example
7
7
  # (prefix ((: <http://www.example.org>))
8
8
  # (project (?C)
9
- # (extend ((?C ?.0))
10
- # (group () ((?.0 (count ?O)))
9
+ # (extend ((?C ??.0))
10
+ # (group () ((??.0 (count ?O)))
11
11
  # (bgp (triple ?S ?P ?O))))))
12
12
  #
13
- # @see http://www.w3.org/TR/sparql11-query/#defn_aggCount
13
+ # @see https://www.w3.org/TR/sparql11-query/#defn_aggCount
14
14
  class Count < Operator
15
15
  include Aggregate
16
16
 
@@ -11,7 +11,7 @@ module SPARQL; module Algebra
11
11
  # @example
12
12
  # (create silent <graph>)
13
13
  #
14
- # @see http://www.w3.org/TR/sparql11-update/#create
14
+ # @see https://www.w3.org/TR/sparql11-update/#create
15
15
  class Create < Operator
16
16
  include SPARQL::Algebra::Update
17
17
 
@@ -30,8 +30,8 @@ module SPARQL; module Algebra
30
30
  # Returns queryable.
31
31
  # @raise [IOError]
32
32
  # If `from` does not exist, unless the `silent` operator is present
33
- # @see http://www.w3.org/TR/sparql11-update/
34
- def execute(queryable, options = {})
33
+ # @see https://www.w3.org/TR/sparql11-update/
34
+ def execute(queryable, **options)
35
35
  debug(options) {"Create"}
36
36
  silent = operands.first == :silent
37
37
  operands.shift if silent
@@ -102,7 +102,7 @@ module SPARQL; module Algebra
102
102
  # (graph ?g (bgp (triple ?s ?p ?o))))))
103
103
  #
104
104
  # @example Dataset with multiple named graphs
105
- # @see http://www.w3.org/TR/sparql11-query/#specifyingDataset
105
+ # @see https://www.w3.org/TR/sparql11-query/#specifyingDataset
106
106
  class Dataset < Binary
107
107
  include Query
108
108
 
@@ -125,8 +125,8 @@ module SPARQL; module Algebra
125
125
  # @yieldreturn [void] ignored
126
126
  # @return [RDF::Query::Solutions]
127
127
  # the resulting solution sequence
128
- # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
129
- def execute(queryable, options = {}, &base)
128
+ # @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
129
+ def execute(queryable, **options, &base)
130
130
  debug(options) {"Dataset"}
131
131
  default_datasets = []
132
132
  named_datasets = []
@@ -141,10 +141,10 @@ module SPARQL; module Algebra
141
141
  debug(options) {"=> default data source #{uri}"}
142
142
  default_datasets << uri
143
143
  end
144
- load_opts = {debug: options.fetch(:debug, nil), graph_name: uri, base_uri: uri}
144
+ load_opts = {logger: options.fetch(:logger, false), graph_name: uri, base_uri: uri}
145
145
  unless queryable.has_graph?(uri)
146
146
  debug(options) {"=> load #{uri}"}
147
- queryable.load(uri.to_s, load_opts)
147
+ queryable.load(uri.to_s, **load_opts)
148
148
  end
149
149
  end
150
150
  debug(options) {
@@ -156,18 +156,7 @@ module SPARQL; module Algebra
156
156
  aggregate = RDF::AggregateRepo.new(queryable)
157
157
  named_datasets.each {|name| aggregate.named(name) if queryable.has_graph?(name)}
158
158
  aggregate.default(*default_datasets.select {|name| queryable.has_graph?(name)})
159
- aggregate.query(operands.last, options.merge(depth: options[:depth].to_i + 1), &base)
160
- end
161
-
162
- ##
163
- # Returns an optimized version of this query.
164
- #
165
- # If optimize operands, and if the first two operands are both Queries, replace
166
- # with the unique sum of the query elements
167
- #
168
- # @return [Union, RDF::Query] `self`
169
- def optimize
170
- operands.last.optimize
159
+ aggregate.query(operands.last, depth: options[:depth].to_i + 1, **options, &base)
171
160
  end
172
161
  end # Dataset
173
162
  end # Operator
@@ -11,7 +11,7 @@ module SPARQL; module Algebra
11
11
  # (filter (= (datatype (xsd:double ?v)) xsd:double)
12
12
  # (bgp (triple ?s :p ?v)))))
13
13
  #
14
- # @see http://www.w3.org/TR/sparql11-query/#func-datatype
14
+ # @see https://www.w3.org/TR/sparql11-query/#func-datatype
15
15
  class Datatype < Operator::Unary
16
16
  include Evaluatable
17
17
 
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
9
9
  # (extend ((?x (day ?date)))
10
10
  # (bgp (triple ?s :date ?date)))))
11
11
  #
12
- # @see http://www.w3.org/TR/sparql11-query/#func-day
12
+ # @see https://www.w3.org/TR/sparql11-query/#func-day
13
13
  class Day < Operator::Unary
14
14
  include Evaluatable
15
15
 
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
9
9
  # @example
10
10
  # (delete ((triple ?s ?p ?o))))
11
11
  #
12
- # @see http://www.w3.org/TR/sparql11-update/#delete
12
+ # @see https://www.w3.org/TR/sparql11-update/#delete
13
13
  class Delete < Operator::Unary
14
14
  include SPARQL::Algebra::Update
15
15
 
@@ -20,8 +20,8 @@ module SPARQL; module Algebra
20
20
  #
21
21
  # @param [RDF::Queryable] queryable
22
22
  # the graph or repository to write
23
- # @param [RDF::Query::Solution] solution
24
- # Solution to map to patterns for this operation
23
+ # @param [RDF::Query::Solutions] solutions
24
+ # Solutions to map to patterns for this operation
25
25
  # @param [Hash{Symbol => Object}] options
26
26
  # any additional keyword options
27
27
  # @option options [Boolean] debug
@@ -30,9 +30,11 @@ module SPARQL; module Algebra
30
30
  # Returns queryable.
31
31
  # @raise [IOError]
32
32
  # If `from` does not exist, unless the `silent` operator is present
33
- # @see http://www.w3.org/TR/sparql11-update/
34
- def execute(queryable, solution, options = {})
35
- debug(options) {"Delete: #{solution} against #{operands.to_sse}"}
33
+ # @see https://www.w3.org/TR/sparql11-update/
34
+ def execute(queryable, solutions: nil, **options)
35
+ debug(options) {"Delete: #{solutions} against #{operands.to_sse}"}
36
+ # Only binds the first solution
37
+ solution = solutions.is_a?(RDF::Query::Solutions) ? solutions.first : solutions
36
38
  # Operands are an array of patterns and Queries (when named).
37
39
  # Create a new query made up all patterns
38
40
  patterns = operand.inject([]) do |memo, op|
@@ -45,7 +47,7 @@ module SPARQL; module Algebra
45
47
  end
46
48
  patterns.each do |pattern|
47
49
  pattern = pattern.dup.bind(solution)
48
- debug(options) {"Delete statement #{statement.to_sse}"}
50
+ debug(options) {"Delete pattern #{pattern.to_sse}"}
49
51
  queryable.delete(RDF::Statement.from(pattern)) if pattern.bound? || pattern.constant?
50
52
  end
51
53
  queryable
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
9
9
  # @example
10
10
  # (deleteData ((triple :a foaf:knows :c)))
11
11
  #
12
- # @see http://www.w3.org/TR/sparql11-update/#deleteData
12
+ # @see https://www.w3.org/TR/sparql11-update/#deleteData
13
13
  class DeleteData < Operator::Unary
14
14
  include SPARQL::Algebra::Update
15
15
 
@@ -28,8 +28,8 @@ module SPARQL; module Algebra
28
28
  # Returns queryable.
29
29
  # @raise [IOError]
30
30
  # If `from` does not exist, unless the `silent` operator is present
31
- # @see http://www.w3.org/TR/sparql11-update/
32
- def execute(queryable, options = {})
31
+ # @see https://www.w3.org/TR/sparql11-update/
32
+ def execute(queryable, **options)
33
33
  operand.each do |op|
34
34
  debug(options) {"DeleteData #{op.to_sxp}"}
35
35
  queryable.delete(op)
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
9
9
  # @example
10
10
  # (deleteWhere ((triple :a foaf:knows ?b))
11
11
  #
12
- # @see http://www.w3.org/TR/sparql11-update/#deleteWhere
12
+ # @see https://www.w3.org/TR/sparql11-update/#deleteWhere
13
13
  class DeleteWhere < Operator::Unary
14
14
  include SPARQL::Algebra::Update
15
15
 
@@ -28,8 +28,8 @@ module SPARQL; module Algebra
28
28
  # Returns queryable.
29
29
  # @raise [IOError]
30
30
  # If `from` does not exist, unless the `silent` operator is present
31
- # @see http://www.w3.org/TR/sparql11-update/
32
- def execute(queryable, options = {})
31
+ # @see https://www.w3.org/TR/sparql11-update/
32
+ def execute(queryable, **options)
33
33
  # Operands are an array of patterns and Queries (when named).
34
34
  # Create a new query made up all patterns
35
35
  patterns = operand.inject([]) do |memo, op|
@@ -40,13 +40,13 @@ module SPARQL; module Algebra
40
40
  end
41
41
  memo
42
42
  end
43
- query = RDF::Query.new(*patterns, {}) # FIXME: added hash argument needed until Statement#to_hash removed.
43
+ query = RDF::Query.new(*patterns, **{}) # FIXME: added hash argument needed until Statement#to_hash removed.
44
44
  debug(options) {"DeleteWhere query #{query.to_sse}"}
45
- query.execute(queryable, options.merge(depth: options[:depth].to_i + 1)) do |solution|
45
+ query.execute(queryable, depth: options[:depth].to_i + 1, **options) do |solution|
46
46
  debug(options) {"DeleteWhere solution #{solution.to_sse}"}
47
47
  query.each_statement do |pattern|
48
48
  pattern = pattern.dup.bind(solution)
49
- debug(options) {"DeleteWhere statement #{statement.to_sse}"}
49
+ debug(options) {"DeleteWhere pattern #{pattern.to_sse}"}
50
50
  queryable.delete(RDF::Statement.from(pattern)) if pattern.bound? || pattern.constant?
51
51
  end
52
52
  end
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
9
9
  # (order ((desc ?name))
10
10
  # (bgp (triple ?x foaf:name ?name)))))
11
11
  #
12
- # @see http://www.w3.org/TR/sparql11-query/#modOrderBy
12
+ # @see https://www.w3.org/TR/sparql11-query/#modOrderBy
13
13
  class Desc < Operator::Asc
14
14
  NAME = :desc
15
15
  end # Desc
@@ -10,7 +10,7 @@ module SPARQL; module Algebra
10
10
  # (describe (?x)
11
11
  # (bgp (triple ?x exOrg:employeeId "1234"))))
12
12
  #
13
- # @see http://www.w3.org/TR/sparql11-query/#describe
13
+ # @see https://www.w3.org/TR/sparql11-query/#describe
14
14
  class Describe < Operator::Binary
15
15
  include Query
16
16
 
@@ -39,8 +39,8 @@ module SPARQL; module Algebra
39
39
  # @yieldreturn [void] ignored
40
40
  # @return [RDF::Graph]
41
41
  # containing the constructed triples
42
- # @see http://www.w3.org/TR/sparql11-query/#describe
43
- def execute(queryable, options = {}, &block)
42
+ # @see https://www.w3.org/TR/sparql11-query/#describe
43
+ def execute(queryable, **options, &block)
44
44
  debug(options) {"Describe #{operands.first}, #{options.inspect}"}
45
45
 
46
46
  # Describe any constand URIs
@@ -60,16 +60,6 @@ module SPARQL; module Algebra
60
60
  # Return Concise Bounded Description
61
61
  queryable.concise_bounded_description(*to_describe.uniq, &block)
62
62
  end
63
-
64
- ##
65
- # Returns an optimized version of this query.
66
- #
67
- # Return optimized query
68
- #
69
- # @return [Union, RDF::Query] `self`
70
- def optimize
71
- operands = operands.map(&:optimize)
72
- end
73
63
 
74
64
  # Query results statements (e.g., CONSTRUCT, DESCRIBE, CREATE)
75
65
  # @return [Boolean]
@@ -10,7 +10,7 @@ module SPARQL; module Algebra
10
10
  # (project (?v)
11
11
  # (bgp (triple ?x ?p ?v)))))
12
12
  #
13
- # @see http://www.w3.org/TR/sparql11-query/#sparqlDistinct
13
+ # @see https://www.w3.org/TR/sparql11-query/#sparqlDistinct
14
14
  class Distinct < Operator::Unary
15
15
  include Query
16
16
 
@@ -30,22 +30,12 @@ module SPARQL; module Algebra
30
30
  # @yieldreturn [void] ignored
31
31
  # @return [RDF::Query::Solutions]
32
32
  # the resulting solution sequence
33
- # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
34
- def execute(queryable, options = {}, &block)
35
- @solutions = queryable.query(operands.last, options.merge(depth: options[:depth].to_i + 1)).distinct
33
+ # @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
34
+ def execute(queryable, **options, &block)
35
+ @solutions = queryable.query(operands.last, depth: options[:depth].to_i + 1, **options).distinct
36
36
  @solutions.each(&block) if block_given?
37
37
  @solutions
38
38
  end
39
-
40
- ##
41
- # Returns an optimized version of this query.
42
- #
43
- # Return optimized query
44
- #
45
- # @return [Union, RDF::Query] `self`
46
- def optimize
47
- operands = operands.map(&:optimize)
48
- end
49
39
  end # Distinct
50
40
  end # Operator
51
41
  end; end # SPARQL::Algebra
@@ -6,7 +6,7 @@ module SPARQL; module Algebra
6
6
  # @example
7
7
  # (/ 4 2)
8
8
  #
9
- # @see http://www.w3.org/TR/xpath-functions/#func-numeric-divide
9
+ # @see https://www.w3.org/TR/xpath-functions/#func-numeric-divide
10
10
  class Divide < Operator::Binary
11
11
  include Evaluatable
12
12
 
@@ -11,7 +11,7 @@ module SPARQL; module Algebra
11
11
  # @example
12
12
  # (drop default)
13
13
  #
14
- # @see http://www.w3.org/TR/sparql11-update/#drop
14
+ # @see https://www.w3.org/TR/sparql11-update/#drop
15
15
  class Drop < Operator
16
16
  include SPARQL::Algebra::Update
17
17
 
@@ -30,8 +30,8 @@ module SPARQL; module Algebra
30
30
  # Returns queryable.
31
31
  # @raise [IOError]
32
32
  # If `from` does not exist, unless the `silent` operator is present
33
- # @see http://www.w3.org/TR/sparql11-update/
34
- def execute(queryable, options = {})
33
+ # @see https://www.w3.org/TR/sparql11-update/
34
+ def execute(queryable, **options)
35
35
  debug(options) {"Drop"}
36
36
  silent = operands.first == :silent
37
37
  silent = operands.first == :silent
@@ -8,8 +8,8 @@ module SPARQL; module Algebra
8
8
  # @example
9
9
  # (encode_for_uri ?x)
10
10
  #
11
- # @see http://www.w3.org/TR/sparql11-query/#func-encode
12
- # @see http://www.w3.org/TR/xpath-functions/#func-abs
11
+ # @see https://www.w3.org/TR/sparql11-query/#func-encode
12
+ # @see https://www.w3.org/TR/xpath-functions/#func-abs
13
13
  class EncodeForURI < Operator::Unary
14
14
  include Evaluatable
15
15
 
@@ -29,7 +29,7 @@ module SPARQL; module Algebra
29
29
  # @raise [TypeError] if the operand is not a literal value
30
30
  def apply(operand)
31
31
  case operand
32
- when RDF::Literal then RDF::Literal(::URI.encode(operand.to_s))
32
+ when RDF::Literal then RDF::Literal(CGI.escape(operand.to_s))
33
33
  else raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}"
34
34
  end
35
35
  end
@@ -6,8 +6,8 @@ module SPARQL; module Algebra
6
6
  # @example
7
7
  # (= ?x ?y)
8
8
  #
9
- # @see http://www.w3.org/TR/sparql11-query/#OperatorMapping
10
- # @see http://www.w3.org/TR/sparql11-query/#func-RDFterm-equal
9
+ # @see https://www.w3.org/TR/sparql11-query/#OperatorMapping
10
+ # @see https://www.w3.org/TR/sparql11-query/#func-RDFterm-equal
11
11
  class Equal < Compare
12
12
  NAME = :'='
13
13
 
@@ -10,7 +10,7 @@ module SPARQL; module Algebra
10
10
  # (filter (exists (bgp (triple ?s ?p ex:o)))
11
11
  # (bgp (triple ?s ?p ?o))))
12
12
  #
13
- # @see http://www.w3.org/TR/sparql11-query/#func-filter-exists
13
+ # @see https://www.w3.org/TR/sparql11-query/#func-filter-exists
14
14
  class Exists < Operator::Unary
15
15
  include Evaluatable
16
16
 
@@ -26,11 +26,11 @@ module SPARQL; module Algebra
26
26
  # @option options[RDF::Queryable] queryable
27
27
  # queryable to execute, using bindings as an initial solution.
28
28
  # @return [RDF::Literal::Boolean] `true` or `false`
29
- def evaluate(bindings, options = {})
29
+ def evaluate(bindings, **options)
30
30
  queryable = options[:queryable]
31
- !operand(0).execute(queryable, options.merge(
32
- solutions: RDF::Query::Solutions(bindings),
33
- depth: options[:depth].to_i + 1)).empty?
31
+ !operand(0).execute(queryable, solutions: RDF::Query::Solutions(bindings),
32
+ depth: options[:depth].to_i + 1,
33
+ **options).empty?
34
34
  end
35
35
  end # Exists
36
36
  end # Operator
@@ -14,7 +14,7 @@ module SPARQL; module Algebra
14
14
  # (triple ?s :q ?w)
15
15
  # ))))
16
16
  #
17
- # @see http://www.w3.org/TR/sparql11-query/#evaluation
17
+ # @see https://www.w3.org/TR/sparql11-query/#evaluation
18
18
  class Exprlist < Operator
19
19
  include Evaluatable
20
20
 
@@ -36,20 +36,10 @@ module SPARQL; module Algebra
36
36
  # options passed from query
37
37
  # @return [RDF::Literal::Boolean] `true` or `false`
38
38
  # @raise [TypeError] if the operands could not be coerced to a boolean literal
39
- def evaluate(bindings, options = {})
40
- res = operands.all? {|op| boolean(op.evaluate(bindings, options.merge(depth: options[:depth].to_i + 1))).true? }
39
+ def evaluate(bindings, **options)
40
+ res = operands.all? {|op| boolean(op.evaluate(bindings, depth: options[:depth].to_i + 1, **options)).true? }
41
41
  RDF::Literal(res) # FIXME: error handling
42
42
  end
43
-
44
- ##
45
- # Returns an optimized version of this query.
46
- #
47
- # Return optimized query
48
- #
49
- # @return [Union, RDF::Query] `self`
50
- def optimize
51
- operands = operands.map(&:optimize)
52
- end
53
43
  end # Exprlist
54
44
  end # Operator
55
45
  end; end # SPARQL::Algebra
@@ -11,7 +11,7 @@ module SPARQL; module Algebra
11
11
  # (extend ((?z (+ ?o 10)))
12
12
  # (bgp (triple ?s <http://example/p> ?o)))))
13
13
  #
14
- # @see http://www.w3.org/TR/sparql11-query/#evaluation
14
+ # @see https://www.w3.org/TR/sparql11-query/#evaluation
15
15
  class Extend < Operator::Binary
16
16
  include Query
17
17
 
@@ -28,6 +28,12 @@ module SPARQL; module Algebra
28
28
  #
29
29
  # Extend(Ω, var, expr) = { Extend(μ, var, expr) | μ in Ω }
30
30
  #
31
+ # For SPARQL*, expr may be an embedded tiple pattern
32
+ #
33
+ # (extend
34
+ # ((?t (triple ?bob foaf:age ?age)))
35
+ # (bgp (triple ?t dct:source ?src)))
36
+ #
31
37
  # @param [RDF::Queryable] queryable
32
38
  # the graph or repository to query
33
39
  # @param [Hash{Symbol => Object}] options
@@ -38,19 +44,24 @@ module SPARQL; module Algebra
38
44
  # @yieldreturn [void] ignored
39
45
  # @return [RDF::Query::Solutions]
40
46
  # the resulting solution sequence
41
- # @see http://www.w3.org/TR/sparql11-query/#evaluation
42
- def execute(queryable, options = {}, &block)
47
+ # @see https://www.w3.org/TR/sparql11-query/#evaluation
48
+ def execute(queryable, **options, &block)
43
49
  debug(options) {"Extend"}
44
- @solutions = operand(1).execute(queryable, options.merge(depth: options[:depth].to_i + 1))
50
+ @solutions = operand(1).execute(queryable, depth: options[:depth].to_i + 1, **options)
45
51
  @solutions.each do |solution|
46
52
  debug(options) {"===> soln #{solution.to_h.inspect}"}
47
53
  operand(0).each do |(var, expr)|
48
54
  begin
49
- val = expr.evaluate(solution, options.merge(
50
- queryable: queryable,
51
- depth: options[:depth].to_i + 1))
55
+ val = expr.evaluate(solution, queryable: queryable,
56
+ depth: options[:depth].to_i + 1,
57
+ **options)
52
58
  debug(options) {"===> + #{var} => #{val.inspect}"}
53
- solution.bindings[var.to_sym] = val
59
+ solution.bindings[var.to_sym] = if val.is_a?(RDF::Query::Pattern)
60
+ # Variable is bound to the solution
61
+ val.bind(solution)
62
+ else
63
+ val
64
+ end
54
65
  rescue TypeError => e
55
66
  # Evaluates to error, ignore
56
67
  debug(options) {"===> #{var} error: #{e.message}"}
@@ -72,16 +83,6 @@ module SPARQL; module Algebra
72
83
  end
73
84
  super
74
85
  end
75
-
76
- ##
77
- # Returns an optimized version of this query.
78
- #
79
- # Return optimized query
80
- #
81
- # @return FIXME
82
- def optimize
83
- operands = operands.map(&:optimize)
84
- end
85
86
  end # Filter
86
87
  end # Operator
87
88
  end; end # SPARQL::Algebra