25.02.2010, 12:39 | #6 |
Участник
|
Цитата:
А, да, то есть АПИ таки есть. Капец - да просто туча кода и фиг поймешь че делает. нечитаемо. один из методов: X++: /// <summary> /// Fits records in the <c>ref</c> table so lines are only claimed one time. /// </summary> /// <remarks> /// After this operation, lines may be claimed by several records if the lines appear in several /// locations. In that case, one of the start positions and the length will be identical. /// </remarks> protected void fitRefs() { //Fit all the shorter ones //and the ones overlapping with same length TmpCompareText ref2; ; // // Example: // // #1 1 - 5 ; 2 - 6 -> This is longer than #2 and is kept // #2 3 - 4 ; 10 - 11 -> This is shadowed by #1 and is deleted // #3 7 - 7 ; 14 - 14 -> #3 and #4 are identical, and decision is deferred to refCleanup() // #4 7 - 7 ; 20 - 20 -> #3 and #4 are identical, and decision is deferred to refCleanup() // #5 10 - 15 ; 25 - 30 -> This is longer than #6 and is kept // #6 17 - 20 ; 29 - 32 -> This is partly shadowed by #2, and is trimmed to: 19 - 20 ; 31 - 32 // ref2.setTmpData(ref); while select ref order by Length desc, Text1Start { while select forupdate ref2 where ref2.Length <= ref.Length && ref2.RecId != ref.RecId && ((ref2.Text1Start >= ref.Text1Start && ref2.Text1Start <= ref.Text1End) || (ref2.Text1End >= ref.Text1Start && ref2.Text1End <= ref.Text1End) || (ref2.Text2Start >= ref.Text2Start && ref2.Text2Start <= ref.Text2End) || (ref2.Text2End >= ref.Text2Start && ref2.Text2End <= ref.Text2End)) { if ( ref2.Length < ref.Length || (ref2.Text1Start != ref.Text1Start && ref2.Text2Start != ref.Text2Start )) { if (ref2.Text1Start >= ref.Text1Start && ref2.Text1Start <= ref.Text1End) //Cut start of text1 in ref2 { ref2.Length = ref2.Length - (ref.Text1End + 1 - ref2.Text1Start); ref2.Text2Start = ref2.Text2Start + (ref.Text1End + 1 - ref2.Text1Start); ref2.Text1Start = ref.Text1End + 1; ref2.Text1End = ref2.Text1Start + ref2.Length - 1; ref2.Text2End = ref2.Text2Start + ref2.Length - 1; } if (ref2.Text1End >= ref.Text1Start && ref2.Text1End <= ref.Text1End) //Cut end of text1 in ref2 { ref2.Length = ref2.Length - (ref2.Text1End - (ref.Text1Start - 1)); ref2.Text2End = ref2.Text2End - (ref2.Text1End - (ref.Text1Start - 1)); ref2.Text1End = ref.Text1Start - 1; ref2.Text2Start = ref2.Text2End - (ref2.Length - 1); ref2.Text1Start = ref2.Text1End - (ref2.Length - 1); } if (ref2.Text2Start >= ref.Text2Start && ref2.Text2Start <= ref.Text2End) //Cut start of text2 in ref2 { ref2.Length = ref2.Length - (ref.Text2End + 1 - ref2.Text2Start); ref2.Text1Start = ref2.Text1Start + (ref.Text2End + 1 - ref2.Text2Start); ref2.Text2Start = ref.Text2End + 1; ref2.Text2End = ref2.Text2Start + ref2.Length - 1; ref2.Text1End = ref2.Text1Start + ref2.Length - 1; } if (ref2.Text2End >= ref.Text2Start && ref2.Text2End <= ref.Text2End) //Cut end of text2 in ref2 { ref2.Length = ref2.Length - (ref2.Text2End - (ref.Text2Start - 1)); ref2.Text1End = ref2.Text1End - (ref2.Text2End - (ref.Text2Start - 1)); ref2.Text2End = ref.Text2Start - 1; ref2.Text1Start = ref2.Text1End - (ref2.Length - 1); ref2.Text2Start = ref2.Text2End - (ref2.Length - 1); } if (ref2.Length <= 0) ref2.delete(); else ref2.update(); } } } } |
|