@@ -31,10 +31,11 @@ module RDF
3131 #
3232 # @since 2.0.0
3333 class Changeset
34- include RDF ::Mutable
34+ # include RDF::Mutable
35+ include RDF ::Util ::Coercions
3536
3637 ##
37- # Applies a changeset to the given mutable RDF::Enumerable .
38+ # Applies a changeset to the given { RDF::Mutable} object .
3839 #
3940 # @param [RDF::Mutable] mutable
4041 # @param [Hash{Symbol => Object}] options
@@ -98,6 +99,24 @@ def readable?
9899 false
99100 end
100101
102+ ##
103+ # Returns `false` as changesets are not {RDF::Writable}.
104+ #
105+ # @return [Boolean]
106+ # @see RDF::Writable#writable?
107+ def writable?
108+ false
109+ end
110+
111+ ##
112+ # Returns `false` as changesets are not {RDF::Mutable}.
113+ #
114+ # @return [Boolean]
115+ # @see RDF::Mutable#mutable?
116+ def mutable?
117+ false
118+ end
119+
101120 ##
102121 # Applies this changeset to the given mutable RDF::Enumerable.
103122 #
@@ -127,35 +146,77 @@ def inspect
127146
128147 ##
129148 # Outputs a developer-friendly representation of this changeset to
130- # `stderr`.
149+ # `$ stderr`.
131150 #
132151 # @return [void]
133152 def inspect!
134153 $stderr. puts ( self . inspect )
135154 end
136155
137- protected
138-
139156 ##
140- # Appends an RDF statement to the sequence to insert when applied .
157+ # Returns the sum of both the `inserts` and `deletes` counts .
141158 #
142- # @param [RDF::Statement] statement
143- # @return [void]
144- # @see RDF::Writable#insert_statement
145- def insert_statement ( statement )
146- self . inserts << statement
159+ # @return [Integer]
160+ def count
161+ inserts . count + deletes . count
147162 end
148163
164+ # Append statements to `inserts`. Statements _should_ be constant
165+ # as variable statements will at best be ignored or at worst raise
166+ # an error when applied.
167+ #
168+ # @param statements [Enumerable, RDF::Statement] Some statements
169+ # @return [self]
170+ def insert ( *statements )
171+ coerce_statements ( statements ) do |stmts |
172+ append_statements :inserts , stmts
173+ end
174+
175+ self
176+ end
177+ alias_method :insert! , :insert
178+ alias_method :<< , :insert
179+
180+ # Append statements to `deletes`. Statements _may_ contain
181+ # variables, although support will depend on the {RDF::Mutable}
182+ # target.
183+ #
184+ # @param statements [Enumerable, RDF::Statement] Some statements
185+ # @return [self]
186+ def delete ( *statements )
187+ coerce_statements ( statements ) do |stmts |
188+ append_statements :deletes , stmts
189+ end
190+
191+ self
192+ end
193+ alias_method :delete! , :delete
194+ alias_method :>> , :delete
195+
196+ private
197+
149198 ##
150- # Appends an RDF statement to the sequence to delete when applied.
199+ # Append statements to the appropriate target. This is a little
200+ # shim to go in between the other shim and the target.
151201 #
152- # @param [RDF::Statement] statement
153- # @return [void]
154- # @see RDF::Mutable#delete_statement
155- def delete_statement ( statement )
156- self . deletes << statement
202+ # @param target [Symbol] the method to send
203+ # @param arg [Enumerable, RDF::Statement]
204+ #
205+ def append_statements ( target , arg )
206+ # coerce to an enumerator
207+ stmts = case
208+ when arg . is_a? ( RDF ::Statement )
209+ [ arg ]
210+ when arg . respond_to? ( :each_statement )
211+ arg . each_statement
212+ when arg . respond_to? ( :each )
213+ arg
214+ else
215+ raise ArgumentError , "Invalid statement: #{ arg . class } "
216+ end
217+
218+ stmts . each { |s | send ( target ) << s }
157219 end
158220
159- undef_method :load , :update , :clear
160221 end # Changeset
161222end # RDF
0 commit comments