基于modoc数据结构来实现文档中数据的实时协作处理方法
技术领域
本发明涉及文档处理领域,更具体地说,涉及一种使用modoc数据结构在多用户处理同一个文档时,支持二维结构数据,比如表格的实时协作,避免所产生的冲突。
背景技术
目前市面上最主流的适用Operational Transformation的数据结构是etherpad和quill-delta。其中,etherpad数据结构是谷歌使用的方案,quill-delta数据结构是微软、领英、Salesforce和Slack使用的方案。
然而,一方面使用Etherpad数据结构处理文本时,存在的问题是不支持非文本的数据格式。如Z:5g>1|5=2p=v*4*5+1$x这个是Etherpad的数据结构,表示的是在文档中间插入一个加粗的「x」。其中的「*5」即表示加粗。但是如果想表示插入一张图片,则没有办法表示出来。
然而,另一方面使用quill-delta数据结构处理文本数据时,其在基于JSON格式的基础上,支持存储任何类型的数据。如插入一张图片为[{action:“insert”,data:{image:“https://example.com/image.png”}}]表示在文档开头插入一个网址为「https://example.com/image.png」的图片。但是quill-delta的问题在于非文本的格式数据是无法实现协作,只能在原有的基础上进行覆盖。这意味着如果使用quill-delta数据结构来实现在文档内插入一个表格时,是不支持实现多人同时编写表格的。同时因为quill-delta基于JSON实现,所以使用前需要先将整个JSON进行解析。因为在实时协作的场景中,经常会遇到只需要修改文档的某几个字节的情况,这样如果文档很大,效率就会很低。
为了实现适用于表格、幻灯片和思维导图的Operational Transformation数据结构,本发明提出了一个新型数据结构modoc。该modoc数据结构抛弃了基于JSON、Messpack、BSON等现有的需要预先解析才能使用的方案,而完全自主实现了一套支持原地读取的数据方案。同时提供了对任意数据类型(如表格和幻灯片)的表达能力。
发明内容
本发明要解决的技术问题在于,针对上述缺陷,提供一种使用modoc数据结构实现二维结构数据的实时协作处理方法。
本发明解决其技术问题所采用的技术方案是:构造一种基于modoc数据结构来实现文档中数据的实时协作处理方法,包括以下步骤:
S1、多个用户同时对一篇文档的内容进行修改;其中,每个文档对应与一个独立的modoc数据结构;
S2、在modoc数据结构基于索引变换的原理,实现多个用户之间的实时协作处理;其中:
modoc数据结构内维护的文档内容由集合Delta表示,而集合Delta包括多个有序组成的Operator操作命令;其中:
modoc数据结构内集合Delta的结构为:XN*LD;
其中,“X”表示Operator操作命令的总数;“N”表示Operator操作命令的长度;“*”表示是用户对文档的操作处理,“L”表示Operator操作命令中包括的数据内容的长度,“D”表示Operator操作命令中包括的数据内容;
当多个用户对一个文档的内容进行修改时,在modoc数据结构内基于Delta集合中所有的Operator操作命令之间的相互索引关系进行协作处理。
进一步的,所述modoc数据结构内部维护了一个数据表;所述数据表记录的是文档的内容。
进一步的,所述Operator操作命令为用户对文档修改的实际操作命令;所述用户对文档的操作处理包括插入-insert、删除-remove和保留-retain;所述Operator操作命令中包括的数据内容为用户在操作处理情况下,在文档中修改的内容。
进一步的,每个Operator操作命令由三个部分组成,分别为动作、数据和属性;其中,动作包含插入-insert、删除-remove和修改-remain,所述动作对应于用户对文档的操作处理;数据是用户在操作处理情况下,在文档中修改的相应内容;属性由两个元素组成,分别是数据类型和数据值。
进一步的,每个Operator操作命令中,其属性所支持的数据值类型为文本、数字、对象和集合Delta;当用户在文档中插入一个表格时,通过集合Delta来表示一系列的单元格,而当用户在每个单元格中基于Operator操作命令执行相应的操作处理时,由于每个Operator操作命令的数据值包括了集合Delta,则当前每个单元格均可分别作为一个独立的文档,实现了在文档中嵌套表格的操作。
进一步的,modoc数据结构内包括若干个集合Delta,当需要读取第M个Operator操作命令时,优先选择读取前M-1个Operator操作命令的数据长度N,因此避免了在使用前将每个Operator操作命令中包括的数据内容依次读取到内存中进行解析的弊端。
进一步的,在多个用户对一个文档的内容进行修改时,通过下述算法对用户的操作进行协作处理:
当用户A需要往文档的第n行插入内容,而用户B需要往文档的第n行插入、保留或移除内容时,保留文档第n行的内容;
当用户A需要保留或删除文档的第n行内容,而用户B需要在文档的第n行插入内容时,往文档的第n行插入内容;
当用户A需要删除文档的第n行内容,而用户B需要往文档的第n行插入或删除内容时,忽略用户B的操作;
当用户A需要保留文档第n行的内容,而用户B也需要保留文档第n行的内容时,保留文档第n行的内容;
当用户A需要保留文档第n行的内容,而用户B需要删除文档第n行的内容时,删除文档第n行的内容;
实施本发明的提供一种基于modoc数据结构来实现文档中数据的实时协作处理方法,具有以下有益效果:
1、可原地读取,性能优秀。支持大文件的数据实时计算;
2、表达能力强,可以表达二维表格数据。
附图说明
下面将结合附图及实施例对本发明作进一步说明,附图中:
图1是本发明提供的在文档中实现数据的实时协作处理方法流程图。
具体实施方式
为了对本发明的技术特征、目的和效果有更加清楚的理解,现对照附图详细说明本发明的具体实施方式。
请参考图1,其为本发明提供的在文档中实现数据的实时协作处理方法流程图,本发明提供的一种实时协作处理方法,包括以下步骤:
S1、多个用户同时对一篇文档的内容进行修改;其中,每个文档对应与一个独立的modoc数据结构;所述modoc数据结构内部维护了一个数据表,所述数据表记录的是文档的内容。
S2、在modoc数据结构基于索引变换的原理,实现多个用户之间的实时协作处理。
其中,modoc数据结构内维护的数据表由集合Delta表示;其中,集合Delta包括多个有序组成的Operator操作命令,Operator操作命令为用户对文档修改的实际操作命令。
当多个用户对一个文档的内容进行修改时,在modoc数据结构内是基于不同Delta集合中的所有的Operator操作命令之间的相互索引关系进行协作处理。其中每个Operator操作命令由动作、数据和属性这三个部分组成;其中,动作包含插入-insert、删除-remove和修改-remain,所述动作对应于用户对文档的操作处理;数据是用户在操作处理情况下,在文档中修改的相应内容;属性由两个元素组成,分别是数据类型和数据值。
在本实施例中,针对用户A和用户B在实际处理同一篇文档的过程中,分别总结作了以下情况,以及每种情况对应的协作结果:
1、当用户A需要往文档的第n行插入内容,而用户B需要往文档的第n行插入、保留或移除内容时,modoc数据结构内的协作结果为保留文档第n行的内容;具体的体现形式为:insert(n)+insert(n)/retain(n)/remove(n):retain(n);
2、当用户A需要保留或删除文档的第n行内容,而用户B需要在文档的第n行插入内容时,modoc数据结构内的协作结果为往文档的第n行插入内容;具体的体现形式为:retain(n)/remove(n)+insert(n):insert(n);
3、当用户A需要删除文档的第n行内容,而用户B需要往文档的第n行插入或删除内容时,modoc数据结构内的协作结果为忽略用户B的操作;具体的体现形式为:remove(n)+remove(n)/retain(n):noop;
4、当用户A需要保留文档第n行的内容,而用户B也需要保留文档第n行的内容时,此时modoc数据结构内的协作结果为保留文档第n行的内容;具体的体现形式为:retain(n)+retain(n):retain(n);
5、当用户A需要保留文档第n行的内容,而用户B需要删除文档第n行的内容时,此时的协作结果为删除文档第n行的内容;具体的体现形式为retain(n)+remove(n):remove(n);
由于每个Operator操作命令中,其属性所支持的数据值类型为文本、数字、对象和集合Delta;当用户在文档中插入一个表格时,通过集合Delta来表示一系列的单元格,而当用户在每个单元格中基于Operator操作命令执行相应的操作处理时,由于每个Operator操作命令的数据值包括了集合Delta,则当前每个单元格均可分别作为一个独立的文档,实现了在文档中嵌套表格的操作。
本实施例在序列化时,每个Operator操作命令的表示形式为:
Operator长度 |
Operator类型 |
Operator数据长度 |
Operator数据类型 |
Operator数据 |
表一
而Delta则由若干个Operator操作命令直接拼接起来的。modoc数据结构内集合Delta的结构为:XN*LD;
其中,“X”表示Operator操作命令的总数;“N”表示Operator操作命令的长度;“*”表示是用户对文档的操作处理,所述操作处理包括插入-insert、删除-remove和保留-retain;“L”表示Operator操作命令中包括的数据内容的长度,“D”表示Operator操作命令中包括的数据内容;所述数据内容包括用户在操作处理情况下,在文档中修改的内容。
由于modoc数据结构内包括若干个集合Delta,当需要读取第5个Operator操作命令时,优先选择读取前4个Operator操作命令的数据长度,因此避免了在使用前将每个Operator操作命令中包括的数据内容依次读取到内存中进行解析的弊端。因为不需要预先解析,所以当修改其中一个Operator时,可以直接跳过前面的内容直接原地编辑。
上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,这些均属于本发明的保护之内。