Skip to content

Commit 6509c2d

Browse files
authored
Merge pull request #260 from TileDB-Inc/sa/sc-28015/bindings-for-delete-group
Sa/sc 28015/bindings for delete group
2 parents e396f58 + f942eef commit 6509c2d

File tree

7 files changed

+133
-5
lines changed

7 files changed

+133
-5
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
set -e -x
2-
curl --location -o tiledb.tar.gz https://github.com/TileDB-Inc/TileDB/releases/download/2.15.0/tiledb-linux-x86_64-2.15.0-1fb59c4.tar.gz \
2+
curl --location -o tiledb.tar.gz https://github.com/TileDB-Inc/TileDB/releases/download/2.15.3/tiledb-linux-x86_64-2.15.3-689bea0.tar.gz \
33
&& sudo tar -C /usr/local -xf tiledb.tar.gz
44
sudo ldconfig /usr/local/lib

.github/scripts/install_tiledb_linux_debug.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
set -e -x
2-
git clone https://github.com/TileDB-Inc/TileDB.git -b 2.15.0
2+
git clone https://github.com/TileDB-Inc/TileDB.git -b 2.15.3
33
cd TileDB
44
mkdir build && cd build
55
cmake -DSANITIZER=leak -DTILEDB_VERBOSE=OFF -DTILEDB_S3=ON -DTILEDB_SERIALIZATION=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/local ..
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
set -e -x
2-
curl --location -o tiledb.tar.gz https://github.com/TileDB-Inc/TileDB/releases/download/2.15.0/tiledb-macos-x86_64-2.15.0-1fb59c4.tar.gz \
2+
curl --location -o tiledb.tar.gz https://github.com/TileDB-Inc/TileDB/releases/download/2.15.3/tiledb-macos-x86_64-2.15.3-689bea0.tar.gz \
33
&& sudo tar -C /usr/local -xf tiledb.tar.gz

.github/scripts/install_tiledb_source_linux.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
set -e -x
2-
git clone https://github.com/TileDB-Inc/TileDB.git -b 2.15.0
2+
git clone https://github.com/TileDB-Inc/TileDB.git -b 2.15.3
33
cd TileDB
44
mkdir build && cd build
55
cmake -DTILEDB_VERBOSE=OFF -DTILEDB_S3=ON -DTILEDB_SERIALIZATION=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..

.github/scripts/install_tiledb_source_macos.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
set -e -x
2-
git clone https://github.com/TileDB-Inc/TileDB.git -b 2.15.0
2+
git clone https://github.com/TileDB-Inc/TileDB.git -b 2.15.3
33
cd TileDB
44
mkdir build && cd build
55
cmake -DTILEDB_VERBOSE=OFF -DTILEDB_S3=ON -DTILEDB_SERIALIZATION=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..

group.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,3 +482,22 @@ func (g *Group) GetIsRelativeURIByName(name string) (bool, error) {
482482
}
483483
return isRelative > 0, nil
484484
}
485+
486+
// Delete deletes written data from an open group. The group must be opened in MODIFY_EXCLUSIVE mode,
487+
// otherwise the function will error out.
488+
// Set recursive true if all data inside the group is to be deleted.
489+
func (g *Group) Delete(recursive bool) error {
490+
curi := C.CString(g.uri)
491+
defer C.free(unsafe.Pointer(curi))
492+
493+
var cRecursive C.uint8_t
494+
if recursive {
495+
cRecursive = 1
496+
}
497+
498+
ret := C.tiledb_group_delete_group(g.context.tiledbContext, g.group, curi, cRecursive)
499+
if ret != C.TILEDB_OK {
500+
return fmt.Errorf("Error deleting group: %s", g.context.LastError())
501+
}
502+
return nil
503+
}

group_test.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
238347
func memberCount(group *Group) (uint64, error) {
239348
if err := group.Open(TILEDB_READ); err != nil {
240349
return 0, err

0 commit comments

Comments
 (0)