Skip to content

Commit 0391752

Browse files
committed
Add a new overloaded setBuffer method which sets the buffer elements
1 parent ce7c0ed commit 0391752

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed

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

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,66 @@ public synchronized Query setBuffer(String attr, NativeArray buffer) throws Tile
305305
return this;
306306
}
307307

308+
/**
309+
* Sets a buffer for a fixed-sized attribute.
310+
*
311+
* @param attr The attribute name.
312+
* @param buffer NativeBuffer to be used for the attribute values.
313+
* @param bufferElements The actual number of buffer elements
314+
* @exception TileDBError A TileDB exception
315+
*/
316+
public synchronized Query setBuffer(String attr, NativeArray buffer, long bufferElements)
317+
throws TileDBError {
318+
if (bufferElements <= 0) {
319+
throw new TileDBError("Number of buffer elements must be >= 1");
320+
}
321+
if (bufferElements > buffer.getSize()) {
322+
throw new TileDBError(
323+
"Number of elements requested exceeds the number of elements in allocated buffer: "
324+
+ bufferElements
325+
+ " > "
326+
+ buffer.getSize());
327+
}
328+
329+
try (ArraySchema schema = array.getSchema()) {
330+
if (attr.equals(tiledb.tiledb_coords())) {
331+
try (Domain domain = schema.getDomain()) {
332+
Types.typeCheck(domain.getType(), buffer.getNativeType());
333+
}
334+
} else {
335+
try (Attribute attribute = schema.getAttribute(attr)) {
336+
Types.typeCheck(attribute.getType(), buffer.getNativeType());
337+
}
338+
}
339+
}
340+
341+
uint64_tArray offsets_array_size = new uint64_tArray(1);
342+
uint64_tArray values_array_size = new uint64_tArray(1);
343+
344+
offsets_array_size.setitem(0, BigInteger.valueOf(0l));
345+
values_array_size.setitem(0, BigInteger.valueOf(bufferElements * buffer.getNativeTypeSize()));
346+
347+
Pair<uint64_tArray, uint64_tArray> buffer_sizes =
348+
new Pair<>(offsets_array_size, values_array_size);
349+
350+
// Close previous buffers if they exist for this attribute
351+
if (buffers_.containsKey(attr)) {
352+
buffers_.get(attr).close();
353+
}
354+
355+
buffers_.put(attr, buffer);
356+
buffer_sizes_.put(attr, buffer_sizes);
357+
358+
// Set the actual TileDB buffer
359+
uint64_tArray buffer_size = buffer_sizes.getSecond();
360+
361+
ctx.handleError(
362+
tiledb.tiledb_query_set_buffer(
363+
ctx.getCtxp(), queryp, attr, buffer.toVoidPointer(), buffer_size.cast()));
364+
365+
return this;
366+
}
367+
308368
/**
309369
* Sets a buffer for a variable-sized getAttribute.
310370
*
@@ -365,6 +425,92 @@ public synchronized Query setBuffer(String attr, NativeArray offsets, NativeArra
365425
return this;
366426
}
367427

428+
/**
429+
* Sets a buffer for a variable-sized getAttribute.
430+
*
431+
* @param attr Attribute name
432+
* @param offsets Offsets where a new element begins in the data buffer.
433+
* @param buffer Buffer vector with elements of the attribute type.
434+
* @param offsetElements The actual number of offset elements
435+
* @param bufferElements The actual number of buffer elements
436+
* @exception TileDBError A TileDB exception
437+
*/
438+
public synchronized Query setBuffer(
439+
String attr,
440+
NativeArray offsets,
441+
NativeArray buffer,
442+
long offsetElements,
443+
long bufferElements)
444+
throws TileDBError {
445+
Integer offsetSize = buffer.getSize();
446+
Integer bufferSize = buffer.getSize();
447+
448+
if (offsetElements > offsetSize) {
449+
throw new TileDBError(
450+
"Number of offset elements requested exceeds the number of elements in allocated offset buffer: "
451+
+ offsetElements
452+
+ " > "
453+
+ offsetSize);
454+
}
455+
if (bufferElements > bufferSize) {
456+
throw new TileDBError(
457+
"Number of buffer elements requested exceeds the number of elements in allocated buffer"
458+
+ bufferElements
459+
+ " > "
460+
+ bufferSize);
461+
}
462+
if (attr.equals(tiledb.tiledb_coords())) {
463+
throw new TileDBError("Cannot set coordinate buffer as variable sized.");
464+
}
465+
466+
if (!offsets.getNativeType().equals(TILEDB_UINT64)) {
467+
throw new TileDBError(
468+
"Buffer offsets should be of getType TILEDB_UINT64 or Long. Found getType: "
469+
+ offsets.getNativeType());
470+
}
471+
if (offsetElements <= 0 || bufferElements <= 0) {
472+
throw new TileDBError("Number of buffer elements must be >= 1");
473+
}
474+
475+
// Type check the buffer native type matches the schema attribute type
476+
try (ArraySchema schema = array.getSchema();
477+
Attribute attribute = schema.getAttribute(attr)) {
478+
Types.typeCheck(attribute.getType(), buffer.getNativeType());
479+
}
480+
481+
uint64_tArray offsets_array = PointerUtils.uint64_tArrayFromVoid(offsets.toVoidPointer());
482+
uint64_tArray offsets_array_size = new uint64_tArray(1);
483+
uint64_tArray values_array_size = new uint64_tArray(1);
484+
485+
offsets_array_size.setitem(0, BigInteger.valueOf(offsetElements * offsets.getNativeTypeSize()));
486+
values_array_size.setitem(0, BigInteger.valueOf(bufferElements * buffer.getNativeTypeSize()));
487+
488+
Pair<uint64_tArray, uint64_tArray> buffer_sizes =
489+
new Pair<>(offsets_array_size, values_array_size);
490+
491+
// Close previous buffers if they exist for this attribute
492+
if (var_buffers_.containsKey(attr)) {
493+
Pair<NativeArray, NativeArray> prev_buffers = var_buffers_.get(attr);
494+
prev_buffers.getFirst().close();
495+
prev_buffers.getSecond().close();
496+
}
497+
498+
var_buffers_.put(attr, new Pair<>(offsets, buffer));
499+
buffer_sizes_.put(attr, buffer_sizes);
500+
501+
ctx.handleError(
502+
tiledb.tiledb_query_set_buffer_var(
503+
ctx.getCtxp(),
504+
queryp,
505+
attr,
506+
offsets_array.cast(),
507+
offsets_array_size.cast(),
508+
buffer.toVoidPointer(),
509+
values_array_size.cast()));
510+
511+
return this;
512+
}
513+
368514
private Query setBufferSizeUnsafe(String attribute, long offsetSize, long bufferSize) {
369515
buffer_sizes_.get(attribute).getFirst().setitem(0, BigInteger.valueOf(offsetSize));
370516
buffer_sizes_.get(attribute).getSecond().setitem(0, BigInteger.valueOf(bufferSize));

0 commit comments

Comments
 (0)