sparql 3.0.0 → 3.1.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.
- checksums.yaml +5 -5
- data/README.md +184 -70
- data/UNLICENSE +1 -1
- data/VERSION +1 -1
- data/bin/sparql +28 -17
- data/lib/rack/sparql.rb +1 -1
- data/lib/rack/sparql/conneg.rb +3 -3
- data/lib/sinatra/sparql.rb +5 -5
- data/lib/sparql.rb +14 -10
- data/lib/sparql/algebra.rb +15 -23
- data/lib/sparql/algebra/aggregate.rb +4 -4
- data/lib/sparql/algebra/evaluatable.rb +2 -2
- data/lib/sparql/algebra/expression.rb +28 -21
- data/lib/sparql/algebra/extensions.rb +142 -16
- data/lib/sparql/algebra/operator.rb +37 -16
- data/lib/sparql/algebra/operator/abs.rb +2 -2
- data/lib/sparql/algebra/operator/add.rb +3 -3
- data/lib/sparql/algebra/operator/alt.rb +4 -4
- data/lib/sparql/algebra/operator/and.rb +7 -7
- data/lib/sparql/algebra/operator/asc.rb +3 -3
- data/lib/sparql/algebra/operator/ask.rb +4 -14
- data/lib/sparql/algebra/operator/avg.rb +6 -4
- data/lib/sparql/algebra/operator/base.rb +10 -10
- data/lib/sparql/algebra/operator/bgp.rb +1 -1
- data/lib/sparql/algebra/operator/bnode.rb +5 -5
- data/lib/sparql/algebra/operator/bound.rb +3 -3
- data/lib/sparql/algebra/operator/ceil.rb +2 -2
- data/lib/sparql/algebra/operator/clear.rb +3 -3
- data/lib/sparql/algebra/operator/coalesce.rb +3 -13
- data/lib/sparql/algebra/operator/compare.rb +8 -8
- data/lib/sparql/algebra/operator/concat.rb +4 -4
- data/lib/sparql/algebra/operator/construct.rb +4 -14
- data/lib/sparql/algebra/operator/contains.rb +2 -2
- data/lib/sparql/algebra/operator/copy.rb +3 -3
- data/lib/sparql/algebra/operator/count.rb +3 -3
- data/lib/sparql/algebra/operator/create.rb +3 -3
- data/lib/sparql/algebra/operator/dataset.rb +5 -16
- data/lib/sparql/algebra/operator/datatype.rb +1 -1
- data/lib/sparql/algebra/operator/day.rb +1 -1
- data/lib/sparql/algebra/operator/delete.rb +7 -5
- data/lib/sparql/algebra/operator/delete_data.rb +3 -3
- data/lib/sparql/algebra/operator/delete_where.rb +5 -5
- data/lib/sparql/algebra/operator/desc.rb +1 -1
- data/lib/sparql/algebra/operator/describe.rb +3 -13
- data/lib/sparql/algebra/operator/distinct.rb +4 -14
- data/lib/sparql/algebra/operator/divide.rb +1 -1
- data/lib/sparql/algebra/operator/drop.rb +3 -3
- data/lib/sparql/algebra/operator/encode_for_uri.rb +3 -3
- data/lib/sparql/algebra/operator/equal.rb +3 -3
- data/lib/sparql/algebra/operator/exists.rb +5 -5
- data/lib/sparql/algebra/operator/exprlist.rb +3 -13
- data/lib/sparql/algebra/operator/extend.rb +21 -20
- data/lib/sparql/algebra/operator/filter.rb +6 -16
- data/lib/sparql/algebra/operator/floor.rb +2 -2
- data/lib/sparql/algebra/operator/graph.rb +5 -16
- data/lib/sparql/algebra/operator/greater_than.rb +5 -5
- data/lib/sparql/algebra/operator/greater_than_or_equal.rb +5 -5
- data/lib/sparql/algebra/operator/group.rb +25 -25
- data/lib/sparql/algebra/operator/group_concat.rb +6 -6
- data/lib/sparql/algebra/operator/hours.rb +1 -1
- data/lib/sparql/algebra/operator/if.rb +5 -15
- data/lib/sparql/algebra/operator/in.rb +4 -14
- data/lib/sparql/algebra/operator/insert.rb +6 -4
- data/lib/sparql/algebra/operator/insert_data.rb +3 -3
- data/lib/sparql/algebra/operator/iri.rb +1 -1
- data/lib/sparql/algebra/operator/is_blank.rb +1 -1
- data/lib/sparql/algebra/operator/is_iri.rb +1 -1
- data/lib/sparql/algebra/operator/is_literal.rb +1 -1
- data/lib/sparql/algebra/operator/is_numeric.rb +1 -1
- data/lib/sparql/algebra/operator/join.rb +12 -10
- data/lib/sparql/algebra/operator/lang.rb +1 -1
- data/lib/sparql/algebra/operator/lang_matches.rb +3 -3
- data/lib/sparql/algebra/operator/lcase.rb +2 -2
- data/lib/sparql/algebra/operator/left_join.rb +15 -12
- data/lib/sparql/algebra/operator/less_than.rb +5 -5
- data/lib/sparql/algebra/operator/less_than_or_equal.rb +5 -5
- data/lib/sparql/algebra/operator/load.rb +3 -3
- data/lib/sparql/algebra/operator/max.rb +6 -4
- data/lib/sparql/algebra/operator/md5.rb +1 -1
- data/lib/sparql/algebra/operator/min.rb +6 -4
- data/lib/sparql/algebra/operator/minus.rb +12 -11
- data/lib/sparql/algebra/operator/minutes.rb +1 -1
- data/lib/sparql/algebra/operator/modify.rb +4 -4
- data/lib/sparql/algebra/operator/month.rb +1 -1
- data/lib/sparql/algebra/operator/move.rb +3 -3
- data/lib/sparql/algebra/operator/multiply.rb +1 -1
- data/lib/sparql/algebra/operator/negate.rb +1 -1
- data/lib/sparql/algebra/operator/not.rb +1 -1
- data/lib/sparql/algebra/operator/not_equal.rb +2 -2
- data/lib/sparql/algebra/operator/notexists.rb +4 -4
- data/lib/sparql/algebra/operator/notin.rb +4 -14
- data/lib/sparql/algebra/operator/notoneof.rb +5 -6
- data/lib/sparql/algebra/operator/now.rb +1 -1
- data/lib/sparql/algebra/operator/or.rb +7 -7
- data/lib/sparql/algebra/operator/order.rb +6 -16
- data/lib/sparql/algebra/operator/path.rb +6 -5
- data/lib/sparql/algebra/operator/path_opt.rb +16 -16
- data/lib/sparql/algebra/operator/path_plus.rb +8 -8
- data/lib/sparql/algebra/operator/path_star.rb +4 -4
- data/lib/sparql/algebra/operator/plus.rb +3 -3
- data/lib/sparql/algebra/operator/prefix.rb +10 -10
- data/lib/sparql/algebra/operator/project.rb +4 -14
- data/lib/sparql/algebra/operator/rand.rb +1 -1
- data/lib/sparql/algebra/operator/reduced.rb +4 -14
- data/lib/sparql/algebra/operator/regex.rb +6 -6
- data/lib/sparql/algebra/operator/replace.rb +4 -4
- data/lib/sparql/algebra/operator/reverse.rb +4 -4
- data/lib/sparql/algebra/operator/round.rb +2 -2
- data/lib/sparql/algebra/operator/same_term.rb +8 -5
- data/lib/sparql/algebra/operator/sample.rb +3 -3
- data/lib/sparql/algebra/operator/seconds.rb +1 -1
- data/lib/sparql/algebra/operator/seq.rb +5 -6
- data/lib/sparql/algebra/operator/sequence.rb +4 -4
- data/lib/sparql/algebra/operator/sha1.rb +1 -1
- data/lib/sparql/algebra/operator/sha256.rb +1 -1
- data/lib/sparql/algebra/operator/sha384.rb +1 -1
- data/lib/sparql/algebra/operator/sha512.rb +1 -1
- data/lib/sparql/algebra/operator/slice.rb +4 -14
- data/lib/sparql/algebra/operator/str.rb +1 -1
- data/lib/sparql/algebra/operator/strafter.rb +2 -2
- data/lib/sparql/algebra/operator/strbefore.rb +2 -2
- data/lib/sparql/algebra/operator/strdt.rb +2 -2
- data/lib/sparql/algebra/operator/strends.rb +2 -2
- data/lib/sparql/algebra/operator/strlang.rb +2 -2
- data/lib/sparql/algebra/operator/strlen.rb +2 -2
- data/lib/sparql/algebra/operator/strstarts.rb +2 -2
- data/lib/sparql/algebra/operator/struuid.rb +1 -1
- data/lib/sparql/algebra/operator/substr.rb +4 -4
- data/lib/sparql/algebra/operator/subtract.rb +1 -1
- data/lib/sparql/algebra/operator/sum.rb +6 -4
- data/lib/sparql/algebra/operator/table.rb +6 -4
- data/lib/sparql/algebra/operator/timezone.rb +1 -1
- data/lib/sparql/algebra/operator/tz.rb +1 -1
- data/lib/sparql/algebra/operator/ucase.rb +2 -2
- data/lib/sparql/algebra/operator/union.rb +10 -9
- data/lib/sparql/algebra/operator/update.rb +4 -4
- data/lib/sparql/algebra/operator/using.rb +4 -4
- data/lib/sparql/algebra/operator/uuid.rb +1 -1
- data/lib/sparql/algebra/operator/with.rb +6 -6
- data/lib/sparql/algebra/operator/year.rb +1 -1
- data/lib/sparql/algebra/query.rb +2 -2
- data/lib/sparql/algebra/update.rb +2 -2
- data/lib/sparql/algebra/version.rb +1 -1
- data/lib/sparql/extensions.rb +5 -5
- data/lib/sparql/grammar.rb +111 -11
- data/lib/sparql/grammar/meta.rb +1372 -333
- data/lib/sparql/grammar/parser11.rb +56 -42
- data/lib/sparql/grammar/terminals11.rb +1 -0
- data/lib/sparql/results.rb +63 -44
- data/lib/sparql/version.rb +1 -1
- metadata +40 -47
@@ -146,8 +146,6 @@ module SPARQL; module Algebra
|
|
146
146
|
autoload :Using, 'sparql/algebra/operator/using'
|
147
147
|
autoload :With, 'sparql/algebra/operator/with'
|
148
148
|
|
149
|
-
|
150
|
-
|
151
149
|
##
|
152
150
|
# Returns an operator class for the given operator `name`.
|
153
151
|
#
|
@@ -331,7 +329,7 @@ module SPARQL; module Algebra
|
|
331
329
|
# @overload initialize(*operands)
|
332
330
|
# @param [Array<RDF::Term>] operands
|
333
331
|
#
|
334
|
-
# @overload initialize(*operands, options)
|
332
|
+
# @overload initialize(*operands, **options)
|
335
333
|
# @param [Array<RDF::Term>] operands
|
336
334
|
# @param [Hash{Symbol => Object}] options
|
337
335
|
# any additional options
|
@@ -357,6 +355,22 @@ module SPARQL; module Algebra
|
|
357
355
|
end
|
358
356
|
end
|
359
357
|
|
358
|
+
##
|
359
|
+
# Deep duplicate operands
|
360
|
+
def deep_dup
|
361
|
+
self.class.new(*operands.map(&:deep_dup))
|
362
|
+
end
|
363
|
+
|
364
|
+
##
|
365
|
+
# Binds the pattern to a solution, making it no longer variable if all variables are resolved to bound variables
|
366
|
+
#
|
367
|
+
# @param [RDF::Query::Solution] solution
|
368
|
+
# @return [self]
|
369
|
+
def bind(solution)
|
370
|
+
@operands.each {|op| op.bind(solution)}
|
371
|
+
self
|
372
|
+
end
|
373
|
+
|
360
374
|
##
|
361
375
|
# Base URI used for reading data sources with relative URIs
|
362
376
|
#
|
@@ -434,7 +448,7 @@ module SPARQL; module Algebra
|
|
434
448
|
# @return [Boolean] `true` or `false`
|
435
449
|
# @see #constant?
|
436
450
|
def variable?
|
437
|
-
operands.any?(
|
451
|
+
operands.any? {|op| op.respond_to?(:variable?) && op.variable?}
|
438
452
|
end
|
439
453
|
|
440
454
|
##
|
@@ -491,23 +505,37 @@ module SPARQL; module Algebra
|
|
491
505
|
#
|
492
506
|
# For constant expressions containing no variables, returns the result
|
493
507
|
# of evaluating the expression with empty bindings; otherwise returns
|
494
|
-
# `self`.
|
508
|
+
# a copy of `self`.
|
495
509
|
#
|
496
510
|
# Optimization is not possible if the expression raises an exception,
|
497
511
|
# such as a `TypeError` or `ZeroDivisionError`, which must be conserved
|
498
512
|
# at runtime.
|
499
513
|
#
|
500
514
|
# @return [SPARQL::Algebra::Expression]
|
501
|
-
|
515
|
+
# @see RDF::Query#optimize
|
516
|
+
def optimize(**options)
|
502
517
|
if constant?
|
503
518
|
# Note that if evaluation results in a `TypeError` or other error,
|
504
519
|
# we must return `self` so that the error is conserved at runtime:
|
505
520
|
evaluate(RDF::Query::Solution.new) rescue self
|
506
521
|
else
|
507
|
-
super # returns `self`
|
522
|
+
super # returns a copy of `self`
|
508
523
|
end
|
509
524
|
end
|
510
525
|
|
526
|
+
##
|
527
|
+
# Optimizes this query by optimizing its constituent operands
|
528
|
+
# according to their cost estimates.
|
529
|
+
#
|
530
|
+
# @return [self]
|
531
|
+
# @see RDF::Query#optimize!
|
532
|
+
def optimize!(**options)
|
533
|
+
@operands.map! do |op|
|
534
|
+
op.optimize(**options) if op.respond_to?(:optimize)
|
535
|
+
end
|
536
|
+
self
|
537
|
+
end
|
538
|
+
|
511
539
|
##
|
512
540
|
# Rewrite operands by yielding each operand. Recursively descends
|
513
541
|
# through operands implementing this method.
|
@@ -532,7 +560,7 @@ module SPARQL; module Algebra
|
|
532
560
|
# Returns the SPARQL S-Expression (SSE) representation of this operator.
|
533
561
|
#
|
534
562
|
# @return [Array]
|
535
|
-
# @see
|
563
|
+
# @see https://openjena.org/wiki/SSE
|
536
564
|
def to_sxp_bin
|
537
565
|
operator = [self.class.const_get(:NAME)].flatten.first
|
538
566
|
[operator, *(operands || []).map(&:to_sxp_bin)]
|
@@ -543,13 +571,6 @@ module SPARQL; module Algebra
|
|
543
571
|
#
|
544
572
|
# @return [String]
|
545
573
|
def to_sxp
|
546
|
-
begin
|
547
|
-
require 'sxp' # @see http://rubygems.org/gems/sxp
|
548
|
-
rescue LoadError
|
549
|
-
abort "SPARQL::Algebra::Operator#to_sxp requires the SXP gem (hint: `gem install sxp')."
|
550
|
-
end
|
551
|
-
require 'sparql/algebra/sxp_extensions'
|
552
|
-
|
553
574
|
to_sxp_bin.to_sxp
|
554
575
|
end
|
555
576
|
|
@@ -647,7 +668,7 @@ module SPARQL; module Algebra
|
|
647
668
|
# @param [RDF::Literal] literal
|
648
669
|
# @return [RDF::Literal::Boolean] `true` or `false`
|
649
670
|
# @raise [TypeError] if the literal could not be coerced to an `RDF::Literal::Boolean`
|
650
|
-
# @see
|
671
|
+
# @see https://www.w3.org/TR/sparql11-query/#ebv
|
651
672
|
def boolean(literal)
|
652
673
|
case literal
|
653
674
|
when FalseClass then RDF::Literal::FALSE
|
@@ -6,8 +6,8 @@ module SPARQL; module Algebra
|
|
6
6
|
# @example
|
7
7
|
# (abs ?x)
|
8
8
|
#
|
9
|
-
# @see
|
10
|
-
# @see
|
9
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-abs
|
10
|
+
# @see https://www.w3.org/TR/xpath-functions/#func-abs
|
11
11
|
class Abs < Operator::Unary
|
12
12
|
include Evaluatable
|
13
13
|
|
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
|
|
9
9
|
# @example
|
10
10
|
# (add default <a>)
|
11
11
|
#
|
12
|
-
# @see
|
12
|
+
# @see https://www.w3.org/TR/sparql11-update/#add
|
13
13
|
class Add < 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
|
32
|
-
def execute(queryable, options
|
31
|
+
# @see https://www.w3.org/TR/sparql11-update/
|
32
|
+
def execute(queryable, **options)
|
33
33
|
debug(options) {"Add"}
|
34
34
|
silent = operands.first == :silent
|
35
35
|
operands.shift if silent
|
@@ -10,7 +10,7 @@ module SPARQL; module Algebra
|
|
10
10
|
# @example
|
11
11
|
# (alt a b)
|
12
12
|
#
|
13
|
-
# @see
|
13
|
+
# @see https://www.w3.org/TR/sparql11-query/#defn_evalPP_alternative
|
14
14
|
class Alt < Operator::Binary
|
15
15
|
include Query
|
16
16
|
|
@@ -32,8 +32,8 @@ module SPARQL; module Algebra
|
|
32
32
|
# each matching solution
|
33
33
|
# @yieldparam [RDF::Query::Solution] solution
|
34
34
|
# @yieldreturn [void] ignored
|
35
|
-
# @see
|
36
|
-
def execute(queryable, options
|
35
|
+
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
36
|
+
def execute(queryable, **options, &block)
|
37
37
|
subject, object = options[:subject], options[:object]
|
38
38
|
debug(options) {"Alt #{[subject, operands, object].to_sse}"}
|
39
39
|
|
@@ -55,7 +55,7 @@ module SPARQL; module Algebra
|
|
55
55
|
end
|
56
56
|
|
57
57
|
query = Union.new(qa, qb)
|
58
|
-
queryable.query(query,
|
58
|
+
queryable.query(query, depth: options[:depth].to_i + 1, **options, &block)
|
59
59
|
end
|
60
60
|
end # Alt
|
61
61
|
end # Operator
|
@@ -7,8 +7,8 @@ module SPARQL; module Algebra
|
|
7
7
|
# (&& ?x ?y)
|
8
8
|
# (and ?x ?y)
|
9
9
|
#
|
10
|
-
# @see
|
11
|
-
# @see
|
10
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-logical-and
|
11
|
+
# @see https://www.w3.org/TR/sparql11-query/#evaluation
|
12
12
|
class And < Operator::Binary
|
13
13
|
include Evaluatable
|
14
14
|
|
@@ -24,7 +24,7 @@ module SPARQL; module Algebra
|
|
24
24
|
# @param [Hash{Symbol => Object}] options
|
25
25
|
# any additional options (see {Operator#initialize})
|
26
26
|
# @raise [TypeError] if any operand is invalid
|
27
|
-
def initialize(left, right, options
|
27
|
+
def initialize(left, right, **options)
|
28
28
|
super
|
29
29
|
end
|
30
30
|
|
@@ -37,20 +37,20 @@ module SPARQL; module Algebra
|
|
37
37
|
# options passed from query
|
38
38
|
# @return [RDF::Literal::Boolean] `true` or `false`
|
39
39
|
# @raise [TypeError] if the operands could not be coerced to boolean literals
|
40
|
-
def evaluate(bindings, options
|
40
|
+
def evaluate(bindings, **options)
|
41
41
|
begin
|
42
|
-
left = boolean(operand(0).evaluate(bindings,
|
42
|
+
left = boolean(operand(0).evaluate(bindings, depth: options[:depth].to_i + 1, **options)).true?
|
43
43
|
rescue TypeError
|
44
44
|
left = nil
|
45
45
|
end
|
46
46
|
|
47
47
|
begin
|
48
|
-
right = boolean(operand(1).evaluate(bindings,
|
48
|
+
right = boolean(operand(1).evaluate(bindings, depth: options[:depth].to_i + 1, **options)).true?
|
49
49
|
rescue TypeError
|
50
50
|
right = nil
|
51
51
|
end
|
52
52
|
|
53
|
-
# From
|
53
|
+
# From https://www.w3.org/TR/sparql11-query/#evaluation
|
54
54
|
# A logical-and that encounters an error on only one branch will return an error if the other branch is
|
55
55
|
# TRUE and FALSE if the other branch is FALSE.
|
56
56
|
case
|
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
|
|
9
9
|
# (order ((asc ?name))
|
10
10
|
# (bgp (triple ?x foaf:name ?name)))))
|
11
11
|
#
|
12
|
-
# @see
|
12
|
+
# @see https://www.w3.org/TR/sparql11-query/#modOrderBy
|
13
13
|
class Asc < Operator::Unary
|
14
14
|
include Evaluatable
|
15
15
|
|
@@ -24,8 +24,8 @@ module SPARQL; module Algebra
|
|
24
24
|
# @param [Hash{Symbol => Object}] options ({})
|
25
25
|
# options passed from query
|
26
26
|
# @return [RDF::Term]
|
27
|
-
def evaluate(bindings, options
|
28
|
-
operand(0).evaluate(bindings,
|
27
|
+
def evaluate(bindings, **options)
|
28
|
+
operand(0).evaluate(bindings, depth: options[:depth].to_i + 1, **options)
|
29
29
|
end
|
30
30
|
end # Asc
|
31
31
|
end # Operator
|
@@ -10,7 +10,7 @@ module SPARQL; module Algebra
|
|
10
10
|
# (ask
|
11
11
|
# (bgp (triple :x :p ?x))))
|
12
12
|
#
|
13
|
-
# @see
|
13
|
+
# @see https://www.w3.org/TR/sparql11-query/#ask
|
14
14
|
class Ask < Operator::Unary
|
15
15
|
include Query
|
16
16
|
|
@@ -28,23 +28,13 @@ module SPARQL; module Algebra
|
|
28
28
|
# @yieldparam [RDF::Query::Solution] solution
|
29
29
|
# @yieldreturn [void] ignored
|
30
30
|
# @return [RDF::Literal::Boolean]\
|
31
|
-
# @see
|
32
|
-
def execute(queryable, options
|
31
|
+
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
32
|
+
def execute(queryable, **options)
|
33
33
|
debug(options) {"Ask #{operands.first}"}
|
34
|
-
res = boolean(!queryable.query(operands.last,
|
34
|
+
res = boolean(!queryable.query(operands.last, depth: options[:depth].to_i + 1, **options).empty?)
|
35
35
|
yield res if block_given?
|
36
36
|
res
|
37
37
|
end
|
38
|
-
|
39
|
-
##
|
40
|
-
# Returns an optimized version of this query.
|
41
|
-
#
|
42
|
-
# Return optimized query
|
43
|
-
#
|
44
|
-
# @return [Union, RDF::Query] `self`
|
45
|
-
def optimize
|
46
|
-
operands = operands.map(&:optimize)
|
47
|
-
end
|
48
38
|
|
49
39
|
# Query results in a boolean result (e.g., ASK)
|
50
40
|
# @return [Boolean]
|
@@ -6,12 +6,12 @@ module SPARQL; module Algebra
|
|
6
6
|
# @example
|
7
7
|
# (prefix ((: <http://www.example.org/>))
|
8
8
|
# (project (?avg)
|
9
|
-
# (extend ((?avg
|
10
|
-
# (group () ((
|
9
|
+
# (extend ((?avg ??.0))
|
10
|
+
# (group () ((??.0 (avg ?o)))
|
11
11
|
# (bgp (triple ?s :dec ?o))))))
|
12
12
|
#
|
13
|
-
# @see
|
14
|
-
class Avg < Operator
|
13
|
+
# @see https://www.w3.org/TR/sparql11-query/#defn_aggAvg
|
14
|
+
class Avg < Operator
|
15
15
|
include Aggregate
|
16
16
|
|
17
17
|
NAME = :avg
|
@@ -23,6 +23,8 @@ module SPARQL; module Algebra
|
|
23
23
|
# enum of evaluated operand
|
24
24
|
# @return [RDF::Literal::Numeric] The numeric average of the terms
|
25
25
|
def apply(enum)
|
26
|
+
# FIXME: we don't actually do anything with distinct
|
27
|
+
operands.shift if distinct = (operands.first == :distinct)
|
26
28
|
if enum.empty?
|
27
29
|
RDF::Literal(0)
|
28
30
|
elsif enum.flatten.all? {|n| n.is_a?(RDF::Literal::Numeric)}
|
@@ -7,7 +7,7 @@ module SPARQL; module Algebra
|
|
7
7
|
# (base <http://example.org/>
|
8
8
|
# (bgp (triple <a> <b> 123.0)))
|
9
9
|
#
|
10
|
-
# @see
|
10
|
+
# @see https://www.w3.org/TR/sparql11-query/#QSynIRI
|
11
11
|
class Base < Binary
|
12
12
|
include Query
|
13
13
|
|
@@ -28,21 +28,21 @@ module SPARQL; module Algebra
|
|
28
28
|
# @yieldreturn [void] ignored
|
29
29
|
# @return [RDF::Queryable, RDF::Query::Solutions]
|
30
30
|
# the resulting solution sequence
|
31
|
-
# @see
|
32
|
-
def execute(queryable, options
|
31
|
+
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
32
|
+
def execute(queryable, **options, &block)
|
33
33
|
debug(options) {"Base #{operands.first}"}
|
34
34
|
Operator.base_uri = operands.first
|
35
|
-
queryable.query(operands.last,
|
35
|
+
queryable.query(operands.last, depth: options[:depth].to_i + 1, **options, &block)
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
##
|
39
|
-
# Returns an optimized version of this query.
|
40
|
-
#
|
41
39
|
# Return optimized query
|
42
40
|
#
|
43
|
-
# @return [
|
44
|
-
|
45
|
-
|
41
|
+
# @return [Base] a copy of `self`
|
42
|
+
# @see SPARQL::Algebra::Expression#optimize
|
43
|
+
def optimize(**options)
|
44
|
+
Operator.base_uri = operands.first
|
45
|
+
operands.last.optimize(**options)
|
46
46
|
end
|
47
47
|
|
48
48
|
# Query results in a boolean result (e.g., ASK)
|
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
|
|
9
9
|
# (prefix ((: <http://example/>))
|
10
10
|
# (bgp (triple ?s ?p ?o)))
|
11
11
|
#
|
12
|
-
# @see
|
12
|
+
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
13
13
|
class BGP < Operator
|
14
14
|
NAME = [:bgp]
|
15
15
|
##
|
@@ -16,7 +16,7 @@ module SPARQL; module Algebra
|
|
16
16
|
# (triple ?b :str ?s2)
|
17
17
|
# )))))
|
18
18
|
#
|
19
|
-
# @see
|
19
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-bnode
|
20
20
|
class BNode < Operator::Unary
|
21
21
|
include Evaluatable
|
22
22
|
|
@@ -30,7 +30,7 @@ module SPARQL; module Algebra
|
|
30
30
|
# @param [Hash{Symbol => Object}] options
|
31
31
|
# any additional options (see {Operator#initialize})
|
32
32
|
# @raise [TypeError] if any operand is invalid
|
33
|
-
def initialize(literal = false, options
|
33
|
+
def initialize(literal = false, **options)
|
34
34
|
super
|
35
35
|
end
|
36
36
|
|
@@ -42,8 +42,8 @@ module SPARQL; module Algebra
|
|
42
42
|
# @param [Hash{Symbol => Object}] options ({})
|
43
43
|
# options passed from query
|
44
44
|
# @return [RDF::Term]
|
45
|
-
def evaluate(bindings, options
|
46
|
-
args = operands.map { |operand| operand.evaluate(bindings,
|
45
|
+
def evaluate(bindings, **options)
|
46
|
+
args = operands.map { |operand| operand.evaluate(bindings, depth: options[:depth].to_i + 1, **options) }
|
47
47
|
apply(args.first, bindings)
|
48
48
|
end
|
49
49
|
|
@@ -82,7 +82,7 @@ module SPARQL; module Algebra
|
|
82
82
|
# Remove the optional argument.
|
83
83
|
#
|
84
84
|
# @return [Array] `self`
|
85
|
-
# @see
|
85
|
+
# @see https://openjena.org/wiki/SSE
|
86
86
|
def to_sxp_bin
|
87
87
|
[NAME] + operands.reject {|o| o == false}
|
88
88
|
end
|
@@ -11,7 +11,7 @@ module SPARQL; module Algebra
|
|
11
11
|
# (bgp (triple ?a :b ?c))
|
12
12
|
# (bgp (triple ?c :d ?e))))))
|
13
13
|
#
|
14
|
-
# @see
|
14
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-bound
|
15
15
|
class Bound < Operator::Unary
|
16
16
|
include Evaluatable
|
17
17
|
|
@@ -25,7 +25,7 @@ module SPARQL; module Algebra
|
|
25
25
|
# @param [Hash{Symbol => Object}] options
|
26
26
|
# any additional options (see {Operator#initialize})
|
27
27
|
# @raise [TypeError] if any operand is invalid
|
28
|
-
def initialize(var, options
|
28
|
+
def initialize(var, **options)
|
29
29
|
super
|
30
30
|
end
|
31
31
|
|
@@ -38,7 +38,7 @@ module SPARQL; module Algebra
|
|
38
38
|
# options passed from query
|
39
39
|
# @return [RDF::Literal::Boolean] `true` or `false`
|
40
40
|
# @raise [TypeError] if the operand is not a variable
|
41
|
-
def evaluate(bindings, options
|
41
|
+
def evaluate(bindings, **options)
|
42
42
|
case var = operand
|
43
43
|
when Variable
|
44
44
|
bindings.respond_to?(:bound?) && bindings.bound?(var) ?
|
@@ -6,8 +6,8 @@ module SPARQL; module Algebra
|
|
6
6
|
# @example
|
7
7
|
# (ceil ?x)
|
8
8
|
#
|
9
|
-
# @see
|
10
|
-
# @see
|
9
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-ceil
|
10
|
+
# @see https://www.w3.org/TR/xpath-functions/#func-ceil
|
11
11
|
class Ceil < Operator::Unary
|
12
12
|
include Evaluatable
|
13
13
|
|
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
|
|
9
9
|
# @example
|
10
10
|
# (clear silent default)
|
11
11
|
#
|
12
|
-
# @see
|
12
|
+
# @see https://www.w3.org/TR/sparql11-update/#clear
|
13
13
|
class Clear < 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
|
32
|
-
def execute(queryable, options
|
31
|
+
# @see https://www.w3.org/TR/sparql11-update/
|
32
|
+
def execute(queryable, **options)
|
33
33
|
debug(options) {"Clear"}
|
34
34
|
silent = operands.first == :silent
|
35
35
|
operands.shift if silent
|