@@ -127,7 +127,6 @@ function levelgraphJSONLD(db, jsonldOpts) {
127127
128128 function doDel ( obj , options , callback ) {
129129 var blanks = { } ;
130-
131130 jsonld . expand ( obj , options , function ( err , expanded ) {
132131 if ( err ) {
133132 return callback && callback ( err ) ;
@@ -136,6 +135,7 @@ function levelgraphJSONLD(db, jsonldOpts) {
136135 var stream = graphdb . delStream ( ) ;
137136 stream . on ( 'close' , callback ) ;
138137 stream . on ( 'error' , callback ) ;
138+
139139 if ( options . base ) {
140140 if ( expanded [ '@context' ] ) {
141141 expanded [ '@context' ] [ '@base' ] = options . base ;
@@ -190,6 +190,38 @@ function levelgraphJSONLD(db, jsonldOpts) {
190190 } )
191191 }
192192
193+ function doCut ( obj , options , callback ) {
194+ var iri = obj ;
195+ if ( typeof obj !== 'string' ) {
196+ iri = obj [ '@id' ] ;
197+ }
198+ if ( iri === undefined ) {
199+ return callback && callback ( null ) ;
200+ }
201+
202+ var stream = graphdb . delStream ( ) ;
203+ stream . on ( 'close' , callback ) ;
204+ stream . on ( 'error' , callback ) ;
205+
206+ ( function delAllTriples ( iri , done ) {
207+ graphdb . get ( { subject : iri } , function ( err , triples ) {
208+ async . each ( triples , function ( triple , cb ) {
209+ stream . write ( triple ) ;
210+ if ( triple . object . indexOf ( '_:' ) === 0 || ( options . recurse && N3Util . isIRI ( triple . object ) ) ) {
211+ delAllTriples ( triple . object , cb ) ;
212+ } else {
213+ cb ( ) ;
214+ }
215+ } , done ) ;
216+ } ) ;
217+ } ) ( iri , function ( err ) {
218+ if ( err ) {
219+ return callback ( err ) ;
220+ }
221+ stream . end ( ) ;
222+ } ) ;
223+ }
224+
193225 graphdb . jsonld . put = function ( obj , options , callback ) {
194226
195227 if ( typeof obj === 'string' ) {
@@ -202,68 +234,59 @@ function levelgraphJSONLD(db, jsonldOpts) {
202234 }
203235
204236 options . base = options . base || this . options . base ;
205- options . preserve = options . preserve || this . options . preserve || false ;
237+ options . overwrite = options . overwrite !== undefined ? options . overwrite : ( this . options . overwrite !== undefined ? this . options . overwrite : false ) ;
206238
207- graphdb . jsonld . del ( obj , options , function ( err ) {
208- if ( err ) {
209- return callback && callback ( err ) ;
210- }
239+ if ( ! options . overwrite ) {
211240 doPut ( obj , options , callback ) ;
212- } ) ;
241+ } else {
242+ graphdb . jsonld . del ( obj , options , function ( err ) {
243+ if ( err ) {
244+ return callback && callback ( err ) ;
245+ }
246+ } ) ;
247+ doPut ( obj , options , callback ) ;
248+ }
213249 } ;
214250
215251 graphdb . jsonld . del = function ( obj , options , callback ) {
216- var blanks = { } ;
252+
253+ if ( typeof options === 'function' ) {
254+ callback = options ;
255+ options = { } ;
256+ }
257+
258+ options . cut = options . cut !== undefined ? options . cut : ( this . options . cut !== undefined ? this . options . cut : false ) ;
259+ options . recurse = options . recurse !== undefined ? options . recurse : ( this . options . recurse !== undefined ? this . options . recurse : false ) ;
217260
218261 if ( typeof obj === 'string' ) {
219262 try {
220263 obj = JSON . parse ( obj ) ;
221264 } catch ( e ) {
222- // Handle case where we're trying to delete by passing an IRI
223- if ( ! N3Util . isIRI ( obj ) ) {
224- throw e
265+ if ( N3Util . isIRI ( obj ) && ! options . cut ) {
266+ callback ( new Error ( "Passing an IRI to del is not supported anymore. Please pass a JSON-LD document." ) )
225267 }
226268 }
227269 }
228270
271+ if ( ! options . cut ) {
272+ doDel ( obj , options , callback )
273+ } else {
274+ doCut ( obj , options , callback )
275+ }
276+ } ;
277+
278+
279+ graphdb . jsonld . cut = function ( obj , options , callback ) {
280+
229281 if ( typeof options === 'function' ) {
230282 callback = options ;
231283 options = { } ;
232284 }
233285
234- options . preserve = options . preserve || this . options . preserve || false ;
235-
236- if ( options . preserve === false ) {
237- var iri = obj ;
238- if ( typeof obj !== 'string' ) {
239- iri = obj [ '@id' ] ;
240- }
241-
242- var stream = graphdb . delStream ( ) ;
243- stream . on ( 'close' , callback ) ;
244- stream . on ( 'error' , callback ) ;
286+ options . recurse = options . recurse || this . options . recurse || false ;
245287
246- ( function delAllTriples ( iri , done ) {
247- graphdb . get ( { subject : iri } , function ( err , triples ) {
248- async . each ( triples , function ( triple , cb ) {
249- stream . write ( triple ) ;
250- if ( triple . object . indexOf ( '_:' ) === 0 ) {
251- delAllTriples ( triple . object , cb ) ;
252- } else {
253- cb ( ) ;
254- }
255- } , done ) ;
256- } ) ;
257- } ) ( iri , function ( err ) {
258- if ( err ) {
259- return callback ( err ) ;
260- }
261- stream . end ( ) ;
262- } ) ;
263- } else {
264- doDel ( obj , options , callback )
265- }
266- } ;
288+ doCut ( obj , options , callback ) ;
289+ }
267290
268291 // http://json-ld.org/spec/latest/json-ld-api/#data-round-tripping
269292 function getCoercedObject ( object ) {
0 commit comments