Commit MetaInfo
Log Message
CreateMWEAnnotationで、二重Segmentの事前チェック処理を追加.
Change Summary
Incremental Difference
| | @@ -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;
|
| | @@ -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;
|
Show on old repository browser
|