sparql 3.1.5 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +35 -28
  3. data/VERSION +1 -1
  4. data/bin/sparql +14 -4
  5. data/lib/sparql/algebra/aggregate.rb +1 -1
  6. data/lib/sparql/algebra/evaluatable.rb +4 -4
  7. data/lib/sparql/algebra/expression.rb +4 -1
  8. data/lib/sparql/algebra/extensions.rb +96 -29
  9. data/lib/sparql/algebra/operator/abs.rb +23 -3
  10. data/lib/sparql/algebra/operator/add.rb +21 -2
  11. data/lib/sparql/algebra/operator/alt.rb +26 -2
  12. data/lib/sparql/algebra/operator/and.rb +25 -3
  13. data/lib/sparql/algebra/operator/asc.rb +20 -1
  14. data/lib/sparql/algebra/operator/ask.rb +17 -1
  15. data/lib/sparql/algebra/operator/avg.rb +18 -2
  16. data/lib/sparql/algebra/operator/base.rb +18 -1
  17. data/lib/sparql/algebra/operator/bgp.rb +5 -1
  18. data/lib/sparql/algebra/operator/bnode.rb +34 -11
  19. data/lib/sparql/algebra/operator/bound.rb +22 -1
  20. data/lib/sparql/algebra/operator/ceil.rb +26 -3
  21. data/lib/sparql/algebra/operator/clear.rb +16 -2
  22. data/lib/sparql/algebra/operator/coalesce.rb +33 -11
  23. data/lib/sparql/algebra/operator/compare.rb +48 -33
  24. data/lib/sparql/algebra/operator/concat.rb +26 -2
  25. data/lib/sparql/algebra/operator/construct.rb +31 -7
  26. data/lib/sparql/algebra/operator/contains.rb +25 -3
  27. data/lib/sparql/algebra/operator/copy.rb +19 -2
  28. data/lib/sparql/algebra/operator/count.rb +18 -2
  29. data/lib/sparql/algebra/operator/create.rb +19 -2
  30. data/lib/sparql/algebra/operator/dataset.rb +17 -0
  31. data/lib/sparql/algebra/operator/datatype.rb +26 -7
  32. data/lib/sparql/algebra/operator/day.rb +24 -6
  33. data/lib/sparql/algebra/operator/delete.rb +27 -2
  34. data/lib/sparql/algebra/operator/delete_data.rb +23 -2
  35. data/lib/sparql/algebra/operator/delete_where.rb +24 -2
  36. data/lib/sparql/algebra/operator/desc.rb +20 -1
  37. data/lib/sparql/algebra/operator/describe.rb +27 -4
  38. data/lib/sparql/algebra/operator/distinct.rb +18 -1
  39. data/lib/sparql/algebra/operator/divide.rb +27 -3
  40. data/lib/sparql/algebra/operator/drop.rb +17 -2
  41. data/lib/sparql/algebra/operator/encode_for_uri.rb +25 -3
  42. data/lib/sparql/algebra/operator/equal.rb +13 -3
  43. data/lib/sparql/algebra/operator/exists.rb +28 -4
  44. data/lib/sparql/algebra/operator/exprlist.rb +12 -1
  45. data/lib/sparql/algebra/operator/extend.rb +33 -18
  46. data/lib/sparql/algebra/operator/filter.rb +27 -5
  47. data/lib/sparql/algebra/operator/floor.rb +26 -3
  48. data/lib/sparql/algebra/operator/graph.rb +13 -0
  49. data/lib/sparql/algebra/operator/greater_than.rb +14 -4
  50. data/lib/sparql/algebra/operator/greater_than_or_equal.rb +14 -4
  51. data/lib/sparql/algebra/operator/group.rb +34 -8
  52. data/lib/sparql/algebra/operator/group_concat.rb +20 -8
  53. data/lib/sparql/algebra/operator/hours.rb +24 -6
  54. data/lib/sparql/algebra/operator/if.rb +21 -4
  55. data/lib/sparql/algebra/operator/in.rb +18 -1
  56. data/lib/sparql/algebra/operator/insert.rb +22 -2
  57. data/lib/sparql/algebra/operator/insert_data.rb +23 -2
  58. data/lib/sparql/algebra/operator/iri.rb +22 -5
  59. data/lib/sparql/algebra/operator/is_blank.rb +20 -2
  60. data/lib/sparql/algebra/operator/is_iri.rb +20 -2
  61. data/lib/sparql/algebra/operator/is_literal.rb +20 -2
  62. data/lib/sparql/algebra/operator/is_numeric.rb +22 -4
  63. data/lib/sparql/algebra/operator/is_triple.rb +62 -0
  64. data/lib/sparql/algebra/operator/join.rb +22 -1
  65. data/lib/sparql/algebra/operator/lang.rb +26 -1
  66. data/lib/sparql/algebra/operator/lang_matches.rb +23 -2
  67. data/lib/sparql/algebra/operator/lcase.rb +24 -3
  68. data/lib/sparql/algebra/operator/left_join.rb +29 -1
  69. data/lib/sparql/algebra/operator/less_than.rb +14 -4
  70. data/lib/sparql/algebra/operator/less_than_or_equal.rb +14 -4
  71. data/lib/sparql/algebra/operator/load.rb +25 -2
  72. data/lib/sparql/algebra/operator/max.rb +18 -2
  73. data/lib/sparql/algebra/operator/md5.rb +23 -6
  74. data/lib/sparql/algebra/operator/min.rb +19 -3
  75. data/lib/sparql/algebra/operator/minus.rb +25 -7
  76. data/lib/sparql/algebra/operator/minutes.rb +24 -6
  77. data/lib/sparql/algebra/operator/modify.rb +41 -5
  78. data/lib/sparql/algebra/operator/month.rb +24 -6
  79. data/lib/sparql/algebra/operator/move.rb +20 -2
  80. data/lib/sparql/algebra/operator/multiply.rb +27 -4
  81. data/lib/sparql/algebra/operator/negate.rb +24 -4
  82. data/lib/sparql/algebra/operator/not.rb +25 -4
  83. data/lib/sparql/algebra/operator/not_equal.rb +16 -1
  84. data/lib/sparql/algebra/operator/notexists.rb +30 -6
  85. data/lib/sparql/algebra/operator/notin.rb +20 -3
  86. data/lib/sparql/algebra/operator/notoneof.rb +12 -2
  87. data/lib/sparql/algebra/operator/now.rb +25 -6
  88. data/lib/sparql/algebra/operator/object.rb +59 -0
  89. data/lib/sparql/algebra/operator/or.rb +26 -3
  90. data/lib/sparql/algebra/operator/order.rb +27 -2
  91. data/lib/sparql/algebra/operator/path.rb +29 -2
  92. data/lib/sparql/algebra/operator/path_opt.rb +21 -2
  93. data/lib/sparql/algebra/operator/path_plus.rb +21 -2
  94. data/lib/sparql/algebra/operator/path_star.rb +20 -2
  95. data/lib/sparql/algebra/operator/plus.rb +43 -4
  96. data/lib/sparql/algebra/operator/predicate.rb +59 -0
  97. data/lib/sparql/algebra/operator/prefix.rb +24 -3
  98. data/lib/sparql/algebra/operator/project.rb +51 -5
  99. data/lib/sparql/algebra/operator/rand.rb +31 -3
  100. data/lib/sparql/algebra/operator/reduced.rb +18 -1
  101. data/lib/sparql/algebra/operator/regex.rb +27 -19
  102. data/lib/sparql/algebra/operator/replace.rb +27 -7
  103. data/lib/sparql/algebra/operator/reverse.rb +20 -2
  104. data/lib/sparql/algebra/operator/round.rb +26 -3
  105. data/lib/sparql/algebra/operator/same_term.rb +25 -7
  106. data/lib/sparql/algebra/operator/sample.rb +31 -9
  107. data/lib/sparql/algebra/operator/seconds.rb +24 -6
  108. data/lib/sparql/algebra/operator/seq.rb +20 -2
  109. data/lib/sparql/algebra/operator/sequence.rb +0 -10
  110. data/lib/sparql/algebra/operator/sha1.rb +19 -2
  111. data/lib/sparql/algebra/operator/sha256.rb +19 -2
  112. data/lib/sparql/algebra/operator/sha384.rb +19 -2
  113. data/lib/sparql/algebra/operator/sha512.rb +19 -2
  114. data/lib/sparql/algebra/operator/slice.rb +27 -5
  115. data/lib/sparql/algebra/operator/str.rb +22 -2
  116. data/lib/sparql/algebra/operator/strafter.rb +26 -3
  117. data/lib/sparql/algebra/operator/strbefore.rb +26 -3
  118. data/lib/sparql/algebra/operator/strdt.rb +23 -2
  119. data/lib/sparql/algebra/operator/strends.rb +26 -4
  120. data/lib/sparql/algebra/operator/strlang.rb +26 -7
  121. data/lib/sparql/algebra/operator/strlen.rb +24 -3
  122. data/lib/sparql/algebra/operator/strstarts.rb +26 -3
  123. data/lib/sparql/algebra/operator/struuid.rb +30 -10
  124. data/lib/sparql/algebra/operator/subject.rb +61 -0
  125. data/lib/sparql/algebra/operator/substr.rb +24 -3
  126. data/lib/sparql/algebra/operator/subtract.rb +29 -3
  127. data/lib/sparql/algebra/operator/sum.rb +18 -2
  128. data/lib/sparql/algebra/operator/table.rb +42 -4
  129. data/lib/sparql/algebra/operator/timezone.rb +24 -6
  130. data/lib/sparql/algebra/operator/tz.rb +23 -6
  131. data/lib/sparql/algebra/operator/ucase.rb +24 -3
  132. data/lib/sparql/algebra/operator/union.rb +29 -6
  133. data/lib/sparql/algebra/operator/update.rb +25 -4
  134. data/lib/sparql/algebra/operator/using.rb +32 -2
  135. data/lib/sparql/algebra/operator/uuid.rb +28 -9
  136. data/lib/sparql/algebra/operator/with.rb +38 -4
  137. data/lib/sparql/algebra/operator/year.rb +24 -6
  138. data/lib/sparql/algebra/operator.rb +112 -7
  139. data/lib/sparql/algebra/sxp_extensions.rb +3 -3
  140. data/lib/sparql/grammar/meta.rb +5390 -2410
  141. data/lib/sparql/grammar/parser11.rb +119 -53
  142. data/lib/sparql/grammar/terminals11.rb +2 -0
  143. data/lib/sparql/grammar.rb +0 -25
  144. metadata +40 -34
@@ -3,8 +3,17 @@ 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)))
8
17
  #
9
18
  # @see https://www.w3.org/TR/sparql11-query/#defn_evalPP_inverse
10
19
  class Reverse < Operator::Unary
@@ -49,6 +58,15 @@ module SPARQL; module Algebra
49
58
  ), &block)
50
59
 
51
60
  end
61
+
62
+ ##
63
+ #
64
+ # Returns a partial SPARQL grammar for this operator.
65
+ #
66
+ # @return [String]
67
+ def to_sparql(**options)
68
+ "^" + operands.first.to_sparql(**options)
69
+ end
52
70
  end # Reverse
53
71
  end # Operator
54
72
  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
@@ -22,12 +36,21 @@ module SPARQL; module Algebra
22
36
  # the operand
23
37
  # @return [RDF::Literal] literal of same type
24
38
  # @raise [TypeError] if the operand is not a numeric value
25
- def apply(operand)
39
+ def apply(operand, **options)
26
40
  case operand
27
41
  when RDF::Literal::Numeric then operand.round
28
42
  else raise TypeError, "expected an RDF::Literal::Numeric, but got #{operand.inspect}"
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
@@ -26,7 +35,7 @@ module SPARQL; module Algebra
26
35
  # an RDF term
27
36
  # @return [RDF::Literal::Boolean] `true` or `false`
28
37
  # @raise [TypeError] if either operand is unbound
29
- def apply(term1, term2)
38
+ def apply(term1, term2, **options)
30
39
  RDF::Literal(term1.eql?(term2))
31
40
  end
32
41
 
@@ -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
@@ -31,9 +44,18 @@ module SPARQL; module Algebra
31
44
  # enum of evaluated operand
32
45
  # @return [RDF::Term] An arbitrary term
33
46
  # @raise [TypeError] If enum is empty
34
- def apply(enum)
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
+ "SAMPLE(#{operands.to_sparql(**options)})"
58
+ end
59
+ end # Sample
38
60
  end # Operator
39
61
  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
@@ -24,10 +33,19 @@ module SPARQL; module Algebra
24
33
  # the operand
25
34
  # @return [RDF::Literal]
26
35
  # @raise [TypeError] if the operand is not a simple literal
27
- def apply(operand)
36
+ def apply(operand, **options)
28
37
  raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
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
@@ -67,6 +76,15 @@ module SPARQL; module Algebra
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
@@ -6,16 +6,6 @@ module SPARQL; module Algebra
6
6
  #
7
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"))
19
9
  class Sequence < Operator
20
10
  include SPARQL::Algebra::Update
21
11
 
@@ -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)))
@@ -26,11 +34,20 @@ module SPARQL; module Algebra
26
34
  # the operand
27
35
  # @return [RDF::Literal]
28
36
  # @raise [TypeError] if the operand is not a simple literal
29
- def apply(operand)
37
+ def apply(operand, **options)
30
38
  raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
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)))
@@ -26,11 +34,20 @@ module SPARQL; module Algebra
26
34
  # the operand
27
35
  # @return [RDF::Literal]
28
36
  # @raise [TypeError] if the operand is not a simple literal
29
- def apply(operand)
37
+ def apply(operand, **options)
30
38
  raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
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)))
@@ -26,11 +34,20 @@ module SPARQL; module Algebra
26
34
  # the operand
27
35
  # @return [RDF::Literal]
28
36
  # @raise [TypeError] if the operand is not a simple literal
29
- def apply(operand)
37
+ def apply(operand, **options)
30
38
  raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
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)))
@@ -26,11 +34,20 @@ module SPARQL; module Algebra
26
34
  # the operand
27
35
  # @return [RDF::Literal]
28
36
  # @raise [TypeError] if the operand is not a simple literal
29
- def apply(operand)
37
+ def apply(operand, **options)
30
38
  raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
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
@@ -3,7 +3,18 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `str` operator.
5
5
  #
6
- # @example
6
+ # [121] BuiltInCall ::= ... | 'STR' '(' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
10
+ # PREFIX : <http://example.org/things#>
11
+ # SELECT ?x ?v
12
+ # WHERE
13
+ # { ?x :p ?v .
14
+ # FILTER ( str(?v) = "1" ) .
15
+ # }
16
+ #
17
+ # @example SSE
7
18
  # (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
8
19
  # (: <http://example.org/things#>))
9
20
  # (project (?x ?v)
@@ -23,13 +34,22 @@ module SPARQL; module Algebra
23
34
  # a literal or IRI
24
35
  # @return [RDF::Literal] a simple literal
25
36
  # @raise [TypeError] if the operand is not a literal or IRI
26
- def apply(term)
37
+ def apply(term, **options)
27
38
  case term
28
39
  when RDF::Literal then RDF::Literal(term.value)
29
40
  when RDF::URI then RDF::Literal(term.to_s)
30
41
  else raise TypeError, "expected an RDF::Literal or RDF::URI, but got #{term.inspect}"
31
42
  end
32
43
  end
44
+
45
+ ##
46
+ #
47
+ # Returns a partial SPARQL grammar for this operator.
48
+ #
49
+ # @return [String]
50
+ def to_sparql(**options)
51
+ "str(" + operands.first.to_sparql(**options) + ")"
52
+ end
33
53
  end # Str
34
54
  end # Operator
35
55
  end; end # SPARQL::Algebra
@@ -3,8 +3,22 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # A SPARQL `strafter` operator.
5
5
  #
6
- # @example
7
- # (strafter ?x ?y)
6
+ # [121] BuiltInCall ::= ... | 'STRAFTER' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT ?s (STRAFTER(?str,"e") AS ?suffix) WHERE {
12
+ # ?s :str ?str
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (prefix
17
+ # ((: <http://example.org/>)
18
+ # (xsd: <http://www.w3.org/2001/XMLSchema#>))
19
+ # (project (?s ?suffix)
20
+ # (extend ((?suffix (strafter ?str "e")))
21
+ # (bgp (triple ?s :str ?str)))))
8
22
  #
9
23
  # @see https://www.w3.org/TR/sparql11-query/#func-strafter
10
24
  # @see https://www.w3.org/TR/xpath-functions/#func-substring-after
@@ -37,7 +51,7 @@ module SPARQL; module Algebra
37
51
  # a literal
38
52
  # @return [RDF::Literal]
39
53
  # @raise [TypeError] if operands are not compatible
40
- def apply(left, right)
54
+ def apply(left, right, **options)
41
55
  case
42
56
  when !left.compatible?(right)
43
57
  raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
@@ -52,6 +66,15 @@ module SPARQL; module Algebra
52
66
  RDF::Literal(parts.last, datatype: left.datatype, language: left.language)
53
67
  end
54
68
  end
69
+
70
+ ##
71
+ #
72
+ # Returns a partial SPARQL grammar for this operator.
73
+ #
74
+ # @return [String]
75
+ def to_sparql(**options)
76
+ "STRAFTER(" + operands.to_sparql(delimiter: ', ', **options) + ")"
77
+ end
55
78
  end # StrAfter
56
79
  end # Operator
57
80
  end; end # SPARQL::Algebra
@@ -3,8 +3,22 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # A SPARQL `strbefore` operator.
5
5
  #
6
- # @example
7
- # (strbefore ?x ?y)
6
+ # [121] BuiltInCall ::= ... | 'STRBEFORE' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT ?s (STRBEFORE(?str,"s") AS ?prefix) WHERE {
12
+ # ?s :str ?str
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (prefix
17
+ # ((: <http://example.org/>)
18
+ # (xsd: <http://www.w3.org/2001/XMLSchema#>))
19
+ # (project (?s ?prefix)
20
+ # (extend ((?prefix (strbefore ?str "s")))
21
+ # (bgp (triple ?s :str ?str)))))
8
22
  #
9
23
  # @see https://www.w3.org/TR/sparql11-query/#func-strbefore
10
24
  # @see https://www.w3.org/TR/xpath-functions/#func-substring-before
@@ -37,7 +51,7 @@ module SPARQL; module Algebra
37
51
  # a literal
38
52
  # @return [RDF::Literal]
39
53
  # @raise [TypeError] if operands are not compatible
40
- def apply(left, right)
54
+ def apply(left, right, **options)
41
55
  case
42
56
  when !left.plain? || !right.plain?
43
57
  raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
@@ -54,6 +68,15 @@ module SPARQL; module Algebra
54
68
  RDF::Literal(parts.first, language: left.language, datatype: left.datatype)
55
69
  end
56
70
  end
71
+
72
+ ##
73
+ #
74
+ # Returns a partial SPARQL grammar for this operator.
75
+ #
76
+ # @return [String]
77
+ def to_sparql(**options)
78
+ "STRBEFORE(" + operands.to_sparql(delimiter: ', ', **options) + ")"
79
+ end
57
80
  end # StrBefore
58
81
  end # Operator
59
82
  end; end # SPARQL::Algebra