Skip to content

Commit 7cf7b3b

Browse files
authored
Merge pull request #65 from RemyBoyer/cosmos-sink-nested-array
Fix nested arrays in Cosmos SQL Sink
2 parents 532dca1 + 7104c96 commit 7cf7b3b

File tree

3 files changed

+78
-9
lines changed

3 files changed

+78
-9
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
namespace Cosmos.DataTransfer.CosmosExtension.UnitTests
2+
{
3+
[TestClass]
4+
public class CosmosDataSinkExtensionTests
5+
{
6+
[TestMethod]
7+
public void BuildObject_WithNestedArrays_WorksCorrectly()
8+
{
9+
var item = new CosmosDictionaryDataItem(new Dictionary<string, object?>()
10+
{
11+
{
12+
"array",
13+
new List<object?>
14+
{
15+
new List<object?>
16+
{
17+
new CosmosDictionaryDataItem(new Dictionary<string, object?>()
18+
{
19+
{ "id", "sub1-1" }
20+
}),
21+
new CosmosDictionaryDataItem(new Dictionary<string, object?>()
22+
{
23+
{ "id", "sub1-2" }
24+
})
25+
},
26+
new List<object?>
27+
{
28+
new CosmosDictionaryDataItem(new Dictionary<string, object?>()
29+
{
30+
{ "id", "sub2-1" }
31+
}),
32+
}
33+
}
34+
}
35+
});
36+
37+
dynamic obj = CosmosDataSinkExtension.BuildObject(item)!;
38+
39+
Assert.AreEqual(typeof(object[]), obj.array.GetType());
40+
Assert.AreEqual(2, obj.array.Length);
41+
42+
var firstSubArray = obj.array[0];
43+
Assert.AreEqual(typeof(object[]), firstSubArray.GetType());
44+
Assert.AreEqual(2, firstSubArray.Length);
45+
46+
Assert.AreEqual("sub1-1", firstSubArray[0].id);
47+
Assert.AreEqual("sub1-2", firstSubArray[1].id);
48+
49+
var secondSubArray = obj.array[1];
50+
Assert.AreEqual(typeof(object[]), secondSubArray.GetType());
51+
Assert.AreEqual(1, secondSubArray.Length);
52+
53+
Assert.AreEqual("sub2-1", secondSubArray[0].id);
54+
}
55+
}
56+
}

Extensions/Cosmos/Cosmos.DataTransfer.CosmosExtension/Cosmos.DataTransfer.CosmosExtension.csproj

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
<OutputType>Exe</OutputType>
88
</PropertyGroup>
99

10+
<ItemGroup>
11+
<InternalsVisibleTo Include="Cosmos.DataTransfer.CosmosExtension.UnitTests" />
12+
</ItemGroup>
13+
1014
<ItemGroup>
1115
<PackageReference Include="Azure.Identity" Version="1.6.0" />
1216
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.34.0" />

Extensions/Cosmos/Cosmos.DataTransfer.CosmosExtension/CosmosDataSinkExtension.cs

+18-9
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ private static MemoryStream CreateItemStream(ExpandoObject item)
176176
return ((IDictionary<string, object?>)item)[propertyName]?.ToString();
177177
}
178178

179-
private static ExpandoObject? BuildObject(IDataItem? source, bool requireStringId = false)
179+
internal static ExpandoObject? BuildObject(IDataItem? source, bool requireStringId = false)
180180
{
181181
if (source == null)
182182
return null;
@@ -202,20 +202,29 @@ private static MemoryStream CreateItemStream(ExpandoObject item)
202202
}
203203
else if (value is IEnumerable<object?> array)
204204
{
205-
value = array.Select(dataItem =>
206-
{
207-
if (dataItem is IDataItem childObject)
208-
{
209-
return BuildObject(childObject);
210-
}
211-
return dataItem;
212-
}).ToArray();
205+
value = BuildArray(array);
213206
}
214207

215208
item.TryAdd(fieldName, value);
216209
}
217210

218211
return item;
212+
213+
static object BuildArray(IEnumerable<object?> array)
214+
{
215+
return array.Select(dataItem =>
216+
{
217+
if (dataItem is IDataItem childObject)
218+
{
219+
return BuildObject(childObject);
220+
}
221+
else if (dataItem is IEnumerable<object?> array)
222+
{
223+
return BuildArray(array);
224+
}
225+
return dataItem;
226+
}).ToArray();
227+
}
219228
}
220229

221230
public IEnumerable<IDataExtensionSettings> GetSettings()

0 commit comments

Comments
 (0)