Skip to content

Commit 5e7b7bf

Browse files
committed
Add Subarray getter APIs for dimension labels.
1 parent 6ed3afa commit 5e7b7bf

1 file changed

Lines changed: 92 additions & 1 deletion

File tree

sources/TileDB.CSharp/Subarray.cs

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Runtime.CompilerServices;
33
using System.Runtime.InteropServices;
44
using TileDB.CSharp.Marshalling;
@@ -322,6 +322,83 @@ public void AddRange(string dimensionName, string start, string end)
322322
_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));
323323
}
324324

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+
325402
/// <summary>
326403
/// Gets the number of ranges for a given dimension index.
327404
/// </summary>
@@ -438,5 +515,19 @@ public ulong GetRangeCount(string dimensionName)
438515
var endStr = MarshaledStringOut.GetString(endBuffer.Span);
439516
return (startStr, endStr);
440517
}
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+
}
441532
}
442533
}

0 commit comments

Comments
 (0)