@@ -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