diff --git a/Src/LexText/ParserCore/ParserCoreTests/ParserReportTests.cs b/Src/LexText/ParserCore/ParserCoreTests/ParserReportTests.cs index 5489a0e92e..c0ef735aa1 100644 --- a/Src/LexText/ParserCore/ParserCoreTests/ParserReportTests.cs +++ b/Src/LexText/ParserCore/ParserCoreTests/ParserReportTests.cs @@ -52,10 +52,11 @@ private IWfiAnalysis CreateIWfiAnalysis(IWfiWordform wordform, List 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)); @@ -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)); @@ -164,6 +166,7 @@ public void TestAddParseResult() }); var analysis = CreateIWfiAnalysis(catWordform, new List {parseMorph}); analysis.SetAgentOpinion(Cache.LanguageProject.DefaultUserAgent, Opinions.approves); + analysis.SetAgentOpinion(Cache.LanguageProject.DefaultParserAgent, Opinions.approves); var analysisX = CreateIWfiAnalysis(catWordform, new List { parseMorph3 }); analysisX.SetAgentOpinion(Cache.LanguageProject.DefaultUserAgent, Opinions.disapproves); // Missing approved analyses. @@ -177,28 +180,28 @@ 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()){ 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. @@ -206,28 +209,28 @@ public void TestAddParseResult() 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); diff --git a/Src/LexText/ParserCore/ParserReport.cs b/Src/LexText/ParserCore/ParserReport.cs index a933a39e97..cb5bf9310d 100644 --- a/Src/LexText/ParserCore/ParserReport.cs +++ b/Src/LexText/ParserCore/ParserReport.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Security.Policy; +using XCore; namespace SIL.FieldWorks.WordWorks.Parser { @@ -85,6 +86,16 @@ public class ParserReport: IEquatable /// public int TotalUserNoOpinionAnalyses { get; set; } + /// + /// Total number of parse analyses that changed since the last parse + /// + public int TotalChangedAnalyses { get; set; } + + /// + /// Whether changes were recorded in ChangedAnalyses. + /// + public bool ChangesRecorded { get; set; } + /// /// Parse reports for each word /// @@ -113,12 +124,14 @@ public ParserReport() ParseReports = new Dictionary(); } - public ParserReport(LcmCache cache) + public ParserReport(LcmCache cache, PropertyTable propertyTable) { ProjectName = cache.LanguageProject.ShortName; MachineName = Environment.MachineName; Timestamp = DateTime.UtcNow.ToFileTime(); ParseReports = new Dictionary(); + bool updatesAnalyses = propertyTable == null ? true : propertyTable.GetBoolProperty("CheckParserUpdatesAnalyses", true); + ChangesRecorded = !updatesAnalyses; } /// @@ -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; @@ -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; @@ -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; @@ -358,6 +375,11 @@ public class ParseReport : IEquatable /// public int NumUserNoOpinionAnalyses { get; set; } + /// + /// Number of analyses that changed since the last parse + /// + public int NumChangedAnalyses { get; set; } + public ParseReport() { } /// @@ -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++; + } + } } /// @@ -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, @@ -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; diff --git a/Src/LexText/ParserUI/ParserListener.cs b/Src/LexText/ParserUI/ParserListener.cs index 7658879ab0..fd1036d718 100644 --- a/Src/LexText/ParserUI/ParserListener.cs +++ b/Src/LexText/ParserUI/ParserListener.cs @@ -764,7 +764,7 @@ private bool ParserResultsHasUppercase(IWfiWordform wordform) /// ParserReport CreateParserReport() { - var parserReport = new ParserReport(m_cache) + var parserReport = new ParserReport(m_cache, m_propertyTable) { SourceText = m_sourceText }; diff --git a/Src/LexText/ParserUI/ParserReportDialog.xaml b/Src/LexText/ParserUI/ParserReportDialog.xaml index 2407087c09..84b2f4d053 100644 --- a/Src/LexText/ParserUI/ParserReportDialog.xaml +++ b/Src/LexText/ParserUI/ParserReportDialog.xaml @@ -169,6 +169,17 @@ + + + + + + diff --git a/Src/LexText/ParserUI/ParserReportDialog.xaml.cs b/Src/LexText/ParserUI/ParserReportDialog.xaml.cs index af96bdb4e6..c0ffb33026 100644 --- a/Src/LexText/ParserUI/ParserReportDialog.xaml.cs +++ b/Src/LexText/ParserUI/ParserReportDialog.xaml.cs @@ -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; diff --git a/Src/LexText/ParserUI/ParserReportsDialog.xaml b/Src/LexText/ParserUI/ParserReportsDialog.xaml index 304a899ae1..2b7e94a1fa 100644 --- a/Src/LexText/ParserUI/ParserReportsDialog.xaml +++ b/Src/LexText/ParserUI/ParserReportsDialog.xaml @@ -95,6 +95,11 @@ + + + +