Skip to content

Commit 41adb65

Browse files
committed
Add Subarray getter APIs for dimension labels.
1 parent 3f7dbe1 commit 41adb65

File tree

1 file changed

+92
-1
lines changed

1 file changed

+92
-1
lines changed

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;
@@ -306,6 +306,83 @@ public void AddRange(string dimensionName, string start, string end)
306306
_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));
307307
}
308308

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+
309386
/// <summary>
310387
/// Gets the number of ranges for a given dimension index.
311388
/// </summary>
@@ -422,5 +499,19 @@ public ulong GetRangeCount(string dimensionName)
422499
var endStr = MarshaledStringOut.GetString(endBuffer.Span);
423500
return (startStr, endStr);
424501
}
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+
}
425516
}
426517
}

0 commit comments

Comments
 (0)