|
1 | | -using System; |
| 1 | +using System; |
2 | 2 | using System.Runtime.CompilerServices; |
3 | 3 | using System.Runtime.InteropServices; |
4 | 4 | using TileDB.CSharp.Marshalling; |
@@ -306,6 +306,83 @@ public void AddRange(string dimensionName, string start, string end) |
306 | 306 | _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)); |
307 | 307 | } |
308 | 308 |
|
| 309 | + /// <summary> |
| 310 | + /// Gets the name of the dimension label for label ranges set on this dimension of the <see cref="Subarray"/>. |
| 311 | + /// </summary> |
| 312 | + /// <param name="dimensionIndex">The dimension's index.</param> |
| 313 | + /// <remarks>This API is experimental and subject to breaking changes without advance notice.</remarks> |
| 314 | + public string GetLabelName(uint dimensionIndex) |
| 315 | + { |
| 316 | + using var ctxHandle = _ctx.Handle.Acquire(); |
| 317 | + using var handle = _handle.Acquire(); |
| 318 | + sbyte* result; |
| 319 | + _ctx.handle_error(Methods.tiledb_subarray_get_label_name(ctxHandle, handle, dimensionIndex, &result)); |
| 320 | + return MarshaledStringOut.GetStringFromNullTerminated(result); |
| 321 | + } |
| 322 | + |
| 323 | + /// <summary> |
| 324 | + /// Gets the range for a given dimension label and range index. |
| 325 | + /// </summary> |
| 326 | + /// <typeparam name="T">The dimension label's type.</typeparam> |
| 327 | + /// <param name="labelName">The dimension label's name.</param> |
| 328 | + /// <param name="rangeIndex">The range's index.</param> |
| 329 | + /// <returns>The dimension's start and end values.</returns> |
| 330 | + /// <exception cref="NotSupportedException"><typeparamref name="T"/> is not supported.</exception> |
| 331 | + /// <remarks>This API is experimental and subject to breaking changes without advance notice.</remarks> |
| 332 | + public (T Start, T End) GetLabelRange<T>(string labelName, uint rangeIndex) where T : struct |
| 333 | + { |
| 334 | + ValidateLabelType<T>(labelName); |
| 335 | + using var ctxHandle = _ctx.Handle.Acquire(); |
| 336 | + using var handle = _handle.Acquire(); |
| 337 | + using var ms_dimensionName = new MarshaledString(labelName); |
| 338 | + void* startPtr, endPtr, stridePtr_unused; |
| 339 | + _ctx.handle_error(Methods.tiledb_subarray_get_label_range(ctxHandle, handle, ms_dimensionName, rangeIndex, &startPtr, &endPtr, &stridePtr_unused)); |
| 340 | + return (Unsafe.ReadUnaligned<T>(startPtr), Unsafe.ReadUnaligned<T>(endPtr)); |
| 341 | + } |
| 342 | + |
| 343 | + /// <summary> |
| 344 | + /// Gets the string range for a given dimension label and range index. |
| 345 | + /// </summary> |
| 346 | + /// <param name="labelName">The dimension label's name.</param> |
| 347 | + /// <param name="rangeIndex">The range's index.</param> |
| 348 | + /// <returns>The dimension's start and end values.</returns> |
| 349 | + /// <remarks>This API is experimental and subject to breaking changes without advance notice.</remarks> |
| 350 | + public (string Start, string End) GetStringLabelRange(string labelName, uint rangeIndex) |
| 351 | + { |
| 352 | + using var ctxHandle = _ctx.Handle.Acquire(); |
| 353 | + using var handle = _handle.Acquire(); |
| 354 | + using var ms_dimensionName = new MarshaledString(labelName); |
| 355 | + ulong start_size; |
| 356 | + ulong end_size; |
| 357 | + _ctx.handle_error(Methods.tiledb_subarray_get_label_range_var_size(ctxHandle, handle, ms_dimensionName, rangeIndex, &start_size, &end_size)); |
| 358 | + |
| 359 | + using var startBuffer = new ScratchBuffer<byte>(checked((int)start_size), stackalloc byte[128]); |
| 360 | + using var endBuffer = new ScratchBuffer<byte>(checked((int)end_size), stackalloc byte[128]); |
| 361 | + fixed (byte* startPtr = startBuffer, endPtr = endBuffer) |
| 362 | + { |
| 363 | + _ctx.handle_error(Methods.tiledb_subarray_get_label_range_var(ctxHandle, handle, ms_dimensionName, rangeIndex, startPtr, endPtr)); |
| 364 | + } |
| 365 | + |
| 366 | + var startStr = MarshaledStringOut.GetString(startBuffer.Span); |
| 367 | + var endStr = MarshaledStringOut.GetString(endBuffer.Span); |
| 368 | + return (startStr, endStr); |
| 369 | + } |
| 370 | + |
| 371 | + /// <summary> |
| 372 | + /// Gets the number of ranges for a given dimension label name. |
| 373 | + /// </summary> |
| 374 | + /// <param name="labelName">The dimension label's name.</param> |
| 375 | + /// <remarks>This API is experimental and subject to breaking changes without advance notice.</remarks> |
| 376 | + public ulong GetLabelRangeCount(string labelName) |
| 377 | + { |
| 378 | + using var ctxHandle = _ctx.Handle.Acquire(); |
| 379 | + using var handle = _handle.Acquire(); |
| 380 | + using var ms_dimensionName = new MarshaledString(labelName); |
| 381 | + ulong result; |
| 382 | + _ctx.handle_error(Methods.tiledb_subarray_get_label_range_num(ctxHandle, handle, ms_dimensionName, &result)); |
| 383 | + return result; |
| 384 | + } |
| 385 | + |
309 | 386 | /// <summary> |
310 | 387 | /// Gets the number of ranges for a given dimension index. |
311 | 388 | /// </summary> |
@@ -422,5 +499,19 @@ public ulong GetRangeCount(string dimensionName) |
422 | 499 | var endStr = MarshaledStringOut.GetString(endBuffer.Span); |
423 | 500 | return (startStr, endStr); |
424 | 501 | } |
| 502 | + |
| 503 | + /// <summary> |
| 504 | + /// Checks whether the <see cref="Subarray"/> has label ranges set on the requested dimension. |
| 505 | + /// </summary> |
| 506 | + /// <param name="dimensionIndex">The dimension's index.</param> |
| 507 | + /// <remarks>This API is experimental and subject to breaking changes without advance notice.</remarks> |
| 508 | + public bool HasLabelRanges(uint dimensionIndex) |
| 509 | + { |
| 510 | + using var ctxHandle = _ctx.Handle.Acquire(); |
| 511 | + using var handle = _handle.Acquire(); |
| 512 | + int result; |
| 513 | + _ctx.handle_error(Methods.tiledb_subarray_has_label_ranges(ctxHandle, handle, dimensionIndex, &result)); |
| 514 | + return result != 0; |
| 515 | + } |
425 | 516 | } |
426 | 517 | } |
0 commit comments