Skip to content

Commit 11ee255

Browse files
committed
Merge branch 'main' into obsolete-remove
2 parents 23b7893 + d676140 commit 11ee255

File tree

100 files changed

+14019
-14106
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+14019
-14106
lines changed

.config/dotnet-tools.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"isRoot": true,
44
"tools": {
55
"clangsharppinvokegenerator": {
6-
"version": "16.0.0",
6+
"version": "17.0.1",
77
"commands": [
88
"ClangSharpPInvokeGenerator"
99
]
Lines changed: 64 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,83 @@
11
using System;
22
using System.IO;
33

4-
namespace TileDB.CSharp.Examples
4+
namespace TileDB.CSharp.Examples;
5+
6+
static class ExampleAggregateQuery
57
{
6-
static class ExampleAggregateQuery
7-
{
8-
private static readonly string ArrayPath = ExampleUtil.MakeExamplePath("aggregate-array");
9-
private static readonly Context Ctx = Context.GetDefault();
8+
private static readonly string ArrayPath = ExampleUtil.MakeExamplePath("aggregate-array");
9+
private static readonly Context Ctx = Context.GetDefault();
1010

11-
private static void CreateArray()
12-
{
13-
// Create array
14-
var dim1 = Dimension.Create(Ctx, "rows", boundLower: 1, boundUpper: 4, extent: 4);
15-
var dim2 = Dimension.Create(Ctx, "cols", boundLower: 1, boundUpper: 4, extent: 4);
16-
var domain = new Domain(Ctx);
17-
domain.AddDimension(dim1);
18-
domain.AddDimension(dim2);
19-
var array_schema = new ArraySchema(Ctx, ArrayType.Sparse);
20-
var attr = new Attribute(Ctx, "a", DataType.Int32);
21-
array_schema.AddAttribute(attr);
22-
array_schema.SetDomain(domain);
23-
array_schema.Check();
11+
private static void CreateArray()
12+
{
13+
// Create array
14+
var dim1 = Dimension.Create(Ctx, "rows", boundLower: 1, boundUpper: 4, extent: 4);
15+
var dim2 = Dimension.Create(Ctx, "cols", boundLower: 1, boundUpper: 4, extent: 4);
16+
var domain = new Domain(Ctx);
17+
domain.AddDimension(dim1);
18+
domain.AddDimension(dim2);
19+
var array_schema = new ArraySchema(Ctx, ArrayType.Sparse);
20+
var attr = new Attribute(Ctx, "a", DataType.Int32);
21+
array_schema.AddAttribute(attr);
22+
array_schema.SetDomain(domain);
23+
array_schema.Check();
2424

25-
Array.Create(Ctx, ArrayPath, array_schema);
26-
}
25+
Array.Create(Ctx, ArrayPath, array_schema);
26+
}
2727

28-
private static void WriteArray()
28+
private static void WriteArray()
29+
{
30+
using (var array_write = new Array(Ctx, ArrayPath))
2931
{
30-
using (var array_write = new Array(Ctx, ArrayPath))
32+
array_write.Open(QueryType.Write);
33+
using (var query_write = new Query(array_write))
3134
{
32-
array_write.Open(QueryType.Write);
33-
using (var query_write = new Query(array_write))
34-
{
35-
query_write.SetLayout(LayoutType.GlobalOrder);
36-
query_write.SetDataBuffer("rows", new int[] { 1, 2 });
37-
query_write.SetDataBuffer("cols", new int[] { 1, 4 });
38-
query_write.SetDataBuffer("a", new int[] { 1, 2 });
39-
query_write.Submit();
40-
query_write.SetDataBuffer("rows", new int[] { 3 });
41-
query_write.SetDataBuffer("cols", new int[] { 3 });
42-
query_write.SetDataBuffer("a", new int[] { 3 });
43-
query_write.SubmitAndFinalize();
44-
}
45-
array_write.Close();
35+
query_write.SetLayout(LayoutType.GlobalOrder);
36+
query_write.SetDataBuffer("rows", new int[] { 1, 2 });
37+
query_write.SetDataBuffer("cols", new int[] { 1, 4 });
38+
query_write.SetDataBuffer("a", new int[] { 1, 2 });
39+
query_write.Submit();
40+
query_write.SetDataBuffer("rows", new int[] { 3 });
41+
query_write.SetDataBuffer("cols", new int[] { 3 });
42+
query_write.SetDataBuffer("a", new int[] { 3 });
43+
query_write.SubmitAndFinalize();
4644
}
45+
array_write.Close();
4746
}
47+
}
4848

49-
private static void ReadArray()
50-
{
51-
ulong[] count = { 0 };
52-
long[] sum = { 0 };
53-
54-
using (var array_read = new Array(Ctx, ArrayPath))
55-
{
56-
array_read.Open(QueryType.Read);
57-
using var query_read = new Query(array_read);
58-
query_read.SetLayout(LayoutType.Unordered);
59-
using var channel = query_read.GetDefaultChannel();
60-
channel.ApplyAggregate(AggregateOperation.Count, "Count");
61-
channel.ApplyAggregate(AggregateOperation.Unary(AggregateOperator.Sum, "a"), "Sum");
62-
query_read.SetDataBuffer("Count", count);
63-
query_read.SetDataBuffer("Sum", sum);
64-
query_read.Submit();
65-
array_read.Close();
66-
}
49+
private static void ReadArray()
50+
{
51+
ulong[] count = [0];
52+
long[] sum = [0];
6753

68-
Console.WriteLine($"Count: {count[0]}");
69-
Console.WriteLine($"Sum: {sum[0]}");
54+
using (var array_read = new Array(Ctx, ArrayPath))
55+
{
56+
array_read.Open(QueryType.Read);
57+
using var query_read = new Query(array_read);
58+
query_read.SetLayout(LayoutType.Unordered);
59+
using var channel = query_read.GetDefaultChannel();
60+
channel.ApplyAggregate(AggregateOperation.Count, "Count");
61+
channel.ApplyAggregate(AggregateOperation.Unary(AggregateOperator.Sum, "a"), "Sum");
62+
query_read.SetDataBuffer("Count", count);
63+
query_read.SetDataBuffer("Sum", sum);
64+
query_read.Submit();
65+
array_read.Close();
7066
}
7167

72-
public static void Run()
73-
{
74-
if (Directory.Exists(ArrayPath))
75-
{
76-
Directory.Delete(ArrayPath, true);
77-
}
68+
Console.WriteLine($"Count: {count[0]}");
69+
Console.WriteLine($"Sum: {sum[0]}");
70+
}
7871

79-
CreateArray();
80-
WriteArray();
81-
ReadArray();
72+
public static void Run()
73+
{
74+
if (Directory.Exists(ArrayPath))
75+
{
76+
Directory.Delete(ArrayPath, true);
8277
}
78+
79+
CreateArray();
80+
WriteArray();
81+
ReadArray();
8382
}
8483
}

examples/TileDB.CSharp.Example/ExampleDataframe.cs

Lines changed: 102 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -4,114 +4,123 @@
44
using System.Linq;
55
using System.Text;
66

7-
namespace TileDB.CSharp.Examples
7+
namespace TileDB.CSharp.Examples;
8+
9+
[System.Diagnostics.CodeAnalysis.SuppressMessage("Major Code Smell", "S6562:Always set the \"DateTimeKind\" when creating new \"DateTime\" instances", Justification = "Excessive for this example; the dates' kind will not be converted")]
10+
[System.Diagnostics.CodeAnalysis.SuppressMessage("Minor Code Smell", "S6588:Use the \"UnixEpoch\" field instead of creating \"DateTime\" instances that point to the beginning of the Unix epoch", Justification = "DateTime.UnixEpoch is unavailable in .NET 5")]
11+
internal static class ExampleDataframe
812
{
9-
internal static class ExampleDataframe
13+
public static void Run()
1014
{
11-
public static void Run()
15+
using var ctx = new Context();
16+
const string arrayUri = "dataframe_array";
17+
if (Directory.Exists(arrayUri))
1218
{
13-
using var ctx = new Context();
14-
const string arrayUri = "dataframe_array";
15-
if (Directory.Exists(arrayUri))
16-
{
17-
Directory.Delete(arrayUri, true);
18-
}
19-
CreateArray(ctx, arrayUri);
20-
21-
string[] names = { "Adam", "Bree", "Charles", "Dianna", "Evan", "Fiona", "Gabe", "Hannah", "Isidore", "Julia" };
22-
DateTime[] dobs = { new DateTime(1990, 1, 1), new DateTime(1991, 2, 2), new DateTime(1992, 3, 3), new DateTime(1993, 4, 4), new DateTime(1994, 5, 5),
23-
new DateTime(1995, 6, 6), new DateTime(1996, 7, 7), new DateTime(1997, 8, 8), new DateTime(1998, 9, 9), new DateTime(1999, 10, 10) };
24-
Write(ctx, arrayUri, 0, names, dobs);
25-
26-
foreach (var x in Read(ctx, arrayUri, 0, 9))
27-
{
28-
Console.WriteLine($"ID: {x.Id}, Name: {x.Name}, Date of birth: {x.DateOfBirth:d}");
29-
}
19+
Directory.Delete(arrayUri, true);
3020
}
21+
CreateArray(ctx, arrayUri);
22+
23+
string[] names = ["Adam", "Bree", "Charles", "Dianna", "Evan", "Fiona", "Gabe", "Hannah", "Isidore", "Julia"];
24+
DateTime[] dobs = [new DateTime(1990, 1, 1),
25+
new DateTime(1991, 2, 2),
26+
new DateTime(1992, 3, 3),
27+
new DateTime(1993, 4, 4),
28+
new DateTime(1994, 5, 5),
29+
new DateTime(1995, 6, 6),
30+
new DateTime(1996, 7, 7),
31+
new DateTime(1997, 8, 8),
32+
new DateTime(1998, 9, 9),
33+
new DateTime(1999, 10, 10)];
34+
Write(ctx, arrayUri, 0, names, dobs);
3135

32-
static void CreateArray(Context ctx, string uri)
36+
foreach (var x in Read(ctx, arrayUri, 0, 9))
3337
{
34-
using var schema = new ArraySchema(ctx, ArrayType.Dense);
35-
using var domain = new Domain(ctx);
36-
using var dimension = Dimension.Create<ulong>(ctx, "id", 0, ulong.MaxValue - 1, 1);
37-
domain.AddDimension(dimension);
38-
schema.SetDomain(domain);
39-
using var attrName = new Attribute(ctx, "name", DataType.StringUtf8);
40-
attrName.SetCellValNum(Attribute.VariableSized);
41-
using var attrDob = new Attribute(ctx, "dob", DataType.DateTimeDay);
42-
schema.AddAttributes(attrName);
43-
schema.AddAttributes(attrDob);
44-
Array.Create(ctx, uri, schema);
38+
Console.WriteLine($"ID: {x.Id}, Name: {x.Name}, Date of birth: {x.DateOfBirth:d}");
4539
}
40+
}
4641

47-
static void Write(Context ctx, string uri, ulong idStart, string[] names, DateTime[] dobs)
42+
static void CreateArray(Context ctx, string uri)
43+
{
44+
using var schema = new ArraySchema(ctx, ArrayType.Dense);
45+
using var domain = new Domain(ctx);
46+
using var dimension = Dimension.Create<ulong>(ctx, "id", 0, ulong.MaxValue - 1, 1);
47+
domain.AddDimension(dimension);
48+
schema.SetDomain(domain);
49+
using var attrName = new Attribute(ctx, "name", DataType.StringUtf8);
50+
attrName.SetCellValNum(Attribute.VariableSized);
51+
using var attrDob = new Attribute(ctx, "dob", DataType.DateTimeDay);
52+
schema.AddAttributes(attrName);
53+
schema.AddAttributes(attrDob);
54+
Array.Create(ctx, uri, schema);
55+
}
56+
57+
static void Write(Context ctx, string uri, ulong idStart, string[] names, DateTime[] dobs)
58+
{
59+
using var array = new Array(ctx, uri);
60+
array.Open(QueryType.Write);
61+
using var query = new Query(array);
62+
query.SetLayout(LayoutType.RowMajor);
63+
using var subarray = new Subarray(array);
64+
subarray.AddRange(0, idStart, idStart + (ulong)names.Length - 1);
65+
query.SetSubarray(subarray);
66+
var (nameData, nameOffsets) = CoreUtil.PackStringArray(names);
67+
query.SetDataBuffer("name", nameData);
68+
query.SetOffsetsBuffer("name", nameOffsets);
69+
query.SetDataBuffer("dob", dobs.Select(x => (long)(x - new DateTime(1970, 1, 1)).Days).ToArray());
70+
query.Submit();
71+
}
72+
73+
static IEnumerable<(ulong Id, string Name, DateTime DateOfBirth)> Read(Context ctx, string uri, ulong idStart, ulong count)
74+
{
75+
using var array = new Array(ctx, uri);
76+
array.Open(QueryType.Read);
77+
(ulong minElement, ulong maxElement, bool isEmpty) = array.NonEmptyDomain<ulong>("id");
78+
if (isEmpty)
4879
{
49-
using var array = new Array(ctx, uri);
50-
array.Open(QueryType.Write);
51-
using var query = new Query(array);
52-
query.SetLayout(LayoutType.RowMajor);
53-
using var subarray = new Subarray(array);
54-
subarray.AddRange(0, idStart, idStart + (ulong)names.Length - 1);
55-
query.SetSubarray(subarray);
56-
var (nameData, nameOffsets) = CoreUtil.PackStringArray(names);
57-
query.SetDataBuffer("name", nameData);
58-
query.SetOffsetsBuffer("name", nameOffsets);
59-
query.SetDataBuffer("dob", dobs.Select(x => (long)(x - new DateTime(1970, 1, 1)).Days).ToArray());
60-
query.Submit();
80+
yield break;
6181
}
82+
idStart = Math.Max(idStart, minElement);
83+
ulong idEnd = Math.Min(idStart + count, maxElement);
84+
using var query = new Query(array);
85+
query.SetLayout(LayoutType.RowMajor);
86+
using var subarray = new Subarray(array);
87+
subarray.AddRange(0, idStart, idEnd);
88+
query.SetSubarray(subarray);
6289

63-
static IEnumerable<(ulong Id, string Name, DateTime DateOfBirth)> Read(Context ctx, string uri, ulong idStart, ulong count)
90+
byte[] nameData = new byte[512];
91+
ulong[] nameOffsets = new ulong[16];
92+
long[] dobs = new long[16];
93+
query.SetDataBuffer("name", nameData);
94+
query.SetOffsetsBuffer("name", nameOffsets);
95+
query.SetDataBuffer("dob", dobs);
96+
ulong currentId = idStart;
97+
// Loop until the query completes or fails.
98+
while (query.Status() is not (QueryStatus.Failed or QueryStatus.Completed))
6499
{
65-
using var array = new Array(ctx, uri);
66-
array.Open(QueryType.Read);
67-
(ulong minElement, ulong maxElement, bool isEmpty) = array.NonEmptyDomain<ulong>("id");
68-
if (isEmpty)
100+
query.Submit();
101+
var dataCount = (int)query.GetResultDataBytes("name");
102+
// The count of offsets for the variable-length attribute "name"
103+
// essentially tells us how many cells were returned.
104+
var offsetCount = (int)query.GetResultOffsets("name");
105+
// If zero cells were returned, check if the reason was that the
106+
// buffers were too small, resize them, and try again.
107+
if (offsetCount == 0 && query.GetStatusDetails().Reason == QueryStatusDetailsReason.UserBufferSize)
69108
{
70-
yield break;
109+
System.Array.Resize(ref nameData, nameData.Length * 2);
110+
System.Array.Resize(ref nameOffsets, nameOffsets.Length * 2);
111+
System.Array.Resize(ref dobs, dobs.Length * 2);
112+
query.SetDataBuffer("name", nameData);
113+
query.SetOffsetsBuffer("name", nameOffsets);
114+
query.SetDataBuffer("dob", dobs);
115+
continue;
71116
}
72-
idStart = Math.Max(idStart, minElement);
73-
ulong idEnd = Math.Min(idStart + count, maxElement);
74-
using var query = new Query(array);
75-
query.SetLayout(LayoutType.RowMajor);
76-
using var subarray = new Subarray(array);
77-
subarray.AddRange(0, idStart, idEnd);
78-
query.SetSubarray(subarray);
79-
80-
byte[] nameData = new byte[512];
81-
ulong[] nameOffsets = new ulong[16];
82-
long[] dobs = new long[16];
83-
query.SetDataBuffer("name", nameData);
84-
query.SetOffsetsBuffer("name", nameOffsets);
85-
query.SetDataBuffer("dob", dobs);
86-
ulong currentId = idStart;
87-
// Loop until the query completes or fails.
88-
while (query.Status() is not (QueryStatus.Failed or QueryStatus.Completed))
117+
for (int i = 0; i < offsetCount; i++)
89118
{
90-
query.Submit();
91-
var dataCount = (int)query.GetResultDataBytes("name");
92-
// The count of offsets for the variable-length attribute "name"
93-
// essentially tells us how many cells were returned.
94-
var offsetCount = (int)query.GetResultOffsets("name");
95-
// If zero cells were returned, check if the reason was that the
96-
// buffers were too small, resize them, and try again.
97-
if (offsetCount == 0 && query.GetStatusDetails().Reason == QueryStatusDetailsReason.UserBufferSize)
98-
{
99-
System.Array.Resize(ref nameData, nameData.Length * 2);
100-
System.Array.Resize(ref nameOffsets, nameOffsets.Length * 2);
101-
System.Array.Resize(ref dobs, dobs.Length * 2);
102-
query.SetDataBuffer("name", nameData);
103-
query.SetOffsetsBuffer("name", nameOffsets);
104-
query.SetDataBuffer("dob", dobs);
105-
continue;
106-
}
107-
for (int i = 0; i < offsetCount; i++)
108-
{
109-
var offset = (int)nameOffsets[i];
110-
var offsetOfNext = i < offsetCount - 1 ? (int)nameOffsets[i + 1] : dataCount;
111-
var name = Encoding.ASCII.GetString(nameData.AsSpan(offset, offsetOfNext - offset));
112-
var dob = new DateTime(1970, 1, 1).AddDays(dobs[i]);
113-
yield return (currentId++, name, dob);
114-
}
119+
var offset = (int)nameOffsets[i];
120+
var offsetOfNext = i < offsetCount - 1 ? (int)nameOffsets[i + 1] : dataCount;
121+
var name = Encoding.ASCII.GetString(nameData.AsSpan(offset, offsetOfNext - offset));
122+
var dob = new DateTime(1970, 1, 1).AddDays(dobs[i]);
123+
yield return (currentId++, name, dob);
115124
}
116125
}
117126
}

0 commit comments

Comments
 (0)