Skip to content

Commit 97db9a5

Browse files
authored
Merge pull request AzureCosmosDB#118 from CityStructure/cosmosdb-ignorenullvalues
introduce IgnoreNullValue setting for CosmosDB sink
2 parents 434fa79 + adb140e commit 97db9a5

File tree

4 files changed

+19
-3
lines changed

4 files changed

+19
-3
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ void ReportCount(int i)
9393
}
9494
}
9595

96-
var convertedObjects = dataItems.Select(di => di.BuildDynamicObjectTree(true)).Where(o => o != null).OfType<ExpandoObject>();
96+
var convertedObjects = dataItems.Select(di => di.BuildDynamicObjectTree(requireStringId: true, ignoreNullValues: settings.IgnoreNullValues)).Where(o => o != null).OfType<ExpandoObject>();
9797
var batches = convertedObjects.Buffer(settings.BatchSize);
9898
var retry = GetRetryPolicy(settings.MaxRetryCount, settings.InitialRetryDurationMs);
9999
await foreach (var batch in batches.WithCancellation(cancellationToken))

Extensions/Cosmos/Cosmos.DataTransfer.CosmosExtension/CosmosExtensionServices.cs

+8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ public static CosmosClient CreateClient(CosmosSettingsBase settings, string disp
2222
AllowBulkExecution = true,
2323
EnableContentResponseOnWrite = false,
2424
};
25+
26+
if (settings is CosmosSinkSettings sinkSettings)
27+
{
28+
clientOptions.SerializerOptions = new CosmosSerializationOptions
29+
{
30+
IgnoreNullValues = sinkSettings.IgnoreNullValues
31+
};
32+
}
2533

2634
CosmosClient? cosmosClient;
2735
if (settings.UseRbacAuth)

Extensions/Cosmos/Cosmos.DataTransfer.CosmosExtension/CosmosSinkSettings.cs

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public class CosmosSinkSettings : CosmosSettingsBase, IDataExtensionSettings
1515
public bool IsServerlessAccount { get; set; } = false;
1616
public bool UseSharedThroughput { get; set; } = false;
1717
public DataWriteMode WriteMode { get; set; } = DataWriteMode.Insert;
18+
public bool IgnoreNullValues { get; set; } = false;
1819
public List<string>? PartitionKeyPaths { get; set; }
1920

2021
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)

Interfaces/Cosmos.DataTransfer.Interfaces/DataItemExtensions.cs

+9-2
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ public static class DataItemExtensions
1111
/// <param name="requireStringId">If true, adds a new GUID "id" field to any top level items where one is not already present.</param>
1212
/// <returns>A dynamic object containing the entire data structure.</returns>
1313
/// <remarks>The returned ExpandoObject can be used directly as an IDictionary.</remarks>
14-
public static ExpandoObject? BuildDynamicObjectTree(this IDataItem? source, bool requireStringId = false)
14+
public static ExpandoObject? BuildDynamicObjectTree(this IDataItem? source, bool requireStringId = false, bool ignoreNullValues = false)
1515
{
16-
if (source == null)
16+
if (source == null)
17+
{
1718
return null;
19+
}
1820

1921
var fields = source.GetFieldNames().ToList();
2022
var item = new ExpandoObject();
@@ -35,6 +37,11 @@ public static class DataItemExtensions
3537
foreach (string field in fields)
3638
{
3739
object? value = source.GetValue(field);
40+
if (ignoreNullValues && value == null)
41+
{
42+
continue;
43+
}
44+
3845
var fieldName = field;
3946
if (string.Equals(field, "id", StringComparison.CurrentCultureIgnoreCase) && requireStringId && !containsLowercaseIdField)
4047
{

0 commit comments

Comments
 (0)