Skip to content
Merged
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
25 changes: 14 additions & 11 deletions Src/LexText/ParserCore/ParserCoreTests/ParserReportTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,11 @@ private IWfiAnalysis CreateIWfiAnalysis(IWfiWordform wordform, List<ParseMorph>
return newAnal;
}

private void CheckParseReport(ParseReport report, int numAnalyses = 0, int numApprovedMissing = 0,
private void CheckParseReport(ParseReport report, int numAnalyses = 0, int numChangedAnalyses = 0, int numApprovedMissing = 0,
int numDisapproved = 0, int numNoOpinion = 0, int parseTime = 0, string errorMessage = null)
{
Assert.That(report.NumAnalyses, Is.EqualTo(numAnalyses));
Assert.That(report.NumChangedAnalyses, Is.EqualTo(numChangedAnalyses));
Assert.That(report.NumUserDisapprovedAnalyses, Is.EqualTo(numDisapproved));
Assert.That(report.NumUserApprovedAnalysesMissing, Is.EqualTo(numApprovedMissing));
Assert.That(report.NumUserNoOpinionAnalyses, Is.EqualTo(numNoOpinion));
Expand All @@ -64,10 +65,11 @@ private void CheckParseReport(ParseReport report, int numAnalyses = 0, int numAp
}

private void CheckParserReport(ParserReport report, int numParseErrors = 0, int numWords = 0,
int numZeroParses = 0, int totalAnalyses = 0, int totalApprovedMissing = 0,
int numZeroParses = 0, int totalAnalyses = 0, int totalChangedAnalyses = 0, int totalApprovedMissing = 0,
int totalDisapproved = 0, int totalNoOpinion = 0,int totalParseTime = 0)
{
Assert.That(report.TotalAnalyses, Is.EqualTo(totalAnalyses));
Assert.That(report.TotalChangedAnalyses, Is.EqualTo(totalChangedAnalyses));
Assert.That(report.TotalUserDisapprovedAnalyses, Is.EqualTo(totalDisapproved));
Assert.That(report.TotalUserApprovedAnalysesMissing, Is.EqualTo(totalApprovedMissing));
Assert.That(report.TotalUserNoOpinionAnalyses, Is.EqualTo(totalNoOpinion));
Expand Down Expand Up @@ -164,6 +166,7 @@ public void TestAddParseResult()
});
var analysis = CreateIWfiAnalysis(catWordform, new List<ParseMorph> {parseMorph});
analysis.SetAgentOpinion(Cache.LanguageProject.DefaultUserAgent, Opinions.approves);
analysis.SetAgentOpinion(Cache.LanguageProject.DefaultParserAgent, Opinions.approves);
var analysisX = CreateIWfiAnalysis(catWordform, new List<ParseMorph> { parseMorph3 });
analysisX.SetAgentOpinion(Cache.LanguageProject.DefaultUserAgent, Opinions.disapproves);
// Missing approved analyses.
Expand All @@ -177,57 +180,57 @@ public void TestAddParseResult()
});

var parseReport = new ParseReport(catWordform, result);
CheckParseReport(parseReport, numAnalyses: 4, numApprovedMissing: 3, numDisapproved: 1, numNoOpinion: 2, parseTime: 10);
CheckParseReport(parseReport, numAnalyses: 4, numChangedAnalyses: 3, numApprovedMissing: 3, numDisapproved: 1, numNoOpinion: 2, parseTime: 10);

var errorResult = new ParseResult("error"){ ParseTime = 1 };
var errorReport = new ParseReport(catWordform, errorResult);
CheckParseReport(errorReport, numApprovedMissing: 4, parseTime: 1, errorMessage: "error");
CheckParseReport(errorReport, numApprovedMissing: 4, numChangedAnalyses: 1, parseTime: 1, errorMessage: "error");
errorReport = new ParseReport(errorWordform, errorResult);
CheckParseReport(errorReport, parseTime: 1, errorMessage: "error");

var zeroResult = new ParseResult(Enumerable.Empty<ParseAnalysis>()){ ParseTime = 2 };
var zeroReport = new ParseReport(catWordform, zeroResult);
CheckParseReport(zeroReport, numApprovedMissing: 4, parseTime: 2);
CheckParseReport(zeroReport, numApprovedMissing: 4, numChangedAnalyses: 1, parseTime: 2);
zeroReport = new ParseReport(zeroWordform, zeroResult);
CheckParseReport(zeroReport, parseTime: 2);

var parserReport = new ParserReport(Cache);
var parserReport = new ParserReport(Cache, null);
parserReport.SourceText = "Testbed";
parserReport.AddParseReport("cat", parseReport);
parserReport.AddParseReport("error", errorReport);
parserReport.AddParseReport("zero", zeroReport);
Assert.That(parserReport.ParseReports.ContainsKey("cat"), Is.True);
CheckParserReport(parserReport, numParseErrors: 1, numWords: 3,
numZeroParses: 2, totalAnalyses: 4, totalApprovedMissing: 3,
numZeroParses: 2, totalAnalyses: 4, totalChangedAnalyses: 3, totalApprovedMissing: 3,
totalDisapproved: 1, totalNoOpinion: 2, totalParseTime: 13);

// Check SubtractParseReport.
var eeReport = errorReport.DiffParseReport(errorReport);
CheckParseReport(eeReport);

var epReport = parseReport.DiffParseReport(errorReport);
CheckParseReport(epReport, numAnalyses: 4, numApprovedMissing: 3,
CheckParseReport(epReport, numAnalyses: 4, numChangedAnalyses: 3, numApprovedMissing: 3,
numDisapproved: 1, numNoOpinion: 2, parseTime: 9, errorMessage: "error => ");

var ezReport = errorReport.DiffParseReport(zeroReport);
CheckParseReport(ezReport, parseTime: -1, errorMessage: " => error");

var peReport = errorReport.DiffParseReport(parseReport);
CheckParseReport(peReport, numAnalyses: -4, numApprovedMissing: -3,
CheckParseReport(peReport, numAnalyses: -4, numChangedAnalyses: -3, numApprovedMissing: -3,
numDisapproved: -1, numNoOpinion: -2, parseTime: -9, errorMessage: " => error");

var ppReport = parseReport.DiffParseReport(parseReport);
CheckParseReport(ppReport);

var pzReport = zeroReport.DiffParseReport(parseReport);
CheckParseReport(pzReport, numAnalyses: -4, numApprovedMissing: -3,
CheckParseReport(pzReport, numAnalyses: -4, numChangedAnalyses: -3, numApprovedMissing: -3,
numDisapproved: -1, numNoOpinion: -2, parseTime: -8);

var zeReport = errorReport.DiffParseReport(zeroReport);
CheckParseReport(zeReport, parseTime: -1, errorMessage: " => error");

var zpReport = parseReport.DiffParseReport(zeroReport);
CheckParseReport(zpReport, numAnalyses: 4, numApprovedMissing: 3,
CheckParseReport(zpReport, numAnalyses: 4, numChangedAnalyses: 3, numApprovedMissing: 3,
numDisapproved: 1, numNoOpinion: 2, parseTime: 8);

var zzReport = zeroReport.DiffParseReport(zeroReport);
Expand Down
67 changes: 65 additions & 2 deletions Src/LexText/ParserCore/ParserReport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.IO;
using System.Linq;
using System.Security.Policy;
using XCore;

namespace SIL.FieldWorks.WordWorks.Parser
{
Expand Down Expand Up @@ -85,6 +86,16 @@ public class ParserReport: IEquatable<ParserReport>
/// </summary>
public int TotalUserNoOpinionAnalyses { get; set; }

/// <summary>
/// Total number of parse analyses that changed since the last parse
/// </summary>
public int TotalChangedAnalyses { get; set; }

/// <summary>
/// Whether changes were recorded in ChangedAnalyses.
/// </summary>
public bool ChangesRecorded { get; set; }

/// <summary>
/// Parse reports for each word
/// </summary>
Expand Down Expand Up @@ -113,12 +124,14 @@ public ParserReport()
ParseReports = new Dictionary<string, ParseReport>();
}

public ParserReport(LcmCache cache)
public ParserReport(LcmCache cache, PropertyTable propertyTable)
{
ProjectName = cache.LanguageProject.ShortName;
MachineName = Environment.MachineName;
Timestamp = DateTime.UtcNow.ToFileTime();
ParseReports = new Dictionary<string, ParseReport>();
bool updatesAnalyses = propertyTable == null ? true : propertyTable.GetBoolProperty("CheckParserUpdatesAnalyses", true);
ChangesRecorded = !updatesAnalyses;
}

/// <summary>
Expand All @@ -132,6 +145,7 @@ public void AddParseReport(string word, ParseReport report)
NumWords += 1;
TotalParseTime += report.ParseTime;
TotalAnalyses += report.NumAnalyses;
TotalChangedAnalyses += report.NumChangedAnalyses;
TotalUserApprovedAnalysesMissing += report.NumUserApprovedAnalysesMissing;
TotalUserDisapprovedAnalyses += report.NumUserDisapprovedAnalyses;
TotalUserNoOpinionAnalyses += report.NumUserNoOpinionAnalyses;
Expand Down Expand Up @@ -245,6 +259,7 @@ public ParserReport DiffParserReports(ParserReport other)
diff.NumZeroParses = NumZeroParses - other.NumZeroParses;
diff.TotalParseTime = TotalParseTime - other.TotalParseTime;
diff.TotalAnalyses = TotalAnalyses - other.TotalAnalyses;
diff.TotalChangedAnalyses = TotalChangedAnalyses - other.TotalChangedAnalyses;
diff.TotalUserApprovedAnalysesMissing = TotalUserApprovedAnalysesMissing - other.TotalUserApprovedAnalysesMissing;
diff.TotalUserDisapprovedAnalyses = TotalUserDisapprovedAnalyses - other.TotalUserDisapprovedAnalyses;
diff.TotalUserNoOpinionAnalyses = TotalUserNoOpinionAnalyses - other.TotalUserNoOpinionAnalyses;
Expand Down Expand Up @@ -296,6 +311,8 @@ public bool Equals(ParserReport other)

if (TotalAnalyses != other.TotalAnalyses) return false;

if (TotalChangedAnalyses != other.TotalChangedAnalyses) return false;

if (TotalUserApprovedAnalysesMissing != other.TotalUserApprovedAnalysesMissing) return false;

if (TotalUserDisapprovedAnalyses != other.TotalUserDisapprovedAnalyses) return false;
Expand Down Expand Up @@ -358,6 +375,11 @@ public class ParseReport : IEquatable<ParseReport>
/// </summary>
public int NumUserNoOpinionAnalyses { get; set; }

/// <summary>
/// Number of analyses that changed since the last parse
/// </summary>
public int NumChangedAnalyses { get; set; }

public ParseReport() { }

/// <summary>
Expand Down Expand Up @@ -409,7 +431,45 @@ public ParseReport(IWfiWordform wordform, ParseResult result)
NumUserNoOpinionAnalyses++;

}

// Count changed analyses.
var parserAgent = wordform.Cache.LanguageProject.DefaultParserAgent;
foreach (IWfiAnalysis wfAnalysis in wordform.AnalysesOC)
{
var opinion = wfAnalysis.GetAgentOpinion(parserAgent);
if (opinion == Opinions.approves)
{
var found = false;
foreach (ParseAnalysis pAnalysis in result.Analyses)
{
if (pAnalysis.MatchesIWfiAnalysis(wfAnalysis))
{
found = true;
break;
}
}
if (!found)
{
NumChangedAnalyses++;
}
}
}
foreach (ParseAnalysis pAnalysis in result.Analyses)
{
var found = false;
foreach (IWfiAnalysis wfAnalysis in wordform.AnalysesOC)
{
var opinion = wfAnalysis.GetAgentOpinion(parserAgent);
if (opinion == Opinions.approves && pAnalysis.MatchesIWfiAnalysis(wfAnalysis))
{
found = true;
break;
}
}
if (!found)
{
NumChangedAnalyses++;
}
}
}

/// <summary>
Expand All @@ -420,6 +480,7 @@ public ParseReport DiffParseReport(ParseReport oldReport)
ParseReport diffReport = new ParseReport
{
NumAnalyses = NumAnalyses - oldReport.NumAnalyses,
NumChangedAnalyses = NumChangedAnalyses - oldReport.NumChangedAnalyses,
NoParse = NoParse - oldReport.NoParse,
NumUserApprovedAnalysesMissing = NumUserApprovedAnalysesMissing - oldReport.NumUserApprovedAnalysesMissing,
NumUserDisapprovedAnalyses = NumUserDisapprovedAnalyses - oldReport.NumUserDisapprovedAnalyses,
Expand Down Expand Up @@ -452,6 +513,8 @@ public bool Equals(ParseReport other)

if (NumAnalyses != other.NumAnalyses) return false;

if (NumChangedAnalyses != other.NumChangedAnalyses) return false;

if (NumUserApprovedAnalysesMissing != other.NumUserApprovedAnalysesMissing) return false;

if (NumUserDisapprovedAnalyses != other.NumUserDisapprovedAnalyses) return false;
Expand Down
2 changes: 1 addition & 1 deletion Src/LexText/ParserUI/ParserListener.cs
Original file line number Diff line number Diff line change
Expand Up @@ -764,7 +764,7 @@ private bool ParserResultsHasUppercase(IWfiWordform wordform)
/// </summary>
ParserReport CreateParserReport()
{
var parserReport = new ParserReport(m_cache)
var parserReport = new ParserReport(m_cache, m_propertyTable)
{
SourceText = m_sourceText
};
Expand Down
11 changes: 11 additions & 0 deletions Src/LexText/ParserUI/ParserReportDialog.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,17 @@
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn x:Name="NumChangedAnalyses" Binding="{Binding NumChangedAnalyses}">
<DataGridTextColumn.Header>
<StackPanel>
<Label Content="{x:Static local:ParserUIStrings.ksNumChangedAnalyses}"
ToolTip="{x:Static local:ParserUIStrings.ksNumChangedAnalysesToolTip}"/>
<Separator/>
<TextBlock ToolTip ="{x:Static local:ParserUIStrings.ksTotalChangedAnalysesToolTip}"
Text="{Binding DataContext.ParserReport.TotalChangedAnalyses, RelativeSource={RelativeSource AncestorType=DataGrid}}"></TextBlock>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding ParseTime, Converter={StaticResource MillisecondsToTimeSpanConverter}, StringFormat=\{0:g\}}">
<DataGridTextColumn.Header>
<StackPanel>
Expand Down
5 changes: 5 additions & 0 deletions Src/LexText/ParserUI/ParserReportDialog.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ public ParserReportDialog()
public ParserReportDialog(ParserReportViewModel parserReport, ParserListener parserListener, Mediator mediator, LcmCache cache, PropertyTable propertyTable)
{
InitializeComponent();
if (!parserReport.ParserReport.ChangesRecorded)
{
// Showing NumChangedAnalyses would be misleading.
NumChangedAnalyses.Visibility = Visibility.Collapsed;
}
ParserListener = parserListener;
Mediator = mediator;
Cache = cache;
Expand Down
5 changes: 5 additions & 0 deletions Src/LexText/ParserUI/ParserReportsDialog.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@
<Label Content="{x:Static local:ParserUIStrings.ksTotalAnalyses}" ToolTip="{x:Static local:ParserUIStrings.ksTotalAnalysesToolTip}"/>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn x:Name="TotalChangedAnalyses" Binding="{Binding ParserReport.TotalChangedAnalyses}">
<DataGridTextColumn.Header>
<Label Content="{x:Static local:ParserUIStrings.ksTotalChangedAnalyses}" ToolTip="{x:Static local:ParserUIStrings.ksTotalChangedAnalysesToolTip}"/>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding ParserReport.TotalParseTime, Converter={StaticResource MillisecondsToTimeSpanConverter}, StringFormat=\{0:g\}}">
<DataGridTextColumn.Header>
<Label Content="{x:Static local:ParserUIStrings.ksTotalParseTime}" ToolTip="{x:Static local:ParserUIStrings.ksTotalParseTimeToolTip}"/>
Expand Down
2 changes: 1 addition & 1 deletion Src/LexText/ParserUI/ParserUI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="ParserUIStrings.resx">
<Generator>ResXFileCodeGenerator</Generator>
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>ParserUIStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
Expand Down
36 changes: 36 additions & 0 deletions Src/LexText/ParserUI/ParserUIStrings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions Src/LexText/ParserUI/ParserUIStrings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,12 @@
<data name="ksNumAnalysesToolTip" xml:space="preserve">
<value>The number of analyses produced by the parser</value>
</data>
<data name="ksNumChangedAnalyses" xml:space="preserve">
<value>Num Changed Analyses</value>
</data>
<data name="ksNumChangedAnalysesToolTip" xml:space="preserve">
<value>The number of analyses that have changed since the last parse</value>
</data>
<data name="ksNumDisapprovedAnalyses" xml:space="preserve">
<value>Disapproved Analyses</value>
</data>
Expand Down Expand Up @@ -286,6 +292,12 @@
<data name="ksTotalAnalysesToolTip" xml:space="preserve">
<value>The total number of analyses in the words parsed</value>
</data>
<data name="ksTotalChangedAnalyses" xml:space="preserve">
<value>Num Changed Analyses</value>
</data>
<data name="ksTotalChangedAnalysesToolTip" xml:space="preserve">
<value>The total number of analyses that have changed since the last parse</value>
</data>
<data name="ksTotalDisapprovedAnalyses" xml:space="preserve">
<value>Disapproved Analyses</value>
</data>
Expand Down
Loading