[0031] 所述的步骤3中在执行队列中找出与该操作具有并发关系的操作包括如下步骤:
[0032] 将站点历史记录划分成因操作序列,并发操作序列两部分;从左到右扫描历史记录H[k],k∈{0,1,.....L},L为H的长度,并且记录与操作o具有因果关系的操作的位置ha,ha初始为-1;如果操作o与H[k]是并发关系,则继续判断第k+1个操作;如果操作o与H[k]的操作是因果关系,则对第k到n+2的操作交换H[k]和H[k-1]的位置,然后将ha加1;
[0033] 3.1当k-ha<3时,记o1=H[k],o2=H[k-1];根据o1=H[k],o2=H[k-1]的操作类型,按照转换规则5-8,调用ET(o1,o2)的到o1’,然后根据o2.t和o1.t的操作类型,按照转换规则1-4,调用IT(o2,o1’)的到o2’;分别赋值H[k]=o2’,H[k-1]=o1’,实现了交换H[k],H[k-1],交换之后执行效果相同;
[0034] 3.2当k-ha≥3时,判断k-1到n+2的操作中是否存在{Ins(p,c),Del(p)}和{Del(p),Ins(p,c)的连续序列;
[0035] 如果不存在,则根据op1=H[k],op2=H[k-1]的操作类型,按照转换规则5-8,调用ET(op1,op2)的到op1’,然后根据op2.t和op1.t的操作类型,按照转换规则1-4,调用IT(op2,op1’)的到op2’;分别赋值H[k]=op2’,H[k-1]=op1’,实现交换H[k]和H[k-1]的执行顺序,交换之后执行的效果相同;将k减1,继续上面的判断;如果存在,则按照如下两种情况进行处理:
[0036] 存 在 {Ins(p,c),Del(p)}, 其 中 H[k] = o1,H[k-1] = Ins(p,c,dn,id) =o2,H[k-2]=Del(p)=o3;查询Dic的值得到p1’,o1.p=p’;按照规则1调用IT(o3,o1)得到o3’,IT(o2,o1)=o2’;将三个操作的位置互换得到,H[k]=o3,H[k-1]=o2,H[k]=o1;
[0037] 存 在 {Del(p),Ins(p,c)},其 中 H[k] = o1,H[k-1] = Ins(p,c,dn,id) =o2,H[k-2]=Del(p)=o3;如果o.p>o2.p,则o.dn加1;o.p≤o2.p,则o2.p加1,o1.p加1;将三个操作的位置互换得到,H[k]=o3,H[k-1]=o2,H[k]=o1。
[0038] 根据权利要求4所述的一种基于操作转换的文本编辑实时协同方法,其特征在于:所述的步骤5包括如下步骤:
[0039] 5.1当L-k≤2时,记op1=H[k],k∈{ha+1,....,L};根据op和op1的操作类型,按照转换规则1-4,调用IT(op,op1)得到op1’;将k加1,继续进行判断并调用IT进行转换;
[0040] 5.2当L-k>2时,判断ha+1到L的操作中是否存在{Ins(p,c),Del(p)}和{Del(p),Ins(p,c)的连续序列;
[0041] 存在{Ins(p,c),Del(p)},其中op1=H[k]=Ins(p,c,dn,id),op2=H[k+1]==Del(p);如果op.p>op1.p,则将op.dn加1,然后返回op’=op;如果op.p≤op1.p,则返回op’=op;
[0042] 存 在{Del(p),Ins(p,c)}, 其 中op1 =H[k] =Del(p),op2 =H[k+1] = =Ins(p,c,dn,id);如果op.t=Ins,则将op.p存入Dic,其中index1等于L,index2为k;然后根据转换规则2调用IT(op,op1)得到op’,然后根据转换规则1调用IT(op’,op)得到op”;op”为操作op在该站点的执行形式;如果op.t=Del,op.p=op1.p,则操作op在该站点的执行形式为空操作,op.p不等于op1.p,则操作op为该站点的执行形式。
[0043] 本发明的有益效果是:本发明应用到实时协同编辑中不需要全序控制;不仅能够做到结果一致,而且能够保证意图维护。
附图说明
[0045] 图2.1是本发明的合并包含转换示意图;
[0046] 图2.2是本发明的依次包含转换示意图;
[0047] 图3.1是本发明的合并后向转换示意图;
[0048] 图3.2是本发明的依次后向转换示意图。
具体实施方式
[0049] 对本发明的核心步骤作进一步详细的描述,但本发明的实施方式不限于此。
[0050] 首先,定义若干操作转换规则。其中包含转换用IT(Inclusive Transformation)表示,排斥转换用ET(Exclusive Transformation)表示。对于任何一个操作op,op.t表示操作的类型(插入记为Ins、删除记为Del),op.c表示操作的作用字符,op.p表示操作的位置,op.id表示产生该操作的站点标识,op.dn表示与之转换的删除操作位置小于op.p的数目。操作的包含转换或者排斥转换只会改变op.p的值,其他属性保持不变。每个站点维护一个字典Dic,便于查询op1在对op2进行包含转换IT(op1,op2)之前的位置,其中op1为插入操作,op2为删除操作,字典的关键字为的二元组,值为op1在对op2进行包含转换之前的p。index1为操作op1在执行队列中的位置,index2为操作op2在执行队列中的位置。
[0051] 1. 当 op1.t = Ins,op2.t = Ins;如 果 op1.pop2.p, 则 IT(op1,op2) =Ins(p1+1,c1,id1,dn1);如果op1.p=op2.p并且op1.dn>op2.dn,则IT(op1,op2)=Ins(p1+1,c1,id1,dn1);如果op1.p=op2.p并且op1.dn=op2.dn和op1.id>op2.id,则IT(op1,op2)=Ins(p1+1,c1,id1,dn1);
[0052] 2.当 op1.t= Ins,op2.t =Del;如 果 op1.p≤ op2.p,则 IT(op1,op2) =Ins(p1,c1,id1,dn1);如果op1.p>op2.p,则IT(op1,op2)=Ins(p1-1,c1,id1,dn1+1);Dic=op1.p;
[0053] 3.当op1.t=Del,op2.t=Ins;如果op1.p
[0054] 4.当op1.t=Del,op2.t=Del;如果op1.pop2.p,则IT(op1,op2)=Del(p1-1);如果op1.p=op2.p,则IT(op1,op2)=Nop;其中Nop表示空操作,不产生任何效果;
[0055] 5.当 op1.t= Ins,op2.t =Ins;如 果 op1.p≤ op2.p,则 ET(op1,op2) =Ins(p1,c1,id1,dn1);如果op1.p=op2.p,则ET(op1,op2)=Ins(p1-1,c1,id1,dn1);
[0056] 6. 当 op1.t = Ins,op2.t = Del;如 果 op1.pop2.p,则ET(op1,op2)=Ins(p1’,c1,id1,dn1-1),p1’=Dic,即p1’是 字 典 中 的 词;如 果 op1.p=op2.p,则 p1’=Dic;假如p1’>op2.p,则ET(op1,op2)=Ins(p1’,c1,id1,dn1-1);否则ET(op1,op2)=Ins(p1’,c1,id1,dn1);
[0057] 7.当op1.t=Del,op2.t=Ins;如果op1.p
[0058] 8.当op1.t=Del,op2.t=Del;如果op1.p
[0059] 1-8的转换规则都是按照操作类型自动选择的,其中1-4规则对应于IT,5-8规则对应于ET。比如op1.t=Ins,op2.t=Del,则自动按照规则2调用IT(op1,op2),按照规则5调用ET(op1,op2)。
[0060] 一种基于合并操作的操作转换系统
框架,包括下述步骤:
[0061] 步骤1:每个站点上都有3个队列:接收队列,等待队列,执行队列。每个站点产生的操作都会在该站点立即执行,并将该操作加入执行队列。每个站点需要状态向量SV(State Vector),向量的长度等于协同的站点数,SV的第i个分量等于第i个站点执行的操作数。
[0062] 接收队列用于保存从其他协同站点发送到该站点的操作;所述等待队列中操作的排列顺序基于接收到的操作的时间顺序;所述执行队列保存该站点执行过的操作,其中操作的排列顺序基于执行顺序。
[0063] 广播本地操作到其他协同站点。发送的操作包括如下信息:站点标识(id),操作的类型(Ins,Del),操作的位置(p),操作的目标(c),站点的状态向量SV。SV[i]代笔第i个站点执行的操作数目。假设当前站点为j,由于本地执行了一个操作则将SV[j]加1。
[0064] 步骤2:每个站点接收到的远程操作加入到接收队列,当该远程操作的所有因操作已经被加入到执行队列,进入步骤3,否则,将该操作加入到等待队列中.每当有远程操作被加入到执行队列,则立即检查等待队列是否有满足因果关系的操作,有则被后续步骤处理并且加入到执行队列,没有则转到接收队列进行判断。
[0065] 每个站点接收到的远程操作都加入到接收队列。按照因果顺序集成远程操作。只有当一个操作的所有因操作已经被加入到执行队列,该操作才能被后续步骤处理。假如接收到的操作来自站点j,接收到的SV为SVj,当前的站点为i;如果满足SVi[j]+1=SVj[j],该远程操作才会被后续步骤处理并加入到执行队列,同时将SVi[j]加1。否则,将该操作加入到等待队列中。
[0066] 步骤3:每个站点在执行队列中找出与该操作具有并发关系的操作。记被比较的两个操作状态向量分别为SV1、SV2,k∈{0,1,2,3.....n},其中n是站点的数量,遍历SV1和SV2。如果SV1[k]
[0067] 将站点历史记录划分成因操作序列,并发操作序列两部分,记录它们的分界位置为ha。从左到右扫描历史记录H[k],k∈{0,1,.....L},L为H的长度,ha初始为-1。如果操作op与H[k]是并发关系,则继续判断第k+1个操作;如果操作op与H[k]的操作是因果关系,则对第k到ha+2的操作交换H[k]和H[k-1]的位置,然后将ha加1。
[0068] ①当k-ha<3时,记op1=H[k],op2=H[k-1]。根据op1=H[k],op2=H[k-1]的操作类型,按照转换规则5-8,调用ET(op1,op2)的到op1’,然后根据op2.t和op1.t的操作类型,按照转换规则1-4,调用IT(op2,op1’)的到op2’。分别赋值H[k]=op2’,H[k-1]=op1’,实现了交换H[k],H[k-1]的目的,并且交换之后执行的效果一样。
[0069] ②当k-ha≥3时,判断k-1到记录与操作op具有因果关系的操作的位置ha+2的操作中是否存在{Ins(p,c),Del(p)}和{Del(p),Ins(p,c)的连续序列,即在同一个位置进行插入删除(或者删除插入)的连续操作。
[0070] ③如果不存在,则根据op1=H[k],op2=H[k-1]的操作类型,按照转换规则5-8,调用ET(op1,op2)得到op1’,然后根据op2.t和op1.t的操作类型,按照转换规则1-4,调用IT(op2,op1’)得到op2’。
[0071] 分别赋值H[k]=op2’,H[k-1]=op1’,实现了交换H[k],H[k-1]的目的,并且交换之后执行的效果一样。将k减1,继续利用上面的过程交换H[k]和H[k-1]位置的操作。如果存在,但是op1.t=Del,则同样按照上面的过程处理。
[0072] ④存在{Ins(p,c),Del(p)},其中H[k]=op1,H[k-1]= Ins(p,c,dn,id)=op2,H[k-2]=Del(p)=op3;查询Dic的值得到p1’,op1.p=p’;按照规则1调用IT(op3,op1)得到op3’,IT(op2,op1)=op2’;将三个操作的位置互换得到,H[k]=op3,H[k-1]=op2,H[k]=op1。
[0073] ⑤存在{Del(p),Ins(p,c)},其中H[k]=op1,H[k-1] =Ins(p,c,dn,id)=op2,H[k-2]=Del(p)=op3;如果op.p>op2.p,则op.dn加1;op.p≤op2.p,则op2.p加1,op1.p加1;将三个操作的位置互换得到,H[k]=op3,H[k-1]=op2,H[k]=op1。
[0074] 步骤4:将找出的并发操作进行转换得到该操作在该站点的执行形式。经过上一个步骤之后,可以得知H[1,...,ha]为因操作,H[ha+1,....,L]为并发操作。将操作op对并发操作进行包含转换得到op’,op’即为操作op在该站点的执行形式。
[0075] ①当L-ha≤2时,记op1=H[k],k∈{ha+1,....,L}。根据op和op1的操作类型,按照转换规则1-4,调用IT(op,op1)得到op’。将k加1,重复上述过程。
[0076] ②当L-ha>2时,判断ha+1到L的操作中是否存在{Ins(p,c),Del(p)}和{Del(p),Ins(p,c)的连续序列,即在同一个位置进行插入删除(或者删除插入)的连续操作。
[0077] ③存在{Ins(p,c),Del(p)},其中op1=H[k]=Ins(p,c,dn,id),op2=H[k+1]==Del(p);如果op.p>op1.p,则将op.dn加1,然后返回op’=op;如果op.p≤op1.p,则返回op’=op;
[0078] ④存在{Del(p),Ins(p,c)},其中op1=H[k]=Del(p),op2=H[k+1]==Ins(p,c,dn,id);如果op.t=Ins,则将op.p存入Dic,其中index1等于L,index2为k。然后根据转换规则2调用IT(op,op1)得到op’,然后根据转换规则1调用IT(op’,op)得到op”。op”即为操作op在该站点的执行形式。如果op.t=Del,op.p=op1.p,则操作op在该站点的执行形式为空操作,没有实际效果,也不会加入到执行队列。op.p不等于op1.p,则操作op就是在该站点的执行形式。
[0079] 步骤5:执行转换后的操作并将该操作加入到执行队列;
[0080] 步骤6:完成协同编辑。
[0081] 下面利用一个实例来对本发明作进一步说明:
[0082] 如表1所示,4个站点的协同文本编辑系统,初始化文档状态为”abCd”,每个站点的本地操作如表1所示,站点操作的编号从0开始。在图2中描述站点2执行本地操作以及接收远程操作的顺序。表2给出了每个站点接收到的远程操作的顺序,可以看出每个站点接收的操作顺序不一样。从表3可以看出,采用上面提出的OT算法来支持这种协同,尽管执行的操作顺序不同,但是最终每个站点都得到了一致的结果并且实现了实时协同文本编辑。因为在定义包含转换的时候,规定了如果在同一个位置插入字符,那么站点小的插入的位置在后面;所以,字符u、v的位置会在字符l、m之前,其他同理。显然,最终的结果符合用户操作的实时协同。
[0083] 综上所述,一种基于操作转换的文本编辑实时协同方法,能够实现多个站点协同的结果一致性与意图维护。
[0084] 表1站点的本地操作
[0085]
[0086] 表2各站点接收远程操作顺序
[0087]Site1 Site2 Site3 Site4
Site3-op0 Site1-op0 Site1-op0 Site1-op0
Site3-op1 Site1-op1 Site2-op0 Site2-op0
Site2-op0 Site1-op2 Site1-op1 Site1-op1
Site2-op1 Site3-op0 Site2-op1 Site2-op1
Site2-op2 Site3-op1 Site2-op2 Site2-op2
Site4-op0 Site4-op0 Site4-op0 Site1-op2
Site3-op2 Site3-op2 Site1-op2 Site3-op0
Site4-op1 Site4-op1 Site4-op1 Site3-op1
Site4-op2 Site4-op2 Site4-op2 Site3-op2
[0088] 表3每个站点执行的操作以及最终文档状态
[0089]