Skip to content

Commit 82345f2

Browse files
committed
Normalize existential accessors (e.g. #statement?) to take both 0-ary and 1-ary variations.
* `#term?` * `#statement?` * `#variable?` * `#graph?`
1 parent ca0bed4 commit 82345f2

13 files changed

Lines changed: 205 additions & 66 deletions

File tree

lib/rdf/mixin/enumerable.rb

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,13 @@ def statements(**options)
136136
#
137137
# @param [RDF::Statement] statement
138138
# @return [Boolean]
139-
def statement?(statement = nil)
140-
statement && !enum_statement.find { |s| s.eql?(statement) }.nil?
139+
def statement?(*args)
140+
case args.length
141+
when 0 then false
142+
when 1
143+
args.first && !enum_statement.find { |s| s.eql?(args.first) }.nil?
144+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
145+
end
141146
end
142147
alias_method :has_statement?, :statement?
143148
alias_method :include?, :statement?
@@ -541,8 +546,12 @@ def terms(unique: true)
541546
# @param [RDF::Resource] value
542547
# @return [Boolean]
543548
# @since 2.0
544-
def term?(value = nil)
545-
value && enum_term.include?(value)
549+
def term?(*args)
550+
case args.length
551+
when 0 then super
552+
when 1 then args.first && enum_term.include?(args.first)
553+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
554+
end
546555
end
547556
alias_method :has_term?, :term?
548557

lib/rdf/model/graph.rb

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,11 +238,15 @@ def count
238238
# @param [Statement] statement
239239
# @return [Boolean]
240240
# @see RDF::Enumerable#statement?
241-
def statement?(statement = nil)
242-
return false if statement.nil?
243-
statement = statement.dup
244-
statement.graph_name = graph_name
245-
@data.statement?(statement)
241+
def statement?(*args)
242+
case args.length
243+
when 0 then false
244+
when 1
245+
statement = args.first.dup
246+
statement.graph_name = graph_name
247+
@data.statement?(statement)
248+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
249+
end
246250
end
247251
alias_method :has_statement?, :statement?
248252

lib/rdf/model/statement.rb

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -136,23 +136,45 @@ def initialize!
136136
end
137137

138138
##
139-
# Returns `true` to indicate that this value is a statement.
139+
# @overload statement?
140+
# Returns `true` if `self` is a {RDF::Statement}.
140141
#
141-
# @return [Boolean]
142-
def statement?
143-
true
142+
# @return [Boolean]
143+
# @overload statement?(statement)
144+
# Returns `true` if `self` contains the given {RDF::Statement}.
145+
#
146+
# @param [RDF::Statement] statement
147+
# @return [Boolean]
148+
def statement?(*args)
149+
case args.length
150+
when 0 then true
151+
when 1 then self == args.first || subject.statement?(*args) || object.statement?(*args)
152+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
153+
end
144154
end
145155

146156
##
147-
# Returns `true` if any element of the statement is not a
157+
# @overload variable?
158+
# Returns `true` if any element of the statement is not a
148159
# URI, Node or Literal.
149160
#
150-
# @return [Boolean]
151-
def variable?
152-
!(subject? && subject.constant? &&
153-
predicate? && predicate.constant? &&
154-
object? && object.constant? &&
155-
(graph? ? graph_name.constant? : true))
161+
# @return [Boolean]
162+
# @overload variable?(variables)
163+
# Returns `true` if this statement contains any of the variables.
164+
#
165+
# @param [Array<Symbol, #to_sym>] variables
166+
# @return [Boolean]
167+
def variable?(*args)
168+
case args.length
169+
when 0
170+
!(subject? && subject.constant? &&
171+
predicate? && predicate.constant? &&
172+
object? && object.constant? &&
173+
(graph? ? graph_name.constant? : true))
174+
when 1
175+
to_quad.any? {|t| t.respond_to?(:variable?) && t.variable?(*args)}
176+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
177+
end
156178
end
157179

158180
##

lib/rdf/model/term.rb

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,21 @@ def eql?(other)
5757
end
5858

5959
##
60-
# Returns `true` if `self` is a {RDF::Term}.
60+
# @overload term?
61+
# Returns `true` if `self` is a {RDF::Term}.
6162
#
62-
# @return [Boolean]
63-
def term?
64-
true
63+
# @return [Boolean]
64+
# @overload term?(name)
65+
# Returns `true` if `self` contains the given RDF subject term.
66+
#
67+
# @param [RDF::Resource] value
68+
# @return [Boolean]
69+
def term?(*args)
70+
case args.length
71+
when 0 then true
72+
when 1 then false
73+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
74+
end
6575
end
6676

6777
##

lib/rdf/model/value.rb

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,27 @@ module Value
4040
# Use value `false` to query for the default graph_name
4141
# @return [Boolean]
4242
def graph?(*args)
43-
false
4443
case args.length
4544
when 0, 1 then false
4645
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
4746
end
4847
end
4948

5049
##
51-
# Is this a {RDF::Statement}?
50+
# @overload statement?
51+
# Returns `true` if `self` is a {RDF::Statement}.
5252
#
53-
# @return [Boolean]
54-
def statement?
55-
false
53+
# @return [Boolean]
54+
# @overload statement?(statement)
55+
# Returns `true` if `self` contains the given {RDF::Statement}.
56+
#
57+
# @param [RDF::Statement] statement
58+
# @return [Boolean]
59+
def statement?(*args)
60+
case args.length
61+
when 0, 1 then false
62+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
63+
end
5664
end
5765

5866
##
@@ -64,11 +72,20 @@ def list?
6472
end
6573

6674
##
67-
# Is this a {RDF::Term}?
75+
# @overload term?
76+
# Returns `true` if `self` is a {RDF::Term}.
6877
#
69-
# @return [Boolean]
70-
def term?
71-
false
78+
# @return [Boolean]
79+
# @overload term?(name)
80+
# Returns `true` if `self` contains the given RDF subject term.
81+
#
82+
# @param [RDF::Resource] value
83+
# @return [Boolean]
84+
def term?(*args)
85+
case args.length
86+
when 0, 1 then false
87+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
88+
end
7289
end
7390

7491
##
@@ -114,12 +131,21 @@ def uri?
114131
end
115132

116133
##
117-
# Is this a {RDF::Query::Variable}, or does it contain a variable?
134+
# @overload variable?
135+
# Returns `true` if `self` is a {RDF::Query::Variable}, or does it contain a variable?
118136
#
119-
# @return [Boolean]
137+
# @return [Boolean]
138+
# @overload variable?(variable)
139+
# Returns `true` if `self` contains the given variable.
140+
#
141+
# @param [RDF::Resource] value
142+
# @return [Boolean]
120143
# @since 0.1.7
121-
def variable?
122-
false
144+
def variable?(*args)
145+
case args.length
146+
when 0, 1 then false
147+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
148+
end
123149
end
124150

125151
##

lib/rdf/query.rb

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -443,11 +443,22 @@ def apply_graph_name(graph_name = nil)
443443
end
444444

445445
##
446-
# Returns `true` if any pattern contains a variable.
446+
# @overload variable?
447+
# Returns `true` if any pattern contains a variable.
447448
#
448-
# @return [Boolean]
449-
def variable?
450-
!variables.empty?
449+
# @return [Boolean]
450+
# @overload variable?(variables)
451+
# Returns `true` if any pattern contains any of the variables.
452+
#
453+
# @param [Array<Symbol, #to_sym>] variables
454+
# @return [Boolean]
455+
def variable?(*args)
456+
case args.length
457+
when 0 then !variables.empty?
458+
when 1
459+
patterns.any? {|p| p.variable?(*args)}
460+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
461+
end
451462
end
452463
alias_method :variables?, :variable?
453464
alias_method :has_variables?, :variable?

lib/rdf/query/solution.rb

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,24 @@ def enum_value
114114
end
115115

116116
##
117-
# Returns `true` if this solution contains bindings for any of the given
117+
# @overload variable?
118+
# Returns `false`.
119+
#
120+
# @return [Boolean]
121+
# @overload variable?(variables)
122+
# Returns `true` if this solution contains bindings for any of the given
118123
# `variables`.
119124
#
120-
# @param [Array<Symbol, #to_sym>] variables
121-
# an array of variables to check
122-
# @return [Boolean] `true` or `false`
125+
# @param [Array<Symbol, #to_sym>] variables
126+
# @return [Boolean]
123127
# @since 0.3.0
124-
def variable?(variables)
125-
variables.any? { |variable| bound?(variable) }
128+
def variable?(*args)
129+
case args.length
130+
when 0 then false
131+
when 1
132+
args.first.any? { |variable| bound?(variable) }
133+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
134+
end
126135
end
127136
alias_method :variables?, :variable?
128137
alias_method :has_variables?, :variable?

lib/rdf/query/solutions.rb

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,25 @@ def variable_names
7878
end
7979

8080
##
81-
# Returns `true` if this solution sequence contains bindings for any of
81+
# @overload variable?
82+
# Returns `false`.
83+
#
84+
# @return [Boolean]
85+
# @overload variable?(variables)
86+
# Returns `true` if this solution sequence contains bindings for any of
8287
# the given `variables`.
8388
#
84-
# @param [Array<Symbol, #to_sym>] variables
85-
# an array of variables to check
86-
# @return [Boolean] `true` or `false`
89+
# @param [Array<Symbol, #to_sym>] variables
90+
# @return [Boolean]
8791
# @see RDF::Query::Solution#variable?
8892
# @see RDF::Query#execute
89-
def variable?(variables)
90-
self.any? { |solution| solution.variables?(variables) }
93+
def variable?(*args)
94+
case args.length
95+
when 0 then false
96+
when 1
97+
self.any? { |solution| solution.variables?(args.first) }
98+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
99+
end
91100
end
92101
alias_method :variables?, :variable?
93102
alias_method :have_variables?, :variable?

lib/rdf/query/variable.rb

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,27 @@ def initialize(name = nil, value = nil, distinguished: nil, existential: nil)
8787
end
8888

8989
##
90-
# Returns `true`.
90+
# @overload variable?
91+
# Returns `true` if `self` is a {RDF::Query::Variable}, or does it contain a variable?
9192
#
92-
# @return [Boolean]
93-
# @see RDF::Term#variable?
93+
# @return [Boolean]
94+
# @overload variable?(variable)
95+
# Returns `true` if `self` contains the given variable.
96+
#
97+
# @param [RDF::Resource] value
98+
# @return [Boolean]
9499
# @since 0.1.7
95-
def variable?
96-
true
100+
def variable?(*args)
101+
case args.length
102+
when 0 then true
103+
when 1
104+
case variable = args.first
105+
when RDF::Query::Variable then self == variable
106+
when Symbol then to_sym == variable
107+
else false
108+
end
109+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
110+
end
97111
end
98112

99113
##

lib/rdf/repository.rb

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -287,10 +287,22 @@ def count
287287
end
288288

289289
##
290-
# @private
291-
# @see RDF::Enumerable#graph?
292-
def graph?(graph)
293-
@data.key?(graph)
290+
# @overload graph?
291+
# Returns `false` to indicate that this is not a graph.
292+
#
293+
# @return [Boolean]
294+
# @overload graph?(name)
295+
# Returns `true` if `self` contains the given RDF graph_name.
296+
#
297+
# @param [RDF::Resource, false] graph_name
298+
# Use value `false` to query for the default graph_name
299+
# @return [Boolean]
300+
def graph?(*args)
301+
case args.length
302+
when 0 then false
303+
when 1 then @data.key?(args.first)
304+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
305+
end
294306
end
295307
alias_method :has_graph?, :graph?
296308

@@ -322,8 +334,12 @@ def each_graph(&block)
322334
# @overload statement?(statement)
323335
# @private
324336
# @see RDF::Enumerable#statement?
325-
def statement?(statement = nil)
326-
statement && statement_in?(@data, statement)
337+
def statement?(*args)
338+
case args.length
339+
when 0 then false
340+
when 1 then args.first && statement_in?(@data, args.first)
341+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
342+
end
327343
end
328344
alias_method :has_statement?, :statement?
329345

0 commit comments

Comments
 (0)