CreateMWEAnnotationで、二重Segmentの事前チェック処理を追加.
@@ -2715,7 +2715,6 @@ | ||
2715 | 2715 | try |
2716 | 2716 | { |
2717 | 2717 | m_MweOps.Clear(); |
2718 | - | |
2719 | 2718 | var words = this.Model.GetWords(this.TargetProjectId); |
2720 | 2719 | m_MWEDownloadSelector.Words = words; |
2721 | 2720 | m_MWEDownloadSelector.OnApplyMweMatches += OnApplyMWEMatches; |
@@ -2743,11 +2742,13 @@ | ||
2743 | 2742 | } |
2744 | 2743 | |
2745 | 2744 | // MWEアノテーションを一旦元に戻し、onされたMWEを順に生成しなおす. |
2746 | - private void OnApplyMWEMatches(MatchingResult[] matches, bool[] onoffs) | |
2745 | + // 処理結果に一致したcheck状態を返す. | |
2746 | + private bool[] OnApplyMWEMatches(MatchingResult[] matches, bool[] onoffs) | |
2747 | 2747 | { |
2748 | 2748 | var words = m_MWEDownloadSelector.Words; |
2749 | 2749 | var oldCur = Cursor.Current; |
2750 | 2750 | Cursor.Current = Cursors.WaitCursor; |
2751 | + var checkStates = new bool[matches.Length]; // すべてデフォルトではunchecked状態 | |
2751 | 2752 | try |
2752 | 2753 | { |
2753 | 2754 | // チェックが変更されるたびにRollbackする |
@@ -2762,7 +2763,15 @@ | ||
2762 | 2763 | // Word番号リストから文字位置範囲リストへ変換 |
2763 | 2764 | match.CalcCharRangeList(words, this.Model.StartChar); |
2764 | 2765 | var op = m_Service.CreateMWEAnnotation(match, false); |
2765 | - m_MweOps.Add(op); | |
2766 | + if (op != null) | |
2767 | + { | |
2768 | + m_MweOps.Add(op); | |
2769 | + checkStates[i] = true; // Executeが成功したので、Check状態とする. | |
2770 | + } | |
2771 | + else | |
2772 | + { | |
2773 | + MessageBox.Show("Duplicate segment is prohibited!"); | |
2774 | + } | |
2766 | 2775 | } |
2767 | 2776 | } |
2768 | 2777 | } |
@@ -2785,6 +2794,7 @@ | ||
2785 | 2794 | } |
2786 | 2795 | Cursor.Current = oldCur; |
2787 | 2796 | } |
2797 | + return checkStates; | |
2788 | 2798 | } |
2789 | 2799 | |
2790 | 2800 | public event EventHandler CreateLinkModeChanged; |
@@ -30,7 +30,7 @@ | ||
30 | 30 | public DataTable Table { get; set; } |
31 | 31 | public List<Tuple<MWE, MatchingResult>> Results { get; set; } |
32 | 32 | |
33 | - public event Action<MatchingResult[], bool[]> OnApplyMweMatches; | |
33 | + public event Func<MatchingResult[], bool[], bool[]> OnApplyMweMatches; | |
34 | 34 | |
35 | 35 | public MWEDownloadGrid(Corpus cps, ILexiconService lexsvc, IDepEditService depsvc) |
36 | 36 | { |
@@ -74,7 +74,11 @@ | ||
74 | 74 | // checkedリストを生成 |
75 | 75 | var checks = from r in this.Table.Rows.Cast<DataRow>() select (bool)r[0]; |
76 | 76 | |
77 | - this.OnApplyMweMatches(mwes.ToArray(), checks.ToArray()); | |
77 | + var checks_update = this.OnApplyMweMatches(mwes.ToArray(), checks.ToArray()); | |
78 | + for (var i = 0; i < checks_update.Length; i++) | |
79 | + { | |
80 | + this.Table.Rows[i][0] = checks_update[i]; | |
81 | + } | |
78 | 82 | } |
79 | 83 | } |
80 | 84 |
@@ -632,7 +632,15 @@ | ||
632 | 632 | public IOperation CreateMWEAnnotation(MatchingResult match, bool recordHistory = true) |
633 | 633 | { |
634 | 634 | var op = new OperationCreateMWEAnnotation(match); |
635 | - op.Execute(m_Context); | |
635 | + try | |
636 | + { | |
637 | + op.Execute(m_Context); | |
638 | + } | |
639 | + catch (DuplicatedAnnotationException) | |
640 | + { | |
641 | + // 同じMWE Segmentを付けようとしたときはDBを変更せずnullを返す. | |
642 | + return null; | |
643 | + } | |
636 | 644 | if (recordHistory) |
637 | 645 | { |
638 | 646 | m_History.Record(op); |
@@ -34,6 +34,20 @@ | ||
34 | 34 | { |
35 | 35 | throw new Exception($"#Ranges={n} != #MWEItems={m_Match.MWE.Items.Count}"); |
36 | 36 | } |
37 | + //重複MWE Segmentのチェック | |
38 | + for (var i = 0; i < m_Match.CharRangeList.Count; i++) | |
39 | + { | |
40 | + var range = m_Match.CharRangeList[i]; | |
41 | + var docid = ctx.Sen.ParentDoc.ID; | |
42 | + var start = range.Start.Value + ctx.Sen.StartChar; | |
43 | + var end = range.End.Value + ctx.Sen.StartChar; | |
44 | + // 既にMWE Segmentが同じ個所にないかをチェック | |
45 | + if (FindSegmentBetween(ctx, docid, start, end, MWETag) != null) | |
46 | + { | |
47 | + throw new DuplicatedAnnotationException(); | |
48 | + } | |
49 | + } | |
50 | + | |
37 | 51 | // m_CharRangeにそれぞれMWE Segmnetを作成し、全体をGroupとする |
38 | 52 | var bunsetsulist = new List<Segment>(); |
39 | 53 | var stag = ctx.Proj.FindTag(Tag.SEGMENT, MWETag); |
@@ -77,6 +91,7 @@ | ||
77 | 91 | var docid = ctx.Sen.ParentDoc.ID; |
78 | 92 | var start = range.Start.Value + ctx.Sen.StartChar; |
79 | 93 | var end = range.End.Value + ctx.Sen.StartChar; |
94 | + | |
80 | 95 | var seg = new Segment(); |
81 | 96 | seg.Sentence = ctx.Sen; |
82 | 97 | seg.Tag = stag; |