Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFormFieldMapper.cs
More file actions
Latest commit
86 lines (69 loc) · 2.8 KB
/
Copy pathFormFieldMapper.cs
File metadata and controls
86 lines (69 loc) · 2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
usingTXTextControl;
namespaceTxFormFieldMapper;
internalsealedclassFormFieldMapper(IReadOnlyList<string>jsonFieldNames,doubleminimumScore)
{
privateconstdoubleAmbiguityMargin=0.08;
privatereadonlyIReadOnlyList<FieldNameCandidate>_jsonCandidates=jsonFieldNames
.Distinct(StringComparer.OrdinalIgnoreCase)
.Select(FieldNameCandidate.Create)
.ToList();
publicIReadOnlyList<MapResult>RenameFormFields(FormFieldCollectionformFields)
{
varresults=newList<MapResult>();
varcachedMatches=newDictionary<string,MatchDecision>(StringComparer.OrdinalIgnoreCase);
for(vari=1;i<=formFields.Count;i++)
{
varfield=formFields[i];
if(fieldisnull)
{
continue;
}
varoriginalName=field.Name??string.Empty;
if(!cachedMatches.TryGetValue(originalName,outvardecision))
{
decision=FindBestMatch(originalName);
cachedMatches[originalName]=decision;
}
if(decision.ShouldRename&&!string.Equals(field.Name,decision.JsonName,StringComparison.Ordinal))
{
field.Name=decision.JsonName;
}
results.Add(newMapResult(originalName,decision.JsonName,decision.Score,decision.Status));
}
returnresults;
}
privateMatchDecisionFindBestMatch(stringformFieldName)
{
if(string.IsNullOrWhiteSpace(formFieldName))
{
returnMatchDecision.Skipped(formFieldName,"skipped: empty field name");
}
varsource=FieldNameCandidate.Create(formFieldName);
varscored=_jsonCandidates
.Select(candidate =>new
{
Candidate=candidate,
Score=FieldNameScorer.Score(source,candidate)
})
.OrderByDescending(item =>item.Score)
.ToList();
if(scored.Count==0)
{
returnMatchDecision.Skipped(formFieldName,"skipped: no unused JSON fields left");
}
varbest=scored[0];
varsecondScore=scored.Count>1?scored[1].Score:0;
if(best.Score<minimumScore)
{
returnMatchDecision.Skipped(best.Candidate.Original,"skipped: below threshold");
}
if(best.Score<1&&best.Score-secondScore<AmbiguityMargin)
{
returnMatchDecision.Skipped(best.Candidate.Original,"skipped: ambiguous");
}
varstatus=string.Equals(formFieldName,best.Candidate.Original,StringComparison.Ordinal)
?"already mapped"
:"renamed";
returnnewMatchDecision(best.Candidate.Original,best.Score,status,ShouldRename:true);
}
}