From 3f7850b5f972eb4baee5f6e64e5932b8b2994f0e Mon Sep 17 00:00:00 2001 From: gsvic Date: Thu, 30 Apr 2020 20:02:13 +0300 Subject: [PATCH] Add support for non empty domain by name [ch1876] --- src/main/java/io/tiledb/java/api/Array.java | 59 +++++++++++++++++++ src/main/java/io/tiledb/java/api/Pair.java | 11 ++++ .../java/io/tiledb/java/api/ArrayTest.java | 38 ++++++++++++ 3 files changed, 108 insertions(+) diff --git a/src/main/java/io/tiledb/java/api/Array.java b/src/main/java/io/tiledb/java/api/Array.java index b444ee6c..40e5fda5 100644 --- a/src/main/java/io/tiledb/java/api/Array.java +++ b/src/main/java/io/tiledb/java/api/Array.java @@ -481,6 +481,65 @@ public HashMap nonEmptyDomain() throws TileDBError { return ret; } + /** + * Given a dimension's index, return the bounding coordinates for that dimension. + * + * @param index THe dimension's index + * @return A Pair that contains the dimension's bounds + * @exception TileDBError A TileDB exception + */ + public Pair getNonEmptyDomainFromIndex(long index) throws TileDBError { + checkIsOpen(); + Pair p; + try (Domain domain = schema.getDomain(); + NativeArray domainArray = + new NativeArray(ctx, 2 * (int) domain.getRank(), domain.getType())) { + + SWIGTYPE_p_int emptyp = tiledb.new_intp(); + try { + ctx.handleError( + tiledb.tiledb_array_get_non_empty_domain_from_index( + ctx.getCtxp(), arrayp, index, domainArray.toVoidPointer(), emptyp)); + if (tiledb.intp_value(emptyp) == 1) { + System.out.println("Returning empty pair"); + return Pair.empty(); + } + } finally { + tiledb.delete_intp(emptyp); + } + + return new Pair(domainArray.getItem(0), domainArray.getItem(1)); + } + } + + /** + * Given a dimension's name, return the bounding coordinates for that dimension. + * + * @param name THe dimension's name + * @return A Pair that contains the dimension's bounds + * @exception TileDBError A TileDB exception + */ + public Pair getNonEmptyDomainFromName(String name) throws TileDBError { + checkIsOpen(); + HashMap ret = new HashMap(); + try (Domain domain = schema.getDomain(); + NativeArray domainArray = + new NativeArray(ctx, 2 * (int) domain.getRank(), domain.getType())) { + SWIGTYPE_p_int emptyp = tiledb.new_intp(); + try { + ctx.handleError( + tiledb.tiledb_array_get_non_empty_domain_from_name( + ctx.getCtxp(), arrayp, name, domainArray.toVoidPointer(), emptyp)); + if (tiledb.intp_value(emptyp) == 1) { + return Pair.empty(); + } + } finally { + tiledb.delete_intp(emptyp); + } + return new Pair(domainArray.getItem(0), domainArray.getItem(1)); + } + } + /** * Compute an upper bound on the buffer elements needed to read a subarray. * diff --git a/src/main/java/io/tiledb/java/api/Pair.java b/src/main/java/io/tiledb/java/api/Pair.java index aa86734c..6e496af1 100644 --- a/src/main/java/io/tiledb/java/api/Pair.java +++ b/src/main/java/io/tiledb/java/api/Pair.java @@ -28,6 +28,8 @@ public class Pair implements java.io.Serializable { private F first; private S second; + private Pair() {} + public Pair(F first, S second) { this.first = first; this.second = second; @@ -48,4 +50,13 @@ public S getSecond() { public void setSecond(S second) { this.second = second; } + + /** + * Returns an empty Pair + * + * @return The Pair + */ + public static Pair empty() { + return new Pair(); + } } diff --git a/src/test/java/io/tiledb/java/api/ArrayTest.java b/src/test/java/io/tiledb/java/api/ArrayTest.java index d7e84cb0..ec5119d6 100644 --- a/src/test/java/io/tiledb/java/api/ArrayTest.java +++ b/src/test/java/io/tiledb/java/api/ArrayTest.java @@ -209,4 +209,42 @@ public void testArrayOpenAtEncrypted() throws Exception { assert Arrays.equals(readArrayAtEncrypted(BigInteger.valueOf(ts_b)), array_b); assert Arrays.equals(readArrayAtEncrypted(BigInteger.valueOf(ts_c)), array_c); } + + @Test + public void testArraygetNonEmptyDomainFromIndex() throws Exception { + Array.create(arrayURI, schemaCreate()); + + long[] array_a = new long[] {1, 2, 3, 6}; + insertArbitraryValues(new NativeArray(ctx, array_a, Long.class)); + + Array array = new Array(ctx, arrayURI, TILEDB_READ); + + Assert.assertEquals(1L, array.getNonEmptyDomainFromIndex(0).getFirst()); + Assert.assertEquals(4L, array.getNonEmptyDomainFromIndex(0).getSecond()); + + try { + array.getNonEmptyDomainFromIndex(1); + Assert.fail(); + } catch (TileDBError error) { + } + } + + @Test + public void testArraygetNonEmptyDomainFromName() throws Exception { + Array.create(arrayURI, schemaCreate()); + + long[] array_a = new long[] {1, 2, 3, 6}; + insertArbitraryValues(new NativeArray(ctx, array_a, Long.class)); + + Array array = new Array(ctx, arrayURI, TILEDB_READ); + + Assert.assertEquals(1L, array.getNonEmptyDomainFromName("d1").getFirst()); + Assert.assertEquals(4L, array.getNonEmptyDomainFromName("d1").getSecond()); + + try { + array.getNonEmptyDomainFromName("d2"); + Assert.fail(); + } catch (TileDBError error) { + } + } }