Skip to content

Commit

Permalink
Allow PropertyTransform to modify resource ID
Browse files Browse the repository at this point in the history
  • Loading branch information
Vincent Wilms committed Jan 14, 2025
1 parent b490119 commit 1791466
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 22 deletions.
32 changes: 22 additions & 10 deletions src/Nexus.Sources.Transform/TransformDataSource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ internal record PropertyTransform(
TransformOperation Operation,
string SourcePath,
string SourcePattern,
string TargetProperty,
string? TargetProperty,
string? TargetTemplate,
string? Separator
);
Expand Down Expand Up @@ -133,11 +133,14 @@ public Task<ResourceCatalog> EnrichCatalogAsync(ResourceCatalog catalog, Cancell
}

// get target value
var existingValue = newResourceProperties.GetValueOrDefault(transform.TargetProperty);
var isNullOrUndefined = existingValue.ValueKind == JsonValueKind.Null || existingValue.ValueKind == JsonValueKind.Undefined;
if (transform.TargetProperty is not null)
{
var existingValue = newResourceProperties.GetValueOrDefault(transform.TargetProperty);
var isNullOrUndefined = existingValue.ValueKind == JsonValueKind.Null || existingValue.ValueKind == JsonValueKind.Undefined;

if (!isNullOrUndefined && transform.Operation == TransformOperation.SetIfNotExists)
continue;
if (!isNullOrUndefined && transform.Operation == TransformOperation.SetIfNotExists)
continue;
}

// get new target value
var isMatch = Regex.IsMatch(sourceValue, transform.SourcePattern);
Expand All @@ -152,16 +155,25 @@ public Task<ResourceCatalog> EnrichCatalogAsync(ResourceCatalog catalog, Cancell
replacement: transform.TargetTemplate ?? DEFAULT_TARGET_TEMPLATE
);

if (transform.Separator is null)
// apply value
if (transform.TargetProperty is null)
{
newResourceProperties[transform.TargetProperty]
= JsonSerializer.SerializeToElement(targetValue);
localResource = resource with { Id = targetValue };
}

else
{
newResourceProperties[transform.TargetProperty]
= JsonSerializer.SerializeToElement(targetValue.Split(transform.Separator));
if (transform.Separator is null)
{
newResourceProperties[transform.TargetProperty]
= JsonSerializer.SerializeToElement(targetValue);
}

else
{
newResourceProperties[transform.TargetProperty]
= JsonSerializer.SerializeToElement(targetValue.Split(transform.Separator));
}
}
}
}
Expand Down
80 changes: 68 additions & 12 deletions tests/Nexus.Sources.Transform.Tests/TransformDataSourceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,10 @@ string expected
/* data source setup */
var transform = new PropertyTransform(
Operation: default,
SourcePattern: sourcePattern,
TargetTemplate: targetTemplate,
SourcePath: DataModelExtensions.OriginalNameKey,
SourcePattern: sourcePattern,
TargetProperty: DataModelExtensions.UnitKey,
TargetTemplate: targetTemplate,
Separator: default
);

Expand Down Expand Up @@ -157,19 +157,19 @@ public async Task CanDeriveUnitFromOriginalNameInTwoSteps()
/* data source setup */
var transform1 = new PropertyTransform(
Operation: default,
SourcePattern: sourcePattern1,
TargetTemplate: targetTemplate1,
SourcePath: DataModelExtensions.OriginalNameKey,
SourcePattern: sourcePattern1,
TargetProperty: DataModelExtensions.UnitKey,
TargetTemplate: targetTemplate1,
Separator: default
);

var transform2 = new PropertyTransform(
Operation: default,
SourcePattern: sourcePattern2,
TargetTemplate: targetTemplate2,
SourcePath: DataModelExtensions.UnitKey,
SourcePattern: sourcePattern2,
TargetProperty: DataModelExtensions.UnitKey,
TargetTemplate: targetTemplate2,
Separator: default
);

Expand Down Expand Up @@ -222,10 +222,10 @@ public async Task DoesNotModifyPropertiesIfNoMatch()
/* data source setup */
var transform = new PropertyTransform(
Operation: default,
SourcePattern: sourcePattern,
TargetTemplate: default,
SourcePath: DataModelExtensions.OriginalNameKey,
SourcePattern: sourcePattern,
TargetProperty: DataModelExtensions.UnitKey,
TargetTemplate: default,
Separator: default
);

Expand Down Expand Up @@ -281,10 +281,10 @@ public async Task CanDeriveGroupsFromOriginalName()
/* data source setup */
var transform = new PropertyTransform(
Operation: default,
SourcePattern: sourcePattern,
TargetTemplate: targetTemplate,
SourcePath: DataModelExtensions.OriginalNameKey,
SourcePattern: sourcePattern,
TargetProperty: DataModelExtensions.GroupsKey,
TargetTemplate: targetTemplate,
Separator: separator
);

Expand Down Expand Up @@ -327,6 +327,62 @@ public async Task CanDeriveGroupsFromOriginalName()
Assert.Equal(expected, actual);
}

[Fact]
public async Task CanDeriveIdFromOriginalName()
{
// Arrange
var originalName = "v_horz_100m_blue_avg in m/s";
var sourcePattern = @"(.*)\sin .*";
var expected = "v_horz_100m_blue_avg";

/* data source setup */
var transform = new PropertyTransform(
Operation: default,
SourcePath: DataModelExtensions.OriginalNameKey,
SourcePattern: sourcePattern,
TargetProperty: default,
TargetTemplate: default,
Separator: default
);

var settings = new TransformSettings(
IdTransforms: [],
PropertyTransforms: [transform]
);

var sourceConfiguration = JsonSerializer
.Deserialize<IReadOnlyDictionary<string, JsonElement>>(JsonSerializer.SerializeToElement(settings));

var context = new DataSourceContext(
ResourceLocator: default,
SystemConfiguration: default,
SourceConfiguration: sourceConfiguration,
RequestConfiguration: default
);

var dataSource = new Transform();

await dataSource.SetContextAsync(context, NullLogger.Instance, CancellationToken.None);

/* catalog setup */
var resource = new ResourceBuilder(id: "foo")
.WithOriginalName(originalName)
.Build();

var catalog = new ResourceCatalogBuilder(id: "/bar")
.AddResource(resource)
.Build();

// Act
var actualCatalog = await dataSource
.EnrichCatalogAsync(catalog, CancellationToken.None);

// Assert
var actual = actualCatalog.Resources![0].Id;

Assert.Equal(expected, actual);
}

[Theory]

/* test creation of missing value or replacement of wrong value */
Expand All @@ -346,10 +402,10 @@ string expected
/* data source setup */
var transform = new PropertyTransform(
Operation: operation,
SourcePattern: ".*",
TargetTemplate: "$0",
SourcePath: DataModelExtensions.OriginalNameKey,
SourcePattern: ".*",
TargetProperty: DataModelExtensions.UnitKey,
TargetTemplate: "$0",
Separator: default
);

Expand Down

0 comments on commit 1791466

Please sign in to comment.