CN110678856B - 调解树结构数据的副本之间的冲突 - Google Patents
调解树结构数据的副本之间的冲突 Download PDFInfo
- Publication number
- CN110678856B CN110678856B CN201780091398.6A CN201780091398A CN110678856B CN 110678856 B CN110678856 B CN 110678856B CN 201780091398 A CN201780091398 A CN 201780091398A CN 110678856 B CN110678856 B CN 110678856B
- Authority
- CN
- China
- Prior art keywords
- key
- value
- document
- timestamp
- modified
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
- G06F16/273—Asynchronous replication or reconciliation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2365—Ensuring data consistency and integrity
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Computer Security & Cryptography (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本说明书的主题通常涉及调解数据的副本之间的冲突。在一个方面,***获得第一文档,其包括在第一设备由应用使用的对象的第一副本;以及第二文档,其包括由该应用在第二设备使用的对象的第二副本。该***从第一文档和第二文档生成合并的文档。该***确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改。作为响应,该***在合并的文档中包括第一文档中第一键的第一值、以及对于第一元素的每个后代元素的在第一文档中后代元素的键的值。
Description
背景技术
本说明书描述了用于调解(reconcile)诸如树结构的数据项的数据项的不一致副本的技术。这些技术通常涉及生成合并的副本,该副本可预测地解决副本之间的不一致。
例如,可以在不同的计算设备上修改同一数据的多个副本,从而导致多个设备之间的数据不一致。可以将多个副本合并以创建一致的数据集。但是,可能存在需要在合并过程期间需要解决的多个副本之间的冲突。例如,同一元素可能已在不同的计算设备上改变为多个不同的值,并且/或者一个元素可能已添加到设备之一的副本处或从其移除。为了在所有设备生成一致的数据集,必须确定合并的数据集中包括多个不同值中的哪个值,和/或在设备之一处是否添加或移除已添加或移除的元素。
发明内容
该说明书描述了用于调解数据的副本之间的冲突的***、方法、设备和技术。当两个数据元素对于相同键具有不同的值时,数据的副本之间的冲突发生。对象可以包括多个数据元素,其中每个数据元素具有各自的键值对。当同步时,每个副本对于相同的键和相同的键集具有相同的值。例如,副本A和副本B可以包括使用键J的键值对。当同步时,副本A和副本B两者对于键J将具有相同的值。如果副本A中的键J的值与副本B中的键J的值不同或从副本A中丢失,则副本A和副本B之间存在冲突。
通常,可以在一种***中实现本说明书中描述的主题的一个创新方面,该***包括:数据处理装置;以及存储装置,其与该数据处理装置进行数据通信。存储装置存储该数据处理装置可执行的指令,并且所述指令在被执行时,使得数据处理装置将执行操作,所述操作包括:获得第一文档,其包括在第一设备由应用使用的对象的第一层次表示的第一副本。该对象的第一层次表示可以包括多个元素。每个元素可以包括键值对。对象的第一层次表示可以包括第一元素的第一键的第一时间戳,该第一时间戳指示在第一设备修改第一键的第一值的时间。该第一元素在第一层次表示中可以包括一个或多个后代元素。数据处理装置获得第二文档,其包括在不同于第一设备的第二设备由应用使用的对象的第二层次表示的第二副本。数据处理装置从第一文档和第二文档生成合并的文档。该合并的文档可以包括对象中每个键值对的当前值。生成合并的文档可以包括:至少基于第一键的第一时间戳,确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改。响应于确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改,数据处理装置可以对于第一键包括第一文档中第一键的第一值而不是第二文档中第一键的第一值;以及对于第一元素的每个后代元素,在第一文档中后代元素的键的值,而不是在第二文档中后代元素的键的值。该方面的其他实施方式包括对应装置、方法和计算机程序,其在计算机存储设备上编码、被配置为执行方法的动作。
这些和其他实施方式可以可选地包括以下特征中的一个或多个。在一些方面中,第二层次表示包括第二时间戳,该第二时间戳指示在第二设备处修改第一键的第一值的时间。至少基于第一时间戳确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改可以包括:确定由第一时间戳指示的时间晚于由第二时间戳指示的时间。
在一些方面中,第二层次表示不包括第一对象的第二时间戳。至少基于第一时间戳确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改可以包括:确定自第一文档与第二文档的最后合并以来,在第二设备处尚未修改第一键的第一值。
在一些方面中,第一层次表示包括:第二时间戳,其指示在第一设备处修改所述多个元素中的第二元素的第二键的第二值的时间。所述第二元素可以包括第二后代元素。所述第一层次表示还可以包括:第三时间戳,其指示在第一设备处修改第二后代元素的第三键的第三值的时间。第二层次表示可以包括:第四时间戳,其指示在第二设备处修改第二键的第二值的时间;以及第五时间戳,其指示在第二设备处修改第三键的第三值的时间。该操作可以包括:确定由第二时间戳指示的时间与由第四时间戳指示的时间匹配,并且作为响应:比较第三时间戳和第五时间戳;以及基于比较,确定与第三键的第三值在第一设备处被修改的时间相比、第三键的第三值在更晚的时间在第二设备处被修改。响应于确定与第三键的第三值在第一设备处被修改的时间相比、第三键的第三值在更晚的时间在第二设备处被修改,数据处理装置可以在合并的文档中包括:在第二文档中的第三键的第三值,而不是在第一文档中的第三键的第三值。
在一些方面中,第一层次表示是基于文本的表示。所述基于文本的表示可以是JavaScript对象表示法(JSON)。所述第一层次表示可以包括用于所述第一键的第一同级键,其中,用于所述第一键的时间戳是用于所述第一同级键的值。所述操作可以包括:由第一设备确定在第一设备处第一后代元素的键的值已经改变;以及响应于确定在第一设备处第一后代元素的键的值已经改变,在第一文档中为第一后代元素的键创建第二同级键,该第二同级键包括基于指示第一后代元素的键的值改变的时间的时间戳的值、并且在第一文档中位于第一后代元素的键的正下方。
在一些方面中,无论与后代元素在第一设备处被修改的时间相比、该后代元素是否在第二设备处在更晚的时间被修改,所述第一文档中的所述后代元素的值、而不是所述第二文档中的所述后代元素的值被包括在合并的文档中。
可以实施本说明书中描述的主题的特定实施例,以实现以下优点中的一个或多个。可以合并对象的副本,使得对对象的每个元素的改变是可交换的,并且保证收敛。例如,通过在改变的根部(例如,对于其值已更改的实际键)维持时间戳,而不是在树或子树的最高级别或树或子树中的每个键处维持时间戳,改变的意图是明确的,并且改变变为可交换的。如本文所述的合并副本也是等幂的,这意味着两个副本可以被多次合并而不改变结果。
通过将时间戳存储为修改的键的标记数据,树的形状可以保持相同,从而允许将本文所述的合并技术改进(retrofit)为现有的实现方式。包括时间戳的标记数据可以包括同级键(例如,如下所述使用波浪号)。时间戳也可以存储为单独的元数据,诸如指向时间戳的JSON指针的映射。
当与具有后代元素的较高级别元素在一副本中与该较高级别元素在不同副本中被改变的时间相比在更晚的时间被改变时,可以将该一个副本中的后代元素的值包括在合并的文档中,而不管两个副本中后代元素被改变的时间。这样,可能根本不评估后代元素的时间戳,从而导致计算设备可以合并副本的速度提高,合并副本所需的计算资源更少和/或由计算设备在给定的时间段内合并的副本的数量增加。
下面参考附图描述前述主题的各种特征和优点。根据本文描述的主题和权利要求,额外特征和优点是显而易见的。
附图说明
图1是计算设备合并对象的副本的示例环境。
图2描绘了包括对象的副本的示例文档被合并为合并的文档。
图3描绘了包括对象的副本的示例文档被合并为合并的文档。
图4描绘了包括对象的副本的示例文档被合并为合并的文档。
图5是用于合并对象的副本的示例处理的流程图。
图6是用于合并对象的副本的另一示例处理的流程图。
在各个附图中,相同的附图数字和标记指示相同的元件。
具体实施方式
通常,本文描述的***和技术合并数据的副本,使得副本之间的冲突得以调解。合并两个副本的动作导致确定性地调解副本之间的冲突的合并的副本。
副本是具有一个或多个数据元素的对象的副本。相同数据的副本可以在多个不同的计算设备并发修改。例如,用户可以使用多个不同的设备来更新日历应用。为了维持一致的数据,可以将在一个计算设备的更新与在每个其他计算设备的数据合并。以这种方式,每个计算设备具有用于应用的相同数据。
数据的每个副本可以使用分层结构(例如,树结构)表示。数据可以包括每个包括值的元素。一些元素可以包括在层次级别低于该元素的后代元素。例如,日历应用的对象可以包括每个月的元素、以及对于每个月的该月的每一天的相应后代元素。另外,每天的元素可以包括对于每小时的后代元素。
为简洁起见将其简称为文档的电子文档可用于存储一个或多个副本及其各自的值。当在计算设备修改元素的值时,计算设备可以在文档中记录指示该元素被修改的时间的时间戳。时间戳可以记录在文档中,元素例如位于改变的根部,而不是子树的树的顶部,其中该元素是后代元素或在子树中的每个键。然后可以使用时间戳合并多个副本。
***可以合并对象(或其他数据集)的副本以生成合并的文档,该文档包括对象的每个元素的调解值。在一些实施方式中,***一次合并对象的两个副本,尽管可能有该对象的两个以上的副本。当合并对象的副本时,***可以基于层次结构和元素的时间戳解决副本值之间的冲突。在一些实施方式中,***可以在评估层次中较低的元素之前评估层次中较高的元素。如果在第一副本的层次中特定级别的元素具有时间戳,该时间戳指示其比在第二副本中的同一元素更晚的时间被修改,则***可以在合并的文档中包括第一副本中的该元素的值。
如果元素具有后代元素,则***还可在合并的文档中包括第一副本中后代元素的值,而不是第二副本中后代元素的值。即使后代元素在第二副本中的修改比第一副本中的修改晚,***仍可以使用第一副本中的后代元素的值。在一些实施方式中,当***识别出元素在一个副本中比另一个副本在更晚的时间被修改时,来自第一副本的元素的后代元素的值将包括在合并的文档中,而无需评估任一副本中的后代元素的时间戳。
如果具有后代元素的元素在两个副本中具有相同的时间戳,则***可以评估后代元素的时间戳,以确定哪些值包括在合并的文档中。***可以一次在层次中向下移动一个级别,直到***识别出后代元素,该后代元素在一个副本上比在另一个副本上晚的时间或者从一个副本中删除了元素的时间被修改。该***可以在合并的文档中包括其中后代元素最后被修改的副本中的后代元素的值。如果从一个副本中删除了该元素,则***可以评估两个副本中该元素的时间戳。如果在第二副本中对元素进行最后修改之后从第一副本中删除了该元素(以及该元素的任何后代元素),则***可以在合并的文档中移除(或不包括)该元素。如果在比从第一副本删除元素晚的时间在第二副本修改该元素,则合并的文档可以包括修改的元素的值和来自第一副本的任何后代元素的值。
图1是示例环境100,其中计算设备110和130合并对象的副本。计算设备110和130可以是膝上型计算机、台式计算机、智能电话、平板计算机、可穿戴设备、智能电视或可用于查看电子数据、与电子数据交互或修改电子数据的任何其他适当的设备。计算设备110和130可以通过数据通信网络140进行通信,所述数据通信网络140例如局域网(LAN)、广域网(WAN)、移动网络、互联网、Wi-Fi、蓝牙或其组合。
每个计算设备110和130包括一个或多个应用,包括由计算设备110和130两者执行的应用112。应用112a-b中的每个都与可以被应用112a-b使用的对象相关联和/或在每个计算设备110和130由应用112a-b修改。
在一些实施方式中,数据集以对象的形式存储。例如,数据集可以以JavaScript对象表示法(JSON)对象的形式存储,其在JSON文档中维护。JSON是通用数据交换格式,可用于存储和传输应用(诸如应用112a-b)的数据。JSON对象包括一个或多个元素,每个元素包括各自的键值对(有时也称为名称-值对),它们可以以层次结构(例如,JSON树)的形式进行排列。键值对包括代表数据项的键和数据项的值。在一些实施方式中,数据集以诸如可扩展标记语言(XML)或YAML非标记语言(YAML)的其他格式存储。
应用112a-b可以在执行应用112a-b的每个计算设备110和130处存储数据的副本。在JSON实施方式中,每个副本都可以存储在相应的JSON文档中。类似地,在使用XML或YAML的实施方式中,每个副本可以存储在相应的XML或YAML文档中。例如,应用112a可以在文档A116中存储设备110的数据的副本,并且应用112b可以在文档B136中存储设备130的数据的副本。
尽管图1示出了两个计算设备110和130,它们各自存储用于应用112a-b的数据的各自副本,但是其他数量的计算设备也可以各自存储用于应用的数据的副本。类似地,尽管每个计算设备110和130被示为存储用于应用112a-b的数据的单个副本,但是单个计算设备可以存储多个副本。
每个文档116和136可以包括元素,每个元素包括用于应用112a-b的相应键值对。例如,文档A116包括具有键“c”和值1829的键值对。类似地,文档B136包括具有键“c”和值“182”的键值对。文档116和136还包括具有键“a”和“b”的元素,对于该元素,键“c”为后代元素。
在树结构中,特定元素的后代元素是连接到该特定元素的元素,并且在树中层次级别比该特定元素低。后代元素包括子元素、孙元素、曾孙元素等。在此示例中,具有键“c”的元素是具有键“a”的元素和具有键“b”的元素的后代元素,并且具有键“b”的元素是具有键“a”的元素的后代元素。例如,键“a”可以是用于顶层数据元素的数据项(例如,人的数据),键“b”可以是用于关于人的数据的子集的数据项(例如,地址数据),并且键“c”可以是用于特定地址数据的数据项(例如,街道号码)。
当应用112a-b修改元素的值时,应用112a-b可以在修改发生的计算设备上的文档中记录指示修改发生时间的时间戳。时间戳可以例如作为文本而不是文档的元数据记录在文档中。例如,时间戳可以记录为键值对的值或文档中的元素。在特定示例中,当在计算设备110上运行的应用112a将键“c”的值修改为值1829时,应用112在文档116中记录时间戳“201708011201”。该时间戳被编码为引用日期08/01/2017以及时间12:01pm。类似地,当在计算设备130上运行的应用112b将键“c”的值修改为值1827时,该应用在文档136中记录时间戳“201708011203”。该时间戳被编码为引用日期08/01/2017以及时间12:03pm。文档116还包括对于键“b”的时间戳“201708011205”,该时间戳指示键“b”的值在08/01/2017的12:05pm被修改为具有2的值。
在一些实施方式中,每个时间戳包括随机生成的随机数值。可以将随机数添加到每个时间戳的末尾,以打破两个否则相等的时间戳之间的联系。例如,时间戳的格式可以是yyyymmddhhmmssmsnonce,其中“yyyy”代表年份,“mm”代表月份,“dd”代表日期,“hh”代表小时,“mm”代表分钟,“ss”代表秒,“ms”代表毫秒,并且“nonce”代表随机随机数。随机数值可以是随机的,但保证在特定副本上随时间单调增加,使得同一副本上较晚的时间戳被分配比较早的时间戳更高的随机数值。
应用112a-b可以记录其值被修改的元素的时间戳,例如,作为修改的基础。例如,当修改键“c”的值时,对于键“c”,而不是层次中较高的元素,例如,而不是键“b”和/或键“a”,记录时间戳。以这种方式,数据合并器114(下面描述)可以识别哪个键在由时间戳指示的时间被修改。如果对于键“a”记录了时间戳以指示“a”的值是基于具有键“c”的后代元素被修改而修改的,则时间戳将是含糊的,并且可能导致对另一个副本中的后代元素的修改在合并期间被错误覆写,如下所述。
时间戳可以以不改变层次结构(例如,树结构)的形状的方式包括在文档116和136中。这允许将时间戳记包括在文档中,而无需改进解析层次表示中的数据的现有实现方式。在一些实施方式中,键的时间戳记被记录为文档中的同级(sibling)键。特定键的同级键是在层次中处于同一级别且具有相同父级的键。例如,文档中键“c”的时间戳被记录为同级键“c~~”的值。同级键的格式可以是“[键]~~”的形式,使得数据合并器114可以解析同级键以识别时间戳和时间戳所属的键。
在一些实施方式中,键的时间戳被记录为与文档分离的元数据。例如,键的时间戳可以记录为指向时间戳的JSON指针,例如记录在指向时间戳的JSON指针的映射中。因为元数据是XML文件格式的一部分,所以当副本存储在XML文档中时,时间戳可以存储为XML标签的元数据属性。
可以使用诸如“json_object->Set({“a”,“b”,“c”},1829);”的设置函数来设置键的值。在该示例中,键“c”的值被设置为1829,并且设置功能包括到键“c”的路径,包括键“c”的祖先元素的每个键。当应用112a-b执行这种形式的设置功能时,应用112a-b可以将执行设置功能的时间记录为路径结尾处的键“c”的时间戳,因为“键”的值是由设置功能修改的值。
在一些实施方式中,元素及其所有父元素(parent)可能没有时间戳。例如,可以为每个元素分配零时间戳,该时间戳的值为零,没有随机随机数。当修改元素的值时,隐式零时间戳可以替换为值指示修改元素值的时间、以及可选地具有可以用于打破时间戳之间的联系的随机随机数的时间戳。出于本文档的目的,具有零时间戳的元素也称为没有时间戳的元素。具有零时间戳的两个元素的内容可以被合并而不被覆写。
由于应用112a-b可以并发修改每个计算设备110和130处的数据,因此每个应用112a-b可以包括例如周期性地合并数据的数据合并器114a-b。例如,计算设备130可以离线(例如,在一段时间内没有连接到网络140)。用户可以使用计算设备110来与应用112a交互并修改应用的数据。当应用设备130重新连接到网络140(或直接连接到计算设备110)时,每个计算设备110和130处的应用112a-b可以交换文档116和136。例如,计算设备110可以将文档116发送到计算设备130并且计算设备130可以将文档136发送到计算设备110。
在计算设备110和130中一者或二者处的数据合并器114a-b可以合并两个文档116和136,以生成包括应用的数据的当前值的合并文档。在一些实施方式中,数据合并器114a-b使用本地文档生成合并的文档。例如,在计算设备110上运行的数据合并器114a可以使用来自文档136的值来更新文档116。当合并完成时,文档116是合并的文档。在计算设备130上运行的数据合并器114b可以执行相同的过程以使用文档116的值将文档136更新为合并的文档。在计算设备110和130两者处使用相同的合并技术,得到的合并文档包括应用112的相同的当前值。
数据合并器114a-b可以一次合并两个文档。例如,数据合并器114a可以从不同的计算设备接收包括数据的副本的文档,例如,来自计算设备130的文档136,并且将文档116与文档136合并。从其接收文档的计算设备不影响合并处理。也就是说,数据合并器114a将独立于另一个文档的来源而从两个文档生成相同的合并的文档。
数据合并器114a-b可以基于文档中元素的层次以及在计算设备116和136中的一个或多个处元素的值被改变的时间来合并文档116和136。通常,数据合并器114a-b可以从层次中最高级别开始评估元素,并且如果合适的话,可以评估层次中较低的元素。例如,树结构可以包括多个子树,每个子树具有在层次中最高级别的元素、以及在子树中处于较低级别的一个或多个元素。数据合并器114a-b可以例如通过评估层次中最高级别(例如,在每个子树的顶部)的元素来递归层次,然后评估子树的一个或多个中较低级别的元素(如果合适的话)。
在用于评估元素的递归处理中,数据合并器114a-b评估层次中最高级别的元素,并且如果合适的话,对层次中较低级别的元素执行评估,例如,一次在层次中向下移动一级。如下所述,如果元素的时间戳在两个副本中相同,或者两个副本都不包括时间戳,则数据合并器114a-b可以移至层次中的较低级别。如果在先前的合并之后未在任一设备处修改元素,或者两个时间戳均为零时间戳,则时间戳可以相同。否则,可以使用时间戳的随机值打破联系。
如果元素的时间戳指示该元素在一个副本处比在另一个副本处在更晚的时间被修改,则来自更晚修改的副本的后代元素的值可以包括在合并的文档中,例如,无需递归后代元素。类似地,如果与该元素在一个副本处被修改相比、元素的时间戳指示该元素被在更晚的时间从不同的副本删除,则可以从合并的文档中删除该元素,例如,无需递归后代元素。
如果对象包括在层次中最高级别的多个元素,则数据合并器114a-b可以分别递归处于最高级别的每个元素的子树。即,如果两个或更多副本的第一元素的时间戳相等或副本不包括用于第一元素的时间戳,则数据合并器114a-b可以评估在层次中最高级别的第一元素的子树中的后代元素。对于层次中最高级别的第二元素,如果一个副本中的第二元素的时间戳指示该第二元素在一个副本中比在另一副本中更晚的时间被修改,则数据合并器114a-b可以确定在合并的文档中包括副本之一中包括的后代元素的值,而不递归第二元素的任何后代元素。
数据合并器114a-b可以识别文档中的一个(例如,文档116)中的层次中的最高级别的元素,并尝试识别在另一个文档(例如,文档136)中相同的元素。如果两个文档都包括该元素,则数据合并器114a-b可以确定文档中的一个或两个都包括该元素的时间戳。如果两个文档都包括该元素的时间戳,例如作为该元素的各自的同级元素,则数据合并器114a-b可以确定哪个时间戳指示了更晚的时间(例如,更近的时间)。然后,数据合并器114a-b可以在合并的文档中包括来自具有指示更晚的时间的时间戳的文档的元素的值。
如果元素具有后代元素,则数据合并器114a-b还可以在合并的文档中包括来自具有指示针对该元素的更晚的时间的时间戳的文档的每个后代元素的值,例如,与后代元素的任何时间戳无关。也就是说,如果文档116的子树中的顶部元素相比于文档136中同一子树中的顶部元素在更晚的时间被修改,则即使文档136中的后代元素相比于文档116中的后代元素在更晚的时间被修改,合并的文档也可以包括来自文档116的顶部元素的值以及来自文档116的子树中的每个后代元素的值。
如果文档(例如文档116)不包括最高级别元素(即,层次中最高级别的元素)的时间戳,则数据合并器114a-b可以确定该元素没有在文档116被维护的计算设备110处被修改。在该示例中,如果一个文档包括该元素的时间戳,而另一文档没有,则数据合并器114a-b可以确定:该元素在维护包括时间戳的文档的计算设备110处在更晚的时间被修改。数据合并器114a-b可以在合并的文档中包括来自包括元素的时间戳的文档的元素的值。类似于以上示例,数据合并器114a-b还可以在合并的文档中包括来自包括元素的时间戳的文档的该元素的后代元素的值。
例如,考虑在文档116和136中包括键“b”的元素。文档116包括键“b”的时间戳作为同级键“b~~”的值。文档136不包括包含键“b”的元素的时间戳。在该示例中,数据合并器114a-b可以确定:与在计算设备130处最后修改键“b”的值相比,在计算设备110处在更晚的时间由应用112a-b对键“b”的值进行了修改。作为响应,数据合并器114a-b可以在表示文档116和文档136的合并的合并的文档中包括来自文档116的键“b”的值。即,数据合并器114a-b可以在合并的文档中包括键“b”的值“2”。
如果两个文档都不包括最高级别元素的时间戳,或者如果文档116和136两者中该元素的时间戳相同,则数据合并器114a-b可以通过评估该元素的后代元素来递归该元素。例如,如果子树的顶部元素在先前的合并之后未在任一计算设备被修改,则数据合并器114a-b可以评估该元素的后代元素,以确定在计算设备110和130中的一者或两者处是否修改了任一后代元素的值。数据合并器114a-b可以确定在合并的文档中包括哪个值。数据合并器114a-b可以以与数据合并器114a-b确定要为顶部元素包括哪个值的方式类似的方式,确定将哪个值包括在合并的文档中。例如,如果数据合并器114a-b确定在合并的文档中包括文档116中的后代元素的值,则数据合并器114a-b还可以在合并的文档中包括作为来自文档116的后代元素的后代的任何元素的值。
数据合并器114a-b可以通过以下方式递归元素的子树:每次降低一个级别到子树中,直到数据合并器115识别出在计算设备中的一个处在更晚的时间修改的元素或者到达子树中的最低级别。如果数据合并器114a-b到达最低级别,并且未识别出在计算设备中的一个处在更晚的时间修改的元素,则数据合并器114a-b可以在合并的文档中包括来自任何一个文档的每个元素的值。然后,数据合并器114a-b可以移动到文档116和136中的下一个子树(如果有的话),并且以类似的方式评估下一个子树中的元素。
如果数据合并器114a-b在包括时间戳的文档中的一个(例如,文档116)中识别出一元素,而另一个文档(例如,文档136)不包括该元素,则数据合并器114a-b可以确定该元素代表新的数据项,并且该元素在时间戳指示的时间被添加到文档116,但没有被添加到文档136。数据合并器可以将该元素添加到合并的文档。但是,新元素可以是特定元素的后代元素。在该示例中,如果文档136具有特定元素的时间戳,其晚于文档116中特定元素的时间戳,则数据合并器114a-b可以作为数据合并器114a-b不评估新元素。例如,数据合并器114a-b可以在合并的文档中替代地包括来自文档136的特定元素的值和来自文档136的特定元素的后代元素的值,而无需评估后代元素,如上所述。
如果数据合并器114a-b在文档中的一个(例如,文档116)中识别了键的时间戳,但未在文档116中识别出包括键的值的键值对,则数据合并器114a-b可以确定由键表示的数据项被在设备110上运行的应用114a删除了。删除的元素可以与其他元素一样对待。例如,如果文档116中的删除的元素的时间戳晚于文档136中的元素的时间戳,则数据合并器114a-b将认为该元素被删除并且不将该元素包括在合并的文档中。如果文档116中删除的元素的时间戳早于文档136中元素的时间戳,则数据合并器114a-b可以在合并的文档中包括来自文档136的元素的值。然而,就像其他元素一样,可以不基于任何祖先元素的时间戳来评估删除的元素。
在一些实施方式中,当合并两个文档时,数据合并器114a-b可以自动合并不具有时间戳并且不具有拥有时间戳的任何父元素的键的值。例如,JSON数据通常在JSON树的根处具有键,这是该树的重要基础架构。在使用JSON数据的特定应用内,基础架构键始终存在,并且覆写基础架构键很少有意义。对基础架构键使用时间戳可能随着应用增长(grow)而使得难以添加新的基础架构键,因为执行初始化的最后一个计算设备将“获胜”并清除其他节点的初始化。为了允许此类基础架构键合并而不是覆写,没有时间戳且没有拥有时间戳的父元素的键将自动合并。也就是说,如果要更新特定文档以使其成为合并的文档,则没有时间戳的基础架构键将在合并的文档中保留相同的值。
图2描绘了包括对象的层次表示的副本的示例文档210和220被合并为合并的文档230。两个文档210和220包括与汽车对象有关的数据。文档210包括具有“汽车”键的元素,该元素包括具有键“最新”的后代元素。具有键“最新”的元素包括具有键“型号”(其值为“型号2”)的后代元素和具有键“内部”的后代元素。具有键“内部”的后代元素又具有拥有键“颜色”和键“座椅”的后代元素。文档220包括与文档210相同的元素和键,但是一些键的值不同。
当文档210和220被合并以生成合并的文档230时,例如图1的数据合并器114a-b的数据合并器可以首先评估具有键“汽车”的元素,因为该元素在层次表示中最高。在此示例中,数据合并器将评估文档210和220两者,并确定两个文档都不包括键“汽车”的时间戳。例如,两个文档都不包括键“汽车”的同级键。
作为响应,数据合并器可以移动到包括键“汽车”的元素下方的下一个较低级别。在此示例中,数据合并器可以评估包括键“最新”的元素,因为它是具有键“汽车”的元素下方的后代元素。数据合并器可以确定文档210包括键“型号”的时间戳211,该时间戳211指示时间为08/01/2017的12:05pm。数据合并器还可以确定文档220不包括键“最新”的时间戳。因此,数据合并器可以确定键“最新”的值是在维护文档210的计算设备处在更晚的时间被修改的。作为响应,数据合并器可以在合并的文档230中包括来自文档210的键“最新”的值。
数据合并器还可以在合并的文档230中包括以下后代元素的值:这些后代元素是来自文档210的具有键“最新”的元素的后代。也就是,数据合并器可以在合并的文档230中包括来自文档210的键“型号”、“内部”、“颜色”和“座位”的值。例如,合并的文档230包括键“型号”的值“型号2”、键“颜色”的值“黑”以及键“座椅”的值“皮革”。数据合并器可以在合并的文档230中包括来自文档210的用于后代键的值,而无需评估后代元素或其时间戳。例如,文档220中键“颜色”的时间戳指示比文档210中键“颜色”的时间戳(即08/01/2017的12:01pm)更晚的时间(即08/02/2017的10:43am)。但是,基于具有键“型号”的更高级别元素对于文档210比对于文档220更晚被修改,数据合并器在合并的文档230中包括来自文档210的键“颜色”的值。
如图2中所示,合并的文档230可以包括来自从其获得值的文档210的时间戳。以此方式,合并的文档230可以与例如用于其他计算设备的其他文档合并,或者更晚与文档210或230中的一个合并。
在生成合并的文档之后,合并的文档可以由执行合并的设备上的应用使用。当数据合并器接收具有对象的副本的变化的文档时,每个设备的数据合并器可以执行相同的合并处理。
图3描绘了包括对象的层次表示的副本的示例文档310和320被合并到合并的文档330中。类似于文档210和220,两个文档310和320包括与汽车对象有关的数据。文档310包括具有“汽车”键的元素,该元素包括具有键“最新”的后代元素。具有键“最新”的数据元素包括具有键“模型”的后代元素和具有键“内部”的后代元素,后者又拥有具有键“颜色”和键“座椅”的后代元素。文档320包括与文档310相同的元素和键,但是一些键的值不同。
当文档310和320被合并以生成合并的文档330时,例如图1的数据合并器114a-b的数据合并器可以首先评估具有键“汽车”的元素,因为该元素在层次表示中最高。在该示例中,数据合并器将评估文档310和320两者,并确定两个文档都不包括键“汽车”的时间戳。例如,两个文档都不包括键“汽车”的同级键。
作为响应,数据合并器可以移动到在包括键“汽车”的元素下方的下一个较低级别。在此示例中,数据合并器可以评估包括键“最新”的元素,因为它是具有键“汽车”的元素下方的后代元素。数据合并器可以确定文档310包括键“最新”的时间戳311,该时间戳311指示时间为08/01/2017的12:05pm。数据合并器还可以确定文档320包括键“模型”的时间戳321,该时间戳321指示时间为08/01/2017的12:15pm。数据合并器可以基于时间戳311和321确定在文档320中比在文档310中更晚对键“最新”的值进行了修改。作为响应,数据合并器可以在合并的文档330中包括来自文档320的键“最新”的值。
数据合并器还可以在合并的文档330中包括以下后代元素的值:这些后代元素是来自文档320的具有键“内部”的元素的后代。也就是说,数据合并器可以在合并的文档330中包括来自文档320的键“型号”、“内部”、“颜色”和“座椅”的值。例如,合并的文档330包括键“型号”的值“型号3”、键“颜色”的值“棕黄色”和键“座椅”的值“皮革”。数据合并器可以在合并的文档330中包括来自文档320的用于后代键的值,而无需评估后代元素或其时间戳。例如,文档310中的键“颜色”的时间戳指示比文档320中的键“颜色”的时间戳(即08/02/2017的10:43am)更晚的时间(即,08/03/2017的12:01pm)。然而,基于具有键“最新”的较高级别元素对于文档320比对于文档310更晚被修改,数据合并器在合并的文档330中包括来自文档320的键“颜色”的值。
如果将键“颜色”的时间戳分配给到键“颜色”的路径中的每个元素,则键“汽车”、“最新”和“内部”都将具有相同的时间戳。例如,在文档310中,键“汽车”将具有时间戳“201708011201”。类似地,在文档320中,键“汽车”将具有时间戳“201708011215”。在该示例中,合并的文档330将包括来自文档310的所有值,因为文档310中的键“汽车”的时间戳将指示比文档320中的键“汽车”的时间戳更晚的时间。通过仅在改变的根部包括时间戳,数据合并器可以从每个文档中选择适当的值。
图4描绘了包括对象的层次表示的副本的示例文档410和420被合并为合并的文档430。类似于文档210和220,两个文档410和420包括与汽车对象相关的数据。文档410包括具有“汽车”键的元素,该元素包括具有键“最新”的后代元素。具有键“最新”的数据元素包括具有键“型号”的后代元素和具有键“内部”的后代元素,后者又拥有具有键“颜色”和键“座椅”的后代元素。文档420包括与文档410相同的元素和键,但是一些键的值不同。
当文档410和420被合并以生成合并的文档430时,例如图1的数据合并器114a-b的数据合并器可以首先评估具有键“汽车”的元素,因为该元素在层次表示中最高。在此示例中,数据合并器将评估文档410和420两者,并确定两个文档都不包括键“汽车”的时间戳。例如,两个文档都不包括键“汽车”的同级键。
作为响应,数据合并器可以移动到包括键“汽车”的元素下方的下一个较低级别。在此示例中,数据合并器可以评估包括键“最新”的元素,因为它是具有键“汽车”的元素下方的后代元素。数据合并器可以确定文档410包括键“最新”的时间戳411,该时间戳411指示时间为08/01/2017的12:05pm。数据合并器还可以确定文档420包括键“最新”的时间戳421,该时间戳指示时间为08/01/2017的12:05pm。数据合并器可以基于时间戳411和421确定同时为文档410和420两者修改了键“最新”的值。作为响应,数据合并器可以评估层次表示中较低的元素以确定哪些值包括在合并的文档430中。
数据合并器可以移动到包括键“型号”和“内部”的下一个较低元素。由于在此级别有多个元素,因此数据合并器可以评估在此级别的每个元素。数据合并器可以评估具有键“型号”的元素,并确定文档410或420都不包括键“型号”的时间戳。由于具有键“型号”的元素不包括任何后代元素,因此数据合并器可以在合并的文档430中包括来自任一文档的键“型号”的值,因为它们具有相同的值。数据合并器可以移动到具有“内部”键的元素。
数据合并器可以确定文档410或420都不包括键“内部”的时间戳,但是具有键“内部”的元素具有后代元素。由于此级别上有多个元素,因此数据合并器可以评估在此级别的每个元素。
数据合并器可以评估具有键“颜色”的元素,并确定文档410包括时间戳412,该时间戳412对于键“颜色”指示时间为08/03/2017的12:01pm,并且文档420指示时间戳422,该时间戳422指示对于键“颜色”时间为08/02/2017的10:43am。数据合并器可以基于时间戳412和422确定键“颜色”的值在文档410中比在文档420中更晚被修改。作为响应,数据合并器可以在合并的文档430中包括来自文档410的键“颜色”的值,即值“黑”。
然后,数据合并器可以评估具有键“座椅”的元素,并确定没有文档包括该键的时间戳。然后,数据合并器可以在合并的文档430中包括来自任一文档的键“座椅”的值,因为它们具有相同的值。
图5是用于合并对象的副本的示例处理500的流程图。处理500的操作可以例如通过包括一个或多个数据处理装置(诸如图1的计算设备110或图1的计算设备130)的***来实现。处理500也可以通过存储在计算机存储介质上的指令来实现,其中由包括数据处理装置的***执行指令导致数据处理装置执行处理500的操作。
该***获得第一文档,该第一文档包括在第一设备处由应用使用的对象的第一层次表示的第一副本(502)。该应用可以安装在多个不同的设备上和/或由多个不同的设备执行,并修改同一数据的副本。例如,用户可以使用执行应用的多个不同设备来修改应用维护的用户数据。在特定示例中,用户可以使用多个设备在日历应用中修改用户的日程安排。
第一文档可以是包括第一设备的对象的副本的JSON文档。在此示例中,JSON文档可以包括定义对象的键值对的第一层次表示。在这种层次表示中,一些元素可以具有后代元素。对于第一设备处的应用对于其修改或删除了键值的任何键,JSON文档可以包括指示该键值被修改或删除的时间的时间戳。
***获得第二文档,该第二文档包括在第二设备处由应用使用的对象的第二层次表示的第二副本(504)。第二设备可以与第一设备不同。例如,第一设备可以是用户的笔记本计算机,并且第二设备可以是用户的智能电话。第二文档也可以是JSON文档,其包括第二设备的对象的副本。JSON文档可以包括定义该对象的键对的第二层次表示。在这种层次表示中,一些元素可以具有后代元素。对于在第二设备处由应用对其修改了键值的任何键,JSON文档可以包括指示键值被修改的时间的时间戳。
***从第一文档和第二文档生成合并的文档(506)。合并的文档可以包括对象的每个元素的当前值。合并的文档还可以仅包括例如与在一个副本处修改元素相比在更晚的时间在另一副本处没有删除的那些元素。例如,如果文档是JSON文档,则合并的文档可以包括尚未删除的JSON对象的每个键的当前值和修改的每个键的时间戳。对于已删除的元素,合并的文档可以包括该元素的时间戳,但不包括值。
***可以基于文档中元素的层次以及如文档中的时间戳所指示的那样改变元素值的时间来合并文档。例如,如上所述,***可以开始评估文档中在最高层次级别上的元素,并在适当的情况下逐步向下进行到子树中。如果一个文档中特定的最高级别键具有比另一个文档中的相同键更晚的时间戳,则***可以在合并的文档中包括来自包括更晚时间戳的文档的键的值。另外,如果存在从包括特定键的元素中降级的后代元素,则***可以在合并的文档中包括来自包括特定键的更晚时间戳的文档的后代键的值。如果特定的最高级别键被从一个文档删除、并且在该文档中具有比另一文档中特定最高级别键的时间戳更晚的时间戳,则该特定的最高级别的键(以及该键的任何后代)可以不包括在合并的文档中。
如果两个文档对于层次中最高级别的元素具有相同的时间戳或没有时间戳、并且该元素具有一个或多个后代元素,则***可以以相同的方式评估后代元素,直到***识别出这样的后代元素:对于该后代元素,一个文档包括时间戳而另一文档不包括时间戳、或者一个文档比另一文档包括后代元素的更晚时间戳。如果***找到对于其仅文档之一包括时间戳的后代元素,则***可以在合并的文档中包括来自具有该时间戳的文档的后代元素的键值(及其任何后代的键值)。类似地,如果***找到对于其一个文档具有比另一文档更晚的时间戳的后代元素,则***可以在合并的文档中包括来自具有更晚时间戳的文档的后代元素的键值(及其任何后代的键值)。如果***找到了从文档之一中删除的键、并且该文档与另一文档相比具有对于该键的更晚的时间戳,则该键(以及该键的任何后代)可以不包括在合并的文档中。
如果***到达元素的子树中的最低级别而没有找到这样的后代元素,则***可以在合并的文档中包括来自文档之一的数据。例如,如果第一设备正在合并文档,则第一设备可以在合并的文档中包括来自第一文档的元素的键值及其后代元素的键值。***可以以类似的方式评估每个子树,直到文档内的所有子树都已被评估并且数据合并到合并的文档中。
图6是用于合并对象的副本的另一示例处理600的流程图。处理600的操作可以例如通过包括一个或多个数据处理装置的***来实现,所述数据处理装置诸如图1的计算设备110或图1的计算设备130。处理600还可以通过存储在计算机存储介质上的指令来实现,其中由包括数据处理装置的***对指令的执行使得数据处理装置执行处理600的操作。
在通过使用来自第二文档的值更新第一文档以使第一文档成为合并的文档来生成合并的文档的方面,描述处理600。例如,第一设备可以维护第一文档,该第一文档包括在第一设备处应用使用的对象的第一层次表示的第一副本。第一设备可以从第二设备接收第二文档,该第二文档包括在第二设备处应用使用的对象的第二层次表示的第二副本。然后,如果合适的话,则第一设备可以将第二文档的值复制到第一文档中以生成合并的文档。
***获得两个文档,每个文档都包括对象的元素(602)。例如,***可以从第一设备获得第一文档,并从第二设备获得第二文档。这些文档可以是具有拥有键值对的元素的层次表示的JSON文档。
***获得下一键作为用于评估的键,并从第一文档中识别下一键的时间戳(如果有的话)(604)。在第一迭代中,下一键可以是在第一层次表示中最高级别的键。在随后的迭代中,下一键可处于第一层次表示中的较低的级别。如果在任何设备修改了键的值,则第一文档可以包括键的时间戳。例如,如果在不同于第一设备的设备修改了键、并且来自该设备的文档与第一文档合并,则第一文档可以包括来自源于该设备的文档的时间戳。时间戳将指示修改发生的时间。可以使用文本将时间戳记录在第一文档中,例如作为下一个键的同级键的值。
***从第二文档获得键的时间戳(如果有的话)(608)。如果在任何设备修改了键的值,则第二文档可以包括键的时间戳。时间戳将指示修改发生的时间。可以使用文本将时间戳记记录在第二文档中,例如,作为该键的同级键的值。
***确定从第一文档获得的时间戳是否指示比从第二文档获得的时间戳更新的时间(608)。如果是这样,则***将第一文档中的元素的值保持不变,并返回操作(604)以评估键。
如果不是,则***确定从第一文档获得的时间戳是否指示与从第二文档获得的时间戳相同的时间(610)。如果是这样,则***对键值进行递归(612)并返回到操作(604)。即,在操作(604)中,***移至该键的后代键并评估该后代键。
如果不是,则***确定键是否已从第二文档中删除(614)。例如,如果第二文档不包括键、但是确实包括该键的时间戳,例如作为该键的同级键的值,则***可以确定该键已从第二文档中删除。
如果键已经从第二文档中删除,则***从第一文档中删除键(616)。如果键尚未从第二文档中删除,则***将键的值从第二文档复制到第一文档(618)。例如,***可以用来自第二文档的键值覆写第一文档中的键值。
不管是否从第二文档中删除了键,***都将键的时间戳(如果有的话)从第二文档复制到第一文档(620)。然后,***返回操作(604)以评估下一个键(如果有的话)。
本说明书中描述的主题和操作的实施例可以在数字电子电路中、在(包括本说明书中公开的结构及其结构等同物的)计算机软件、固件或硬件中实现,或者在它们中的一个或多个的组合中体现。本说明书中描述的主题的实施例可以实现为一个或多个计算机程序,即,在计算机存储介质上编码的计算机程序指令的一个或多个模块,用于供数据处理装置执行或控制数据处理装置的操作。替代地或附加地,程序指令可以在例如机器生成的电、光或电磁信号的人工生成的传播信号上编码,这些信号被生成以编码信息,用于传输到合适的接收器装置以由数据处理装置执行。计算机存储介质可以是机器可读存储设备、机器可读存储基板、随机或串行存取存储器阵列或设备、或它们中的一个或多个的组合,或包括在这些之中。此外,尽管计算机存储介质不是传播信号,但是计算机存储介质可以是在人工生成的传播信号中编码的计算机程序指令的源或目的地。计算机存储介质也可以是一个或多个单独的物理组件或介质(例如,多个CD、盘或其他存储设备)或包括在其中。
本说明书中描述的操作可以被实现为由数据处理装置对存储在一个或多个计算机可读存储设备上或从其他源接收的数据执行的操作。
术语“数据处理装置”涵盖用于处理数据的所有种类的装置、设备和机器,例如包括可编程处理器、计算机、片上***、或以上中的多个或组合。该装置可以包括专用逻辑电路,例如FPGA(现场可编程门阵列)或ASIC(专用集成电路)。除了硬件之外,该装置还可以包括为所讨论的计算机程序创建执行环境的代码,例如,构成处理器固件、协议栈、数据库管理***、操作***、跨平台运行时环境、虚拟机或它们中的一个或多个的组合的代码。装置和执行环境可以实现各种不同的计算模型基础架构,诸如网络服务、分布式计算和网格计算基础架构。
计算机程序(也被称为程序、软件、软件应用、脚本或代码)可以用任何形式的编程语言编写,包括编译或解释语言、声明或过程性语言;并且它可以以任何形式部署,包括作为独立程序或作为模块、组件、子例程、对象或适用于计算环境的其他单元。计算机程序可以但不必对应于文件***中的文件。程序可以存储在保存其他程序或数据的文件的一部分中(例如,存储在标记语言文档中的一个或多个脚本中)、专用于所讨论的程序的单个文件中、或者存储在多个协调文件中(例如存储一个或多个模块、子程序或代码部分的文件)。可以部署计算机程序以在一个计算机上或在位于一个站点上或跨多个站点分布并通过通信网络互连的多个计算机上执行。
本说明书中描述的处理和逻辑流程可以由执行一个或多个计算机程序的一个或多个可编程处理器执行,以通过对输入数据进行操作并生成输出来执行动作。处理和逻辑流程也可以由专用逻辑电路(例如FPGA(现场可编程门阵列)或ASIC(专用集成电路))来执行,并且装置也可以实现为所述专用逻辑电路。
适合于执行计算机程序的处理器例如包括通用和专用微处理器两者、以及任何种类的数字计算机的任何一个或多个处理器。通常,处理器将从只读存储器或随机存取存储器或这两者接收指令和数据。计算机的基本元件是用于根据指令执行动作的处理器和用于存储数据的一个或多个存储器设备。通常,计算机还将包括用于存储数据的一个或多个大容量存储设备或可操作地耦合以从所述一个或多个大容量存储设备接收数据或将数据传输到所述一个或多个大容量存储设备或进行接收和传输这两者,所述大容量存储设备例如磁、磁光盘或光盘。但是,计算机不必具有这样的设备。此外,计算机可以嵌入在例如移动电话、个人数字助理(PDA)、移动音频或视频播放器、游戏控制台、全球定位***(GPS)接收器或便携式存储设备(例如,通用串行总线(USB)闪存驱动)等的另一设备中。适于存储计算机程序指令和数据的设备包括所有形式的非易失性存储器、介质和存储器设备,包括例如半导体存储器设备,例如EPROM、EEPROM和闪存设备;磁盘,例如内部硬盘或可移除磁盘;磁光盘;以及CD ROM和DVD-ROM盘。处理器和存储器可以由专用逻辑电路补充或并入专用逻辑电路中。
为了支持与用户的交互,本说明书中描述的主题的实施例可以在计算机上实现,所述计算机具有:用于向用户显示信息的显示设备,例如CRT(阴极射线管)或LCD(液晶显示器)监视器;以及用户可通过其向计算机提供输入的键盘和指示设备(例如,鼠标或轨迹球)。其他类型的设备也可用于支持与用户的交互;例如,提供给用户的反馈可以是任何形式的感觉反馈,例如视觉反馈、听觉反馈或触觉反馈;并且可以以包括声学、语音或触觉输入的任何形式接收来自用户的输入。另外,计算机可以通过向用户使用的设备发送文档和从用户使用的设备接收文档,例如,通过响应于从web浏览器接收的请求将网页发送到用户的客户端设备上的web浏览器,与用户交互。
本说明书中描述的主题的实施例可以在计算***中实现,该计算***包括:后端组件,例如作为数据服务器;或者包括中间件组件,例如应用服务器;或者包括前端组件,例如,具有图形用户界面、网络浏览器的客户端计算机,用户可通过其与本说明书中描述的主题的实现方式进行交互;或者包括一个或多个这样的后端、中间件或前端组件的任何组合。***的组件可以通过例如通信网络的任何形式或介质的数字数据通信互连。通信网络的示例包括局域网(“LAN”)和广域网(“WAN”)、跨网(例如,因特网)、以及对等网络(例如,自组织对等网络)。
计算***可以包括客户端和服务器。客户端和服务器通常彼此远离,并且典型地通过通信网络进行交互。客户端和服务器的关系借助于在各个计算机上运行并且彼此具有客户端-服务器关系的计算机程序而产生。在一些实施例中,服务器将数据(例如,HTML页面)发送到客户端设备(例如,用于向与客户端设备交互的用户显示数据和从所述用户接收用户输入的目的)。可以在服务器处从客户端设备接收在客户端设备处生成的数据,例如,用户交互的结果。
虽然本说明书包括许多具体的实现细节,但是这些不应被解释为对任何发明的范围或可能要求保护的范围的限制,而是作为可以特定于特定发明的特定实施例的特征的描述。在单独实施例的上下文中在本说明书中描述的某些特征也可以在单个实施例中组合实现。相反,在单个实施例的上下文中描述的各种特征也可以单独地或以任何合适的子组合在多个实施例中实现。此外,尽管特征可以在上面描述为以某些组合起作用并且甚至最初如此要求保护,但是在一些情况下可以从组合中切除来自要求保护的组合的一个或多个特征,并且要求保护的组合可以针对子组合或子组合的变化。
类似地,虽然以特定顺序在附图中描绘了操作,但是这不应该被理解为要求以所示的特定顺序或按顺序执行这些操作,或者执行所有示出的操作以达到期望的效果。在某些情况下,多任务处理和并行处理可能是有利的。此外,上述实施例中的各种***组件的分离不应被理解为在所有实施例中都要求这种分离,并且应当理解,所描述的程序组件和***通常可以一起集成在单个软件产品中或打包成多个软件产品。
因此,已经描述了主题的特定实施例。其他实施例在所附权利要求的范围内。在一些情况下,权利要求中记载的动作可以以不同的顺序执行并且仍然实现期望的结果。另外,附图中描绘的处理不一定要求所示的特定顺序或按顺序来实现期望的结果。在某些实施方式中,多任务处理和并行处理可能是有利的。
Claims (20)
1.一种用于调解数据的副本的***,该***包括:
数据处理装置;以及
存储装置,其与该数据处理装置进行数据通信,并存储该数据处理装置可执行的指令,并且所述指令在这种执行时,使得数据处理装置执行操作,所述操作包括:
获得第一文档,其包括在第一设备由应用使用的对象的第一层次表示的第一副本,该对象的第一层次表示包括多个元素,每个元素包括键值对,对象的第一层次表示包括第一元素的第一键的第一时间戳,该第一时间戳指示在第一设备修改第一键的第一值的时间,该第一元素在第一层次表示中包括一个或多个后代元素;
获得第二文档,其包括在不同于第一设备的第二设备由应用使用的对象的第二层次表示的第二副本;以及
从第一文档和第二文档生成合并的文档,该合并的文档包括对象中每个键值对的当前值,包括:
至少基于第一键的第一时间戳,确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改;
响应于确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改,在合并的文档中:
对于第一键,包括第一文档中第一键的第一值而不是第二文档中第一键的第一值;以及
对于第一元素的每个后代元素,包括第一文档中后代元素的键的值,而不是在第二文档中后代元素的键的值。
2.根据权利要求1所述的***,其中:
第二层次表示包括第二时间戳,该第二时间戳指示在第二设备处修改第一键的第一值的时间;以及
至少基于第一时间戳确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改包括:确定由第一时间戳指示的时间晚于由第二时间戳指示的时间。
3.根据权利要求1所述的***,其中:
第二层次表示不包括第一对象的第二时间戳;以及
至少基于第一时间戳确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改包括:确定自第一文档与第二文档的最后合并以来,在第二设备处尚未修改第一键的第一值。
4.根据权利要求1所述的***,其中:
第一层次表示包括:
第二时间戳,其指示在第一设备处修改所述多个元素中的第二元素的第二键的第二值的时间,所述第二元素包括第二后代元素;以及
第三时间戳,其指示在第一设备处修改第二后代元素的第三键的第三值的时间;
第二层次表示包括:
第四时间戳,其指示在第二设备处修改第二键的第二值的时间;以及
第五时间戳,其指示在第二设备处修改第三键的第三值的时间;
所述操作还包括:
确定由第二时间戳指示的时间与由第四时间戳指示的时间匹配,并且作为响应:
比较第三时间戳和第五时间戳;
基于比较,确定与第三键的第三值在第一设备处被修改的时间相比、第三键的第三值在更晚的时间在第二设备处被修改;以及
响应于确定与第三键的第三值在第一设备处被修改的时间相比、第三键的第三值在更晚的时间在第二设备处被修改,在合并的文档中包括第二文档中的第三键的第三值,而不是第一文档中的第三键的第三值。
5.根据权利要求1所述的***,其中,所述第一层次表示是基于文本的表示。
6.根据权利要求5所述的***,其中,所述基于文本的表示是JavaScript对象表示法JSON。
7.根据权利要求6所述的***,其中,所述第一层次表示包括用于所述第一键的第一同级键,其中,用于所述第一键的时间戳是用于所述第一同级键的值。
8.根据权利要求7所述的***,其中,所述操作包括:
由第一设备确定在第一设备处第一后代元素的键的值已经改变;以及
响应于确定在第一设备处第一后代元素的键的值已经改变,在第一文档中为第一后代元素的键创建第二同级键,该第二同级键包括基于指示第一后代元素的键的值改变的时间的时间戳的值、并且在第一文档中位于第一后代元素的键的正下方。
9.根据权利要求1所述的***,其中,无论与后代元素在第一设备处被修改的时间相比、该后代元素在第二设备处是否在更晚的时间被修改,所述第一文档中的所述后代元素的值、而不是所述第二文档中的所述后代元素的值被包括在所述合并的文档中。
10.一种用于调解数据的副本的计算机实现的方法,该方法包括:
获得第一文档,其包括在第一设备由应用使用的对象的第一层次表示的第一副本,该对象的第一层次表示包括多个元素,每个元素包括键值对,对象的第一层次表示包括第一元素的第一键的第一时间戳,该第一时间戳指示在第一设备修改第一键的第一值的时间,该第一元素在第一层次表示中包括一个或多个后代元素;
获得第二文档,其包括在不同于第一设备的第二设备由应用使用的对象的第二层次表示的第二副本;以及
从第一文档和第二文档生成合并的文档,该合并的文档包括对象中每个键值对的当前值,包括:
至少基于第一键的第一时间戳,确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改;
响应于确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改,在合并的文档中:
对于第一键包括第一文档中第一键的第一值而不是第二文档中第一键的第一值;以及
对于第一元素的每个后代元素包括第一文档中后代元素的键的值,而不是在第二文档中后代元素的键的值。
11.根据权利要求10所述的方法,其中:
第二层次表示包括第二时间戳,该第二时间戳指示在第二设备处修改第一键的第一值的时间;以及
至少基于第一时间戳确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改包括:确定由第一时间戳指示的时间晚于由第二时间戳指示的时间。
12.根据权利要求10所述的方法,其中:
第二层次表示不包括用于第一对象的第二时间戳;以及
至少基于第一时间戳确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改包括:确定自第一文档与第二文档的最后合并以来,在第二设备处尚未修改第一键的第一值。
13.根据权利要求10所述的方法,其中:
第一层次表示包括:
第二时间戳,其指示在第一设备处修改所述多个元素中的第二元素的第二键的第二值的时间,所述第二元素包括第二后代元素;以及
第三时间戳,其指示在第一设备处修改第二后代元素的第三键的第三值的时间;
第二层次表示包括:
第四时间戳,其指示在第二设备处修改第二键的第二值的时间;以及
第五时间戳,其指示在第二设备处修改第三键的第三值的时间;
所述方法还包括:
确定由第二时间戳指示的时间与由第四时间戳指示的时间匹配,并且作为响应:
比较第三时间戳和第五时间戳;
基于所述比较,确定与第三键的第三值在第一设备处被修改的时间相比、第三键的第三值在更晚的时间在第二设备处被修改;以及
响应于确定与第三键的第三值在第一设备处被修改的时间相比、第三键的第三值在更晚的时间在第二设备处被修改,在合并的文档中包括:第二文档中的第三键的第三值,而不是第一文档中的第三键的第三值。
14.根据权利要求10所述的方法,其中,所述第一层次表示是基于文本的表示。
15.根据权利要求14所述的方法,其中,所述基于文本的表示是JavaScript对象表示法JSON。
16.根据权利要求15所述的方法,其中,所述第一层次表示包括用于所述第一键的第一同级键,其中,用于所述第一键的时间戳是用于所述第一同级键的值。
17.根据权利要求16所述的方法,还包括:
由第一设备确定在第一设备处第一后代元素的键的值已经改变;以及
响应于确定在第一设备处第一后代元素的键的值已经改变,在第一文档中为第一后代元素的键创建第二同级键,该第二同级键包括基于指示第一后代元素的键的值改变的时间的时间戳的值、并且在第一文档中位于第一后代元素的键的正下方。
18.根据权利要求10所述的方法,其中,无论与后代元素在第一设备处被修改的时间相比、该后代元素在第二设备处是否在更晚的时间被修改,所述第一文档中的所述后代元素的值、而不是所述第二文档中的所述后代元素的值被包括在所述合并的文档中。
19.一种用计算机程序编码的非暂时性计算机存储介质,该程序包括指令,该指令在由一个或多个数据处理装置执行时,使该数据处理装置执行操作,所述操作包括:
获得第一文档,其包括在第一设备由应用使用的对象的第一层次表示的第一副本,该对象的第一层次表示包括多个元素,每个元素包括键值对,对象的第一层次表示包括第一元素的第一键的第一时间戳,该第一时间戳指示在第一设备修改第一键的第一值的时间,该第一元素在第一层次表示中包括一个或多个后代元素;
获得第二文档,其包括在不同于第一设备的第二设备由应用使用的对象的第二层次表示的第二副本;以及
从第一文档和第二文档生成合并的文档,该合并的文档包括对象中每个键值对的当前值,包括:
至少基于第一键的第一时间戳,确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改;
响应于确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改,在合并的文档中:
对于第一键,包括第一文档中第一键的第一值而不是第二文档中第一键的第一值;以及
对于第一元素的每个后代元素,包括第一文档中后代元素的键的值,而不是在第二文档中后代元素的键的值。
20.根据权利要求19所述的非暂时性计算机存储介质,其中:
第二层次表示包括第二时间戳,该第二时间戳指示在第二设备处修改第一键的第一值的时间;以及
至少基于第一时间戳确定与第一键的第一值在第二设备处被修改的时间相比、第一键的第一值在更晚的时间在第一设备处被修改包括:确定由第一时间戳指示的时间晚于由第二时间戳指示的时间。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/US2017/057524 WO2019078876A1 (en) | 2017-10-20 | 2017-10-20 | CONFLICT RESOLUTION BETWEEN ARBORESCENT STRUCTURE DATA REPLICA |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110678856A CN110678856A (zh) | 2020-01-10 |
CN110678856B true CN110678856B (zh) | 2023-06-27 |
Family
ID=60202481
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201780091398.6A Active CN110678856B (zh) | 2017-10-20 | 2017-10-20 | 调解树结构数据的副本之间的冲突 |
Country Status (4)
Country | Link |
---|---|
US (1) | US11194786B2 (zh) |
EP (1) | EP3612949A1 (zh) |
CN (1) | CN110678856B (zh) |
WO (1) | WO2019078876A1 (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11074401B2 (en) * | 2019-10-23 | 2021-07-27 | Sap Se | Merging delta object notation documents |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101401100A (zh) * | 2006-03-14 | 2009-04-01 | 国际商业机器公司 | 通过确定输入数据中的模式进行数据挖掘 |
CN101908163A (zh) * | 2009-06-05 | 2010-12-08 | 深圳市脑库计算机***有限公司 | 用于政务商务决策的专家支持应用***平台及其建构方法 |
CN102362271A (zh) * | 2009-03-23 | 2012-02-22 | 沃克韦科技美国有限责任公司 | 用于合并在托管的会话***中的会话的编辑的***和方法 |
CN104714999A (zh) * | 2013-12-16 | 2015-06-17 | 国际商业机器公司 | 整合来自多个源的时间感知的数据的***和方法 |
CN106462565A (zh) * | 2014-05-12 | 2017-02-22 | 谷歌公司 | 在文档内更新文本 |
CN106599219A (zh) * | 2016-11-25 | 2017-04-26 | 杭州日阅通讯有限公司 | 一种数字图书交互分享***及其实现方法 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2255047A1 (en) * | 1998-11-30 | 2000-05-30 | Ibm Canada Limited-Ibm Canada Limitee | Comparison of hierarchical structures and merging of differences |
US6457065B1 (en) * | 1999-01-05 | 2002-09-24 | International Business Machines Corporation | Transaction-scoped replication for distributed object systems |
JPWO2006051959A1 (ja) * | 2004-11-12 | 2008-05-29 | 株式会社ジャストシステム | 文書処理装置及び文書処理方法 |
US7778963B2 (en) | 2005-04-26 | 2010-08-17 | Microsoft Corporation | Constraint-based conflict handling for synchronization |
US7657769B2 (en) | 2007-01-08 | 2010-02-02 | Marcy M Scott | N-way synchronization of data |
US8543619B2 (en) * | 2009-09-15 | 2013-09-24 | Oracle International Corporation | Merging XML documents automatically using attributes based comparison |
US20160026455A1 (en) * | 2013-03-08 | 2016-01-28 | Mark Christopher Jeffrey | Systems and methods for managing files in a cloud-based computing environment |
US9722795B2 (en) | 2014-05-20 | 2017-08-01 | Vmware, Inc. | Digitally signing JSON messages |
US10545993B2 (en) | 2015-03-19 | 2020-01-28 | Russell Sullivan | Methods and systems of CRDT arrays in a datanet |
EP3304330A4 (en) | 2015-06-01 | 2018-11-07 | Benjamin Aaron Miller | Content segmentation and time reconciliation |
-
2017
- 2017-10-20 US US16/624,486 patent/US11194786B2/en active Active
- 2017-10-20 WO PCT/US2017/057524 patent/WO2019078876A1/en active Search and Examination
- 2017-10-20 CN CN201780091398.6A patent/CN110678856B/zh active Active
- 2017-10-20 EP EP17793806.5A patent/EP3612949A1/en active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101401100A (zh) * | 2006-03-14 | 2009-04-01 | 国际商业机器公司 | 通过确定输入数据中的模式进行数据挖掘 |
CN102362271A (zh) * | 2009-03-23 | 2012-02-22 | 沃克韦科技美国有限责任公司 | 用于合并在托管的会话***中的会话的编辑的***和方法 |
CN101908163A (zh) * | 2009-06-05 | 2010-12-08 | 深圳市脑库计算机***有限公司 | 用于政务商务决策的专家支持应用***平台及其建构方法 |
CN104714999A (zh) * | 2013-12-16 | 2015-06-17 | 国际商业机器公司 | 整合来自多个源的时间感知的数据的***和方法 |
CN106462565A (zh) * | 2014-05-12 | 2017-02-22 | 谷歌公司 | 在文档内更新文本 |
CN106599219A (zh) * | 2016-11-25 | 2017-04-26 | 杭州日阅通讯有限公司 | 一种数字图书交互分享***及其实现方法 |
Also Published As
Publication number | Publication date |
---|---|
CN110678856A (zh) | 2020-01-10 |
US11194786B2 (en) | 2021-12-07 |
EP3612949A1 (en) | 2020-02-26 |
US20200110738A1 (en) | 2020-04-09 |
WO2019078876A1 (en) | 2019-04-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11956327B2 (en) | Application logging framework | |
Sevilla Ruiz et al. | Inferring versioned schemas from NoSQL databases and its applications | |
Brown et al. | Implementation patterns for microservices architectures | |
US11663498B2 (en) | System and method for generating organizational memory using semantic knowledge graphs | |
US10831986B2 (en) | Generating a document object model (DOM) differential | |
US10387145B1 (en) | Mapping API parameters | |
US11216474B2 (en) | Statistical processing of natural language queries of data sets | |
Daróczi | Mastering data analysis with R | |
CN105389315A (zh) | 一种动态网页更新方法及装置 | |
US11689428B1 (en) | Systems and methods for visualization based on historical network traffic and future projection of infrastructure assets | |
CN107122187A (zh) | 一种业务***异构操作***访问设计方法 | |
US11334601B2 (en) | Unified data model | |
Nelson | Mastering redis | |
Raj | A detailed analysis of nosql and newsql databases for bigdata analytics and distributed computing | |
US10956392B1 (en) | Methods, apparatuses, and computer program products for identifying fields in a data tree | |
CN110678856B (zh) | 调解树结构数据的副本之间的冲突 | |
US20170177686A1 (en) | Property models on mobile devices | |
US9886424B2 (en) | Web application framework for extracting content | |
Zhu et al. | Multiobjective sensor ontology matching technique with user preference metrics | |
US20200372019A1 (en) | System and method for automatic completion of queries using natural language processing and an organizational memory | |
US20230236849A1 (en) | Enterprise application runtime customization and release management | |
US20210397663A1 (en) | Data reduction in a tree data structure for a wireframe | |
Wickham | Practical Java Machine Learning | |
US9135225B2 (en) | Data description injection | |
Mukherjee et al. | Data mining-based hierarchical transaction model for multi-level consistency management in large-scale replicated databases |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |