Skip to content

Commit 61c0e71

Browse files
committed
Integrate var-sized NativeArray map with the fix-sized NativeArray map
1 parent 3a434d0 commit 61c0e71

File tree

1 file changed

+62
-62
lines changed

1 file changed

+62
-62
lines changed

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

Lines changed: 62 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,8 @@ public class Query implements AutoCloseable {
5959

6060
private NativeArray subarray;
6161

62-
private Map<String, NativeArray> buffers_;
6362
private Map<String, Pair<ByteBuffer, ByteBuffer>> byteBuffers_;
64-
private Map<String, Pair<NativeArray, NativeArray>> var_buffers_;
63+
private Map<String, Pair<NativeArray, NativeArray>> buffers_;
6564
private Map<String, Pair<uint64_tArray, uint64_tArray>> buffer_sizes_;
6665

6766
public Query(Array array, QueryType type) throws TileDBError {
@@ -82,7 +81,6 @@ public Query(Array array, QueryType type) throws TileDBError {
8281
this.queryp = tiledb.tiledb_query_tpp_value(_querypp);
8382
this.buffers_ = Collections.synchronizedMap(new HashMap<>());
8483
this.byteBuffers_ = Collections.synchronizedMap(new HashMap<>());
85-
this.var_buffers_ = Collections.synchronizedMap(new HashMap<>());
8684
this.buffer_sizes_ = Collections.synchronizedMap(new HashMap<>());
8785
}
8886

@@ -130,9 +128,11 @@ public QueryStatus submit() throws TileDBError {
130128
for (String attribute : byteBuffers_.keySet()) {
131129
boolean isVar;
132130

133-
if (array.getSchema().hasAttribute(attribute))
134-
isVar = array.getSchema().getAttribute(attribute).isVar();
135-
else isVar = array.getSchema().getDomain().getDimension(attribute).isVar();
131+
try (ArraySchema arraySchema = array.getSchema()) {
132+
if (arraySchema.hasAttribute(attribute))
133+
isVar = arraySchema.getAttribute(attribute).isVar();
134+
else isVar = arraySchema.getDomain().getDimension(attribute).isVar();
135+
}
136136

137137
if (isVar) {
138138
int offset_nbytes = this.buffer_sizes_.get(attribute).getFirst().getitem(0).intValue();
@@ -414,10 +414,10 @@ public synchronized Query setBuffer(String attr, NativeArray buffer) throws Tile
414414

415415
// Close previous buffers if they exist for this attribute
416416
if (buffers_.containsKey(attr)) {
417-
buffers_.get(attr).close();
417+
buffers_.get(attr).getSecond().close();
418418
}
419419

420-
buffers_.put(attr, buffer);
420+
buffers_.put(attr, new Pair(null, buffer));
421421
buffer_sizes_.put(attr, buffer_sizes);
422422

423423
// Set the actual TileDB buffer
@@ -475,10 +475,10 @@ public synchronized Query setBuffer(String attr, NativeArray buffer, long buffer
475475

476476
// Close previous buffers if they exist for this attribute
477477
if (buffers_.containsKey(attr)) {
478-
buffers_.get(attr).close();
478+
buffers_.get(attr).getSecond().close();
479479
}
480480

481-
buffers_.put(attr, buffer);
481+
buffers_.put(attr, new Pair(null, buffer));
482482
buffer_sizes_.put(attr, buffer_sizes);
483483

484484
// Set the actual TileDB buffer
@@ -619,13 +619,13 @@ public synchronized Query setBuffer(String attr, NativeArray offsets, NativeArra
619619
new Pair<>(offsets_array_size, values_array_size);
620620

621621
// Close previous buffers if they exist for this attribute
622-
if (var_buffers_.containsKey(attr)) {
623-
Pair<NativeArray, NativeArray> prev_buffers = var_buffers_.get(attr);
622+
if (buffers_.containsKey(attr)) {
623+
Pair<NativeArray, NativeArray> prev_buffers = buffers_.get(attr);
624624
prev_buffers.getFirst().close();
625625
prev_buffers.getSecond().close();
626626
}
627627

628-
var_buffers_.put(attr, new Pair<>(offsets, buffer));
628+
buffers_.put(attr, new Pair<>(offsets, buffer));
629629
buffer_sizes_.put(attr, buffer_sizes);
630630

631631
ctx.handleError(
@@ -679,8 +679,8 @@ public synchronized Query setBuffer(String attr, ByteBuffer offsets, ByteBuffer
679679
new Pair<>(offsets_array_size, values_array_size);
680680

681681
// Close previous buffers if they exist for this attribute
682-
if (var_buffers_.containsKey(attr)) {
683-
Pair<NativeArray, NativeArray> prev_buffers = var_buffers_.get(attr);
682+
if (buffers_.containsKey(attr)) {
683+
Pair<NativeArray, NativeArray> prev_buffers = buffers_.get(attr);
684684
prev_buffers.getFirst().close();
685685
prev_buffers.getSecond().close();
686686
}
@@ -765,13 +765,13 @@ public synchronized Query setBuffer(
765765
new Pair<>(offsets_array_size, values_array_size);
766766

767767
// Close previous buffers if they exist for this attribute
768-
if (var_buffers_.containsKey(attr)) {
769-
Pair<NativeArray, NativeArray> prev_buffers = var_buffers_.get(attr);
768+
if (buffers_.containsKey(attr)) {
769+
Pair<NativeArray, NativeArray> prev_buffers = buffers_.get(attr);
770770
prev_buffers.getFirst().close();
771771
prev_buffers.getSecond().close();
772772
}
773773

774-
var_buffers_.put(attr, new Pair<>(offsets, buffer));
774+
buffers_.put(attr, new Pair<>(offsets, buffer));
775775
buffer_sizes_.put(attr, buffer_sizes);
776776

777777
ctx.handleError(
@@ -795,13 +795,13 @@ private Query setBufferSizeUnsafe(String attribute, long offsetSize, long buffer
795795

796796
public synchronized Query setBufferByteSize(String attribute, Long offsetSize, Long bufferSize)
797797
throws TileDBError {
798-
if (!var_buffers_.containsKey(attribute)) {
798+
if (!buffers_.containsKey(attribute)) {
799799
throw new TileDBError("Query var attribute buffer does not exist: " + attribute);
800800
}
801801
if (offsetSize <= 0 || bufferSize <= 0) {
802802
throw new TileDBError("Number of buffer bytes must be >= 1");
803803
}
804-
Pair<NativeArray, NativeArray> varBuffers = var_buffers_.get(attribute);
804+
Pair<NativeArray, NativeArray> varBuffers = buffers_.get(attribute);
805805
NativeArray offsetBuffer = varBuffers.getFirst();
806806
Long offsetNBytes = offsetBuffer.getNBytes();
807807
NativeArray buffer = varBuffers.getSecond();
@@ -831,7 +831,7 @@ public synchronized Query setBufferByteSize(String attribute, Long bufferSize)
831831
if (bufferSize <= 0) {
832832
throw new TileDBError("Number of buffer bytes must be >= 1");
833833
}
834-
NativeArray buffer = buffers_.get(attribute);
834+
NativeArray buffer = buffers_.get(attribute).getSecond();
835835
Long bufferNBytes = buffer.getNBytes();
836836
if (bufferSize > bufferNBytes) {
837837
throw new TileDBError(
@@ -851,7 +851,7 @@ public synchronized Query setBufferElements(String attribute, Integer bufferElem
851851
if (bufferElements <= 0) {
852852
throw new TileDBError("Number of buffer elements must be >= 1");
853853
}
854-
NativeArray buffer = buffers_.get(attribute);
854+
NativeArray buffer = buffers_.get(attribute).getSecond();
855855
Integer bufferSize = buffer.getSize();
856856
if (bufferElements > bufferSize) {
857857
throw new TileDBError(
@@ -865,13 +865,13 @@ public synchronized Query setBufferElements(String attribute, Integer bufferElem
865865

866866
public synchronized Query setBufferElements(
867867
String attribute, Integer offsetElements, Integer bufferElements) throws TileDBError {
868-
if (!var_buffers_.containsKey(attribute)) {
868+
if (!buffers_.containsKey(attribute)) {
869869
throw new TileDBError("Query var attribute buffer does not exist: " + attribute);
870870
}
871871
if (offsetElements <= 0 || bufferElements <= 0) {
872872
throw new TileDBError("Number of buffer elements must be >= 1");
873873
}
874-
Pair<NativeArray, NativeArray> varBuffers = var_buffers_.get(attribute);
874+
Pair<NativeArray, NativeArray> varBuffers = buffers_.get(attribute);
875875
NativeArray offsetBuffer = varBuffers.getFirst();
876876
Integer offsetSize = offsetBuffer.getSize();
877877
NativeArray buffer = varBuffers.getSecond();
@@ -928,28 +928,32 @@ public Object getCoordinates() throws TileDBError {
928928
*/
929929
public HashMap<String, Pair<Long, Long>> resultBufferElements() throws TileDBError {
930930
HashMap<String, Pair<Long, Long>> result = new HashMap<String, Pair<Long, Long>>();
931-
for (Map.Entry<String, NativeArray> entry : buffers_.entrySet()) {
932-
String name = entry.getKey();
933-
NativeArray val_buffer = entry.getValue();
934-
BigInteger val_nbytes = buffer_sizes_.get(name).getSecond().getitem(0);
935-
Long nelements =
936-
val_nbytes.divide(BigInteger.valueOf(val_buffer.getNativeTypeSize())).longValue();
937-
result.put(name, new Pair<>(0l, nelements));
938-
}
939-
for (Map.Entry<String, Pair<NativeArray, NativeArray>> entry : var_buffers_.entrySet()) {
931+
for (Map.Entry<String, Pair<NativeArray, NativeArray>> entry : buffers_.entrySet()) {
940932
String name = entry.getKey();
941-
Pair<uint64_tArray, uint64_tArray> buffer_size = buffer_sizes_.get(name);
942-
943-
NativeArray off_buffer = entry.getValue().getFirst();
944-
BigInteger off_nbytes = buffer_size.getFirst().getitem(0);
945-
Long off_nelements =
946-
off_nbytes.divide(BigInteger.valueOf(off_buffer.getNativeTypeSize())).longValue();
947933

948-
NativeArray val_buffer = entry.getValue().getSecond();
949-
BigInteger val_nbytes = buffer_size.getSecond().getitem(0);
950-
Long val_nelements =
951-
val_nbytes.divide(BigInteger.valueOf(val_buffer.getNativeTypeSize())).longValue();
952-
result.put(name, new Pair<Long, Long>(off_nelements, val_nelements));
934+
// Fixed-sized
935+
if (entry.getValue().getFirst() == null) {
936+
NativeArray val_buffer = entry.getValue().getSecond();
937+
BigInteger val_nbytes = buffer_sizes_.get(name).getSecond().getitem(0);
938+
Long nelements =
939+
val_nbytes.divide(BigInteger.valueOf(val_buffer.getNativeTypeSize())).longValue();
940+
result.put(name, new Pair<>(0l, nelements));
941+
}
942+
// Var-sized
943+
else {
944+
Pair<uint64_tArray, uint64_tArray> buffer_size = buffer_sizes_.get(name);
945+
946+
NativeArray off_buffer = entry.getValue().getFirst();
947+
BigInteger off_nbytes = buffer_size.getFirst().getitem(0);
948+
Long off_nelements =
949+
off_nbytes.divide(BigInteger.valueOf(off_buffer.getNativeTypeSize())).longValue();
950+
951+
NativeArray val_buffer = entry.getValue().getSecond();
952+
BigInteger val_nbytes = buffer_size.getSecond().getitem(0);
953+
Long val_nelements =
954+
val_nbytes.divide(BigInteger.valueOf(val_buffer.getNativeTypeSize())).longValue();
955+
result.put(name, new Pair<Long, Long>(off_nelements, val_nelements));
956+
}
953957
}
954958
return result;
955959
}
@@ -968,12 +972,11 @@ public HashMap<String, Pair<Long, Long>> resultBufferElements() throws TileDBErr
968972
*/
969973
public HashMap<String, Pair<Long, Long>> resultBufferSizes() throws TileDBError {
970974
HashMap<String, Pair<Long, Long>> result = new HashMap<String, Pair<Long, Long>>();
971-
for (Map.Entry<String, NativeArray> entry : buffers_.entrySet()) {
972-
String name = entry.getKey();
975+
for (String name : buffers_.keySet()) {
973976
BigInteger val_nbytes = buffer_sizes_.get(name).getSecond().getitem(0);
974977
result.put(name, new Pair<>(0l, val_nbytes.longValue()));
975978
}
976-
for (Map.Entry<String, Pair<NativeArray, NativeArray>> entry : var_buffers_.entrySet()) {
979+
for (Map.Entry<String, Pair<NativeArray, NativeArray>> entry : buffers_.entrySet()) {
977980
String name = entry.getKey();
978981
Pair<uint64_tArray, uint64_tArray> buffer_size = buffer_sizes_.get(name);
979982

@@ -987,15 +990,15 @@ public HashMap<String, Pair<Long, Long>> resultBufferSizes() throws TileDBError
987990

988991
/** Clears all attribute buffers. */
989992
public synchronized void resetBuffers() {
990-
for (NativeArray buffer : buffers_.values()) {
991-
buffer.close();
993+
for (Pair<NativeArray, NativeArray> buffer : buffers_.values()) {
994+
buffer.getSecond().close();
992995
}
993996
buffers_.clear();
994-
for (Pair<NativeArray, NativeArray> var_buffer : var_buffers_.values()) {
997+
for (Pair<NativeArray, NativeArray> var_buffer : buffers_.values()) {
995998
var_buffer.getFirst().close();
996999
var_buffer.getSecond().close();
9971000
}
998-
var_buffers_.clear();
1001+
buffers_.clear();
9991002
for (Pair<uint64_tArray, uint64_tArray> size_pair : buffer_sizes_.values()) {
10001003
size_pair.getFirst().delete();
10011004
size_pair.getSecond().delete();
@@ -1026,7 +1029,7 @@ public Query resetBufferSizes() {
10261029
*/
10271030
public Object getBuffer(String attr) throws TileDBError {
10281031
if (buffers_.containsKey(attr)) {
1029-
NativeArray buffer = buffers_.get(attr);
1032+
NativeArray buffer = buffers_.get(attr).getSecond();
10301033
Integer nelements =
10311034
(buffer_sizes_
10321035
.get(attr)
@@ -1035,8 +1038,8 @@ public Object getBuffer(String attr) throws TileDBError {
10351038
.divide(BigInteger.valueOf(buffer.getNativeTypeSize())))
10361039
.intValue();
10371040
return buffer.toJavaArray(nelements);
1038-
} else if (var_buffers_.containsKey(attr)) {
1039-
NativeArray buffer = var_buffers_.get(attr).getSecond();
1041+
} else if (buffers_.containsKey(attr)) {
1042+
NativeArray buffer = buffers_.get(attr).getSecond();
10401043
Integer nelements =
10411044
(buffer_sizes_
10421045
.get(attr)
@@ -1070,10 +1073,10 @@ public Pair<ByteBuffer, ByteBuffer> getByteBuffer(String attr) throws TileDBErro
10701073
* @throws TileDBError A TileDB exception
10711074
*/
10721075
public long[] getVarBuffer(String attr) throws TileDBError {
1073-
if (!var_buffers_.containsKey(attr)) {
1076+
if (!buffers_.containsKey(attr)) {
10741077
throw new TileDBError("Query variable attribute buffer does not exist: " + attr);
10751078
}
1076-
NativeArray buffer = var_buffers_.get(attr).getFirst();
1079+
NativeArray buffer = buffers_.get(attr).getFirst();
10771080
Integer nelements =
10781081
(buffer_sizes_
10791082
.get(attr)
@@ -1122,12 +1125,9 @@ public synchronized void close() {
11221125
size_pair.getFirst().delete();
11231126
size_pair.getSecond().delete();
11241127
}
1125-
for (NativeArray buffer : buffers_.values()) {
1126-
buffer.close();
1127-
}
1128-
for (Pair<NativeArray, NativeArray> var_buffer : var_buffers_.values()) {
1129-
var_buffer.getFirst().close();
1130-
var_buffer.getSecond().close();
1128+
for (Pair<NativeArray, NativeArray> buffer : buffers_.values()) {
1129+
if (buffer.getFirst() != null) buffer.getFirst().close();
1130+
if (buffer.getSecond() != null) buffer.getSecond().close();
11311131
}
11321132
if (subarray != null) {
11331133
subarray.close();

0 commit comments

Comments
 (0)