The disclosure is generally directed to methods and devices for online collaborative document editing and, more particularly, to a method and computing device for maintaining a document outline on a user interface.
Collaborative editing applications allow multiple users to access and edit a document. There are two conventional approaches to collaboration on documents. The first approach uses an application to manage requests to edit a document by checking a document in and out of shared storage, permitting only one user at a time to edit the document.
The second conventional collaborative approach has the master document's owner create a unique copy of that document for each collaborator. Because the collaborators are denied knowledge of others' edits, their respective work quickly results in conflicting changes to the master document. The master document's owner is left with resolving these conflicts. What was to be collaboration diverges into a conflict of edits.
The features and advantages of the disclosure will become more apparent by describing in detail exemplary embodiments thereof with reference to the attached drawings, in which:
As described herein, various embodiments relate to a system and method for efficiently tracking and storing changes made in documents. In an embodiment, the system and method are used to track and store changes made in editable documents, including but not limited to spreadsheets, content in presentations, graphic components in flow charts and diagrams. The system and method are also used to track and store changes made in a document by multiple users.
A document collaboration system may include a server and various client devices or may simply involve a single device or peer-to-peer devices. The document collaboration system may be implemented in a cloud computing environment. In a client-server architecture, a document collaboration editing application may be installed on the server, the client devices, or both. The document collaboration editing application may also be an application that is accessible through a web browser.
The disclosure is generally to directed to methods and a computing device for maintaining a document outline on a user interface. In various embodiments, a computing device: displays the document outline on the user interface; maintains, in a non-transitory computer-readable medium, a causal graph data structure representing the document outline, wherein the causal graph data structure includes a plurality of structure nodes, each structure node representing a level of the document outline; receives, via the user interface, an insertion of a new level to the document outline; in response to the insertion, defines a structure node that represents the inserted level; inserts a transition node in the causal graph data structure, wherein the transition node represents a relationship between the structure node and at least one other node of the causal graph data structure; inserts the structure node into the causal graph data structure as a child of the transition node; and updating the user interface to display the inserted level within the document outline.
The transition node may be inserted as a child of another transition node, which is, itself, a child of the structure node. Alternatively, the transition node may be inserted as a child of the structure node.
The inserted structure node may include things such as text to be displayed as a title for the inserted level, identifiers of any parent nodes, and identifiers of child nodes.
According to an embodiment, the computing device: receives, via the user interface, a deletion of a level of the plurality of levels; in response to the deletion, inserts, in the causal graph data structure, a deletion node as a child of the structure node representing the level for which the deletion was received, wherein the deletion node refers to the level that is to be deleted; and updates the user interface to remove the level for which the deletion was received.
In an embodiment, the computing device: receives, via the user interface, a formatting of a level of the plurality of levels; in response to the formatting, inserts an attribute node as a child of a structure node representing the level for which the formatting was received, wherein the attribute node indicates the type of formatting that is to be applied; apples the formatting to a section of the document within the level being formatted; and updates the user interface to display the updated formatting of the section.
According to an embodiment, the computing device: receives, via the user interface, an input of an undo instruction; in response to the undo instruction, inserts, in the causal graph data structure, a deletion node as a child of the structure node; and updates the user interface to remove the level represented by the structure node.
In various embodiments, the actions carried out by the computing device with respect to the outline as herein described can also be carried out in the context of z-depth levels on a presentation (e.g., on a slide of a presentation) being displayed (e.g., by presentation software).
Various embodiments of the disclosure are implemented in a computer networking environment. Turning to
Residing within the media storage device 108 is a database 108a containing multiple documents, three of which are depicted in
For convenient reference, the first computing device 100 will also be referred to as a “productivity server 100” and the fifth computing device 106 will be also be referred to as a “database server 106.” Although depicted in
In an embodiment, documents maintained on the media storage device 108 may be organized into sections, with each section (e.g., the contents of the section) being maintained in its own separate data structure referred to as a “section entity.” For example, the first document 114 in
According to an embodiment, one or more of the computing devices of
Each of the elements of
The term “local memory” as used herein refers to one or both the memories 154 and 156 (i.e., memory accessible by the processor 152 within the computing device). In some embodiments, the secondary memory 156 is implemented as, or supplemented by an external memory 156A. The media storage device 108 is a possible implementation of the external memory 156A. The processor 152 executes the instructions and uses the data to carry out various procedures including, in some embodiments, the methods described herein, including displaying a graphical user interface 169. The graphical user interface 169 is, according to one embodiment, software that the processor 152 executes to display a report on the display device 160, and which permits a user to make inputs into the report via the user input devices 168.
The computing devices of
Causal tree structures are useful representations of how content and metadata associated with the content are organized. For example, a document may be represented by a single causal tree structure or a bounded set of causal tree structures. The causal tree structure is useful in efficiently tracking and storing changes made in the document. A typical causal tree structure includes nodes of the editing instructions in the document, and each editing instruction has a unique identifier or ID. The editing instructions include, for example, text characters, insertion of text characters, deletion of text characters, formatting instructions, copy and paste, cut and paste, etc. In other words, a causal tree structure is a representation of all the instructions (regardless of type) that compose a document. The causal tree structure starts with a root node, from which all other instruction nodes branch. Except for the root node, each editing instruction in the document is caused by whichever editing instruction that came before it. Every editing instruction is aware of the ID of its parent instruction, i.e., the instruction that “caused” it. In an embodiment, each instruction (other than the root node) in the document may be represented as a 3-tuple: ID (ID of the instruction), CauseID (ID of the parent instruction), and Value (value of the instruction). Example causal tree structures are shown in
When a user changes the text “ape” to “apple” by inserting new characters “p” and “1” between the existing characters “p” and “e” in the causal tree 20, these insertions result in causal tree 21. The causal tree 21 is a modified version of the causal tree 20 and tracks the character insertion instructions as additional nodes of the tree. In the causal tree 21, the instruction to insert a new character “p” is added as the fourth node 204 and is assigned the next available ID, i.e., “4”. The instruction to insert new character “p” also has a CauseID of “3” since its parent instruction is the existing “p” in the text “ape”. The instruction to insert a new character “l” follows the instruction to insert the new character “p”, and the instruction to insert the new character “l” is shown in a fifth node 205. The instruction to insert the new character “l” has an ID of “5”, a CauseID of “4”, and a value of “1”.
As shown in
In an embodiment, sequence of the instructions in a causal tree is determined by the ID of the instructions; the higher the value of the ID the later the node came into existence, since the ID for a node is based on the next available sequential ID in the document. For example, in causal tree 21 the fourth node 204 has the ID of “4” and thus was created after the third node 203 which has the ID of “3”. Nodes or branches sharing the same CauseID are ordered from highest value ID to lowest value ID. For example, in causal tree 21, the fourth node 204 and the third node 203 share the same parent node (the second node 202) and the same CauseID of “2”. Because the ID (“4”) of the fourth node 204 is higher than the ID (“3”) of the third node 203, the fourth node 204 begins the first branch following the second node 202, and the third node 203 begins the second branch following the second node 202. In yet another embodiment, sequence of the branches is determined by a time stamp, where the nodes sharing the same CauseID are ordered from newest node (i.e., created later in time) to oldest node (i.e., created earlier in time).
Using a causal tree structure, every editing instruction in a document is immutable (including deletions), which ensures convergence of the changes at all user sites. As long as sufficient time is allowed for all editing instructions to arrive at all user sites, every user device will be able to construct the same causal tree and the users will be able to view and edit the same revision of document. In an embodiment, the value of the editing instruction may be mutable, however, the ID (e.g., ID of the node containing the editing instruction) is not mutable.
Storing the 3-tuple of every editing instruction in a document, however, requires a lot of memory and network transmission time. To reduce the amount of storage space and network transmission time needed, causal trees are compressed, where tree nodes form long chains with incrementing IDs. Not every ID is stored; only the first ID in each chain is stored. The CauseID may be similarly compressed.
A compression algorithm is applied to uncompressed causal tree 30 resulting in compressed causal tree 30′. In compressed tree 30′, node 301 to 305 with IDs of “1” to “5” are grouped or chained together to form a chain node 301′ for the text “apple”. Nodes 306 to 309 with IDs of “6” to “9” are grouped or chained together to form another chain node 306′ for the text “pine”. In an embodiment, in the compressed causal tree 30′, only the ID of the first node in a chain node is stored. In
A compression algorithm is applied to uncompressed causal tree 40 resulting in compressed causal tree 40′. The compressed causal tree 40′ includes the root node 400. Following the root node 400 is a chain node 401′ for the text “coco”. The chain node 401′ has an ID of “1” (the ID of the first character “c”) and a CauseID of “0” (the ID of the root node 400). The chain node 401′ in turn causes two chain nodes 405′ and 408′. The chain node 405′ has an ID of “5”, a CauseID of “1”, and a Value of “nut”. The chain node 408′ has an ID of “8”, a Cause ID of “1”, and a Value of “del” representing the deletion instruction. In an embodiment, the chain node 408′ includes a length field (“4”), because the chain node 408′ contains four deletion instructions “del”. Instead of removing the text “coco” from the tree, the chain node 408′ modifies the character chain node 401′ so that the system tracks the edit that deleted “coco” from “coconut”.
In compressed causal tree 40′, only three IDs are stored following the root node 400. ID “1” is stored and corresponds to “coco” in chain node 401′. ID “5” is stored and corresponds to “nut” in chain node 405′. ID “8” is stored and correspond to the four deletion instructions “del” in chain node 408′. The chain nodes 405′ and 408′ share the same CauseID of “1”, because “coco” of chain node 401′ is the parent of both chain nodes 405′ and 408′.
Not only can the causal tree structure be used to track and store insertion and deletion of text, it can also be utilized to track and store formatting changes and other metadata changes.
Uncompressed causal tree 50 includes a root node 500 and nodes 501 to 515. Nodes 501 to 506 respectively correspond to the characters in the text “banana”, which has IDs of “1” to “6”. When the text “banana” is bolded, a bold instruction “<b>” is generated for each character node in the text “banana”. In uncompressed causal tree 50, the bold instructions “<b>” span nodes 507 to 512 and have IDs “7” to “12”. Each of the bold instructions “<b>” at character nodes 507 to 512 is caused by a character in the text “banana”. For example, the bold instruction “<b>” at node 507 is caused by the character “b” at node 501. The bold instruction “<b>” at node 507 thus has a CauseID of “1”. Likewise, the bold instruction “<b>” at node 512 is caused by the last “a” at node 506. The bold instruction “<b>” at node 512 thus has a CauseID of “6”.
When the user enters an instruction to delete the bolding of the “ana” portion of the text “banana”, three deletion instructions “del” are generated and added to the uncompressed causal tree 50. The deletion instructions “del” have IDs of “13”, “14”, and “15” and are caused by nodes 510, 511, and 512, respectively, and thus have respective CauseIDs of “10”, “11”, and “12”. A deletion instruction does not remove the characters or instructions from the causal tree; instead, the deletion instruction simply instructs for the deletion or undoing of its respective parent node. In this example, the bold instructions “<b>” at nodes 510, 511, and 512 remain pointing to their respective parent nodes, i.e., nodes 504, 505, and 506, even though the bold instructions “<b>” at nodes 510, 511, and 512 are marked as deleted by the delete instructions “del” at nodes 513, 514, and 515.
When uncompressed causal tree 50 is compressed, the result is the compressed causal tree 50′. The compressed causal tree 50′ includes the root node 500. Following the root node 500 is a chain node 501′ for the text “ban”. The chain node 501′ has an ID of “1” (the ID of the first character “b”) and a CauseID of “0” (the ID of the root node 500). The chain node 501′ in turn causes two chain nodes 504′ and 507′. The chain node 507′ is a formatting chain node and has an ID of “7”, a CauseID of “1”, and a Value of “<b>” representing a bold instruction. In an embodiment, a length field is included in formatting chain node 507′ to indicate that the chain is “3” characters long, i.e., there are three bold instructions “<b>” in the formatting chain node 507′. In other embodiments, however, the length field is omitted from the formatting chain node 507′. The three bold instructions “<b>” in formatting chain node 507′ are caused by the text “ban” in chain node 501′, and the bold instructions “<b>” modify the text “ban” to create the bolded word “ban”.
The chain node 501′ also causes the chain node 504′, which has an ID of “4”, a CauseID of “1”, and a Value of “ana”. The chain node 504′ in turn causes another formatting chain node 510′, which has an ID of “10”, a CauseID of “4”, and a Value of “<b>” representing a bold instruction. A length field in formatting chain node 510′ indicates that the chain is “3” characters long, i.e., there are three bold instructions “<b>” in the formatting chain node 510′. The bold instructions “<b>” in the formatting chain node 510′ modify the text “ana” in the chain node 504′.
When the user enters the instruction to delete the bolding of the characters “ana”, the formatting chain node 510′ causes a chain node 513′. The chain node 513′ includes deletion instructions “del” and has an ID of “13”, a CauseID of “10”, and a Value of “del” representing a delete instruction. A length field in the chain node 513′ indicates that the chain is “3” characters long, i.e., there are three deletion instructions “del” in the chain node. The deletion instructions in the chain node 513′ modify the formatting chain node 510′, i.e., which deletes the bold instructions contained in chain node 510′.
The user experience to unbold the text “ana” may be represented in another syntax, in another embodiment. In one example, it could be a syntax representing bold-ness as a Boolean property e.g., “bold=false”. In another example, it could be a syntax where the unbold is a complementary instruction to “<b>” i.e., “<unb>”.
As shown in
Compressing uncompressed causal tree 52 results in compressed causal tree 52′. When the user enters the “unbold” instruction to unbold the text “ana”, the chain node 510′ causes a chain node 516′. The chain node 516′ includes unbold instructions “<unb>” and has an ID of “13”, a CauseID of “10”, and a Value of “<unb>” representing an unbold instruction. The instructions in the chain node 516′ modify the chain node 510′, i.e., which unbolds the text “ana” (chain node 504′) that was previously bolded by chain node 510′.
Furthermore, although delete instruction (from the perspective of the system) or an undo instruction (from the perspective of the user) is applied to a bold instruction in
In
User A bolds “pineapple lime”, resulting in causal tree 61 based on User A's edits. The causal tree 61 includes the root node 600 and chain nodes 601a, 615, and 623. Chain node 601a is a character chain node and has an ID of “1”, a CauseID of “0”, and a Value of “pineapple lime”. Character chain node 601a in turn causes chain nodes 615 and 623. Chain node 615 is also a character chain node and has an ID of “15”, a CauseID of “1”, and a Value of “_coconut” (a space plus the characters in the text “coconut”). As used in
User B italicizes “lime coconut”, resulting in causal tree 62 based on user B's edits. The causal tree 62 includes the root node 600 and chain nodes 601b, 611, and 637. Chain node 601b is a character chain node has an ID of “1”, a CauseID of “0”, and a Value of “pineapple_” (the characters in the text “pineapple” plus a space). Character chain node 601b in turn causes another character chain node 611. Character chain node 611 has an ID of “11”, a CauseID of “1”, and a Value of “lime coconut”. Character chain node 611 causes formatting chain node 637, which has a ID of “37”, a CauseID of “11”, and a Value of “<i>” representing an italicize instruction. In the present embodiment, a length field in the formatting chain node 637 indicates that the chain is 12 characters long, i.e., the twelve italicize instructions “<i>” in the formatting chain node 637 apply to twelve characters. The italicize instructions “<i>” in formatting chain node 637 modify the text “lime coconut” in the character chain node 611. In other embodiments, however, the length field is omitted from the chain node 637.
In an embodiment, User A and User B are editing the document simultaneously, or almost simultaneously. When the edits made by User A and User B are transmitted to the server, the edits are incorporated into a single causal tree 63 as shown in
In more detail, causal tree 63 includes the root node 600 and several subsequent chain nodes. Immediately following the root node 600 is the character chain node 601b, which has an ID of “1”, a CauseID of “0”, and a Value of “pineapple_” (the characters in the text “pineapple” plus a space). Character chain node 601b in turn causes two chain nodes 611 and 623a. Chain node 623a is a formatting chain node and has an ID of “23”, a CauseID of “1”, a Value of “<b>”, and a length of 10 corresponding to the number of characters in the text “pineapple” in character chain node 601b. Formatting chain node 623a is a bold instruction to modify the text “pineapple_” (the characters in the text “pineapple” plus a space) in chain node 601b. Formatting chain node 623a is a portion of formatting chain node 623 in causal tree 61, which corresponds to the edits made by User A.
Character chain node 611 is also caused by chain node 601b. Character chain node 611b has an ID of “11”, a CauseID of “1”, and a Value of “lime”. In turn, character chain node 611b causes two formatting chain nodes 633 and 637b and another character chain node 615. Formatting chain node 633 has an ID of “33”, a CauseID of “11”, a value of “<b>”, and a length of 4 corresponding to the number of characters in the text “lime”. Formatting chain node 633 is a bold instruction to modify the text “lime” in the character chain node 611. Formatting chain node 633 is also a portion of the formatting chain node 623 in causal tree 61. Together, formatting chain nodes 623a and 633 correspond to the edits made by User A.
Character chain node 611b also causes formatting chain node 637b. Formatting chain node 637b has an ID of “37”, a CauseID of “11”, a Value of “<i>” representing an italicize instruction and a length of 4 corresponding to the number of characters in the text “lime”. Formatting chain node 637b is an italicize instruction to modify the text “lime” in the character chain node 611b. Formatting chain node 637b is a portion of the formatting chain node 637, which corresponds to the edits made by User B in the causal tree 62.
Character chain node 615 is caused by character chain node 611b. Character chain node 615 has a ID of “15”, a CauseID of “11”, and a Value of “_coconut” (a space plus the characters in the text “coconut”). Character chain node 615 causes formatting chain node 641, which has an ID of “41”, a CauseID of “15”, a Value of “<i>”, and a length of 8 corresponding to the number of characters in “coconut”. Formatting chain node 641 is an italicize instruction to modify the text “_coconut” (a space plus the characters in the text “coconut”) in the character chain 615. Together, formatting chain node 637b and 641 corresponds to the edits made by User B in formatting chain node 637 in the causal tree 62.
The syntax of the causal tree structure 720 will be explained in more detail. In the causal tree structure 720, a chain node or a branch of the causal tree structure is represented as “#<site ID>:<stamp> [Value]”. In
In an embodiment, an instruction ID of the chain node includes a combination of the site ID and the stamp. For example, in
Although the instruction IDs in the present embodiment is generated at the client devices, in other embodiments, the instruction ID is generated by the server. In still other embodiments, the instruction ID may include a time stamp, which indicates the time at which the instruction is entered by the user.
In an embodiment, the site ID is used to identify the user, such that each user has a unique site ID. In various embodiments, each user is assigned the next available site ID when the user begins an editing session. For example, User A is assigned #1 as a site ID for a first editing session. When User A leaves the first editing session and begins a second editing session during which time User B is already editing the document, User A is assigned #2 as site ID for the second editing session while User B is assigned #1 as the site ID. In other embodiments, however, the site ID is not user session-specific and may be persistent for each user.
In various embodiments, the site ID is useful to resolve conflicts that may arise when edits from different users arrive simultaneously at the server (i.e., serves a tie-breaking function). In an embodiment, User A makes an edit to the document and User B also makes an edit to the document. User A's editing instruction is assigned a first instruction ID, a combination of User A's site ID and the next available stamp value. User B's editing instruction is assigned a second instruction ID, a combination of User B's site ID and the next available stamp value. In one scenario, User A's edit instruction and User B's edit instruction are assigned the same stamp value (due to network latency) and the instructions are received by the server at the same time. To resolve such conflict, the server processes the editing instruction with a lower site ID first. For instance, if User A is assigned site ID #1 and User B is assigned site ID #2, then the server will process User A's editing instructions prior to processing User B's editing instructions. In other embodiments, however, the user editing instruction associated with a higher site ID may take priority.
In other embodiments in which the instruction IDs include time stamps, the time stamp may be used (in place of or in addition to the site ID) to resolve conflicts that may arise when edits from different users arrive simultaneously at the server. As the time stamps are generated at the client devices when the users enters the edit, a user instruction associated with an earlier time stamp may take priority over a user instruction associated with a later time stamp, such that the user instruction associated with the earlier time stamp is processed first.
Character chain node “to the” is also caused by the “Hello” character chain node. The character chain node “to the” has an instruction ID of “#1:7” (site ID=1 and stamp=7). Two formatting chain nodes follow “to the” character chain node. Formatting chain node 822b has an instruction ID of “#1:26” (site ID=1 and stamp=26) and is a bold instruction, which indicates that “to the” has been bolded. Formatting chain node 822c has an instruction ID of “#1:32” (site ID=1 and stamp=32) and is an italicize instruction, which indicates that “to the” has been italicized. Both formatting chain nodes 822b and 822c are caused by the character chain node “to the”.
Character chain node “World!” (a space plus the text “World!”) is caused by character chain node “to the”. The character chain node “World!” has an instruction ID of “#1:13” (site ID=1 and stamp=13). A formatting chain node 822d follows the character chain node “World!”. Formatting chain node 822d has an instruction ID of “#1:38” (site ID=1 and stamp=13) and is an italicize instruction, which indicates that “World!” has been italicized. Formatting chain node 822d is caused by the character chain node “World!”.
Although the instruction IDs in the embodiments of
In various embodiments, a causal tree is restructured into smaller, even-sized branches. If a tree is unbalanced, then the restructured or rebalanced tree contains more branches than the original tree in an embodiment. Depending on the editing instructions, the restructured or rebalanced tree may contain less branches than the original tree. The branches make it easier for the system to support the client-server architecture where the server has the whole document, and the client device only needs the part actively used by the client device. This way, rather than transmitting the entire tree to a client device, only the branches that are needed by a user are sent to that user's client device. Furthermore, transmitting just the necessary branches, which are smaller than the entire tree structure, reduces transmission time when sent from the server to the client device, reduces processing time on the client device, and decreases the horsepower requirements of the client device. This is particularly useful when the client device is a mobile phone, tablet, or other handheld device that may have lower computational power.
Referring to
When a rebalancing algorithm is applied to the causal tree 90, a rebalanced tree 90′ is generated. The rebalanced tree 90′ includes the root node 900. Two subroot nodes 900a and 900b are generated. Subroot node 900a has an ID of “1,000,000,002” and subroot node 900b has an ID of “1,000,000,001”. Subroot nodes 900a and 900b are invisible nodes, i.e., they are not visible to the user when the document is composed. Character nodes 901 to 906 follow subroot node 900a, and character node 901 is caused by subroot node 900a. Instead of following character node 906, character nodes 907 to 912 now form a second branch in the rebalanced tree 90′. Character node 907 is now caused by subroot node 900b and its CauseID is changed from 6 to 1,000,000,001. Although the CauseID of character node 907 is modified, the ID of character node 907 remains the unchanged. As shown in
The rebalancing algorithm generates the invisible subroot nodes to allow redistribution of nodes in the causal tree. The invisible subroot nodes also preserve the proper traversal order of the nodes in the causal tree. For example, in rebalanced tree 90′, because the ID of subroot node 900a is greater than the ID of subroot node 900b, the branch beginning with subroot node 900a (character nodes 901 to 906) is traversed before the branch beginning with subroot node 900b (character nodes 907 to 912). In other embodiments, however, the ID of subroot node 900a may be less than the ID of subroot node 900b, and the branch beginning with subroot node 900a is traversed before the branch beginning with subroot 900b.
In still other embodiments, subroot nodes are not generated. Instead, an additional identifier is added to the first node in each branch of the rebalanced tree to indicate the order in which the branches of the rebalanced causal tree should be traversed.
This example, though trivial in size, illustrates what happens with a much larger document. Many business documents number in the hundreds of pages; some, in the thousands of pages. Due to limited display space on computer devices a user may only need to display no more than 4 pages at a time. Rather than transmitting the entire causal tree representing the thousands of pages and having a client device, especially a mobile device with limited computational power, work through pagination, the server can perform pagination, rebalancing the causal tree into branches appropriately limited in size to what can be displayed on the client device. The server then sends only the branch that represents the content to be displayed on the client device.
In various embodiments, only the ID (shown as the instruction ID in the causal tree structures in
Other example instructions that are suitable for a causal tree structure include the copy and paste instruction and the cut and paste instruction. Regarding the copy and paste instruction, the branches and/or nodes that are associated with the copied content are duplicated into new branches and/or nodes. The new branches and/or nodes have a different CauseID than the original branches and/or nodes, depending on where the copied content is pasted. Regarding the cut and paste instruction, prior to creating the duplicate branches and/or nodes, delete instruction nodes are added to follow the original branches and/or nodes.
A causal tree may be used to represent content other than a conventional computer document. In an embodiment a causal tree may be created for every cell in a spreadsheet to provide the benefits of tracking changes to a cell's value over time, provide for visual formatting on individual characters in that cell, control over access to the value, or other cell and character-specific capabilities as represented in the causal tree of that cell. In one embodiment it could be used to track changes to a formula that generates a cell's value.
In another embodiment, a causal tree is created for a spreadsheet with each cell being a branch of that spreadsheet. For example,
Referring to
In the present embodiment, the formula “=SUM(A8:A12)” is moved from cell A13 to B13. With this edit, a delete instruction “del” is added after the location node 1101 as node 1107. Node 1107 has an ID of “49”, which is the next available ID in the causal tree structure. Another location node 1108 is added. The location node 1108 is caused by the cell subroot node 1100 and has an ID of “50.” The location node 1108 indicates that the location of the formula is now in cell “B13”.
In
The edits with respect to the text of the formula is reflected in the casual tree branch beginning with the node 1106. The node 1106 has an ID of “48” and indicates that the unedited portion of the formula is “=SUM(A8:A1”. The node 1106 causes nodes 1111, 1112, and 1114. Node 1111 has an ID of “53”, indicates that it follows node 1106, and a value of “2”. A delete instruction node 1113 is generated following node 1111 because “2” is deleted from the formula. The delete instruction node 1113 has an ID of “55,” indicates that it follows node 1111 and a value of “del” indicating the delete instruction. Node 1112 follows the node 1106 and has an ID of 54 and a value of “)”. The “0” added to the formula is indicated in node 1114, which follows the node 1106. Node 1114 has an ID of “56” and a value of “0”.
As noted earlier, the value or instruction of a node is not restricted by the causal tree, but rather only by the syntax understood by an application that processes and interprets the value or instruction. For example, the i18n character set can be represented without an impact on the causal tree; the application that interprets it does need to know how to interpret the values.
At 1202, the productivity server 100 stores, on a database of the productivity server 100 or on the database server 110, a causal tree structure (e.g., a data structure) corresponding to a document. The document may be stored on the database of the productivity server 100 or the database server 110. The causal tree structure includes a sequence of editing instructions, and each editing instruction is assigned an identifier unique to such editing instruction. In an embodiment, the identifiers of the editing instructions in the causal tree structure are assigned by client devices when these edit instructions are received by the client devices (e.g., when the editing instructions are entered by a user). In other embodiments, for example when an editing instruction is too large for a client device to process, upon receiving the editing instruction, the server assigns the editing instruction an identifier and processes and applies the editing instruction to the causal tree structure maintained by the server. In still other embodiments, the causal tree structure contains server-generated instructions (e.g., creation of a document, re-balance of the causal tree structure, or externally updated link content), and these server-generated instructions are assigned identifiers by the server.
At 1204, the productivity server 100 receives, via its network interface 140, a user editing instruction for the document, where the user editing instruction is assigned an identifier unique to the user editing instruction. In an embodiment, the identifier unique to the user editing instruction is assigned by the client device after receiving the user editing instruction. Then at 1206, the productivity server 100 stores, via its processor 130, the user editing instruction and the identifier assigned to the user editing instruction as an additional node to the causal tree structure. At 1208, the productivity server 100 broadcasts, to a plurality of client devices (e.g., client devices 104, 106, and 108) connected to the productivity server 100, the user editing instruction and the identifier assigned to the user editing instruction.
In an embodiment, the identifier assigned to the user editing instruction may include a site identifier and a stamp. The site identifier is unique to an editing session of the user at a client device. The stamp is a numeric value (e.g., an integer value) based on identifiers assigned to editing instructions in the causal tree structure. In an embodiment, the stamp represents temporal relativeness to all other identifiers in the same causal tree structure, which allows the determination of the history of edits to the document. In some embodiments, the number of editing instructions in the causal tree may be reduced but the identifiers will continue to increment.
In still another embodiment, the identifier assigned to the user editing instruction may further include a cause identifier, where the cause identifier is an identifier of a prior editing instruction in a node in the causal tree structure that precedes the additional node.
In yet another embodiment, the document may be composed by traversing identifiers of the editing instructions in a sequential order (e.g., in an ascending or descending order).
In still other embodiments, the user editing instruction may include an instruction to modify a series of consecutive data in the document. The series of consecutive data, for example, may be a string of characters that is inserted or deleted by the user.
In an embodiment, each editing instruction in the causal tree structure may include at least one instruction selected from the group consisting of a modification of a value, a modification of metadata, a link to another node of the causal tree structure, a link to a node in another causal tree structure corresponding to another document, a link to the other causal tree, and a link to data residing outside the causal tree structure.
In another embodiment, the causal tree structure may include an editing instruction that is assigned a cause identifier. The causal tree structure may further include a second editing instruction that is assigned the same cause identifier as the editing instruction. The editing instruction and the second editing instruction may form separate branches of the causal tree structure.
At 1302, the client device 104 receives, from the productivity server 100 or the database server 110, at least a portion of a causal tree structure corresponding to a document. The client device 104 may receive the portion of a causal tree structure in response to a user request to access, view, and/or edit the corresponding portion of the document. The causal tree structure is stored on the database server 110 (or a database of the productivity server 100) and includes a sequence of editing instructions. Each editing instruction is assigned an identifier unique to such editing instruction.
At 1304, the client device 104 stores the received portion of the causal tree structure in its memory. At 1306, the client device 104 receives a user editing instruction for the document input by a user. At 1308, the client device 104 assigns, using its processor 130, an identifier to the user editing instruction.
At 1310, the client device 104 transmits, to the productivity server 100, the user editing instruction and the identifier assigned to the user editing instruction. At 1312, the client device 104 receives, from the productivity server 100, another user editing instruction for the document and an identifier assigned to the other user editing instruction. In an embodiment, the other user editing instruction is an instruction transmitted to the productivity server 100 by another client device (e.g., client device 106) from another user who is collaboratively editing the same document.
At 1314, the client device 104 stores the user editing instruction and the identifier assigned to the user instruction, and the received other user editing instruction and the received identifier as additional nodes to the portion of the causal tree structure stored on the client device 104. At 1316, the client device 104 processes and renders the user editing instruction and the received other user instruction, e.g., display edits to the document made by the user of client device 104 and the user of client device 106.
In an embodiment, the client device 104 assigns the identifier to the user editing instruction by assigning a site identifier and a stamp. The site identifier is unique to the user's editing session on the client device 104. The stamp is a numeric value (e.g., an integer value) based on identifiers assigned to editing instructions in the causal tree structure stored on the server.
In various embodiments, the client device 104 maintains a “maxStamp” numeric counter. When the client device 104 needs to generate or assign an identifier to a user editing instruction, the client device 104 increments maxStamp and sets the stamp of the identifier to the new maxStamp value. When the client device 104 receives editing instructions from the network or the productivity server 100, the client device 104 sets the maxStamp to the largest-seen stamp for the incoming editing instruction. This process ensures that when the client device 104 generates an identifier, that identifier's stamp will be larger than any stamp the client device 104 has yet seen.
In still other embodiments, the client device 104 further assigns a cause identifier as a part of the identifier of the user editing instruction. The cause identifier is an identifier of a prior editing instruction in the causal tree structure that precedes the additional node in which the user editing instruction resides.
In an embodiment, the client device 104 composes (e.g., processes and renders) the document by traversing identifiers of the editing instructions in the portion of the causal tree structure in a sequential order.
In various embodiments, the user editing instruction may include an instruction to modify a series of consecutive data in the document.
In an embodiment, the user editing instruction of the client device 104 and the other user editing instruction of the client device 106 may share a cause identifier, where the cause identifier is an identifier of a prior editing instruction in the causal tree structure that precedes both the user editing instruction and the other user editing instruction.
In still another embodiment, the client device 104 receives a next user editing instruction, and assigns an identifier to the next user editing instruction based on the identifier assigned to the user instruction and the identifier assigned to the other user instruction.
At 1402, the productivity server 100 stores, on a database of the productivity server 100 or the database server 110, a causal tree structure corresponding to a document. The causal tree structure includes a sequence of editing instructions and each editing instruction is assigned an identifier unique to such editing instruction. At 1404, the productivity server 1404 receives a first user editing instruction transmitted by a first client device (e.g., client device 104) and a second user editing instruction transmitted by a second client device (e.g., client device 106). The first user editing instruction is assigned a first identifier (e.g., by the first client device) and the second user editing instruction is assigned a second identifier (e.g., by the second client device). At 1406, the productivity server 100 stores, via its processor 130, the first user editing instruction and the first identifier as a first additional node to the causal tree structure, and stores the second user editing instruction and the second identifier as a second additional node to the causal tree structure.
At 1408, the productivity server 100 transmits, to the first client device, the second user editing instruction and the second identifier, to render changes to the document corresponding to the first user editing instruction and the second user editing instruction. At 1410, the productivity server 100 transmits, to the second client device, the first user editing instruction and the first identifier, to render changes to the document corresponding to the first user editing instruction and the second user editing instruction.
According to the method 1400, if both the first user and the second user are editing the same portion of the document, both users' editing instructions are used to update the causal tree structure stored on the server and the copies of the causal tree structure (or copies of a branch of the causal tree structure) at the users' client devices. This ensures that the user edits converges and that both users are editing the same revision of the document.
In an embodiment, the first identifier may include a first site identifier unique to a first user's editing session on the first client device, and a first stamp, which is a numeric value (e.g., an integer value) based on identifiers assigned to editing instructions in the causal tree structure. The second identifier may include a second site identifier unique to a second user's editing session on the second client device, and a second stamp, which is a numeric value (e.g., an integer value) based on identifiers assigned to editing instructions in the causal tree structure.
In another embodiment, the first identifier may further include a first cause identifier, which is an identifier of a prior editing instruction in the causal tree structure that precedes the first user editing instruction. The second identifier may further include a second cause identifier, which is an identifier of a prior editing instruction in the causal tree structure that precedes the second user editing instruction.
In an embodiment where the first cause identifier and the second cause identifier are the same, the productivity server 100 compares the first stamp and the second stamp. If the first stamp is greater than the second stamp, the productivity server 100 processes the first user editing instruction before processing the second user editing instruction. If the first stamp is less than the second stamp, the productivity server 100 processes the second user editing instruction before processing the first user editing instruction.
In still another embodiment, when the first user editing instruction and the second user editing instruction are received by the productivity server 100 simultaneously, the productivity server 100 compares the first site identifier and the second site identifier. If the first site identifier is less than the second site identifier, the productivity server 100 processes the first user editing instruction before processing the second user editing instruction. If the first site identifier is greater than the second site identifier, the productivity server processes the second user editing instruction before processing the second user editing instruction.
In still another embodiment, the first identifier may include a first time stamp and the second identifier may include a second time stamp. The productivity server 100 compares the first time stamp and the second time stamp. If the first time stamp has an earlier time than the second time stamp, the productivity server 100 processes the first user editing instruction before processing the second user editing instruction. If the first time stamp has a later time than the second time stamp, the productivity server 100 processes the second user editing instruction before processing the first user editing instruction.
At 1502, the productivity server 100 stores, on a database of the productivity server 100 or the database server 110, a causal tree structure corresponding to a document. The causal tree structure includes a sequence of editing instructions and each editing instruction is assigned an identifier unique to such editing instruction. At 1504, the productivity server 100 divides, using its processor 130, the causal tree structure into a plurality of branches, where each branch has about the same number of editing instructions.
At 1506, the productivity server 100 receives a user editing instruction for the document, where the user editing instruction is assigned an identifier unique to the user editing instruction. At 1508, the productivity server 100 stores the user editing instruction and the identifier assigned to the user editing instruction as an additional node to a first branch of the causal tree structure. At 1510, the productivity server 100 broadcasts, to a plurality of client devices connected to the server, the user editing instruction and the identifier assigned to the user editing instruction.
In an embodiment, the productivity server 100 compares a number of editing instructions in the first branch of the causal tree structure to a predetermined number. If the number of editing instructions in the first branch exceeds the predetermined number, the productivity server 100 re-divides (e.g., re-balances) the causal tree structure into a second plurality of branches having about the same number of editing instructions.
In another embodiment, the productivity server 100 re-divides the causal tree structure when all user sessions to edit the document are terminated.
In yet another embodiment, the productivity server 100 temporarily suspend all user sessions to edit the document when re-dividing or re-balancing the causal tree structure.
In an embodiment, the re-divided causal tree structure may have a different number of branches than the causal tree structure.
In still another embodiment, the identifier assigned to each editing instruction may include an instruction identifier and a cause identifier. The productivity server 100 re-divides the causal tree structure by modifying cause identifiers of first editing instructions in the second plurality of branches without modifying the instruction identifiers of the first editing instructions.
In various embodiments, the causal tree structure also may be used to represent other metadata such as for use in formatting rendering of the data, or for capturing semantic information. It may contain metadata useful for other purposes such as for generating footnotes or even other documents in other data formats such as HTML, XML, XBRL, and iXBRL. In another embodiment, characters may represent data used to control access to the CauseID supporting such features as redacting content. The causal tree structure can be extended and adapted to all kinds of documents.
In still other embodiment, the causal tree structure may be used to represent various types of documents and objects such as a presentation or structured drawing. For instance, a presentation may include object of various types, e.g., text object, spreadsheet/table object, images. In an embodiment, each object may have its own causal tree structure. In another embodiment, each object may be a branch in causal tree structure for the presentation. The layout of these objects and the relationship between them may also be captured by the causal tree. In yet other embodiments, the causal tree may be used to link objects in different documents together. In still other embodiments, a node of a causal tree in one document may be a link to another separate and unrelated causal tree in another document. In other words, a causal tree may include an instruction that refers to nodes and branches of another causal tree or an entire other causal tree.
According to an embodiment, the causal tree data structure is implemented as a “commutative replicated data type” (CRDT). A CRDT is a replicated data structure that is inherently commutative: it allows edits to be applied to it in any order to produce the same result. A causal tree CRDT has several advantages for real-time collaborative distributed document editing, such as consistency, efficiency, interactivity, and respect for user intention.
A causal tree CRDT is a sequence CRDT designed to represent an eventually consistent list of atoms. The list of atoms is represented by a tree of vertices or nodes (vertices and nodes are used interchangeably herein). Edits carry the changes in vertices from one site with a replica of the data structure to another. When a site receives edits from another site, the edits are performed. Regardless of the order the edits are performed in, consistency will eventually be reached.
Each vertex or node in a causal tree CRDT has a globally unique id, written #s:t, where s is an integer identifying a site, and t is a logical timestamp that monotonically increases at each site. The site identifier is unique per site at any moment such that each site will produce unique ids. The site ids can be tied to additional information to represent authorship, e.g., a site id may represent a user or client device in various embodiments. When edits from another site are received, the timestamp for the site is updated to the maximum timestamp. Vertex ids have a global “younger” order where larger timestamps are younger, with ties resolved by the site id. Formally, if a and b are vertex ids, a>b∝a:t>b:t∨a:t=b:t∧a:s>b:s″.
Each vertex or node in the tree contains a list of children sorted by the identifiers, youngest to oldest. These children were “caused” by the parent vertex. Each edit carries the identifier of the new vertex and the cause identifier so that the new vertex gets added to the correct list. If a cause cannot be found, the edit is pended until the cause has been added to the data structure.
In an embodiment, to carry out more computationally complex tasks such as driving document outlines for large collaborative documents, an ordered tree CRDT (which will also be referred to herein as a “causal graph”) may be used. The causal graph is itself an extension of the causal tree CRDT: just as the causal tree uses an internal tree to implement a sequence CRDT, the causal graph uses an internal digraph to implement a hierarchy-of-sequences (ordered tree) CRDT. This combination creates an effective foundation for collaboratively editing large documents (e.g., a document upwards of 7,000 pages in size with 1,000 sections and 1,200 embedded objects). Put another way, a causal graph (as used herein) is an ensemble of causal subtrees, each one representing the ordered parent/child relationship between levels of nodes in an ordered tree hierarchy. Taken together this forms a digraph where the edges are causal connections and vertices are node and transition objects. Moving content from one location to another in the causal graph involves inserting a new transition in the appropriate causal tree (i.e., in the appropriate causal subtree).
As used herein, a causal graph is append-only, with all mutating operations adding new vertices to the graph. In this way the causal graph contains a record of all its historical states. Producing an ordered tree from the causal graph involves a traversal of the structure, iterating through selected edges to determine which nodes are “active” (not deleted) and their hierarchy and order positioning in the current document state.
Unlike a causal tree, where the structural relationship among data atoms is maintained entirely in the causal edges between graph vertices, a causal graph differentiates between node and transition vertices, with causal edges connecting both types, and has a more complex graph topology. This distinction allows for the original node to stay within the graph be moved as many times as necessary by adding transitions to it.
Turning to
A possible implementation of the traversal as an ordered tree algorithm (also referred to herein as the Output Outline procedure) is as follows:
Delete(target) inserts a deletion vertex (a tombstone) causally linked to the target. All vertex types—including other deletions—can be deleted. In
Move(target, cause, after) could delete the existing node and insert a new one, but two or more simultaneous moves could unnecessarily duplicate large branch copies and yield an undesirable tree shape. Instead, move inserts a newer transition vertex representing the new location for the target node. During ordered-tree traversal of the causal graph the newer transition supersedes any older ones, respecting users' edit intentions. Turning to
In practice, the nature of collaborative editing means it's possible for edits to take place “simultaneously” as far the converged causal graph state can tell. Consider the situation in
An effective resolution to these cycles in the graph will produce an ordered tree that preserves commutativity while ideally also respecting user intentions. In an embodiment, the point in the above-described procedure marked add cycle resolution is carried out (e.g., by the computing device) as follows:
A possible implementation of the cycle resolution as a graph traversal algorithm (also referred to herein as the Loop Resolution procedure) is as follows:
While setting the transitions in the Flat-tree Node List (FNL), if inserting a transition leads to the formation of a cycle, the oldest transition in the cycle is replaced with the next-older transition not causing a cycle. If no such transition is available, the next-oldest transition in the cycle is checked for a replacement, and so on. The search is guaranteed to terminate as the FNL has no cycles before inserting each transition, and ultimately any new transition could be rejected to preserve that. By disregarding older transitions to resolve cycles, user intentions are better respected as new move operations are appended.
A slightly more involved situation is shown in
In an embodiment, to be a practical data structure, the causal graph supports some additional operations, such as format and undo/redo. A format(target, key, value) operation involves another vertex type attribute, which associates key/value metadata with nodes. Attributes represent various properties that can be set on an element such as a document section name or visibility. Attribute vertices can be causally connected to nodes and can be deleted. The newest non-deleted format in a set of formats with the same key on the same node will be active and the rest inactive.
While undo(target) and redo(target) are treated as distinct operations a user may perform, in the data structure they are implemented as delete vertices on whatever edit vertex was undone or redone. This works as an undo of a deletion of a node appears as a deletion of that deletion, rendering the node undeleted. Formats and deletions can be deleted and undeleted in the same way.
Using this causal graph to support a document outline is straightforward: each node vertex represents a document section, with an attribute vertex storing the unique key identifying its section contents. Other formats store section titles, formatting properties like page margins or numbering style, etc. The ordered-tree traversal described above produces an outline structure for the current state of the document.
According to various embodiments, changes to a causal graph can be represented by different types of nodes. The use of structure nodes, transition nodes, deletion nodes, and attribute nodes will be described in the following sections. As will be shown, transition nodes help to facilitate changes. For example, by using transition nodes, moving a node representing a section of a document involves appending only one node to the causal graph data structure (the transition). Without a transition node, such a move would involve appending: (1) a deletion on the original, (2) a new structure node (section node), and (3) new attribute nodes copying all of the formats from the original. Put another way, using transition nodes provides an advantage in terms of space efficiency (i.e., less network storage needed) and network transmission efficiency (i.e., requires less bandwidth to execute). This allows collaboration without potentially ending up with duplicate parts of branches that could occur if, for example, two or more users were executing moves at the same time. In such case, both would delete the same original then create their own copies, resulting in duplicates. Using transition nodes makes such duplication impossible, since to resolve two or more users inserting transitions is as simple as sorting the transitions and determining which one is the currently active one that should be honored. The transitions make outlines and slides have superior collaboration while using less memory. A simple undo/redo/delete of a transition is also provided.
Additional technical advantages of using a causal graph as described herein include providing the ability to create much larger documents using a collaborative outline. The outline orders the collaborative rich-text to provide larger documents since only part of the document has to be loaded depending on what a user is looking at. At the same time, the outline is highly collaborative and allows for real-time modifications, e.g., the outline can be changed and the user sees those changes right away. The user's changes will be honored unless overwritten/undone by a user, whereas if this required the server to respond right away (in the non-causal graph approach) changes would take longer to be shown and two users changing two different things in the outline may result in one of the user's changes not taking effect.
Yet another technical advantage of using a causal graph is that this data structure can be used in multiple locations. For example, in the context of a slide presentation, it be for used for the outline of the presentation and for each individual slide as well. The order of the items on a slide (z-order/depth-order) may, for example, be based on the order of the nodes in the causal graph. The causal graph implementation described herein also provides a simple way to group items, sub-group items while inside a group, and order items while inside a group. Each slide (just like the outline) may be highly collaborative and show results in real-time without the delay of having to communicate with the server (although the changes will need to get to the server to be stored eventually, the changes are first applied on the client before being applied to the server).
Still another technical advantage of using a causal graph is that it facilitates an edge computing model in that most of the work is done on the client side (the user's computer) for determining the changes that need to be applied. The same data structure is used on all the user's machines and the server acts like a passive customer. The server runs the same data structure as the clients so it can apply the changes the same way one user will apply changes from a different user. This means the code only has to be written once to work on both sides.
Turning to
In an embodiment, the outline entity is a causal graph that includes one or more nodes. Types of nodes that may be used include (1) a structure node, which represents part of a hierarchical structure, such as a level (e.g., a section) of a document outline; (2) a transition node, which represents a relationship between two structure nodes; (3) a deletion node, which represents a deletion of a node; and (4) an attribute node, which represents custom information for a node.
Turning to
Turning to
Turning to
Turning to
Turning to
Turning to
Add a new Node directly under the Root
Turning to
Add a new Node before A under the Root
Turning to
Add a new Node after A under the Root
Turning to
Add a new Node directly under the A
Turning to
Add a Delete to Node A
Turning to
Add a Delete to Node A
In an embodiment, a Deletion may not be added to a Root Node. Thus, if the computing device attempts to add a Deletion to the Root Node (e.g., DeleteNode(#0:0)), a special case check may be implemented to enforce this prohibition.
Turning to
Add a Format to Node A
Turning to
Add another Format to Node A
Turning to
Add another Format to Node A
Turning to
Move Node B to after A under the Root
Turning to
Move Node D directly under Node B
Turning to
Undo inserting a new Node, add a Deletion to the Node
Turning to
Undo a deletion, add a Deletion to the Deletion
Turning to
Deletion #1:3. Deletion #1:3 checks with its newest deletion which is Deletion #1:5. Deletion #1:5 checks with its newest deletion which is Deletion #1:6. Deletion #1:6 has no deletions so it should be honored, which means Deletion #1:5 should be ignored. Since Deletion #1:5 is ignored, Deletion #1:3 checks with the next newest deletion, Deletion #1:4, which has no deletions indicating it should be honored. Since Deletion #1:3 has at least one honored deletion, Deletion #1:3 should be ignored. #1:1 is therefore rendered.
Turning to
Undo a Move, add a Deletion to #1:5
Turning to
Undo a format or add a Deletion to the Format
Turning to
Turning to
Turning to
To traverse the tree according to an embodiment, the computing device, using the resulting Transition list, walks the tree outputting the Nodes into the outline. The computing device in this embodiment only takes transitions to their End Node when they show up in the Transition list. The Transition list can be grouped using their Start Nodes and sorted by causal-identifier to make checking for a Transition in the list much faster.
To walk the tree in an embodiment, the computing device takes the newest child Transition that is in the list and does a full depth first tree traversal, keeping a stack of Nodes to speed up the process.
More specifically, in an embodiment, the computing device: (1) generates an Output #0:0 Root and pushes it on a Node stack; (2) follows Transition #1:4 because it's in the Transition list; outputs #1:3 B as a child of the Node on the top of the Node stack, i.e., #0:0; (3) pushes #1:3 B on to stack; (4) follows Transition #1:9; (5) outputs #1:7 D as child of #1:3 B and pushes #1:7 D onto stack; (6) #1:7 D has no children so the computing device pops it off stack and returns to Transition #1:9; (7) Transition #1:9 has no children so the computing device returns to #1:3 B; (7) #1:3 B has no children so the computing device pops it off the stack and returns to #0:0 Root; (8) the computing device follows Transition #1:2; (9) outputs #1:1 A as a child of #0:0 Root; (9) ignores Transition #1:8 because it is not in the Transition list; (10) pops #1:1 A off stack; (11) follows Transition #1:6; (12) outputs #1:5 C as a child of #0:0 Root; (13) pops, pops, pops, and is done. The resulting Outline Output is shown in
Turning to
Turning to
Turning to
In the first example, a first computing device receives the request MoveNode(#1:3, #1:1) from a second computing device and receives the request MoveNode(#1:1, #1:3) from a third computing device.
Turning to
The index corresponds to the column number of a Node in the FNL, with the Root having a index of 0. For example, in the FNLs shown in
Turning to
Turning to
Turning to
Now that the loop is resolved, the first computing device will output the outline shown in
Turning to
The loop resolution procedure described above honors every user's edits. Even if the edit is ignored to resolve the loops, the edits will still be there. For example, given the tri-move cycle described above, if the fourth computing device undoes its move, this will resolve the loop differently causing others sites moves to be honored, as shown in
Turning to
Turning to
Turning to
Turning to
Turning to
Turning to
Turning to
In various embodiments, a computing device (e.g., the first computing device 100) displays at least one slide that has z-depth-ordered items and maintains (e.g., in a non-transitory computer-readable medium) a causal graph data structure representing the z-depth ordering of the items (in which each structure node represents a level in the z-depth ordering). The computing device can then receive, via the user interface, the same sorts of inputs described above with respect to an outline (e.g., the insertion or deletion of a level, the movement of one or more levels (e.g., representing a change in the z-depth ordering), and the change in an attribute of a level (e.g., the formatting of a z-depth level)), and reacts in the same ways described herein with regard to analogous actions being taken on outlines. The computing device then updates the user interface to reflect the action taken.
It should be understood that the exemplary embodiments described herein should be considered in a descriptive sense only and not for purposes of limitation. Descriptions of features or aspects within each embodiment should typically be considered as available for other similar features or aspects in other embodiments. It will be understood by those of ordinary skill in the art that various changes in form and details may be made therein without departing from their spirit and scope as set forth in the following claims. For example, the actions described herein can be reordered in ways that will be apparent to those of skill in the art.
This application is a continuation of U.S. patent application Ser. No. 16/293,998 (now U.S. Pat. No. 11,048,861), filed Mar. 6, 2019, which is a continuation of U.S. patent application Ser. No. 16/191,821 (now U.S. Pat. No. 10,325,014), filed Nov. 15, 2018, which claims the priority benefit of U.S. Provisional Patent Application 62/587,177, filed Nov. 16, 2017. U.S. application Ser. No. 16/191,821 is a continuation in part of U.S. patent application Ser. No. 15/411,237 (now U.S. Pat. No. 10,331,776), filed Jan. 20, 2017, which is a continuation of U.S. patent application Ser. No. 15/049,221, filed Feb. 22, 2016 (now U.S. Pat. No. 9,552,343), which is a continuation of U.S. patent application Ser. No. 14/808,029, filed Jul. 24, 2015 (now U.S. Pat. No. 9,292,482), which claims the priority benefit of U.S. Provisional Patent Application No. 62/155,000, entitled “SYSTEM AND METHOD FOR CONVERGENT DOCUMENT COLLABORATION,” filed on Apr. 30, 2015. The disclosures of each of the above-listed applications are incorporated herein by reference in their entirety.
Number | Name | Date | Kind |
---|---|---|---|
4807182 | Queen | Feb 1989 | A |
5603021 | Spencer et al. | Feb 1997 | A |
5758356 | Hara et al. | May 1998 | A |
5883623 | Cseri | Mar 1999 | A |
6057837 | Hatakeda et al. | May 2000 | A |
6138130 | Adler et al. | Oct 2000 | A |
6230173 | Ferrel et al. | May 2001 | B1 |
6252605 | Beesley et al. | Jun 2001 | B1 |
6460059 | Wisniewski | Oct 2002 | B1 |
6572660 | Okamoto | Jun 2003 | B1 |
6631385 | Lee et al. | Oct 2003 | B2 |
6741998 | Ruth et al. | May 2004 | B2 |
6792454 | Nakano et al. | Sep 2004 | B2 |
6848077 | McBrearty et al. | Jan 2005 | B1 |
6909965 | Beesley et al. | Jun 2005 | B1 |
6948154 | Rothermel et al. | Sep 2005 | B1 |
7080065 | Kothuri et al. | Jul 2006 | B1 |
7096422 | Rothschiller et al. | Aug 2006 | B2 |
7124362 | Tischer | Oct 2006 | B2 |
7181467 | Kothuri | Feb 2007 | B2 |
7219108 | Kothuri et al. | May 2007 | B2 |
7249314 | Walker et al. | Jul 2007 | B2 |
7424671 | Elza | Sep 2008 | B2 |
7496837 | Larcheveque | Feb 2009 | B1 |
7496841 | Hadfield et al. | Feb 2009 | B2 |
7587471 | Yasuda et al. | Sep 2009 | B2 |
7631255 | Weise | Dec 2009 | B2 |
7734714 | Rogers | Jun 2010 | B2 |
7761403 | Witkowski et al. | Jul 2010 | B2 |
7792847 | Dickerman et al. | Sep 2010 | B2 |
7809712 | Witkowski et al. | Oct 2010 | B2 |
7827208 | Bosworth et al. | Nov 2010 | B2 |
7984371 | Zdenek | Jul 2011 | B2 |
8015235 | Bauer et al. | Sep 2011 | B1 |
8108464 | Rochelle et al. | Jan 2012 | B1 |
8307337 | Chamieh et al. | Nov 2012 | B2 |
8332747 | Carro et al. | Dec 2012 | B2 |
8335783 | Milby | Dec 2012 | B2 |
8412813 | Carlson et al. | Apr 2013 | B2 |
8423471 | Emigh et al. | Apr 2013 | B1 |
8527865 | Li et al. | Sep 2013 | B2 |
8555161 | Parker | Oct 2013 | B2 |
8595620 | Larsen et al. | Nov 2013 | B2 |
8595750 | Agarwal et al. | Nov 2013 | B2 |
8607207 | Chamieh et al. | Dec 2013 | B2 |
8645929 | Chamieh et al. | Feb 2014 | B2 |
8656290 | Greenspan et al. | Feb 2014 | B1 |
8707156 | Xue et al. | Apr 2014 | B2 |
8745483 | Chavoustie et al. | Jun 2014 | B2 |
8825594 | Skaria et al. | Sep 2014 | B2 |
8849834 | Milby | Sep 2014 | B2 |
8856234 | Kluin et al. | Oct 2014 | B2 |
8869020 | Daga | Oct 2014 | B2 |
8954457 | Fablet et al. | Feb 2015 | B2 |
9015301 | Redlich et al. | Apr 2015 | B2 |
9152686 | Whitehead et al. | Oct 2015 | B2 |
9292366 | Carro et al. | Mar 2016 | B2 |
9292482 | Thiesen | Mar 2016 | B1 |
9292507 | Calkowski et al. | Mar 2016 | B2 |
9552343 | Thiesen | Jan 2017 | B2 |
9613055 | Tyercha et al. | Apr 2017 | B2 |
9720931 | Tyercha et al. | Aug 2017 | B2 |
10133708 | Carro et al. | Nov 2018 | B2 |
10147054 | Dayon et al. | Dec 2018 | B2 |
10223340 | Soni | Mar 2019 | B2 |
10325014 | Nelson et al. | Jun 2019 | B2 |
10331776 | Thiesen | Jun 2019 | B2 |
10635744 | Beth et al. | Apr 2020 | B2 |
10878182 | Thiesen et al. | Dec 2020 | B2 |
10936808 | Soni | Mar 2021 | B2 |
20020049697 | Nakano et al. | Apr 2002 | A1 |
20020065848 | Walker et al. | May 2002 | A1 |
20020103825 | Bauchot | Aug 2002 | A1 |
20030028545 | Wang et al. | Feb 2003 | A1 |
20030079157 | Lee et al. | Apr 2003 | A1 |
20030112273 | Hadfield et al. | Jun 2003 | A1 |
20030121008 | Tischer | Jun 2003 | A1 |
20030128243 | Okamoto et al. | Jul 2003 | A1 |
20040024752 | Manber et al. | Feb 2004 | A1 |
20040133567 | Witkowski et al. | Jul 2004 | A1 |
20040172616 | Rothschiller et al. | Sep 2004 | A1 |
20040181543 | Wu et al. | Sep 2004 | A1 |
20040193615 | Kothuri | Sep 2004 | A1 |
20050132070 | Redlich et al. | Jun 2005 | A1 |
20050149851 | Mittal | Jul 2005 | A1 |
20060044307 | Song | Mar 2006 | A1 |
20060080594 | Chavoustie et al. | Apr 2006 | A1 |
20060085386 | Thanu et al. | Apr 2006 | A1 |
20060101324 | Goldberg et al. | May 2006 | A1 |
20060143607 | Morris | Jun 2006 | A1 |
20060224946 | Barrett et al. | Oct 2006 | A1 |
20060271868 | Sullivan et al. | Nov 2006 | A1 |
20070033519 | Zdenek | Feb 2007 | A1 |
20070124281 | Cowan | May 2007 | A1 |
20070136698 | Trujillo et al. | Jun 2007 | A1 |
20070186157 | Walker et al. | Aug 2007 | A1 |
20070219956 | Milton | Sep 2007 | A1 |
20070220415 | Cheng et al. | Sep 2007 | A1 |
20070245409 | Harris et al. | Oct 2007 | A1 |
20080005164 | Yee et al. | Jan 2008 | A1 |
20080114720 | Smith et al. | May 2008 | A1 |
20080134138 | Chamieh et al. | Jun 2008 | A1 |
20080148140 | Nakano | Jun 2008 | A1 |
20080162532 | Daga | Jul 2008 | A1 |
20080177825 | Dubinko et al. | Jul 2008 | A1 |
20080300864 | Smith | Dec 2008 | A1 |
20080306983 | Singh | Dec 2008 | A1 |
20090044283 | Yoshihama | Feb 2009 | A1 |
20090063949 | Duan | Mar 2009 | A1 |
20090094242 | Lo et al. | Apr 2009 | A1 |
20090100324 | Aureglia et al. | Apr 2009 | A1 |
20090150426 | Cannon et al. | Jun 2009 | A1 |
20090182837 | Rogers | Jul 2009 | A1 |
20090199090 | Poston | Aug 2009 | A1 |
20090292730 | Li et al. | Nov 2009 | A1 |
20090327213 | Choudhary | Dec 2009 | A1 |
20100058176 | Carro et al. | Mar 2010 | A1 |
20100077331 | Bargh et al. | Mar 2010 | A1 |
20100257439 | Xue et al. | Oct 2010 | A1 |
20110106795 | Maim | May 2011 | A1 |
20110202968 | Nurmi | Aug 2011 | A1 |
20110271179 | Jasko et al. | Nov 2011 | A1 |
20120030563 | Lemonik et al. | Feb 2012 | A1 |
20120136874 | Milby | May 2012 | A1 |
20120137308 | Agarwal et al. | May 2012 | A1 |
20120151312 | Clee et al. | Jun 2012 | A1 |
20120173612 | Vegesna-Venkata et al. | Jul 2012 | A1 |
20120330984 | Fablet et al. | Dec 2012 | A1 |
20120331379 | Carro et al. | Dec 2012 | A1 |
20130232475 | Chamieh et al. | Sep 2013 | A1 |
20140047327 | Larsen et al. | Feb 2014 | A1 |
20140082470 | Trebas et al. | Mar 2014 | A1 |
20140129645 | Mo | May 2014 | A1 |
20140181016 | Whitehead et al. | Jun 2014 | A1 |
20140188544 | Senescu | Jul 2014 | A1 |
20140245257 | Kusmer et al. | Aug 2014 | A1 |
20140282101 | Beechuk et al. | Sep 2014 | A1 |
20150052100 | Calkowski et al. | Feb 2015 | A1 |
20150058449 | Garg et al. | Feb 2015 | A1 |
20150100304 | Tealdi et al. | Apr 2015 | A1 |
20150100594 | Hess et al. | Apr 2015 | A1 |
20150199270 | Day-Richter | Jul 2015 | A1 |
20150324373 | Tyercha et al. | Nov 2015 | A1 |
20150324399 | Tyercha et al. | Nov 2015 | A1 |
20160162128 | Hansen et al. | Jun 2016 | A1 |
20160239488 | Aguilon et al. | Aug 2016 | A1 |
20160321228 | Thiesen | Nov 2016 | A1 |
20160344667 | Lane et al. | Nov 2016 | A1 |
20160378737 | Keslin et al. | Dec 2016 | A1 |
20170132188 | Thiesen | May 2017 | A1 |
20170220546 | Codrington et al. | Aug 2017 | A1 |
20170308511 | Beth et al. | Oct 2017 | A1 |
20180165260 | Soni | Jun 2018 | A1 |
20190102370 | Nelson et al. | Apr 2019 | A1 |
20200250383 | Cheng | Aug 2020 | A1 |
20210064817 | Deering et al. | Mar 2021 | A1 |
20210081605 | Smith et al. | Mar 2021 | A1 |
Number | Date | Country |
---|---|---|
2008107665 | Sep 2008 | WO |
Entry |
---|
ExtendOffice, “Howto insert multiple hyperlinks in a cell in Excel?”, ExtendOffice.com, <https://web.archive.org/web/20150409040726/https://www.extendoffice.com/documents/excel/916-excel-insert-mulitple-hyperlinks.html>, 2015, 3 pages. |
Bewig, “How do you know your spreadsheet is right? Principles, Techniques and Practice of Spreadsheet Style,” <http://www.eusprig.org/hdykysir.pdf>, Jul. 28, 2005, 14 pages. |
Burnett et al., “Testing Homogeneous Spreadsheet Grids with the “What You See Is What You Test” Methodology,” IEEE Transactions on Software Engineering, Jun. 2002, vol. 28, No. 6, pp. 576-594. |
Grishchenko, “Deep Hypertext with Embedded Revision Control Implemented in regular Expressions,” Proceedings of the 6th International Symposium on Wikis and Open Collaboration, ACM, 2010, 10 pages. |
Grishchenko et al., “Referencing within evolving hypertext,” Second international Workshop on Dynamic and Adaptive Hypertext, 2011, 12 pages. |
Guttman, “R-Trees: A Dynamic Index Structure for Spatial Searching,” ACM, 1984, pp. 47-57. |
Ignat et al., “Tree-based model algorithm for maintaining consistency in real-time collaborative editing systems,” The Fourth International Workshop on Collaborative Editing Systems, CSCW 2002, New Orleans, USA, Nov. 2002, 8 pages. |
Kamel et al., “Hilbert R-tree: An Improved R-tree Using Fractals,” PVLDB '94 Proceedings of the 20th International Conference on Very Large Data Bases, Sep. 12-15, 1994, Morgan Kaufman Publishers Inc., San Francisco, CA, USA, 1994, pp. 500-509. |
Kankuzi, “A Dynamic Graph-based Visualization for Spreadsheets,” University of Bostwana, Faculty of Science, Department of Computer Science, <http://www.researchgate.net/profile/Yirsaw_Ayalew2/publication/234808991_A_dynamic_graph-based_visualization_for_spreadsheets/links/00b7d51a9b5169d566000000.pdf>, Jun. 2008, 121 pages. |
Kankuzi et al., “An End-User Oriented Graph-Based Visualization for Spreadsheets,” Proceedings of the 4th International Workshop on End-user Software Engineering, WEUSE '08, May 12, 2008, Leipzig, Germany, ACM, 2008, pp. 86-90. |
Microsoft, “Create an external reference (link) to a cell range in another workbook,” Excel for Microsoft 365, Excel 2019, Excel 2016, Excel 2013, Excel 2010 Support Office, 2020, retrieved from internet at <https://support.office.com/en-us/article/create-an-external-reference-link-to-a-cell-range-in-another-workbook-c98d1803-dd75-4668-ac6a-17cca2a9b95f> on May 5, 2020, 8 pages. |
Microsoft, “Create or change a cell reference,” Excel for Microsoft 365, Excel for the web, Excel 2019, Excel 2016 Support Office, 2020, retrieved from internet at <https://support.office.com/en-us/article/create-or-change-a-cell-reference-c7b8b95d-c594-4488-947e-c835903cebaa> on May 5, 2020, 8 pages. |
Rothermel et al., “A Methodology for Testing Spreadsheets,” ACM Transactions on Software Engineering and Methodology, Jan. 2001, vol. 10, No. 1, pp. 110-147. |
Sewall et al., “PALM: Parallel Architecture-Friendly Latch-Free Modifications to B+ Trees on Many-Core Processors,” Proc. VLDB Endowment, 2011, pp. 795-806. |
Stanescu et al., “Using R-trees in content-based region query with spatial bounds,” Seventh International Symposium on Symbolic and Numeric Algorithms for Scientific Computing (SYNASC'05), Timisoara, Romania, 2005, 7 pages. |
Tang et al., “Novel DR-tree index based on the diagonal line of MBR,” 2012 8th International Wireless Communications and Mobile Computing Conference (IWCMC), Limassol, Cyprus, 2012, pp. 574-579. |
Yang et al., “Performance of R-Tree with Slim-Down and Reinsertion Algorithm,” 2010 International Conference on Signal Acquisition and Processing, Bangalore, India, 2010, pp. 291-294. |
Number | Date | Country | |
---|---|---|---|
20210312119 A1 | Oct 2021 | US |
Number | Date | Country | |
---|---|---|---|
62587177 | Nov 2017 | US | |
62155000 | Apr 2015 | US |
Number | Date | Country | |
---|---|---|---|
Parent | 16293998 | Mar 2019 | US |
Child | 17350395 | US | |
Parent | 16191821 | Nov 2018 | US |
Child | 16293998 | US | |
Parent | 15049221 | Feb 2016 | US |
Child | 15411237 | US | |
Parent | 14808029 | Jul 2015 | US |
Child | 15049221 | US |
Number | Date | Country | |
---|---|---|---|
Parent | 15411237 | Jan 2017 | US |
Child | 16191821 | US |