sparql 3.1.8 → 3.2.3

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 (155) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +88 -60
  3. data/VERSION +1 -1
  4. data/bin/sparql +15 -35
  5. data/lib/rack/sparql/conneg.rb +22 -1
  6. data/lib/sinatra/sparql/extensions.rb +1 -1
  7. data/lib/sinatra/sparql.rb +57 -12
  8. data/lib/sparql/algebra/expression.rb +63 -10
  9. data/lib/sparql/algebra/extensions.rb +110 -46
  10. data/lib/sparql/algebra/operator/abs.rb +22 -2
  11. data/lib/sparql/algebra/operator/add.rb +21 -2
  12. data/lib/sparql/algebra/operator/adjust.rb +69 -0
  13. data/lib/sparql/algebra/operator/alt.rb +26 -2
  14. data/lib/sparql/algebra/operator/and.rb +25 -3
  15. data/lib/sparql/algebra/operator/asc.rb +20 -1
  16. data/lib/sparql/algebra/operator/ask.rb +17 -1
  17. data/lib/sparql/algebra/operator/avg.rb +19 -1
  18. data/lib/sparql/algebra/operator/base.rb +18 -1
  19. data/lib/sparql/algebra/operator/bgp.rb +13 -1
  20. data/lib/sparql/algebra/operator/bnode.rb +33 -10
  21. data/lib/sparql/algebra/operator/bound.rb +22 -1
  22. data/lib/sparql/algebra/operator/ceil.rb +25 -2
  23. data/lib/sparql/algebra/operator/clear.rb +26 -2
  24. data/lib/sparql/algebra/operator/coalesce.rb +33 -11
  25. data/lib/sparql/algebra/operator/compare.rb +9 -0
  26. data/lib/sparql/algebra/operator/concat.rb +26 -2
  27. data/lib/sparql/algebra/operator/construct.rb +29 -6
  28. data/lib/sparql/algebra/operator/contains.rb +24 -2
  29. data/lib/sparql/algebra/operator/copy.rb +19 -2
  30. data/lib/sparql/algebra/operator/count.rb +52 -6
  31. data/lib/sparql/algebra/operator/create.rb +20 -2
  32. data/lib/sparql/algebra/operator/dataset.rb +37 -2
  33. data/lib/sparql/algebra/operator/datatype.rb +25 -6
  34. data/lib/sparql/algebra/operator/day.rb +25 -7
  35. data/lib/sparql/algebra/operator/delete.rb +29 -2
  36. data/lib/sparql/algebra/operator/delete_data.rb +23 -2
  37. data/lib/sparql/algebra/operator/delete_where.rb +24 -2
  38. data/lib/sparql/algebra/operator/desc.rb +20 -1
  39. data/lib/sparql/algebra/operator/describe.rb +27 -4
  40. data/lib/sparql/algebra/operator/distinct.rb +20 -3
  41. data/lib/sparql/algebra/operator/divide.rb +26 -2
  42. data/lib/sparql/algebra/operator/drop.rb +27 -3
  43. data/lib/sparql/algebra/operator/encode_for_uri.rb +22 -2
  44. data/lib/sparql/algebra/operator/equal.rb +12 -2
  45. data/lib/sparql/algebra/operator/exists.rb +28 -4
  46. data/lib/sparql/algebra/operator/exprlist.rb +15 -2
  47. data/lib/sparql/algebra/operator/extend.rb +95 -7
  48. data/lib/sparql/algebra/operator/filter.rb +27 -5
  49. data/lib/sparql/algebra/operator/floor.rb +25 -2
  50. data/lib/sparql/algebra/operator/function_call.rb +64 -0
  51. data/lib/sparql/algebra/operator/graph.rb +69 -6
  52. data/lib/sparql/algebra/operator/greater_than.rb +12 -3
  53. data/lib/sparql/algebra/operator/greater_than_or_equal.rb +12 -2
  54. data/lib/sparql/algebra/operator/group.rb +133 -8
  55. data/lib/sparql/algebra/operator/group_concat.rb +43 -7
  56. data/lib/sparql/algebra/operator/hours.rb +25 -7
  57. data/lib/sparql/algebra/operator/if.rb +20 -3
  58. data/lib/sparql/algebra/operator/in.rb +18 -1
  59. data/lib/sparql/algebra/operator/insert.rb +24 -2
  60. data/lib/sparql/algebra/operator/insert_data.rb +23 -2
  61. data/lib/sparql/algebra/operator/iri.rb +21 -4
  62. data/lib/sparql/algebra/operator/is_blank.rb +20 -3
  63. data/lib/sparql/algebra/operator/is_iri.rb +20 -3
  64. data/lib/sparql/algebra/operator/is_literal.rb +20 -3
  65. data/lib/sparql/algebra/operator/is_numeric.rb +22 -5
  66. data/lib/sparql/algebra/operator/is_triple.rb +32 -0
  67. data/lib/sparql/algebra/operator/join.rb +58 -3
  68. data/lib/sparql/algebra/operator/lang.rb +25 -0
  69. data/lib/sparql/algebra/operator/lang_matches.rb +22 -1
  70. data/lib/sparql/algebra/operator/lcase.rb +22 -2
  71. data/lib/sparql/algebra/operator/left_join.rb +44 -3
  72. data/lib/sparql/algebra/operator/less_than.rb +12 -3
  73. data/lib/sparql/algebra/operator/less_than_or_equal.rb +12 -2
  74. data/lib/sparql/algebra/operator/load.rb +25 -2
  75. data/lib/sparql/algebra/operator/max.rb +19 -1
  76. data/lib/sparql/algebra/operator/md5.rb +22 -5
  77. data/lib/sparql/algebra/operator/min.rb +21 -3
  78. data/lib/sparql/algebra/operator/minus.rb +65 -7
  79. data/lib/sparql/algebra/operator/minutes.rb +25 -7
  80. data/lib/sparql/algebra/operator/modify.rb +62 -5
  81. data/lib/sparql/algebra/operator/month.rb +25 -7
  82. data/lib/sparql/algebra/operator/move.rb +20 -2
  83. data/lib/sparql/algebra/operator/multiply.rb +26 -3
  84. data/lib/sparql/algebra/operator/negate.rb +23 -3
  85. data/lib/sparql/algebra/operator/not.rb +24 -3
  86. data/lib/sparql/algebra/operator/not_equal.rb +13 -0
  87. data/lib/sparql/algebra/operator/notexists.rb +30 -6
  88. data/lib/sparql/algebra/operator/notin.rb +20 -3
  89. data/lib/sparql/algebra/operator/notoneof.rb +21 -2
  90. data/lib/sparql/algebra/operator/now.rb +24 -5
  91. data/lib/sparql/algebra/operator/object.rb +32 -0
  92. data/lib/sparql/algebra/operator/or.rb +26 -3
  93. data/lib/sparql/algebra/operator/order.rb +64 -1
  94. data/lib/sparql/algebra/operator/path.rb +29 -2
  95. data/lib/sparql/algebra/operator/path_opt.rb +28 -65
  96. data/lib/sparql/algebra/operator/path_plus.rb +37 -10
  97. data/lib/sparql/algebra/operator/path_range.rb +178 -0
  98. data/lib/sparql/algebra/operator/path_star.rb +25 -4
  99. data/lib/sparql/algebra/operator/path_zero.rb +110 -0
  100. data/lib/sparql/algebra/operator/plus.rb +49 -8
  101. data/lib/sparql/algebra/operator/predicate.rb +32 -0
  102. data/lib/sparql/algebra/operator/prefix.rb +24 -3
  103. data/lib/sparql/algebra/operator/project.rb +111 -6
  104. data/lib/sparql/algebra/operator/rand.rb +30 -2
  105. data/lib/sparql/algebra/operator/reduced.rb +20 -3
  106. data/lib/sparql/algebra/operator/regex.rb +26 -18
  107. data/lib/sparql/algebra/operator/replace.rb +26 -6
  108. data/lib/sparql/algebra/operator/reverse.rb +31 -2
  109. data/lib/sparql/algebra/operator/round.rb +25 -2
  110. data/lib/sparql/algebra/operator/same_term.rb +24 -6
  111. data/lib/sparql/algebra/operator/sample.rb +32 -8
  112. data/lib/sparql/algebra/operator/seconds.rb +25 -7
  113. data/lib/sparql/algebra/operator/seq.rb +23 -5
  114. data/lib/sparql/algebra/operator/sequence.rb +14 -11
  115. data/lib/sparql/algebra/operator/sha1.rb +18 -1
  116. data/lib/sparql/algebra/operator/sha256.rb +18 -1
  117. data/lib/sparql/algebra/operator/sha384.rb +18 -1
  118. data/lib/sparql/algebra/operator/sha512.rb +18 -1
  119. data/lib/sparql/algebra/operator/slice.rb +27 -5
  120. data/lib/sparql/algebra/operator/str.rb +21 -1
  121. data/lib/sparql/algebra/operator/strafter.rb +25 -2
  122. data/lib/sparql/algebra/operator/strbefore.rb +25 -2
  123. data/lib/sparql/algebra/operator/strdt.rb +22 -1
  124. data/lib/sparql/algebra/operator/strends.rb +25 -3
  125. data/lib/sparql/algebra/operator/strlang.rb +24 -6
  126. data/lib/sparql/algebra/operator/strlen.rb +23 -2
  127. data/lib/sparql/algebra/operator/strstarts.rb +25 -2
  128. data/lib/sparql/algebra/operator/struuid.rb +29 -9
  129. data/lib/sparql/algebra/operator/subject.rb +32 -0
  130. data/lib/sparql/algebra/operator/substr.rb +23 -2
  131. data/lib/sparql/algebra/operator/subtract.rb +37 -7
  132. data/lib/sparql/algebra/operator/sum.rb +24 -6
  133. data/lib/sparql/algebra/operator/table.rb +85 -4
  134. data/lib/sparql/algebra/operator/timezone.rb +25 -7
  135. data/lib/sparql/algebra/operator/triple.rb +24 -0
  136. data/lib/sparql/algebra/operator/tz.rb +24 -7
  137. data/lib/sparql/algebra/operator/ucase.rb +23 -2
  138. data/lib/sparql/algebra/operator/union.rb +29 -6
  139. data/lib/sparql/algebra/operator/update.rb +46 -4
  140. data/lib/sparql/algebra/operator/using.rb +49 -2
  141. data/lib/sparql/algebra/operator/uuid.rb +27 -8
  142. data/lib/sparql/algebra/operator/with.rb +38 -4
  143. data/lib/sparql/algebra/operator/year.rb +25 -7
  144. data/lib/sparql/algebra/operator.rb +150 -12
  145. data/lib/sparql/algebra/query.rb +5 -3
  146. data/lib/sparql/algebra/sxp_extensions.rb +3 -3
  147. data/lib/sparql/algebra.rb +42 -6
  148. data/lib/sparql/grammar/meta.rb +1367 -267
  149. data/lib/sparql/grammar/parser11.rb +829 -331
  150. data/lib/sparql/grammar/terminals11.rb +2 -2
  151. data/lib/sparql/grammar.rb +6 -4
  152. data/lib/sparql/results.rb +3 -2
  153. data/lib/sparql/server.rb +93 -0
  154. data/lib/sparql.rb +8 -5
  155. metadata +57 -35
@@ -3,9 +3,17 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL GraphPattern `reduced` operator.
5
5
  #
6
- # @example
7
- # (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
8
- # (: <http://example/>))
6
+ # [9] SelectClause ::= 'SELECT' ( 'DISTINCT' | 'REDUCED' )? ( ( Var | ( '(' Expression 'AS' Var ')' ) )+ | '*' )
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT REDUCED ?v
12
+ # WHERE { ?x ?p ?v }
13
+ #
14
+ # @example SSE
15
+ # (prefix ((: <http://example.org/>)
16
+ # (xsd: <http://www.w3.org/2001/XMLSchema#>))
9
17
  # (reduced
10
18
  # (project (?v)
11
19
  # (bgp (triple ?x ?p ?v)))))
@@ -37,6 +45,15 @@ module SPARQL; module Algebra
37
45
  @solutions.each(&block) if block_given?
38
46
  @solutions
39
47
  end
48
+
49
+ ##
50
+ #
51
+ # Returns a partial SPARQL grammar for this operator.
52
+ #
53
+ # @return [String]
54
+ def to_sparql(**options)
55
+ operands.first.to_sparql(reduced: true, **options)
56
+ end
40
57
  end # Reduced
41
58
  end # Operator
42
59
  end; end # SPARQL::Algebra
@@ -3,33 +3,31 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `regex` operator.
5
5
  #
6
- # @example
6
+ # [122] RegexExpression ::= 'REGEX' '(' Expression ',' Expression ( ',' Expression )? ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX ex: <http://example.com/#>
10
+ # PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
11
+ # SELECT ?val
12
+ # WHERE {
13
+ # ex:foo rdf:value ?val .
14
+ # FILTER regex(?val, "GHI")
15
+ # }
16
+ #
17
+ # @example SSE
7
18
  # (prefix ((ex: <http://example.com/#>)
8
19
  # (rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>))
9
- # (project (?val)
10
- # (filter (regex ?val "GHI")
11
- # (bgp (triple ex:foo rdf:value ?val)))))
20
+ # (project (?val)
21
+ # (filter (regex ?val "GHI")
22
+ # (bgp (triple ex:foo rdf:value ?val)))))
12
23
  #
13
24
  # @see https://www.w3.org/TR/sparql11-query/#funcex-regex
14
25
  # @see https://www.w3.org/TR/xpath-functions/#func-matches
15
- class Regex < Operator::Ternary
26
+ class Regex < Operator
16
27
  include Evaluatable
17
28
 
18
29
  NAME = :regex
19
30
 
20
- ##
21
- # Initializes a new operator instance.
22
- #
23
- # @param [RDF::Term] text
24
- # @param [RDF::Term] pattern
25
- # @param [RDF::Term] flags
26
- # @param [Hash{Symbol => Object}] options
27
- # any additional options (see {Operator#initialize})
28
- # @raise [TypeError] if any operand is invalid
29
- def initialize(text, pattern, flags = RDF::Literal(''), **options)
30
- super
31
- end
32
-
33
31
  ##
34
32
  # Matches `text` against a regular expression `pattern`.
35
33
  #
@@ -65,6 +63,16 @@ module SPARQL; module Algebra
65
63
  options |= Regexp::EXTENDED if flags.include?(?x)
66
64
  RDF::Literal(Regexp.new(pattern, options) === text)
67
65
  end
66
+
67
+ ##
68
+ #
69
+ # Returns a partial SPARQL grammar for this operator.
70
+ #
71
+ # @return [String]
72
+ def to_sparql(**options)
73
+ ops = operands.last.to_s.empty? ? operands[0..-2] : operands
74
+ "regex(" + ops.to_sparql(delimiter: ', ', **options) + ")"
75
+ end
68
76
  end # Regex
69
77
  end # Operator
70
78
  end; end # SPARQL::Algebra
@@ -3,12 +3,22 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `replace` operator.
5
5
  #
6
- # @example
7
- # (prefix ((: <http://example.org/>)
8
- # (xsd: <http://www.w3.org/2001/XMLSchema#>))
9
- # (project (?s ?new)
10
- # (extend ((?new (replace ?str "[^a-z0-9]" "-")))
11
- # (bgp (triple ?s :str ?str)))))
6
+ # [124] StrReplaceExpression ::= 'REPLACE' '(' Expression ',' Expression ',' Expression ( ',' Expression )? ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT ?s (REPLACE(?str,"[^a-z0-9]", "-") AS ?new)
12
+ # WHERE {
13
+ # ?s :str ?str
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix ((: <http://example.org/>)
18
+ # (xsd: <http://www.w3.org/2001/XMLSchema#>))
19
+ # (project (?s ?new)
20
+ # (extend ((?new (replace ?str "[^a-z0-9]" "-")))
21
+ # (bgp (triple ?s :str ?str)))))
12
22
  #
13
23
  # @see https://www.w3.org/TR/sparql11-query/#funcex-replace
14
24
  # @see https://www.w3.org/TR/xpath-functions/#func-replace
@@ -76,6 +86,16 @@ module SPARQL; module Algebra
76
86
  def to_sxp_bin
77
87
  [NAME] + operands.reject {|o| o.to_s == ""}
78
88
  end
89
+
90
+ ##
91
+ #
92
+ # Returns a partial SPARQL grammar for this operator.
93
+ #
94
+ # @return [String]
95
+ def to_sparql(**options)
96
+ ops = operands.last.to_s.empty? ? operands[0..-2] : operands
97
+ "REPLACE(" + ops.to_sparql(delimiter: ', ', **options) + ")"
98
+ end
79
99
  end # Replace
80
100
  end # Operator
81
101
  end; end # SPARQL::Algebra
@@ -3,8 +3,28 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL Property Path `reverse` (NegatedPropertySet) operator.
5
5
  #
6
- # @example
7
- # (reverse :p)
6
+ # [92] PathEltOrInverse ::= PathElt | '^' PathElt
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX ex: <http://www.example.org/schema#>
10
+ # PREFIX in: <http://www.example.org/instance#>
11
+ # ASK { in:b ^ex:p in:a }
12
+ #
13
+ # @example SSE
14
+ # (prefix ((ex: <http://www.example.org/schema#>)
15
+ # (in: <http://www.example.org/instance#>))
16
+ # (ask (path in:b (reverse ex:p) in:a)))
17
+ #
18
+ # @example SPARQL Grammar
19
+ # prefix ex: <http://www.example.org/schema#>
20
+ # prefix in: <http://www.example.org/instance#>
21
+ #
22
+ # select * where { in:c ^(ex:p1/ex:p2) ?x }
23
+ #
24
+ # @example SSE
25
+ # (prefix ((ex: <http://www.example.org/schema#>)
26
+ # (in: <http://www.example.org/instance#>))
27
+ # (path in:c (reverse (seq ex:p1 ex:p2)) ?x))
8
28
  #
9
29
  # @see https://www.w3.org/TR/sparql11-query/#defn_evalPP_inverse
10
30
  class Reverse < Operator::Unary
@@ -49,6 +69,15 @@ module SPARQL; module Algebra
49
69
  ), &block)
50
70
 
51
71
  end
72
+
73
+ ##
74
+ #
75
+ # Returns a partial SPARQL grammar for this operator.
76
+ #
77
+ # @return [String]
78
+ def to_sparql(**options)
79
+ "^(" + operands.first.to_sparql(**options) + ')'
80
+ end
52
81
  end # Reverse
53
82
  end # Operator
54
83
  end; end # SPARQL::Algebra
@@ -5,8 +5,22 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # Returns the number with no fractional part that is closest to the argument. If there are two such numbers, then the one that is closest to positive infinity is returned. An error is raised if `arg` is not a numeric value.
7
7
  #
8
- # @example
9
- # (round ?x)
8
+ # [121] BuiltInCall ::= ... 'ROUND' '(' Expression ')'
9
+ #
10
+ # @example SPARQL Grammar
11
+ # PREFIX : <http://example.org/>
12
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
13
+ # SELECT ?s ?num (ROUND(?num) AS ?round) WHERE {
14
+ # ?s :num ?num
15
+ # }
16
+ #
17
+ # @example SSE
18
+ # (prefix
19
+ # ((: <http://example.org/>)
20
+ # (xsd: <http://www.w3.org/2001/XMLSchema#>))
21
+ # (project (?s ?num ?round)
22
+ # (extend ((?round (round ?num)))
23
+ # (bgp (triple ?s :num ?num)))))
10
24
  #
11
25
  # @see https://www.w3.org/TR/sparql11-query/#func-round
12
26
  # @see https://www.w3.org/TR/xpath-functions/#func-round
@@ -29,5 +43,14 @@ module SPARQL; module Algebra
29
43
  end
30
44
  end
31
45
  end # Round
46
+
47
+ ##
48
+ #
49
+ # Returns a partial SPARQL grammar for this operator.
50
+ #
51
+ # @return [String]
52
+ def to_sparql(**options)
53
+ "ROUND(#{operands.to_sparql(**options)})"
54
+ end
32
55
  end # Operator
33
56
  end; end # SPARQL::Algebra
@@ -3,12 +3,21 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `sameTerm` operator.
5
5
  #
6
- # @example
7
- # (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
8
- # (: <http://example.org/things#>))
9
- # (project (?x ?v)
10
- # (filter (sameTerm ?v)
11
- # (bgp (triple ?x :p ?v)))))
6
+ # [121] BuiltInCall ::= ... | 'sameTerm' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/things#>
10
+ # SELECT * {
11
+ # ?x1 :p ?v1 .
12
+ # ?x2 :p ?v2 .
13
+ # FILTER sameTerm(?v1, ?v2)
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix
18
+ # ((: <http://example.org/things#>))
19
+ # (filter (sameTerm ?v1 ?v2)
20
+ # (bgp (triple ?x1 :p ?v1) (triple ?x2 :p ?v2))))
12
21
  #
13
22
  # @see https://www.w3.org/TR/sparql11-query/#func-sameTerm
14
23
  class SameTerm < Operator::Binary
@@ -44,6 +53,15 @@ module SPARQL; module Algebra
44
53
  super # @see Operator#optimize!
45
54
  end
46
55
  end
56
+
57
+ ##
58
+ #
59
+ # Returns a partial SPARQL grammar for this operator.
60
+ #
61
+ # @return [String]
62
+ def to_sparql(**options)
63
+ "sameTerm(#{operands.to_sparql(delimiter: ', ', **options)})"
64
+ end
47
65
  end # SameTerm
48
66
  end # Operator
49
67
  end; end # SPARQL::Algebra
@@ -3,13 +3,26 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `sample` set function.
5
5
  #
6
- # @example
7
- # (prefix ((: <http://www.example.org/>))
8
- # (filter (|| (|| (= ?sample 1.0) (= ?sample 2.2)) (= ?sample 3.5))
9
- # (project (?sample)
10
- # (extend ((?sample ??.0))
11
- # (group () ((??.0 (sample ?o)))
12
- # (bgp (triple ?s :dec ?o)))))))
6
+ # [127] Aggregate::= ... | 'SAMPLE' '(' 'DISTINCT'? Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example/>
10
+ #
11
+ # SELECT ?w (SAMPLE(?v) AS ?S)
12
+ # {
13
+ # ?s :p ?v .
14
+ # OPTIONAL { ?s :q ?w }
15
+ # }
16
+ # GROUP BY ?w
17
+ #
18
+ # @example SSE
19
+ # (prefix ((: <http://example/>))
20
+ # (project (?w ?S)
21
+ # (extend ((?S ??.0))
22
+ # (group (?w) ((??.0 (sample ?v)))
23
+ # (leftjoin
24
+ # (bgp (triple ?s :p ?v))
25
+ # (bgp (triple ?s :q ?w))))) ))
13
26
  #
14
27
  # @see https://www.w3.org/TR/sparql11-query/#defn_aggSample
15
28
  class Sample < Operator
@@ -34,6 +47,17 @@ module SPARQL; module Algebra
34
47
  def apply(enum, **options)
35
48
  enum.detect(lambda {raise TypeError, "Sampling an empty multiset"}) {|e| e.first}.first
36
49
  end
37
- end # LCase
50
+
51
+ ##
52
+ #
53
+ # Returns a partial SPARQL grammar for this operator.
54
+ #
55
+ # @return [String]
56
+ def to_sparql(**options)
57
+ distinct = operands.first == :distinct
58
+ args = distinct ? operands[1..-1] : operands
59
+ "SAMPLE(#{'DISTINCT ' if distinct}#{args.to_sparql(**options)})"
60
+ end
61
+ end # Sample
38
62
  end # Operator
39
63
  end; end # SPARQL::Algebra
@@ -5,11 +5,20 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # Returns the seconds part of the lexical form of `arg`.
7
7
  #
8
- # @example
9
- # (prefix ((: <http://example.org/>))
10
- # (project (?s ?x)
11
- # (extend ((?x (seconds ?date)))
12
- # (bgp (triple ?s :date ?date)))))
8
+ # [121] BuiltInCall ::= ... | 'SECONDS' '(' Expression ')'
9
+ #
10
+ # @example SPARQL Grammar
11
+ # PREFIX : <http://example.org/>
12
+ # SELECT ?s (SECONDS(?date) AS ?x) WHERE {
13
+ # ?s :date ?date
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix
18
+ # ((: <http://example.org/>))
19
+ # (project (?s ?x)
20
+ # (extend ((?x (seconds ?date)))
21
+ # (bgp (triple ?s :date ?date)))))
13
22
  #
14
23
  # @see https://www.w3.org/TR/sparql11-query/#func-seconds
15
24
  class Seconds < Operator::Unary
@@ -22,12 +31,21 @@ module SPARQL; module Algebra
22
31
  #
23
32
  # @param [RDF::Literal] operand
24
33
  # the operand
25
- # @return [RDF::Literal]
34
+ # @return [RDF::Literal::Temporal]
26
35
  # @raise [TypeError] if the operand is not a simple literal
27
36
  def apply(operand, **options)
28
- raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
37
+ raise TypeError, "expected an RDF::Literal::Temporal, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::Temporal)
29
38
  RDF::Literal(operand.object.second)
30
39
  end
40
+
41
+ ##
42
+ #
43
+ # Returns a partial SPARQL grammar for this operator.
44
+ #
45
+ # @return [String]
46
+ def to_sparql(**options)
47
+ "SECONDS(#{operands.last.to_sparql(**options)})"
48
+ end
31
49
  end # Seconds
32
50
  end # Operator
33
51
  end; end # SPARQL::Algebra
@@ -3,8 +3,17 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL Property Path `sequence` (SequencePath) operator.
5
5
  #
6
- # @example
7
- # (seq :a :b)
6
+ # # [90] PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )*
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX ex: <http://www.example.org/schema#>
10
+ # PREFIX in: <http://www.example.org/instance#>
11
+ # SELECT * WHERE { in:a ex:p1/ex:p2 ?x }
12
+ #
13
+ # @example SSE
14
+ # (prefix ((ex: <http://www.example.org/schema#>)
15
+ # (in: <http://www.example.org/instance#>))
16
+ # (path in:a (seq ex:p1 ex:p2) ?x))
8
17
  #
9
18
  # @see https://www.w3.org/TR/sparql11-query/#defn_evalPP_sequence
10
19
  class Seq < Operator::Binary
@@ -50,10 +59,10 @@ module SPARQL; module Algebra
50
59
  end
51
60
 
52
61
  left = queryable.query(q1, **options.merge(object: v, depth: options[:depth].to_i + 1))
53
- debug(options) {"(seq)=>(left) #{left.map(&:to_h).to_sse}"}
62
+ #debug(options) {"(seq)=>(left) #{left.map(&:to_h).to_sse}"}
54
63
 
55
64
  right = queryable.query(q2, **options.merge(subject: v, depth: options[:depth].to_i + 1))
56
- debug(options) {"(seq)=>(right) #{right.map(&:to_h).to_sse}"}
65
+ #debug(options) {"(seq)=>(right) #{right.map(&:to_h).to_sse}"}
57
66
 
58
67
  @solutions = RDF::Query::Solutions(left.map do |s1|
59
68
  right.map do |s2|
@@ -63,10 +72,19 @@ module SPARQL; module Algebra
63
72
  solution.bindings.delete(v.to_sym)
64
73
  solution
65
74
  end
66
- debug(options) {"(seq)=> #{@solutions.map(&:to_h).to_sse}"}
75
+ debug(options) {"(seq)=> #{@solutions.to_sxp}"}
67
76
  @solutions.each(&block) if block_given?
68
77
  @solutions
69
78
  end
79
+
80
+ ##
81
+ #
82
+ # Returns a partial SPARQL grammar for this operator.
83
+ #
84
+ # @return [String]
85
+ def to_sparql(**options)
86
+ '(' + operands.to_sparql(delimiter: '/', **options) + ')'
87
+ end
70
88
  end # Seq
71
89
  end # Operator
72
90
  end; end # SPARQL::Algebra
@@ -4,18 +4,11 @@ module SPARQL; module Algebra
4
4
  ##
5
5
  # The SPARQL UPDATE `sequence` operator.
6
6
  #
7
- # Sequences through each operand
7
+ # Sequences through each operand.
8
8
  #
9
- # @example
10
- # (sequence
11
- # (bgp
12
- # (triple ?s ?p ??0)
13
- # (triple ??0 rdf:first ??1)
14
- # (triple ??0 rdf:rest ??2)
15
- # (triple ??2 rdf:first ??3)
16
- # (triple ??2 rdf:rest rdf:nil))
17
- # (path ??1 (seq (path* :p) :q) 123)
18
- # (path ??3 (reverse :r) "hello"))
9
+ # [103] CollectionPath ::= '(' GraphNodePath+ ')'
10
+ #
11
+ # @see https://www.w3.org/TR/sparql11-query/#collections
19
12
  class Sequence < Operator
20
13
  include SPARQL::Algebra::Update
21
14
 
@@ -58,6 +51,16 @@ module SPARQL; module Algebra
58
51
  @solutions.each(&block) if block_given?
59
52
  @solutions
60
53
  end
54
+
55
+ ##
56
+ #
57
+ # Returns a partial SPARQL grammar for this operator.
58
+ #
59
+ # @return [String]
60
+ def to_sparql(**options)
61
+ str = "{\n" + operands.to_sparql(top_level: false, **options) + "\n}"
62
+ Operator.to_sparql(str, **options)
63
+ end
61
64
  end # Sequence
62
65
  end # Operator
63
66
  end; end # SPARQL::Algebra
@@ -7,7 +7,15 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # Returns the SHA1 checksum, as a hex digit string, calculated on the UTF-8 representation of the simple literal or lexical form of the `xsd:string`. Hex digits `SHOULD` be in lower case.
9
9
  #
10
- # @example
10
+ # [121] BuiltInCall ::= ... | 'SHA1' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.org/>
14
+ # SELECT (SHA1(?l) AS ?hash) WHERE {
15
+ # :s1 :str ?l
16
+ # }
17
+ #
18
+ # @example SSE
11
19
  # (prefix ((: <http://example.org/>))
12
20
  # (project (?hash)
13
21
  # (extend ((?hash (sha1 ?l)))
@@ -31,6 +39,15 @@ module SPARQL; module Algebra
31
39
  raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
32
40
  RDF::Literal(Digest::SHA1.new.hexdigest(operand.to_s))
33
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "SHA1(" + operands.to_sparql(**options) + ")"
50
+ end
34
51
  end # SHA1
35
52
  end # Operator
36
53
  end; end # SPARQL::Algebra
@@ -7,7 +7,15 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # Returns the SHA256 checksum, as a hex digit string, calculated on the UTF-8 representation of the simple literal or lexical form of the `xsd:string`. Hex digits `SHOULD` be in lower case.
9
9
  #
10
- # @example
10
+ # [121] BuiltInCall ::= ... | 'SHA256' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.org/>
14
+ # SELECT (SHA256(?l) AS ?hash) WHERE {
15
+ # :s1 :str ?l
16
+ # }
17
+ #
18
+ # @example SSE
11
19
  # (prefix ((: <http://example.org/>))
12
20
  # (project (?hash)
13
21
  # (extend ((?hash (sha256 ?l)))
@@ -31,6 +39,15 @@ module SPARQL; module Algebra
31
39
  raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
32
40
  RDF::Literal(Digest::SHA256.new.hexdigest(operand.to_s))
33
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "SHA256(" + operands.to_sparql(**options) + ")"
50
+ end
34
51
  end # SHA256
35
52
  end # Operator
36
53
  end; end # SPARQL::Algebra
@@ -7,7 +7,15 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # Returns the SHA384 checksum, as a hex digit string, calculated on the UTF-8 representation of the simple literal or lexical form of the `xsd:string`. Hex digits `SHOULD` be in lower case.
9
9
  #
10
- # @example
10
+ # [121] BuiltInCall ::= ... | 'SHA384' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.org/>
14
+ # SELECT (SHA384(?l) AS ?hash) WHERE {
15
+ # :s1 :str ?l
16
+ # }
17
+ #
18
+ # @example SSE
11
19
  # (prefix ((: <http://example.org/>))
12
20
  # (project (?hash)
13
21
  # (extend ((?hash (sha384 ?l)))
@@ -31,6 +39,15 @@ module SPARQL; module Algebra
31
39
  raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
32
40
  RDF::Literal(Digest::SHA384.new.hexdigest(operand.to_s))
33
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "SHA384(" + operands.to_sparql(**options) + ")"
50
+ end
34
51
  end # SHA384
35
52
  end # Operator
36
53
  end; end # SPARQL::Algebra
@@ -7,7 +7,15 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # Returns the SHA512 checksum, as a hex digit string, calculated on the UTF-8 representation of the simple literal or lexical form of the `xsd:string`. Hex digits `SHOULD` be in lower case.
9
9
  #
10
- # @example
10
+ # [121] BuiltInCall ::= ... | 'SHA512' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.org/>
14
+ # SELECT (SHA512(?l) AS ?hash) WHERE {
15
+ # :s1 :str ?l
16
+ # }
17
+ #
18
+ # @example SSE
11
19
  # (prefix ((: <http://example.org/>))
12
20
  # (project (?hash)
13
21
  # (extend ((?hash (sha512 ?l)))
@@ -31,6 +39,15 @@ module SPARQL; module Algebra
31
39
  raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
32
40
  RDF::Literal(Digest::SHA512.new.hexdigest(operand.to_s))
33
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "SHA512(" + operands.to_sparql(**options) + ")"
50
+ end
34
51
  end # SHA512
35
52
  end # Operator
36
53
  end; end # SPARQL::Algebra
@@ -3,12 +3,23 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL GraphPattern `slice` operator.
5
5
  #
6
- # @example
6
+ # [25] LimitOffsetClauses ::= LimitClause OffsetClause? | OffsetClause LimitClause?
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/ns#>
10
+ #
11
+ # SELECT ?v
12
+ # WHERE { :a ?p ?v }
13
+ # ORDER BY ?v
14
+ # OFFSET 100
15
+ # LIMIT 1
16
+ #
17
+ # @example SSE
7
18
  # (prefix ((: <http://example.org/ns#>))
8
- # (slice 1 1
9
- # (project (?v)
10
- # (order (?v)
11
- # (bgp (triple ??0 :num ?v))))))
19
+ # (slice 100 1
20
+ # (project (?v)
21
+ # (order (?v)
22
+ # (bgp (triple :a ?p ?v))))))
12
23
  #
13
24
  # @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
14
25
  class Slice < Operator::Ternary
@@ -52,6 +63,17 @@ module SPARQL; module Algebra
52
63
  @solutions.each(&block) if block_given?
53
64
  @solutions
54
65
  end
66
+
67
+ ##
68
+ #
69
+ # Extracts OFFSET and LIMIT.
70
+ #
71
+ # @return [String]
72
+ def to_sparql(**options)
73
+ offset = operands[0].to_i unless operands[0] == :_
74
+ limit = operands[1].to_i unless operands[1] == :_
75
+ operands.last.to_sparql(offset: offset, limit: limit, **options)
76
+ end
55
77
  end # Slice
56
78
  end # Operator
57
79
  end; end # SPARQL::Algebra