|
1 | | -using System; |
| 1 | +using System; |
2 | 2 | using System.Runtime.CompilerServices; |
3 | 3 | using System.Runtime.InteropServices; |
4 | 4 | using TileDB.CSharp.Marshalling; |
@@ -322,6 +322,83 @@ public void AddRange(string dimensionName, string start, string end) |
322 | 322 | _ctx.handle_error(Methods.tiledb_subarray_add_range_var_by_name(ctxHandle, handle, ms_name, ms_start, (ulong)ms_start.Length, ms_end, (ulong)ms_end.Length)); |
323 | 323 | } |
324 | 324 |
|
| 325 | + /// <summary> |
| 326 | + /// Gets the name of the dimension label for label ranges set on this dimension of the <see cref="Subarray"/>. |
| 327 | + /// </summary> |
| 328 | + /// <param name="dimensionIndex">The dimension's index.</param> |
| 329 | + /// <remarks>This API is experimental and subject to breaking changes without advance notice.</remarks> |
| 330 | + public string GetLabelName(uint dimensionIndex) |
| 331 | + { |
| 332 | + using var ctxHandle = _ctx.Handle.Acquire(); |
| 333 | + using var handle = _handle.Acquire(); |
| 334 | + sbyte* result; |
| 335 | + _ctx.handle_error(Methods.tiledb_subarray_get_label_name(ctxHandle, handle, dimensionIndex, &result)); |
| 336 | + return MarshaledStringOut.GetStringFromNullTerminated(result); |
| 337 | + } |
| 338 | + |
| 339 | + /// <summary> |
| 340 | + /// Gets the range for a given dimension label and range index. |
| 341 | + /// </summary> |
| 342 | + /// <typeparam name="T">The dimension label's type.</typeparam> |
| 343 | + /// <param name="labelName">The dimension label's name.</param> |
| 344 | + /// <param name="rangeIndex">The range's index.</param> |
| 345 | + /// <returns>The dimension's start and end values.</returns> |
| 346 | + /// <exception cref="NotSupportedException"><typeparamref name="T"/> is not supported.</exception> |
| 347 | + /// <remarks>This API is experimental and subject to breaking changes without advance notice.</remarks> |
| 348 | + public (T Start, T End) GetLabelRange<T>(string labelName, uint rangeIndex) where T : struct |
| 349 | + { |
| 350 | + ValidateLabelType<T>(labelName); |
| 351 | + using var ctxHandle = _ctx.Handle.Acquire(); |
| 352 | + using var handle = _handle.Acquire(); |
| 353 | + using var ms_dimensionName = new MarshaledString(labelName); |
| 354 | + void* startPtr, endPtr, stridePtr_unused; |
| 355 | + _ctx.handle_error(Methods.tiledb_subarray_get_label_range(ctxHandle, handle, ms_dimensionName, rangeIndex, &startPtr, &endPtr, &stridePtr_unused)); |
| 356 | + return (Unsafe.ReadUnaligned<T>(startPtr), Unsafe.ReadUnaligned<T>(endPtr)); |
| 357 | + } |
| 358 | + |
| 359 | + /// <summary> |
| 360 | + /// Gets the string range for a given dimension label and range index. |
| 361 | + /// </summary> |
| 362 | + /// <param name="labelName">The dimension label's name.</param> |
| 363 | + /// <param name="rangeIndex">The range's index.</param> |
| 364 | + /// <returns>The dimension's start and end values.</returns> |
| 365 | + /// <remarks>This API is experimental and subject to breaking changes without advance notice.</remarks> |
| 366 | + public (string Start, string End) GetStringLabelRange(string labelName, uint rangeIndex) |
| 367 | + { |
| 368 | + using var ctxHandle = _ctx.Handle.Acquire(); |
| 369 | + using var handle = _handle.Acquire(); |
| 370 | + using var ms_dimensionName = new MarshaledString(labelName); |
| 371 | + ulong start_size; |
| 372 | + ulong end_size; |
| 373 | + _ctx.handle_error(Methods.tiledb_subarray_get_label_range_var_size(ctxHandle, handle, ms_dimensionName, rangeIndex, &start_size, &end_size)); |
| 374 | + |
| 375 | + using var startBuffer = new ScratchBuffer<byte>(checked((int)start_size), stackalloc byte[128]); |
| 376 | + using var endBuffer = new ScratchBuffer<byte>(checked((int)end_size), stackalloc byte[128]); |
| 377 | + fixed (byte* startPtr = startBuffer, endPtr = endBuffer) |
| 378 | + { |
| 379 | + _ctx.handle_error(Methods.tiledb_subarray_get_label_range_var(ctxHandle, handle, ms_dimensionName, rangeIndex, startPtr, endPtr)); |
| 380 | + } |
| 381 | + |
| 382 | + var startStr = MarshaledStringOut.GetString(startBuffer.Span); |
| 383 | + var endStr = MarshaledStringOut.GetString(endBuffer.Span); |
| 384 | + return (startStr, endStr); |
| 385 | + } |
| 386 | + |
| 387 | + /// <summary> |
| 388 | + /// Gets the number of ranges for a given dimension label name. |
| 389 | + /// </summary> |
| 390 | + /// <param name="labelName">The dimension label's name.</param> |
| 391 | + /// <remarks>This API is experimental and subject to breaking changes without advance notice.</remarks> |
| 392 | + public ulong GetLabelRangeCount(string labelName) |
| 393 | + { |
| 394 | + using var ctxHandle = _ctx.Handle.Acquire(); |
| 395 | + using var handle = _handle.Acquire(); |
| 396 | + using var ms_dimensionName = new MarshaledString(labelName); |
| 397 | + ulong result; |
| 398 | + _ctx.handle_error(Methods.tiledb_subarray_get_label_range_num(ctxHandle, handle, ms_dimensionName, &result)); |
| 399 | + return result; |
| 400 | + } |
| 401 | + |
325 | 402 | /// <summary> |
326 | 403 | /// Gets the number of ranges for a given dimension index. |
327 | 404 | /// </summary> |
@@ -438,5 +515,19 @@ public ulong GetRangeCount(string dimensionName) |
438 | 515 | var endStr = MarshaledStringOut.GetString(endBuffer.Span); |
439 | 516 | return (startStr, endStr); |
440 | 517 | } |
| 518 | + |
| 519 | + /// <summary> |
| 520 | + /// Checks whether the <see cref="Subarray"/> has label ranges set on the requested dimension. |
| 521 | + /// </summary> |
| 522 | + /// <param name="dimensionIndex">The dimension's index.</param> |
| 523 | + /// <remarks>This API is experimental and subject to breaking changes without advance notice.</remarks> |
| 524 | + public bool HasLabelRanges(uint dimensionIndex) |
| 525 | + { |
| 526 | + using var ctxHandle = _ctx.Handle.Acquire(); |
| 527 | + using var handle = _handle.Acquire(); |
| 528 | + int result; |
| 529 | + _ctx.handle_error(Methods.tiledb_subarray_has_label_ranges(ctxHandle, handle, dimensionIndex, &result)); |
| 530 | + return result != 0; |
| 531 | + } |
441 | 532 | } |
442 | 533 | } |
0 commit comments