Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Globalization;
using Microsoft.Extensions.Logging;
Expand Down Expand Up @@ -82,10 +82,22 @@ internal override void InternalExecute(WorkItem source, WorkItem target)
}

// Convert field value to numeric
if (!TryConvertToNumeric(fieldValue, out var numericValue))
{
Log.LogWarning("FieldCalculationMap: Source field '{SourceField}' with value '{FieldValue}' is not numeric on work item {WorkItemId}. Skipping calculation.", parameter.Value, fieldValue, source.Id);
return;
if (!TryConvertToNumeric(fieldValue, out var numericValue)) {

switch (Config.parsingFallback) {
case FieldCalculationMapParsingFallback.RaiseError:
Log.LogError(
"FieldCalculationMap: Source field '{SourceField}' with value '{FieldValue}' is not numeric on work item {WorkItemId}. Skipping calculation.",
parameter.Value, fieldValue, source.Id);
break;

case FieldCalculationMapParsingFallback.ResetToZero:
Log.LogWarning(
"FieldCalculationMap: Source field '{SourceField}' with value '{FieldValue}' is not numeric on work item {WorkItemId}. resetting the value to 0.0.",
parameter.Value, fieldValue, source.Id);
numericValue = 0.0;
break;
}
}
Comment thread
MrHinsh marked this conversation as resolved.

parameterValues[parameter.Key] = numericValue;
Expand Down Expand Up @@ -216,4 +228,4 @@ private static bool TryConvertToTargetFieldType(object result, Field targetField
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,31 @@
using System.Collections.Generic;
using System.Collections.Generic;
using MigrationTools.Tools.Infrastructure;

namespace MigrationTools.Tools
{
namespace MigrationTools.Tools {
public enum FieldCalculationMapParsingFallback {
RaiseError,
ResetToZero
}

/// <summary>
/// Performs mathematical calculations on numeric fields using NCalc expressions during migration.
/// </summary>
/// <status>ready</status>
/// <processingtarget>Work Item Field</processingtarget>
public class FieldCalculationMapOptions : FieldMapOptions
{
public class FieldCalculationMapOptions : FieldMapOptions {
/// <summary>
/// Gets or sets the NCalc expression to evaluate. Variables in the expression should be enclosed in square brackets (e.g., "[x]*2").
/// </summary>
/// <default>null</default>
public string expression { get; set; }

/// <summary>
/// Gets or sets the parsing fallback.
/// </summary>
/// <default>null</default>
public FieldCalculationMapParsingFallback parsingFallback { get; set; } =
FieldCalculationMapParsingFallback.RaiseError;

/// <summary>
/// Gets or sets a dictionary mapping variable names used in the expression to source field reference names.
/// </summary>
Expand All @@ -31,23 +41,21 @@ public class FieldCalculationMapOptions : FieldMapOptions
/// <summary>
/// Sets example configuration defaults for documentation purposes.
/// </summary>
public void SetExampleConfigDefaults()
{
public void SetExampleConfigDefaults() {
ApplyTo = new List<string>() { "SomeWorkItemType" };
expression = "[x]*2";
parameters = new Dictionary<string, string>
{
parameters = new Dictionary<string, string> {
{ "x", "Custom.FieldB" }
};
targetField = "Custom.FieldC";
parsingFallback = FieldCalculationMapParsingFallback.RaiseError;
}

/// <summary>
/// Initializes a new instance of the FieldCalculationMapOptions class.
/// </summary>
public FieldCalculationMapOptions()
{
public FieldCalculationMapOptions() {
parameters = new Dictionary<string, string>();
}
}
}
}