@@ -235,6 +235,115 @@ func TestGetIsRelativeURIByName(t *testing.T) {
235235 require .NoError (t , group .Close ())
236236}
237237
238+ func TestGroupDelete (t * testing.T ) {
239+ // setup creates an hierarchy of groups and returns the
240+ // members URIs in the following order
241+ // outerGroup/
242+ // outerArray
243+ // innerGroup/
244+ // innerArray
245+ setup := func (t * testing.T ) []string {
246+ outerGroupURI := t .TempDir ()
247+ outerArrayURI := t .TempDir ()
248+ innerGroupURI := t .TempDir ()
249+ innerArrayURI := t .TempDir ()
250+ tdbCtx , err := NewContext (nil )
251+ require .NoError (t , err )
252+
253+ outerGroup , err := createTestGroup (tdbCtx , outerGroupURI )
254+ require .NoError (t , err )
255+ innerGroup , err := createTestGroup (tdbCtx , innerGroupURI )
256+ require .NoError (t , err )
257+
258+ arraySchema := buildArraySchema (tdbCtx , t )
259+ outerArray , err := NewArray (tdbCtx , outerArrayURI )
260+ require .NoError (t , err )
261+ outerArray .Create (arraySchema )
262+ require .NoError (t , err )
263+ innerArray , err := NewArray (tdbCtx , innerArrayURI )
264+ require .NoError (t , err )
265+ innerArray .Create (arraySchema )
266+ require .NoError (t , err )
267+
268+ require .NoError (t , innerGroup .Open (TILEDB_WRITE ))
269+ require .NoError (t , innerGroup .AddMember (innerArray .uri , "innerArray" , false ))
270+ require .NoError (t , innerGroup .Close ())
271+ require .NoError (t , outerGroup .Open (TILEDB_WRITE ))
272+ require .NoError (t , outerGroup .AddMember (outerArray .uri , "outerArray" , false ))
273+ require .NoError (t , outerGroup .AddMember (innerGroup .uri , "innerGroup" , false ))
274+ require .NoError (t , outerGroup .Close ())
275+
276+ return []string {outerGroupURI , outerArrayURI , innerGroupURI , innerArrayURI }
277+ }
278+
279+ // TileDB core versions 2.15.2, 2.15.3 and the upcoming 2.15.4
280+ // are slightly different on the files they leave behind after delete
281+ // To be compatible with all we check that a deleted group misses the `group.tdb` file
282+ // and a delete array has an empty `__schema` dir
283+
284+ t .Run ("recursive" , func (t * testing.T ) {
285+ uris := setup (t )
286+
287+ tdbCtx , err := NewContext (nil )
288+ require .NoError (t , err )
289+
290+ outerGroup , err := NewGroup (tdbCtx , uris [0 ])
291+ require .NoError (t , err )
292+ require .NoError (t , outerGroup .Open (TILEDB_MODIFY_EXCLUSIVE ))
293+ require .NoError (t , outerGroup .Delete (true ))
294+
295+ tdbCfg , err := NewConfig ()
296+ require .NoError (t , err )
297+ vfs , err := NewVFS (tdbCtx , tdbCfg )
298+ require .NoError (t , err )
299+
300+ exists , err := vfs .IsFile (uris [0 ] + "/__tiledb_group.tdb" )
301+ require .NoError (t , err )
302+ require .False (t , exists )
303+ exists , err = vfs .IsFile (uris [2 ] + "/__tiledb_group.tdb" )
304+ require .NoError (t , err )
305+ require .False (t , exists )
306+
307+ dirSize , err := vfs .DirSize (uris [1 ] + "/__schema" )
308+ require .NoError (t , err )
309+ require .Equal (t , uint64 (0 ), dirSize )
310+ dirSize , err = vfs .DirSize (uris [1 ] + "/__schema" )
311+ require .NoError (t , err )
312+ require .Equal (t , uint64 (0 ), dirSize )
313+ })
314+
315+ t .Run ("nonrecursive" , func (t * testing.T ) {
316+ uris := setup (t )
317+
318+ tdbCtx , err := NewContext (nil )
319+ require .NoError (t , err )
320+
321+ outerGroup , err := NewGroup (tdbCtx , uris [0 ])
322+ require .NoError (t , err )
323+ require .NoError (t , outerGroup .Open (TILEDB_MODIFY_EXCLUSIVE ))
324+ require .NoError (t , outerGroup .Delete (false ))
325+
326+ tdbCfg , err := NewConfig ()
327+ require .NoError (t , err )
328+ vfs , err := NewVFS (tdbCtx , tdbCfg )
329+ require .NoError (t , err )
330+
331+ exists , err := vfs .IsFile (uris [0 ] + "/__tiledb_group.tdb" )
332+ require .NoError (t , err )
333+ require .False (t , exists )
334+ exists , err = vfs .IsFile (uris [2 ] + "/__tiledb_group.tdb" )
335+ require .NoError (t , err )
336+ require .True (t , exists )
337+
338+ dirSize , err := vfs .DirSize (uris [1 ] + "/__schema" )
339+ require .NoError (t , err )
340+ require .True (t , dirSize > 0 )
341+ dirSize , err = vfs .DirSize (uris [1 ] + "/__schema" )
342+ require .NoError (t , err )
343+ require .True (t , dirSize > 0 )
344+ })
345+ }
346+
238347func memberCount (group * Group ) (uint64 , error ) {
239348 if err := group .Open (TILEDB_READ ); err != nil {
240349 return 0 , err
0 commit comments