sparql 3.1.0 → 3.1.6
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 +4 -4
- data/README.md +188 -73
- data/UNLICENSE +1 -1
- data/VERSION +1 -1
- data/bin/sparql +37 -17
- data/lib/rack/sparql/conneg.rb +2 -2
- data/lib/sinatra/sparql.rb +4 -4
- data/lib/sparql.rb +13 -12
- data/lib/sparql/algebra.rb +11 -19
- data/lib/sparql/algebra/aggregate.rb +2 -2
- data/lib/sparql/algebra/expression.rb +67 -38
- data/lib/sparql/algebra/extensions.rb +182 -23
- data/lib/sparql/algebra/operator.rb +55 -22
- data/lib/sparql/algebra/operator/abs.rb +2 -2
- data/lib/sparql/algebra/operator/add.rb +2 -2
- data/lib/sparql/algebra/operator/alt.rb +2 -2
- data/lib/sparql/algebra/operator/and.rb +3 -3
- data/lib/sparql/algebra/operator/asc.rb +1 -1
- data/lib/sparql/algebra/operator/ask.rb +2 -12
- data/lib/sparql/algebra/operator/avg.rb +8 -1
- data/lib/sparql/algebra/operator/base.rb +8 -8
- data/lib/sparql/algebra/operator/bgp.rb +2 -2
- data/lib/sparql/algebra/operator/bnode.rb +2 -2
- data/lib/sparql/algebra/operator/bound.rb +1 -1
- data/lib/sparql/algebra/operator/ceil.rb +2 -2
- data/lib/sparql/algebra/operator/clear.rb +2 -2
- data/lib/sparql/algebra/operator/coalesce.rb +1 -11
- data/lib/sparql/algebra/operator/compare.rb +15 -8
- data/lib/sparql/algebra/operator/concat.rb +2 -2
- data/lib/sparql/algebra/operator/construct.rb +4 -13
- data/lib/sparql/algebra/operator/contains.rb +2 -2
- data/lib/sparql/algebra/operator/copy.rb +2 -2
- data/lib/sparql/algebra/operator/count.rb +1 -1
- data/lib/sparql/algebra/operator/create.rb +2 -2
- data/lib/sparql/algebra/operator/dataset.rb +3 -14
- 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 +6 -6
- data/lib/sparql/algebra/operator/delete_data.rb +2 -2
- data/lib/sparql/algebra/operator/delete_where.rb +3 -3
- data/lib/sparql/algebra/operator/desc.rb +1 -1
- data/lib/sparql/algebra/operator/describe.rb +2 -12
- data/lib/sparql/algebra/operator/distinct.rb +2 -12
- data/lib/sparql/algebra/operator/divide.rb +1 -1
- data/lib/sparql/algebra/operator/drop.rb +2 -2
- data/lib/sparql/algebra/operator/encode_for_uri.rb +2 -2
- data/lib/sparql/algebra/operator/equal.rb +2 -2
- data/lib/sparql/algebra/operator/exists.rb +1 -1
- data/lib/sparql/algebra/operator/exprlist.rb +1 -11
- data/lib/sparql/algebra/operator/extend.rb +3 -12
- data/lib/sparql/algebra/operator/filter.rb +3 -13
- data/lib/sparql/algebra/operator/floor.rb +2 -2
- data/lib/sparql/algebra/operator/graph.rb +4 -15
- 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 +14 -14
- data/lib/sparql/algebra/operator/group_concat.rb +1 -1
- data/lib/sparql/algebra/operator/hours.rb +1 -1
- data/lib/sparql/algebra/operator/if.rb +1 -11
- data/lib/sparql/algebra/operator/in.rb +1 -11
- data/lib/sparql/algebra/operator/insert.rb +4 -4
- data/lib/sparql/algebra/operator/insert_data.rb +2 -2
- 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/is_triple.rb +30 -0
- data/lib/sparql/algebra/operator/join.rb +9 -7
- 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 +16 -9
- 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 +2 -2
- data/lib/sparql/algebra/operator/max.rb +8 -1
- data/lib/sparql/algebra/operator/md5.rb +1 -1
- data/lib/sparql/algebra/operator/min.rb +8 -1
- data/lib/sparql/algebra/operator/minus.rb +9 -8
- data/lib/sparql/algebra/operator/minutes.rb +1 -1
- data/lib/sparql/algebra/operator/modify.rb +1 -1
- data/lib/sparql/algebra/operator/month.rb +1 -1
- data/lib/sparql/algebra/operator/move.rb +2 -2
- 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 +2 -2
- data/lib/sparql/algebra/operator/notin.rb +1 -11
- data/lib/sparql/algebra/operator/notoneof.rb +2 -2
- data/lib/sparql/algebra/operator/now.rb +1 -1
- data/lib/sparql/algebra/operator/object.rb +27 -0
- data/lib/sparql/algebra/operator/or.rb +3 -3
- data/lib/sparql/algebra/operator/order.rb +2 -12
- data/lib/sparql/algebra/operator/path.rb +2 -2
- data/lib/sparql/algebra/operator/path_opt.rb +2 -2
- data/lib/sparql/algebra/operator/path_plus.rb +2 -2
- data/lib/sparql/algebra/operator/path_star.rb +2 -2
- data/lib/sparql/algebra/operator/plus.rb +2 -2
- data/lib/sparql/algebra/operator/predicate.rb +27 -0
- data/lib/sparql/algebra/operator/prefix.rb +8 -8
- data/lib/sparql/algebra/operator/project.rb +2 -12
- data/lib/sparql/algebra/operator/rand.rb +1 -1
- data/lib/sparql/algebra/operator/reduced.rb +2 -12
- data/lib/sparql/algebra/operator/regex.rb +5 -5
- data/lib/sparql/algebra/operator/replace.rb +3 -3
- data/lib/sparql/algebra/operator/reverse.rb +2 -2
- 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 +9 -2
- data/lib/sparql/algebra/operator/seconds.rb +1 -1
- data/lib/sparql/algebra/operator/seq.rb +1 -1
- data/lib/sparql/algebra/operator/sequence.rb +1 -1
- 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 +2 -12
- 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/subject.rb +29 -0
- data/lib/sparql/algebra/operator/substr.rb +3 -3
- data/lib/sparql/algebra/operator/subtract.rb +1 -1
- data/lib/sparql/algebra/operator/sum.rb +1 -1
- data/lib/sparql/algebra/operator/table.rb +2 -2
- data/lib/sparql/algebra/operator/timezone.rb +1 -1
- data/lib/sparql/algebra/operator/triple.rb +27 -0
- 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 +7 -6
- data/lib/sparql/algebra/operator/update.rb +2 -2
- data/lib/sparql/algebra/operator/using.rb +2 -2
- data/lib/sparql/algebra/operator/uuid.rb +1 -1
- data/lib/sparql/algebra/operator/with.rb +3 -3
- data/lib/sparql/algebra/operator/year.rb +1 -1
- data/lib/sparql/algebra/query.rb +1 -1
- data/lib/sparql/algebra/update.rb +1 -1
- data/lib/sparql/algebra/version.rb +1 -1
- data/lib/sparql/extensions.rb +7 -13
- data/lib/sparql/grammar.rb +81 -6
- data/lib/sparql/grammar/meta.rb +5801 -1584
- data/lib/sparql/grammar/parser11.rb +116 -50
- data/lib/sparql/grammar/terminals11.rb +4 -0
- data/lib/sparql/results.rb +70 -43
- data/lib/sparql/version.rb +1 -1
- metadata +34 -39
@@ -54,6 +54,10 @@ module SPARQL; module Algebra
|
|
54
54
|
autoload :Timezone, 'sparql/algebra/operator/timezone'
|
55
55
|
autoload :TZ, 'sparql/algebra/operator/tz'
|
56
56
|
autoload :Year, 'sparql/algebra/operator/year'
|
57
|
+
autoload :IsTriple, 'sparql/algebra/operator/is_triple'
|
58
|
+
autoload :Subject, 'sparql/algebra/operator/subject'
|
59
|
+
autoload :Predicate, 'sparql/algebra/operator/predicate'
|
60
|
+
autoload :Object, 'sparql/algebra/operator/object'
|
57
61
|
|
58
62
|
# Binary operators
|
59
63
|
autoload :And, 'sparql/algebra/operator/and'
|
@@ -146,8 +150,6 @@ module SPARQL; module Algebra
|
|
146
150
|
autoload :Using, 'sparql/algebra/operator/using'
|
147
151
|
autoload :With, 'sparql/algebra/operator/with'
|
148
152
|
|
149
|
-
|
150
|
-
|
151
153
|
##
|
152
154
|
# Returns an operator class for the given operator `name`.
|
153
155
|
#
|
@@ -296,6 +298,14 @@ module SPARQL; module Algebra
|
|
296
298
|
when :update then Update
|
297
299
|
when :using then Using
|
298
300
|
when :with then With
|
301
|
+
|
302
|
+
# RDF-star
|
303
|
+
when :istriple then IsTriple
|
304
|
+
when :triple then Triple
|
305
|
+
when :subject then Subject
|
306
|
+
when :predicate then Predicate
|
307
|
+
when :object then Object
|
308
|
+
|
299
309
|
else nil # not found
|
300
310
|
end
|
301
311
|
end
|
@@ -338,8 +348,8 @@ module SPARQL; module Algebra
|
|
338
348
|
# @option options [Boolean] :memoize (false)
|
339
349
|
# whether to memoize results for particular operands
|
340
350
|
# @raise [TypeError] if any operand is invalid
|
341
|
-
def initialize(*operands)
|
342
|
-
@options =
|
351
|
+
def initialize(*operands, **options)
|
352
|
+
@options = options.dup
|
343
353
|
@operands = operands.map! do |operand|
|
344
354
|
case operand
|
345
355
|
when Array
|
@@ -357,6 +367,22 @@ module SPARQL; module Algebra
|
|
357
367
|
end
|
358
368
|
end
|
359
369
|
|
370
|
+
##
|
371
|
+
# Deep duplicate operands
|
372
|
+
def deep_dup
|
373
|
+
self.class.new(*operands.map(&:deep_dup), **@options)
|
374
|
+
end
|
375
|
+
|
376
|
+
##
|
377
|
+
# Binds the pattern to a solution, making it no longer variable if all variables are resolved to bound variables
|
378
|
+
#
|
379
|
+
# @param [RDF::Query::Solution] solution
|
380
|
+
# @return [self]
|
381
|
+
def bind(solution)
|
382
|
+
@operands.each {|op| op.bind(solution)}
|
383
|
+
self
|
384
|
+
end
|
385
|
+
|
360
386
|
##
|
361
387
|
# Base URI used for reading data sources with relative URIs
|
362
388
|
#
|
@@ -434,7 +460,7 @@ module SPARQL; module Algebra
|
|
434
460
|
# @return [Boolean] `true` or `false`
|
435
461
|
# @see #constant?
|
436
462
|
def variable?
|
437
|
-
operands.any?(
|
463
|
+
operands.any? {|op| op.respond_to?(:variable?) && op.variable?}
|
438
464
|
end
|
439
465
|
|
440
466
|
##
|
@@ -491,21 +517,35 @@ module SPARQL; module Algebra
|
|
491
517
|
#
|
492
518
|
# For constant expressions containing no variables, returns the result
|
493
519
|
# of evaluating the expression with empty bindings; otherwise returns
|
494
|
-
# `self`.
|
520
|
+
# a copy of `self`.
|
495
521
|
#
|
496
522
|
# Optimization is not possible if the expression raises an exception,
|
497
523
|
# such as a `TypeError` or `ZeroDivisionError`, which must be conserved
|
498
524
|
# at runtime.
|
499
525
|
#
|
500
526
|
# @return [SPARQL::Algebra::Expression]
|
501
|
-
|
527
|
+
# @see RDF::Query#optimize
|
528
|
+
def optimize(**options)
|
502
529
|
if constant?
|
503
530
|
# Note that if evaluation results in a `TypeError` or other error,
|
504
531
|
# we must return `self` so that the error is conserved at runtime:
|
505
532
|
evaluate(RDF::Query::Solution.new) rescue self
|
506
533
|
else
|
507
|
-
super # returns `self`
|
534
|
+
super # returns a copy of `self`
|
535
|
+
end
|
536
|
+
end
|
537
|
+
|
538
|
+
##
|
539
|
+
# Optimizes this query by optimizing its constituent operands
|
540
|
+
# according to their cost estimates.
|
541
|
+
#
|
542
|
+
# @return [self]
|
543
|
+
# @see RDF::Query#optimize!
|
544
|
+
def optimize!(**options)
|
545
|
+
@operands.map! do |op|
|
546
|
+
op.optimize(**options) if op.respond_to?(:optimize)
|
508
547
|
end
|
548
|
+
self
|
509
549
|
end
|
510
550
|
|
511
551
|
##
|
@@ -532,7 +572,7 @@ module SPARQL; module Algebra
|
|
532
572
|
# Returns the SPARQL S-Expression (SSE) representation of this operator.
|
533
573
|
#
|
534
574
|
# @return [Array]
|
535
|
-
# @see
|
575
|
+
# @see https://openjena.org/wiki/SSE
|
536
576
|
def to_sxp_bin
|
537
577
|
operator = [self.class.const_get(:NAME)].flatten.first
|
538
578
|
[operator, *(operands || []).map(&:to_sxp_bin)]
|
@@ -543,13 +583,6 @@ module SPARQL; module Algebra
|
|
543
583
|
#
|
544
584
|
# @return [String]
|
545
585
|
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
586
|
to_sxp_bin.to_sxp
|
554
587
|
end
|
555
588
|
|
@@ -647,7 +680,7 @@ module SPARQL; module Algebra
|
|
647
680
|
# @param [RDF::Literal] literal
|
648
681
|
# @return [RDF::Literal::Boolean] `true` or `false`
|
649
682
|
# @raise [TypeError] if the literal could not be coerced to an `RDF::Literal::Boolean`
|
650
|
-
# @see
|
683
|
+
# @see https://www.w3.org/TR/sparql11-query/#ebv
|
651
684
|
def boolean(literal)
|
652
685
|
case literal
|
653
686
|
when FalseClass then RDF::Literal::FALSE
|
@@ -724,7 +757,7 @@ module SPARQL; module Algebra
|
|
724
757
|
##
|
725
758
|
# @param [Hash{Symbol => Object}] options
|
726
759
|
# any additional options (see {Operator#initialize})
|
727
|
-
def initialize(options
|
760
|
+
def initialize(**options)
|
728
761
|
super
|
729
762
|
end
|
730
763
|
end # Nullary
|
@@ -743,7 +776,7 @@ module SPARQL; module Algebra
|
|
743
776
|
# the operand
|
744
777
|
# @param [Hash{Symbol => Object}] options
|
745
778
|
# any additional options (see {Operator#initialize})
|
746
|
-
def initialize(arg, options
|
779
|
+
def initialize(arg, **options)
|
747
780
|
super
|
748
781
|
end
|
749
782
|
end # Unary
|
@@ -764,7 +797,7 @@ module SPARQL; module Algebra
|
|
764
797
|
# the second operand
|
765
798
|
# @param [Hash{Symbol => Object}] options
|
766
799
|
# any additional options (see {Operator#initialize})
|
767
|
-
def initialize(arg1, arg2, options
|
800
|
+
def initialize(arg1, arg2, **options)
|
768
801
|
super
|
769
802
|
end
|
770
803
|
end # Binary
|
@@ -787,7 +820,7 @@ module SPARQL; module Algebra
|
|
787
820
|
# the third operand
|
788
821
|
# @param [Hash{Symbol => Object}] options
|
789
822
|
# any additional options (see {Operator#initialize})
|
790
|
-
def initialize(arg1, arg2, arg3, options
|
823
|
+
def initialize(arg1, arg2, arg3, **options)
|
791
824
|
super
|
792
825
|
end
|
793
826
|
end # Ternary
|
@@ -812,7 +845,7 @@ module SPARQL; module Algebra
|
|
812
845
|
# the forth operand
|
813
846
|
# @param [Hash{Symbol => Object}] options
|
814
847
|
# any additional options (see {Operator#initialize})
|
815
|
-
def initialize(arg1, arg2, arg3, arg4, options
|
848
|
+
def initialize(arg1, arg2, arg3, arg4, **options)
|
816
849
|
super
|
817
850
|
end
|
818
851
|
end # Ternary
|
@@ -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,7 +28,7 @@ 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
|
31
|
+
# @see https://www.w3.org/TR/sparql11-update/
|
32
32
|
def execute(queryable, **options)
|
33
33
|
debug(options) {"Add"}
|
34
34
|
silent = operands.first == :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,7 +32,7 @@ module SPARQL; module Algebra
|
|
32
32
|
# each matching solution
|
33
33
|
# @yieldparam [RDF::Query::Solution] solution
|
34
34
|
# @yieldreturn [void] ignored
|
35
|
-
# @see
|
35
|
+
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
36
36
|
def execute(queryable, **options, &block)
|
37
37
|
subject, object = options[:subject], options[:object]
|
38
38
|
debug(options) {"Alt #{[subject, operands, object].to_sse}"}
|
@@ -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
|
|
@@ -50,7 +50,7 @@ module SPARQL; module Algebra
|
|
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
|
|
@@ -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
|
31
|
+
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
32
32
|
def execute(queryable, **options)
|
33
33
|
debug(options) {"Ask #{operands.first}"}
|
34
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]
|
@@ -10,12 +10,19 @@ module SPARQL; module Algebra
|
|
10
10
|
# (group () ((??.0 (avg ?o)))
|
11
11
|
# (bgp (triple ?s :dec ?o))))))
|
12
12
|
#
|
13
|
-
# @see
|
13
|
+
# @see https://www.w3.org/TR/sparql11-query/#defn_aggAvg
|
14
14
|
class Avg < Operator
|
15
15
|
include Aggregate
|
16
16
|
|
17
17
|
NAME = :avg
|
18
18
|
|
19
|
+
def initialize(*operands, **options)
|
20
|
+
raise ArgumentError,
|
21
|
+
"avg operator accepts at most one argument with an optional :distinct" if
|
22
|
+
(operands - %i{distinct}).length != 1
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
19
26
|
##
|
20
27
|
# The Avg set function calculates the average value for an expression over a group. It is defined in terms of Sum and Count.
|
21
28
|
#
|
@@ -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
|
31
|
+
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
32
32
|
def execute(queryable, **options, &block)
|
33
33
|
debug(options) {"Base #{operands.first}"}
|
34
34
|
Operator.base_uri = operands.first
|
35
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
|
##
|
@@ -22,7 +22,7 @@ module SPARQL; module Algebra
|
|
22
22
|
# @yieldparam [RDF::Query::Solution] solution
|
23
23
|
# @yieldreturn [void] ignored
|
24
24
|
# @return [RDF::Query]
|
25
|
-
def self.new(*patterns, &block)
|
25
|
+
def self.new(*patterns, **options, &block)
|
26
26
|
RDF::Query.new(*patterns, graph_name: false, &block)
|
27
27
|
end
|
28
28
|
end # BGP
|
@@ -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
|
|
@@ -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
|
|
@@ -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,7 +28,7 @@ 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
|
31
|
+
# @see https://www.w3.org/TR/sparql11-update/
|
32
32
|
def execute(queryable, **options)
|
33
33
|
debug(options) {"Clear"}
|
34
34
|
silent = operands.first == :silent
|
@@ -15,7 +15,7 @@ module SPARQL; module Algebra
|
|
15
15
|
# (bgp (triple ?s :p ?o))
|
16
16
|
# (bgp (triple ?s :q ?x))))))
|
17
17
|
#
|
18
|
-
# @see
|
18
|
+
# @see https://www.w3.org/TR/sparql11-query/#func-coalesce
|
19
19
|
class Coalesce < Operator
|
20
20
|
include Evaluatable
|
21
21
|
|
@@ -50,16 +50,6 @@ module SPARQL; module Algebra
|
|
50
50
|
end
|
51
51
|
raise TypeError, "None of the operands evaluated"
|
52
52
|
end
|
53
|
-
|
54
|
-
##
|
55
|
-
# Returns an optimized version of this query.
|
56
|
-
#
|
57
|
-
# Return optimized query
|
58
|
-
#
|
59
|
-
# @return [Union, RDF::Query] `self`
|
60
|
-
def optimize
|
61
|
-
operands = operands.map(&:optimize)
|
62
|
-
end
|
63
53
|
end # Coalesce
|
64
54
|
end # Operator
|
65
55
|
end; end # SPARQL::Algebra
|