diff --git a/build.gradle b/build.gradle index 726399bd..7bbf5d71 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { } group 'io.tiledb' -version '0.17.0-SNAPSHOT' +version '0.17.2-SNAPSHOT' repositories { jcenter() diff --git a/src/main/c/custom/tiledb_custom.cxx b/src/main/c/custom/tiledb_custom.cxx index 10b33d35..caec1e9b 100644 --- a/src/main/c/custom/tiledb_custom.cxx +++ b/src/main/c/custom/tiledb_custom.cxx @@ -1207,7 +1207,7 @@ extern "C" { } arg4 = *(uint8_t **)&jarg4; arg5 = *(uint64_t **)&jarg5; - result = (int32_t)tiledb_query_set_validity_buffer(arg1,arg2,(char const *)arg3,arg4,arg5); + result = (int32_t)tiledb_query_set_validity_buffer(arg1,arg2,(char const *)arg3,(uint8_t *)buffer,arg5); jresult = (jint)result; if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); return jresult; diff --git a/src/main/java/io/tiledb/java/api/Query.java b/src/main/java/io/tiledb/java/api/Query.java index 27dffe62..2ce51d97 100644 --- a/src/main/java/io/tiledb/java/api/Query.java +++ b/src/main/java/io/tiledb/java/api/Query.java @@ -553,7 +553,13 @@ public synchronized Query setValidityBuffer(String attr, NativeArray bytemap) th uint64_tArray buffer_validity_bytemap_size = new uint64_tArray(1); buffer_validity_bytemap_size.setitem(0, BigInteger.valueOf(bytemap.getNBytes())); - validityByteMaps_.put(attr, bytemap); + if (validityByteMaps_.containsKey(attr)) { + NativeArray byteMap = validityByteMaps_.get(attr); + if (byteMap != null) byteMap.close(); + validityByteMaps_.put(attr, bytemap); + } else { + validityByteMaps_.put(attr, bytemap); + } validityByteMapSizes_.put(attr, buffer_validity_bytemap_size); ctx.handleError( @@ -568,7 +574,7 @@ public synchronized Query setValidityBuffer(String attr, NativeArray bytemap) th } /** - * Sets a validity byte-map for a fixed-sized attribute. + * Sets a validity byte-map for an attribute. * * @param attr The attribute name. * @param buffer NativeBuffer to be used for the attribute values. @@ -594,6 +600,12 @@ public synchronized Query setValidityBuffer(String attr, ByteBuffer buffer) thro buffer_validity_bytemap_size.setitem(0, BigInteger.valueOf(buffer.capacity())); + // Close previous buffers if they exist for this attribute + if (validityByteMaps_.containsKey(attr)) { + NativeArray prevBuff = validityByteMaps_.get(attr); + prevBuff.close(); + } + validityByteMapsByteBuffers_.put(attr, buffer); validityByteMapSizes_.put(attr, buffer_validity_bytemap_size); @@ -1006,14 +1018,29 @@ public synchronized void resetBuffers() { if (buffer.getSecond() != null) buffer.getSecond().clear(); } + for (NativeArray buffer : validityByteMaps_.values()) { + if (buffer != null) buffer.close(); + } + + for (ByteBuffer buffer : validityByteMapsByteBuffers_.values()) { + if (buffer != null) buffer.clear(); + } + byteBuffers_.clear(); buffers_.clear(); + validityByteMapsByteBuffers_.clear(); + validityByteMaps_.clear(); for (Pair size_pair : buffer_sizes_.values()) { if (size_pair.getFirst() != null) size_pair.getFirst().delete(); if (size_pair.getSecond() != null) size_pair.getSecond().delete(); } buffer_sizes_.clear(); + + for (uint64_tArray size : validityByteMapSizes_.values()) { + if (size != null) size.delete(); + } + validityByteMapSizes_.clear(); } public synchronized Query resetBufferSizes(Long val) { diff --git a/src/test/java/io/tiledb/java/api/QueryTest.java b/src/test/java/io/tiledb/java/api/QueryTest.java index a16ab660..cc03da29 100644 --- a/src/test/java/io/tiledb/java/api/QueryTest.java +++ b/src/test/java/io/tiledb/java/api/QueryTest.java @@ -1197,7 +1197,8 @@ public void denseArrayReadTest() throws Exception { } } - public void denseArrayNIOReadTest() throws Exception { // TODO + @Test + public void denseArrayNIOReadTest() throws Exception { denseArrayCreateNullableAttrs(true); denseArrayWrite(); @@ -1363,7 +1364,8 @@ public void sparseArrayReadTest() throws Exception { } } - public void sparseArrayNIOReadTest() throws Exception { // TODO + @Test + public void sparseArrayNIOReadTest() throws Exception { sparseArrayCreateNullableAttrs(true); sparseArrayWrite();