Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/main/java/io/tiledb/java/api/Array.java
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,6 @@ public Pair getNonEmptyDomainFromIndex(long index) throws TileDBError {
*/
public Pair getNonEmptyDomainFromName(String name) throws TileDBError {
checkIsOpen();
HashMap<String, Pair> ret = new HashMap<String, Pair>();
try (Domain domain = schema.getDomain();
NativeArray domainArray =
new NativeArray(ctx, 2 * (int) domain.getRank(), domain.getType())) {
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/io/tiledb/java/api/Datatype.java
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,8 @@ public Class javaClass() throws TileDBError {
return String.class;
case TILEDB_STRING_UCS4:
return String.class;
case TILEDB_STRING_ASCII:
return String.class;
case TILEDB_ANY:
default:
throw new TileDBError("No such enum value" + this.name());
Expand Down
36 changes: 22 additions & 14 deletions src/main/java/io/tiledb/java/api/Dimension.java
Original file line number Diff line number Diff line change
Expand Up @@ -96,23 +96,31 @@ public Dimension(Context ctx, String name, Datatype type, Pair<T, T> domain, T e
private void createImpl(Context ctx, String name, Datatype dimType, Pair<T, T> domain, T extent)
throws TileDBError {
SWIGTYPE_p_p_tiledb_dimension_t dimensionpp = tiledb.new_tiledb_dimension_tpp();
try (NativeArray domainBuffer = new NativeArray(ctx, 2, dimType);
NativeArray tileExtent = new NativeArray(ctx, 1, dimType)) {
domainBuffer.setItem(0, domain.getFirst());
domainBuffer.setItem(1, domain.getSecond());
tileExtent.setItem(0, extent);

if (dimType.equals(Datatype.TILEDB_STRING_ASCII)) {
ctx.handleError(
tiledb.tiledb_dimension_alloc(
ctx.getCtxp(),
name,
dimType.toSwigEnum(),
domainBuffer.toVoidPointer(),
tileExtent.toVoidPointer(),
dimensionpp));
} catch (Exception err) {
tiledb.delete_tiledb_dimension_tpp(dimensionpp);
throw err;
ctx.getCtxp(), name, dimType.toSwigEnum(), null, null, dimensionpp));
} else {
try (NativeArray domainBuffer = new NativeArray(ctx, 2, dimType);
NativeArray tileExtent = new NativeArray(ctx, 1, dimType)) {
domainBuffer.setItem(0, domain.getFirst());
domainBuffer.setItem(1, domain.getSecond());
tileExtent.setItem(0, extent);
ctx.handleError(
tiledb.tiledb_dimension_alloc(
ctx.getCtxp(),
name,
dimType.toSwigEnum(),
domainBuffer.toVoidPointer(),
tileExtent.toVoidPointer(),
dimensionpp));
} catch (Exception err) {
tiledb.delete_tiledb_dimension_tpp(dimensionpp);
throw err;
}
}

this.ctx = ctx;
this.name = name;
this.domain = domain;
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/io/tiledb/java/api/NativeArray.java
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ private int getSize(Object buffer) throws TileDBError {
{
return ((long[]) buffer).length;
}
case TILEDB_STRING_ASCII:
case TILEDB_CHAR:
{
return stringToBytes(buffer).length;
Expand Down Expand Up @@ -275,6 +276,7 @@ private void createNativeArrayFromBuffer(Object buffer) throws TileDBError {
uint64_tArray = Utils.newInt64_tArray((long[]) buffer);
break;
}
case TILEDB_STRING_ASCII:
case TILEDB_CHAR:
{
byte[] bytes = stringToBytes(buffer);
Expand Down Expand Up @@ -357,6 +359,7 @@ private void allocateEmptyArray() throws TileDBError {
uint64_tArray = new int64_tArray(size);
break;
}
case TILEDB_STRING_ASCII:
case TILEDB_CHAR:
{
int8_tArray = new int8_tArray(size);
Expand Down Expand Up @@ -438,6 +441,7 @@ public Object getItem(int index) throws ArrayIndexOutOfBoundsException, TileDBEr
{
return uint64_tArray.getitem(index);
}
case TILEDB_STRING_ASCII:
case TILEDB_CHAR:
{
return int8_tArray.getitem(index);
Expand Down Expand Up @@ -527,6 +531,7 @@ public void setItem(int index, Object value) throws ArrayIndexOutOfBoundsExcepti
uint64_tArray.setitem(index, (long) value);
break;
}
case TILEDB_STRING_ASCII:
case TILEDB_CHAR:
{
for (byte b : stringToBytes(value)) {
Expand Down Expand Up @@ -601,6 +606,7 @@ public SWIGTYPE_p_void toVoidPointer() throws TileDBError {
{
return PointerUtils.toVoid(uint64_tArray);
}
case TILEDB_STRING_ASCII:
case TILEDB_CHAR:
{
return PointerUtils.toVoid(int8_tArray);
Expand Down Expand Up @@ -771,6 +777,7 @@ public Object toJavaArray(int position, int elements) throws TileDBError {
{
return Utils.int64ArrayGet(uint64_tArray, position, elements);
}
case TILEDB_STRING_ASCII:
case TILEDB_CHAR:
{
return Utils.int8ArrayGet(int8_tArray, position, elements);
Expand Down
117 changes: 112 additions & 5 deletions src/main/java/io/tiledb/java/api/Query.java
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,104 @@ public synchronized Query addRange(int dimIdx, Object start, Object end) throws
return this;
}

/**
* Adds a 1D variable-sized range along a subarray dimension, which is in the form (start, end).
* Applicable only to variable-sized dimensions.
*
* @param dimIdx The index of the dimension to add the range to
* @param start The range start
* @param end The range end
* @return This query
* @throws TileDBError A TileDB exception
*/
public synchronized Query addRangeVar(int dimIdx, String start, String end) throws TileDBError {
Datatype dimType;
try (ArraySchema schema = array.getSchema();
Domain domain = schema.getDomain()) {
dimType = domain.getType();
}

Types.javaTypeCheck(start.getClass(), dimType.javaClass());
Types.javaTypeCheck(end.getClass(), dimType.javaClass());

try (NativeArray startArr = new NativeArray(ctx, 1, dimType);
NativeArray endArr = new NativeArray(ctx, 1, dimType)) {
startArr.setItem(0, start);
endArr.setItem(0, end);

ctx.handleError(
tiledb.tiledb_query_add_range_var(
ctx.getCtxp(),
queryp,
dimIdx,
startArr.toVoidPointer(),
BigInteger.valueOf(start.length()),
endArr.toVoidPointer(),
BigInteger.valueOf(end.length())));
}

return this;
}

/**
* Retrieves a range's start and end size for a given variable-length dimensions at a given range
* index.
*
* @param dimIdx The index of the dimension to add the range to
* @return This query
* @throws TileDBError A TileDB exception
*/
public synchronized Pair<Long, Long> getRangeVarSize(int dimIdx, BigInteger rangeIdx)
throws TileDBError {
SWIGTYPE_p_unsigned_long_long startSize = tiledb.new_ullp();
SWIGTYPE_p_unsigned_long_long endSize = tiledb.new_ullp();
try {
ctx.handleError(
tiledb.tiledb_query_get_range_var_size(
ctx.getCtxp(), queryp, dimIdx, rangeIdx, startSize, endSize));

return new Pair(
tiledb.ullp_value(startSize).longValue(), tiledb.ullp_value(endSize).longValue());
} catch (TileDBError error) {
throw error;
}
}

/**
* Retrieves a specific range of the query subarray along a given variable-length dimension.
*
* @param dimIdx The index of the dimension to add the range to
* @return This query
* @throws TileDBError A TileDB exception
*/
public synchronized Pair<String, String> getRangeVar(int dimIdx, BigInteger rangeIdx)
throws TileDBError {
Datatype dimType;
try (ArraySchema schema = array.getSchema();
Domain domain = schema.getDomain()) {
dimType = domain.getType();
}

Pair<Long, Long> size = this.getRangeVarSize(dimIdx, rangeIdx);

try (NativeArray startArr = new NativeArray(ctx, size.getFirst().intValue(), dimType);
NativeArray endArr = new NativeArray(ctx, size.getSecond().intValue(), dimType)) {

ctx.handleError(
tiledb.tiledb_query_get_range_var(
ctx.getCtxp(),
queryp,
dimIdx,
rangeIdx,
startArr.toVoidPointer(),
endArr.toVoidPointer()));

Object start = new String((byte[]) startArr.toJavaArray());
Object end = new String((byte[]) endArr.toJavaArray());
return new Pair(start, end);
}
}

/**
* Retrieves the number of ranges of the query subarray along a given dimension.
*
Expand Down Expand Up @@ -272,7 +370,7 @@ public synchronized Query setBuffer(String attr, NativeArray buffer) throws Tile
if (attr.equals(tiledb.tiledb_coords())) {
Types.typeCheck(domain.getType(), buffer.getNativeType());
} else if (domain.hasDimension(attr)) {
Types.typeCheck(domain.getType(), buffer.getNativeType());
Types.typeCheck(domain.getDimension(attr).getType(), buffer.getNativeType());
} else {
try (Attribute attribute = schema.getAttribute(attr)) {
Types.typeCheck(attribute.getType(), buffer.getNativeType());
Expand Down Expand Up @@ -333,7 +431,7 @@ public synchronized Query setBuffer(String attr, NativeArray buffer, long buffer
if (attr.equals(tiledb.tiledb_coords())) {
Types.typeCheck(domain.getType(), buffer.getNativeType());
} else if (domain.hasDimension(attr)) {
Types.typeCheck(domain.getType(), buffer.getNativeType());
Types.typeCheck(domain.getDimension(attr).getType(), buffer.getNativeType());
} else {
try (Attribute attribute = schema.getAttribute(attr)) {
Types.typeCheck(attribute.getType(), buffer.getNativeType());
Expand Down Expand Up @@ -391,9 +489,18 @@ public synchronized Query setBuffer(String attr, NativeArray offsets, NativeArra
}

// Type check the buffer native type matches the schema attribute type
try (ArraySchema schema = array.getSchema();
Attribute attribute = schema.getAttribute(attr)) {
Types.typeCheck(attribute.getType(), buffer.getNativeType());
try (ArraySchema schema = array.getSchema()) {
try (Domain domain = schema.getDomain()) {
if (attr.equals(tiledb.tiledb_coords())) {
Types.typeCheck(domain.getType(), buffer.getNativeType());
} else if (domain.hasDimension(attr)) {
Types.typeCheck(domain.getDimension(attr).getType(), buffer.getNativeType());
} else {
try (Attribute attribute = schema.getAttribute(attr)) {
Types.typeCheck(attribute.getType(), buffer.getNativeType());
}
}
}
}

uint64_tArray offsets_array = PointerUtils.uint64_tArrayFromVoid(offsets.toVoidPointer());
Expand Down
1 change: 1 addition & 0 deletions src/main/java/io/tiledb/java/api/Types.java
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ public static Class getJavaType(Datatype type) throws TileDBError {
{
return Long.class;
}
case TILEDB_STRING_ASCII:
case TILEDB_CHAR:
{
return String.class;
Expand Down
Loading