Skip to content

Commit ce660cc

Browse files
committed
Added getMetadataMap to Array
1 parent dc80fec commit ce660cc

File tree

2 files changed

+162
-0
lines changed

2 files changed

+162
-0
lines changed

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import io.tiledb.libtiledb.*;
3030
import java.math.BigInteger;
3131
import java.util.HashMap;
32+
import java.util.Map;
3233

3334
/**
3435
* Class representing a TileDB array object.
@@ -742,6 +743,26 @@ public Pair<String, NativeArray> getMetadataFromIndex(BigInteger index) throws T
742743
return new Pair<String, NativeArray>(keyString, result);
743744
}
744745

746+
/**
747+
* Returns a HashMap with all array metadata in a key-value manner.
748+
*
749+
* @return The metadata
750+
* @throws TileDBError
751+
*/
752+
public Map<String, Object> getMetadataMap() throws TileDBError {
753+
Map<String, Object> result = new HashMap<>();
754+
755+
for (int i = 0; i < this.getMetadataNum().intValue(); ++i) {
756+
Pair meta = this.getMetadataFromIndex(i);
757+
String key = meta.getFirst().toString();
758+
NativeArray value = (NativeArray) meta.getSecond();
759+
if (value.getSize() == 1) result.put(key, value.getItem(0));
760+
else result.put(key, value);
761+
}
762+
763+
return result;
764+
}
765+
745766
/**
746767
* Checks if the key is present in the Array metadata. The array must be opened in READ mode,
747768
* otherwise the function will error out.

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

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.nio.charset.StandardCharsets;
1010
import java.sql.Timestamp;
1111
import java.util.Arrays;
12+
import java.util.Map;
1213
import org.junit.*;
1314
import org.junit.rules.TemporaryFolder;
1415

@@ -415,4 +416,144 @@ public void testArrayMetadata() throws Exception {
415416

416417
arraydn.close();
417418
}
419+
420+
@Test
421+
public void testArrayGetMetadataMap() throws Exception {
422+
Array.create(arrayURI, schemaCreate());
423+
424+
long[] array_a = new long[] {1, 2, 3, 6};
425+
insertArbitraryValues(new NativeArray(ctx, array_a, Long.class));
426+
427+
Array array = new Array(ctx, arrayURI, TILEDB_WRITE);
428+
429+
NativeArray metadataByte = new NativeArray(ctx, new byte[] {-7, -6, -5, 0, 100}, Byte.class);
430+
431+
NativeArray metadataShort = new NativeArray(ctx, new short[] {18, 19, 20, 21}, Short.class);
432+
433+
NativeArray metadataInt =
434+
new NativeArray(
435+
ctx,
436+
new int[] {
437+
0, 1, 2, 3, 4, 5, 6, 7,
438+
8, 9, 10, 11, 12, 13, 14, 15
439+
},
440+
Integer.class);
441+
442+
NativeArray metadataFloat =
443+
new NativeArray(
444+
ctx,
445+
new float[] {
446+
0.1f, 0.2f, 1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f,
447+
4.1f, 4.2f, 5.1f, 5.2f, 6.1f, 6.2f, 7.1f, 7.2f,
448+
8.1f, 8.2f, 9.1f, 9.2f, 10.1f, 10.2f, 11.1f, 11.2f,
449+
12.1f, 12.2f, 13.1f, 13.2f, 14.1f, 14.2f, 15.1f, 15.2f
450+
},
451+
Float.class);
452+
453+
NativeArray metadataDouble =
454+
new NativeArray(
455+
ctx,
456+
new double[] {
457+
1.1d, 1.2d, 2.1d, 2.2d, 3.1d, 3.2d, 4.1d, 4.2d,
458+
5.1d, 5.2d, 6.1d, 6.2d, 7.1d, 7.2d, 8.1d, 8.2d,
459+
9.1d, 9.2d, 10.1d, 10.2d, 11.1d, 11.2d, 12.1d, 12.2d,
460+
13.1d, 14.2d, 14.1d, 14.2d, 15.1d, 15.2d, 16.1d, 16.2d
461+
},
462+
Double.class);
463+
464+
NativeArray metadataByteSingle = new NativeArray(ctx, new byte[] {-7}, Byte.class);
465+
NativeArray metadataShortSingle = new NativeArray(ctx, new short[] {1}, Short.class);
466+
NativeArray metadataIntSingle = new NativeArray(ctx, new int[] {1}, Integer.class);
467+
NativeArray metadataDoubleSingle = new NativeArray(ctx, new double[] {1.0}, Double.class);
468+
NativeArray metadataFloatSingle = new NativeArray(ctx, new float[] {1.0f}, Float.class);
469+
470+
String byteKey = "md-byte";
471+
String shortKey = "md-short";
472+
String intKey = "md-int";
473+
String floatKey = "md-float";
474+
String doubleKey = "md-double";
475+
476+
String byteSingleKey = "byte-single";
477+
String shortSingleKey = "short-single";
478+
String intSingleKey = "int-single";
479+
String floatSingleKey = "float-single";
480+
String doubleSingleKey = "double-single";
481+
482+
// metadata keys sorted in a lexicographic ordering
483+
String[] keys =
484+
new String[] {
485+
byteKey,
486+
doubleKey,
487+
floatKey,
488+
intKey,
489+
shortKey,
490+
byteSingleKey,
491+
doubleSingleKey,
492+
floatSingleKey,
493+
shortSingleKey,
494+
intSingleKey
495+
};
496+
Datatype[] types =
497+
new Datatype[] {
498+
TILEDB_INT8,
499+
TILEDB_FLOAT64,
500+
TILEDB_FLOAT32,
501+
TILEDB_INT32,
502+
TILEDB_INT16,
503+
TILEDB_INT8,
504+
TILEDB_FLOAT64,
505+
TILEDB_FLOAT32,
506+
TILEDB_INT32,
507+
TILEDB_INT16
508+
};
509+
510+
int keysNum = keys.length;
511+
NativeArray[] nativeArrays =
512+
new NativeArray[] {
513+
metadataByte,
514+
metadataDouble,
515+
metadataFloat,
516+
metadataInt,
517+
metadataShort,
518+
metadataByteSingle,
519+
metadataDoubleSingle,
520+
metadataFloatSingle,
521+
metadataIntSingle,
522+
metadataShortSingle
523+
};
524+
525+
for (int i = 0; i < keysNum; i++) {
526+
array.putMetadata(keys[i], nativeArrays[i]);
527+
}
528+
// submit changes
529+
array.close();
530+
531+
// open a new session
532+
array = new Array(ctx, arrayURI, TILEDB_READ);
533+
534+
Map<String, Object> metadata = array.getMetadataMap();
535+
536+
for (int i = 0; i < keys.length; ++i) {
537+
String key = keys[i];
538+
Object value = metadata.get(key);
539+
540+
// Check if the key is contained in the metadata
541+
Assert.assertTrue(metadata.containsKey(key));
542+
543+
Class c = types[i].javaClass();
544+
545+
if (value instanceof NativeArray) {
546+
// Check array types
547+
Assert.assertEquals(c, ((NativeArray) value).getJavaType());
548+
549+
// Check array elements
550+
for (int idx = 0; idx < nativeArrays[i].getSize(); ++idx) {
551+
Assert.assertEquals(((NativeArray) value).getItem(idx), nativeArrays[i].getItem(idx));
552+
}
553+
} else {
554+
Assert.assertEquals(c, value.getClass());
555+
Assert.assertEquals(nativeArrays[i].getItem(0), value);
556+
}
557+
}
558+
}
418559
}

0 commit comments

Comments
 (0)