Skip to content

Commit c02c823

Browse files
committed
Reduce copy pasting in tests, add a new getMetadata overload
1 parent caa69fe commit c02c823

File tree

2 files changed

+89
-47
lines changed

2 files changed

+89
-47
lines changed

src/main/java/io/tiledb/java/api/Array.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,18 @@ public HashMap<String, Pair<Long, Long>> maxBufferElements(NativeArray subarray)
615615
return ret;
616616
}
617617

618+
/**
619+
* Get a metadata key-value item from an open array. The array must be opened in READ mode,
620+
* otherwise the function will error out.
621+
*
622+
* @param key a key to retrieve from the metadata key-value
623+
* @return NativeArray which contains the metadata
624+
* @throws TileDBError A TileDB exception
625+
*/
626+
public NativeArray getMetadata(String key) throws TileDBError {
627+
return getMetadata(key, null);
628+
}
629+
618630
/**
619631
* Get a metadata key-value item from an open array. The array must be opened in READ mode,
620632
* otherwise the function will error out.
@@ -630,14 +642,18 @@ public NativeArray getMetadata(String key, Datatype nativeType) throws TileDBErr
630642
SWIGTYPE_p_p_void resultArrpp = tiledb.new_voidpArray(0);
631643
SWIGTYPE_p_unsigned_int value_num = tiledb.new_uintp();
632644
SWIGTYPE_p_tiledb_datatype_t value_type =
633-
tiledb.copy_tiledb_datatype_tp(nativeType.toSwigEnum());
645+
(nativeType == null)
646+
? tiledb.new_tiledb_datatype_tp()
647+
: tiledb.copy_tiledb_datatype_tp(nativeType.toSwigEnum());
634648

635649
ctx.handleError(
636650
tiledb.tiledb_array_get_metadata(
637651
ctx.getCtxp(), arrayp, key, value_type, value_num, resultArrpp));
638652

653+
Datatype derivedNativeType = Datatype.fromSwigEnum(tiledb.tiledb_datatype_tp_value(value_type));
654+
639655
long value = tiledb.uintp_value(value_num);
640-
NativeArray result = new NativeArray(ctx, nativeType, resultArrpp, (int) value);
656+
NativeArray result = new NativeArray(ctx, derivedNativeType, resultArrpp, (int) value);
641657

642658
tiledb.delete_uintp(value_num);
643659
tiledb.delete_tiledb_datatype_tp(value_type);
@@ -679,6 +695,18 @@ public BigInteger getMetadataNum() throws TileDBError {
679695
return value;
680696
}
681697

698+
/**
699+
* Gets a metadata item from an open array using an index. The array must be opened in READ mode,
700+
* otherwise the function will error out.
701+
*
702+
* @param index index to retrieve metadata from
703+
* @return a pair, key and the metadata
704+
* @throws TileDBError A TileDB exception
705+
*/
706+
public Pair<String, NativeArray> getMetadataFromIndex(long index) throws TileDBError {
707+
return getMetadataFromIndex(BigInteger.valueOf(index));
708+
}
709+
682710
/**
683711
* Gets a metadata item from an open array using an index. The array must be opened in READ mode,
684712
* otherwise the function will error out.

src/test/java/io/tiledb/java/api/ArrayTest.java

Lines changed: 59 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.tiledb.java.api;
22

3+
import static io.tiledb.java.api.Datatype.*;
34
import static io.tiledb.java.api.Layout.TILEDB_ROW_MAJOR;
45
import static io.tiledb.java.api.QueryType.TILEDB_READ;
56
import static io.tiledb.java.api.QueryType.TILEDB_WRITE;
@@ -309,37 +310,50 @@ public void testArrayMetadata() throws Exception {
309310
String floatKey = "md-float";
310311
String doubleKey = "md-double";
311312

312-
Assert.assertFalse(array.hasMetadataKey(byteKey));
313-
Assert.assertFalse(array.hasMetadataKey(shortKey));
314-
Assert.assertFalse(array.hasMetadataKey(intKey));
315-
Assert.assertFalse(array.hasMetadataKey(floatKey));
316-
Assert.assertFalse(array.hasMetadataKey(doubleKey));
313+
// metadata keys sorted in a lexicographic ordering
314+
String[] keys = new String[] {byteKey, doubleKey, floatKey, intKey, shortKey};
315+
Datatype[] types =
316+
new Datatype[] {TILEDB_INT8, TILEDB_FLOAT64, TILEDB_FLOAT32, TILEDB_INT32, TILEDB_INT16};
317+
int keysNum = keys.length;
318+
NativeArray[] nativeArrays =
319+
new NativeArray[] {metadataByte, metadataDouble, metadataFloat, metadataInt, metadataShort};
320+
Object[] expectedArrays =
321+
new Object[] {
322+
metadataByte.toJavaArray(),
323+
metadataDouble.toJavaArray(),
324+
metadataFloat.toJavaArray(),
325+
metadataInt.toJavaArray(),
326+
metadataShort.toJavaArray()
327+
};
328+
329+
for (int i = 0; i < keysNum; i++) {
330+
Assert.assertFalse(array.hasMetadataKey(keys[i]));
331+
}
332+
317333
Assert.assertEquals(0, array.getMetadataNum().intValue());
318334
array.close();
319335

320-
arrayw.putMetadata(byteKey, metadataByte);
321-
arrayw.putMetadata(shortKey, metadataShort);
322-
arrayw.putMetadata(intKey, metadataInt);
323-
arrayw.putMetadata(floatKey, metadataFloat);
324-
arrayw.putMetadata(doubleKey, metadataDouble);
336+
for (int i = 0; i < keysNum; i++) {
337+
arrayw.putMetadata(keys[i], nativeArrays[i]);
338+
}
325339
// submit changes
326340
arrayw.close();
327341

328342
// open a new session
329343
Array arrayn = new Array(ctx, arrayURI, TILEDB_READ);
330344

331-
Assert.assertTrue(arrayn.hasMetadataKey(byteKey));
332-
Assert.assertTrue(arrayn.hasMetadataKey(shortKey));
333-
Assert.assertTrue(arrayn.hasMetadataKey(intKey));
334-
Assert.assertTrue(arrayn.hasMetadataKey(floatKey));
335-
Assert.assertTrue(arrayn.hasMetadataKey(doubleKey));
336-
Assert.assertEquals(5, arrayn.getMetadataNum().intValue());
345+
for (int i = 0; i < keysNum; i++) {
346+
Assert.assertTrue(arrayn.hasMetadataKey(keys[i]));
347+
}
348+
349+
Assert.assertEquals(keysNum, arrayn.getMetadataNum().intValue());
337350

338-
NativeArray metadataByteActual = arrayn.getMetadata(byteKey, Datatype.TILEDB_INT8);
339-
NativeArray metadataShortActual = arrayn.getMetadata(shortKey, Datatype.TILEDB_INT16);
340-
NativeArray metadataIntActual = arrayn.getMetadata(intKey, Datatype.TILEDB_INT32);
341-
NativeArray metadataFloatActual = arrayn.getMetadata(floatKey, Datatype.TILEDB_FLOAT32);
342-
NativeArray metadataDoubleActual = arrayn.getMetadata(doubleKey, Datatype.TILEDB_FLOAT64);
351+
// manual extraction of metadata
352+
NativeArray metadataByteActual = arrayn.getMetadata(byteKey, TILEDB_INT8);
353+
NativeArray metadataShortActual = arrayn.getMetadata(shortKey, TILEDB_INT16);
354+
NativeArray metadataIntActual = arrayn.getMetadata(intKey, TILEDB_INT32);
355+
NativeArray metadataFloatActual = arrayn.getMetadata(floatKey, TILEDB_FLOAT32);
356+
NativeArray metadataDoubleActual = arrayn.getMetadata(doubleKey, TILEDB_FLOAT64);
343357

344358
Assert.assertNotNull(metadataByteActual);
345359
Assert.assertNotNull(metadataShortActual);
@@ -360,43 +374,43 @@ public void testArrayMetadata() throws Exception {
360374
(double[]) metadataDoubleActual.toJavaArray(),
361375
1e-10d);
362376

363-
// fromIndex tests
364-
// metadata keys sorted in a lexicographic ordering
365-
String[] expectedKeys = new String[] {byteKey, doubleKey, floatKey, intKey, shortKey};
366-
Object[] expectedArrays =
367-
new Object[] {
368-
metadataByte.toJavaArray(),
369-
metadataDouble.toJavaArray(),
370-
metadataFloat.toJavaArray(),
371-
metadataInt.toJavaArray(),
372-
metadataShort.toJavaArray()
373-
};
377+
// exctracion of metadata without specifying the Datatype
378+
for (int i = 0; i < keysNum; i++) {
379+
NativeArray a = arrayn.getMetadata(keys[i]);
380+
Assert.assertNotNull(a);
381+
Assert.assertEquals(types[i], a.getNativeType());
382+
Assert.assertEquals(nativeArrays[i].getNativeType(), a.getNativeType());
383+
Assert.assertArrayEquals(getArray(expectedArrays[i]), getArray(a.toJavaArray()));
384+
}
374385

386+
// fromIndex tests
375387
for (int i = 0; i < arrayn.getMetadataNum().intValue(); i++) {
376-
Pair<String, NativeArray> p = arrayn.getMetadataFromIndex(BigInteger.valueOf(i));
377-
Assert.assertEquals(expectedKeys[i], p.getFirst());
378-
Assert.assertArrayEquals(getArray(expectedArrays[i]), getArray(p.getSecond().toJavaArray()));
388+
Pair<String, NativeArray> p = arrayn.getMetadataFromIndex(i);
389+
NativeArray a = p.getSecond();
390+
Assert.assertEquals(keys[i], p.getFirst());
391+
Assert.assertEquals(types[i], a.getNativeType());
392+
Assert.assertEquals(nativeArrays[i].getNativeType(), a.getNativeType());
393+
Assert.assertArrayEquals(getArray(expectedArrays[i]), getArray(a.toJavaArray()));
379394
}
380395

381396
arrayn.close();
382397

383398
// open a new write session
384399
Array arrayd = new Array(ctx, arrayURI, TILEDB_WRITE);
385400

386-
arrayd.deleteMetadata(byteKey);
387-
arrayd.deleteMetadata(shortKey);
388-
arrayd.deleteMetadata(intKey);
389-
arrayd.deleteMetadata(floatKey);
390-
arrayd.deleteMetadata(doubleKey);
401+
for (int i = 0; i < keysNum; i++) {
402+
arrayd.deleteMetadata(keys[i]);
403+
}
404+
391405
arrayd.close();
392406

393407
// open a new session to check the deletion
394408
Array arraydn = new Array(ctx, arrayURI, TILEDB_READ);
395-
Assert.assertFalse(arraydn.hasMetadataKey(byteKey));
396-
Assert.assertFalse(arraydn.hasMetadataKey(shortKey));
397-
Assert.assertFalse(arraydn.hasMetadataKey(intKey));
398-
Assert.assertFalse(arraydn.hasMetadataKey(floatKey));
399-
Assert.assertFalse(arraydn.hasMetadataKey(doubleKey));
409+
410+
for (int i = 0; i < keysNum; i++) {
411+
Assert.assertFalse(arraydn.hasMetadataKey(keys[i]));
412+
}
413+
400414
Assert.assertEquals(0, arraydn.getMetadataNum().intValue());
401415

402416
arraydn.close();

0 commit comments

Comments
 (0)