Skip to content

Commit 3d0b48a

Browse files
authored
Merge pull request #141 from TileDB-Inc/victorgiannakouris/ch1348/preparesubmission-should-not-be-called-every
Eliminate prepareSubmission(); Fixed buffering bug
2 parents b890edb + cc3f468 commit 3d0b48a

File tree

1 file changed

+45
-43
lines changed

1 file changed

+45
-43
lines changed

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

Lines changed: 45 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ public QueryStatus getQueryStatus() throws TileDBError {
120120
* @exception TileDBError A TileDB exception
121121
*/
122122
public QueryStatus submit() throws TileDBError {
123-
prepareSubmission();
124123
ctx.handleError(tiledb.tiledb_query_submit(ctx.getCtxp(), queryp));
125124
return getQueryStatus();
126125
}
@@ -141,7 +140,6 @@ public void submitAsync() throws TileDBError {
141140
* @exception TileDBError A TileDB exception
142141
*/
143142
public void submitAsync(Callback callback) throws TileDBError {
144-
prepareSubmission();
145143
ctx.handleError(Utils.tiledb_query_submit_async(ctx.getCtxp(), queryp, callback));
146144
}
147145

@@ -280,16 +278,30 @@ public synchronized Query setBuffer(String attr, NativeArray buffer) throws Tile
280278
}
281279
}
282280
}
281+
282+
uint64_tArray offsets_array_size = new uint64_tArray(1);
283+
uint64_tArray values_array_size = new uint64_tArray(1);
284+
285+
offsets_array_size.setitem(0, BigInteger.valueOf(0l));
286+
values_array_size.setitem(0, BigInteger.valueOf(buffer.getNBytes()));
287+
283288
Pair<uint64_tArray, uint64_tArray> buffer_sizes =
284-
new Pair<uint64_tArray, uint64_tArray>(new uint64_tArray(1), new uint64_tArray(1));
285-
buffer_sizes.getFirst().setitem(0, BigInteger.valueOf(0l));
286-
buffer_sizes.getSecond().setitem(0, BigInteger.valueOf(buffer.getNBytes()));
287-
// close previous buffers if they exist for this attribute
289+
new Pair<>(offsets_array_size, values_array_size);
290+
291+
// Close previous buffers if they exist for this attribute
288292
if (buffers_.containsKey(attr)) {
289293
buffers_.get(attr).close();
290294
}
295+
291296
buffers_.put(attr, buffer);
292297
buffer_sizes_.put(attr, buffer_sizes);
298+
299+
// Set the actual TileDB buffer
300+
uint64_tArray buffer_size = buffer_sizes.getSecond();
301+
ctx.handleError(
302+
tiledb.tiledb_query_set_buffer(
303+
ctx.getCtxp(), queryp, attr, buffer.toVoidPointer(), buffer_size.cast()));
304+
293305
return this;
294306
}
295307

@@ -307,28 +319,49 @@ public synchronized Query setBuffer(String attr, NativeArray offsets, NativeArra
307319
if (attr.equals(tiledb.tiledb_coords())) {
308320
throw new TileDBError("Cannot set coordinate buffer as variable sized.");
309321
}
322+
310323
if (!offsets.getNativeType().equals(TILEDB_UINT64)) {
311324
throw new TileDBError(
312325
"Buffer offsets should be of getType TILEDB_UINT64 or Long. Found getType: "
313326
+ offsets.getNativeType());
314327
}
315-
// type check the buffer native type matches the schema attribute type
328+
329+
// Type check the buffer native type matches the schema attribute type
316330
try (ArraySchema schema = array.getSchema();
317331
Attribute attribute = schema.getAttribute(attr)) {
318332
Types.typeCheck(attribute.getType(), buffer.getNativeType());
319333
}
334+
335+
uint64_tArray offsets_array = PointerUtils.uint64_tArrayFromVoid(offsets.toVoidPointer());
336+
uint64_tArray offsets_array_size = new uint64_tArray(1);
337+
uint64_tArray values_array_size = new uint64_tArray(1);
338+
339+
offsets_array_size.setitem(0, BigInteger.valueOf(offsets.getNBytes()));
340+
values_array_size.setitem(0, BigInteger.valueOf(buffer.getNBytes()));
341+
320342
Pair<uint64_tArray, uint64_tArray> buffer_sizes =
321-
new Pair<>(new uint64_tArray(1), new uint64_tArray(1));
322-
buffer_sizes.getFirst().setitem(0, BigInteger.valueOf(offsets.getNBytes()));
323-
buffer_sizes.getSecond().setitem(0, BigInteger.valueOf(buffer.getNBytes()));
324-
// close previous buffers if they exist for this attribute
343+
new Pair<>(offsets_array_size, values_array_size);
344+
345+
// Close previous buffers if they exist for this attribute
325346
if (var_buffers_.containsKey(attr)) {
326347
Pair<NativeArray, NativeArray> prev_buffers = var_buffers_.get(attr);
327348
prev_buffers.getFirst().close();
328349
prev_buffers.getSecond().close();
329350
}
330-
var_buffers_.put(attr, new Pair<NativeArray, NativeArray>(offsets, buffer));
351+
352+
var_buffers_.put(attr, new Pair<>(offsets, buffer));
331353
buffer_sizes_.put(attr, buffer_sizes);
354+
355+
ctx.handleError(
356+
tiledb.tiledb_query_set_buffer_var(
357+
ctx.getCtxp(),
358+
queryp,
359+
attr,
360+
offsets_array.cast(),
361+
offsets_array_size.cast(),
362+
buffer.toVoidPointer(),
363+
values_array_size.cast()));
364+
332365
return this;
333366
}
334367

@@ -561,37 +594,6 @@ public Query resetBufferSizes() {
561594
return resetBufferSizes(0l);
562595
}
563596

564-
private synchronized void prepareSubmission() throws TileDBError {
565-
for (Map.Entry<String, NativeArray> entry : buffers_.entrySet()) {
566-
String name = entry.getKey();
567-
NativeArray buffer = entry.getValue();
568-
Pair<uint64_tArray, uint64_tArray> buffer_sizes = buffer_sizes_.get(name);
569-
uint64_tArray buffer_size = buffer_sizes.getSecond();
570-
ctx.handleError(
571-
tiledb.tiledb_query_set_buffer(
572-
ctx.getCtxp(), queryp, name, buffer.toVoidPointer(), buffer_size.cast()));
573-
}
574-
for (Map.Entry<String, Pair<NativeArray, NativeArray>> entry : var_buffers_.entrySet()) {
575-
String name = entry.getKey();
576-
NativeArray off_buffer = entry.getValue().getFirst();
577-
NativeArray val_buffer = entry.getValue().getSecond();
578-
579-
Pair<uint64_tArray, uint64_tArray> buffer_size = buffer_sizes_.get(name);
580-
uint64_tArray offsets = PointerUtils.uint64_tArrayFromVoid(off_buffer.toVoidPointer());
581-
uint64_tArray off_size = buffer_size.getFirst();
582-
uint64_tArray val_size = buffer_size.getSecond();
583-
ctx.handleError(
584-
tiledb.tiledb_query_set_buffer_var(
585-
ctx.getCtxp(),
586-
queryp,
587-
name,
588-
offsets.cast(),
589-
off_size.cast(),
590-
val_buffer.toVoidPointer(),
591-
val_size.cast()));
592-
}
593-
}
594-
595597
/**
596598
* Return a Java primitive array object as a copy of the attribute buffer
597599
*

0 commit comments

Comments
 (0)