図1は、本実施形態に係る併合装置1の機能ブロックの一例を示す。併合装置1は、例えば、所定のコンピュータであってもよい。また、併合装置1は、例えば、ソフトウェア開発におけるテストを行なうモックアップサーバであってもよい。
併合装置1は、記憶部10、入出力部11、差分取得部12、集約部13、ソート部14、ソース取得部15、併合部16、および選択部17等を含む。
記憶部10は、JSON(JavaScript Object Notation,「JavaScript」は登録商標)等による構造化文書のデータ(文書データとも記載する)を記憶する。本実施形態における文書データには、ネスト構造に基づいて整理された、名詞等の単語や複合語や語句等のデータ(語句データとも記載する)が含まれる。なお、ネスト構造以外にも木構造等に基づいて整理された語句データを文書データは含んでもよい。文書データは、後述する入出力部11を介して変更可能である。記憶部10は、変更前の文書データを記憶し、変更後の文書データや変更前後の各文書データの差分に係るデータや文書データを変更するための変更命令等のデータを記憶する。変更前後の各文書データの差分に係るデータ、文書データを変更するための変更命令等を、以下では変更履歴データと記載する場合もあるとする。
入出力部11は、開発者等のユーザからの文書データの入力、文書データの変更のための変更命令、2つ以上の文書データの併合指示等を受け付ける。なお、図1には、1つの入出力部11が示されているが、併合装置1は、複数のユーザのそれぞれから文書データの変更命令を受け付けるために、複数の入出力部11を備えていてもよい。入出力部11は、複数のユーザの各々に与えられたアカウントを通じて、複数の変更命令を受け付けてもよい。併合装置1は、不図示の通信部を介して他の装置においてユーザが入力した変更命令を受け付けてもよい。記憶部10は、複数のユーザや装置からの変更命令に係るデータを、ユーザ毎、アカウント毎、又は装置毎に記憶する。
入出力部11は、併合部16および選択部17による処理結果を、例えば、ディスプレイ等の表示装置に出力し、該表示装置に、処理結果を表示させてもよい。
差分取得部12は、入出力部11を介して上記併合指示を受け付けると、記憶部10に記憶された変更履歴データを読み込む。差分取得部12は、変更履歴データから、変更前後の各文書データ間の差分に係るデータであって、変更対象の語句データがネスト構造上どの語句データの配下にあるかを示す所属情報と、変更前後の各語句データとを抽出する。このデータを以下では、変更文データとも記載する。所属情報は、データの存在する位置までを示すための文字列等の情報(パス)である。本実施形態における変更文データは、所属情報が示す所在における変更前の語句データを変更後の語句データに変更する際に用いられる。
変更文データを含むデータであって、文書全体に対し変更を行うためのデータを、差分情報とも記載する。本実施形態において差分情報は、1つの変更命令に対し1つ生成されるものとする。
差分情報の総数がN(Nは2以上の自然数)の場合に、各差分情報を第nの差分情報(nは1以上でN以下の自然数)と記載する場合もあるとする。第nの差分情報に含まれる変更文データを、第nの変更文データを記載する場合もあるとする。第nの変更文データの適用対象の語句データを、第nの語句データと記載する場合もあるとする。文書データに対し、第nの差分情報を適用することに生成される構造化文書を、第nの構造化文書と記載する場合もあるとする。
図2は、変更対象の文書データと、当該文書データの変更について変更履歴データから抽出される変更文データを例示する。図2には、JSONによる文書データが一例として示されているが文書データはJSONによるものに限定されない。JSONには、「名前」のデータ(名前データとも記載する)と「値」のデータ(値データとも記載する)が含まれる。なお、名前データと値データは語句データの例である。
図2に示す一例においては、「books」、「book」は名前データであり、「a」、「b」、「c」は値データである。「book」は「books」に属するデータであり、「a」、「b」、および「c」は「book」の各具体例となるデータである。一般名詞「book」(本)に対し、例えば本のタイトルである固有名詞「a」、「b」、「c」が関連付けられている。値データは、その一般的概念を表す名前データと、例えば「:」を用いて関連付けられ、「:」に隣接して順番に示される。これらの値データ「a」等は、「book」によりラベリングされる集合に属するものといえることから、名前データ「book」に属する。
図2には、2つの変更文データ(変更文データX、Y)が例示されている。「path」は、変更対象の語句データの、構造化文書における所属先を示す所属情報(パス)を指す。ネスト構造において、ある語句データ(語句データAとする)に別の語句データ(語句データBとする)が直接的に属する場合、語句データBの階層は語句データAの階層よりも1つ下である。この場合、所属情報において、語句データAと語句データBとの間には「/」が付される。例えば、図2に示される「/books/book」は、文書データに名前データ「books」が属し、且つ名前データ「books」に名前データ「book」が属することを表す。「/」が2つであることから、「book」の階層の深さは2である。
値データ「a」等の所在は、名前データ「book」の所属情報と、名前データ「book」における順番により表される。図2に示す変更文データXにおける「/books/book/3」は、名前データ「books」に属する名前データ「book」の3番目の要素の値データを指す所属情報である。この所属情報の「/」は3つであるため、対応する所属情報により所在が示される値データは、深さ3の階層にある。図2の変更対象の文書データを参照すると、上記パスにより所在が示される、深さ3の階層にある値データは「c」である。
変更文データにおいて、「src」、「dst」は、それぞれ変更対象の語句データの変更前のデータ、変更対象の文言データの変更後のデータを指す。図2の2つの変更文データのうち「“src”:“book”,“dst”:“manual”」を含む変更文データXは、名前データを「book」から「manual」に変更させるための変更文データである。
同様に、「“src”:“c”,“dst”:“d”」を含む変更文データYは、名前データ「book」に属する3番目の値データ「c」を、値データ「d」に変更させるための変更文データである。
以下、図3、4を参照し、文書データに対し、図2に示す変更文データX、Yが、この順番で適用される場合について説明する。
図3は、変更文データXを適用することにより変更された文書データと変更文データを示す。変更文データXの適用により、文書データにおいて名前データ「books」に属する名前データ「book」は、名前データ「manual」へ変更される。また、この変更文データXにより、変更文データYに含まれる所属情報における「book」は「manual」へ変更される。
図4は、変更文データYの適用により変更された文書データを示す。この変更文データYの適用により、文書データにおいて名前データ「book」に属する値データ「c」は値データ「d」へと変更される。この変更文データYは値データを変更するものであり、値データは所属情報には含まれない。このため、変更文データYの適用により他の変更文データの所属情報の変更は行われない。
図1を参照すると、集約部13は、差分取得部12が抽出した差分情報中の変更文データを集約する。集約部13による変更文データの集約は、変更命令毎に行われる。ある変更命令において、2つ以上の変更文データであって推移的な変更を指示するための変更文データが存在する場合に、集約部13は、これら2つ以上の変更文データを1つに集約する。
図5は、集約について例示的に説明するための図である。図5に示す変更文データP「“path”:“/website/user/3”,“src”:“C”,“dst”:“None”」は、「website」に属する「user」に属する3番目の「C」を消去するための変更文データである。また図5に示す変更文データQ「“path”:“/website/user/3”,“src”:“None”,“dst”:“D”」は、「website」に属する「user」において、3番目の値データとして「D」を追加するための変更文データである。これらの変更文データが上記の順番で用いられることにより、「website」に属する「user」に属する3番目の値データは、「C」から、「None」に対応する状態を経て、「D」へと推移することがわかる。「None」に対応する状態とは、何も語句が含まれない空の状態を指す。以下、該空のデータを、文言データとする場合がある。
図5において、変更文データS、Tのこの順番の組み合わせは、変更文データR「“path”:“/website/user/3”,“src”:“C”,“dst”:“D”」と同等である。集約部13は、変更文データS、Tのような1つにまとめることができる複数の変更文データをまとめ、1つの変更文データに書き換える。このように複数の変更文データをまとめる処理を、以下では、集約処理と記載する。
図1を参照すると、ソート部14は、1つの文書データに対する1以上の変更命令の各々から取得される変更文データであって、集約部13による処理後の変更文データを、適用対象の語句データの所在の階層の深さに応じて並び替える。本実施形態においては、ソート部14は、階層の昇順に変更文データを並び替える。
ソース取得部15は、入出力部11を介して併合指示を受け付けると、記憶部10から、更新対象となる元の文書データを取得する。
併合部16は、ソース取得部15が取得した文書データに対し、1以上の変更命令に係る各変更文データを、ソート部14において並び替えられた順序に従って適用することにより、文書データを更新する。
併合部16は、2つ以上の差分情報の各変更文データを、ソート部14により並び替えられた順序に基づき、適用する。これにより、元の文書データにおいて、パスの階層が浅い語句データから順に更新されていく。
ここで、本実施形態において、パスの階層が浅い語句データに対する変更文データから順に適用される理由は、以下の通りである。もし併合装置1が、パスの階層がより深い語句データに対する変更文データを先に適用する場合、併合装置1は、最初に、最も深い階層のパスの語句データを探索する。この場合、ネスト構造が複雑であれば、先に実行される語句データの更新が遅延する可能性がある。一方、階層の浅いパスの語句データの更新が先に行われる場合、併合装置1は、ネスト構造を浅い階層から追跡し、その追跡結果を一時的に記憶するなどすることにより、次の更新対象となる語句データの所在の把握にその追跡結果を用いることができる。これにより、更新のための時間が短縮される。また、浅い階層のパスの語句データが更新により消去される場合、この語句データに属するデータに対し更新を先に行うことは更新時間を無駄に消費することになる。このため、本実施形態に係る併合装置1においては、階層が浅いパスの語句データから順に更新する。ただし、階層の深いパスの語句データの更新から先に行なわれてもよい。
併合部16は、2つ以上の変更命令における各変更文データが、同じ語句データを変更対象とし、これら変更文データによる更新後の各語句データが互いに異なる場合、更新後の文書データに、これら変更文による更新後の各語句データを含ませる。このようにすることで、2つ以上の変更命令の活用が図られ、また更新後の文書データにおける、2つ以上の変更命令による更新後の各語句データの確認と選択の機会を、ユーザに与えることができる。
図6は、互いに異なる更新結果を得る2つの変更文データを、1つの語句データへ適用する場合における併合部16の処理内容を例示する図である。元の文書データにおいて変更対象となる語句データは、「books」に属する「author」である。この文書データから互いに異なる更新結果を生成する2つの変更命令による各結果を、変更結果A、変更結果Bとする。変更結果Aにおいては、「author」が「editor」に書き換えられている。変更結果Bにおいては、「author」が「doctor」に書き換えられている。併合部16は、パスが同一の語句データを変更対象とし、互いに異なる変更結果を生成する、2つ以上の変更命令の各々から取得される変更文データによる変更結果のいずれをも活用する。図6は、併合部16が、「author」を「(“editor” or “doctor”)」へ書き換え、変更結果A、Bを活用し、更新後のデータに「editor」も「doctor」も含ませていることを示す。
併合部16は、1つの変更命令においてある語句データが変更対象とされ、他の変更命令においてはこの語句データが変更対象とされない場合には、この語句データを変更対象とする変更命令に応じて、この語句データを書き換える。
図7は、複数の変更命令のうち、ある語句データを変更対象とする変更命令が1つだけである場合における併合部16の処理方法を例示する。
併合部16は、1つの変更命令に係る変更文データが、あるパスにおける語句データを変更する場合、同じパスにおける語句データを変更する他の変更命令に係る変更文データがないか判定する。併合部16は、あるパスの語句データを変更する変更文データが1つしかない場合に、この変更文データを当該語句データに適用する。併合部16は、1つの文書データに対する2つ以上の変更命令に係る各変更文データであって、同じパスの語句データを変更する変更文データをまとめてもよい。まとめた変更文データが1つの場合に、併合部16は、当該変更文データを文書データへ適用してもよい。併合部16は、ソート部14が並べ替えた順に従って変更文データを適用し、変更前後の各語句データを候補として文書データに含ませていき、変更が1つの場合に、変更文データに基づいた語句データに更新してもよい。
図7は、名前データ「author」を「editor」へ更新する変更命令(変更命令Aと記載する)と、値データ「foo」を「bar」へ更新する変更命令(変更命令Bと記載する)がある場合の併合部16による処理を示す。
図7に示す例においては、併合部16は、ソート部14が並べ替えた順に従い変更文データを適用する中で、変更命令Aに対応する変更文データに従い変更された文書データ「editor」を、元の語句データ「author」と共に文書データに含ませる。そして、併合部16は、この語句データに対する他の変更文データがないことから、変更後の「editor」を選択し、文書データから「author」を消去する。
図7に示す例においては、併合部16は、1つの語句データに適用する変更文データが1つであるか、同じ語句データに適用する他の変更文データがないか判定する。「foo」を変更する変更文データは、変更命令Bに係る変更文データ以外にはないため、併合部16は、この変更文データに従って、「foo」を「bar」に変更する。
図7に示す例では、併合部16は、名前データについては、更新前後のデータを候補として含ませ、値データについては、変更文が1つであることを確認後、更新を行っているが、併合部16による変更方法はこれに限らない。
本実施形態においては、1つの語句データに対し、1つの変更文データがあった場合に、この変更文データに基づく変更が行われる。これにより、語句データについての変更命令が反映されると共に、ユーザが適切な語句データを選択する手間を省くことができる。しかし、併合部16による変更命令の実行後の文書データは、変更前後の語句データを含んでいてもよい。別のユーザによる予期しない変更を防ぐためである。
併合部16による処理結果は、記憶部10に記憶されてもよい。
選択部17は、各々が同じ語句データを互いに異なる語句データへ変更する2つ以上の変更文データに応じて併合部16が候補として文書データに含ませた2つ以上の変更後の語句データの選択に係る処理を行う。選択部17は、更新後の語句データに2つ以上の候補がある場合に、ユーザに2つ以上の候補のうちのいずれかを選択させるため、入出力部11に対し表示指示を行う。
図8は、選択部17からの表示指示に応じた、入出力部11による表示内容を例示する。図8には、入出力部11において、Graphical User Interface(GUI)、Character user interface(GUI)が用いられる場合における各表示内容が例示される。この例においては、図6に示された「or」で連結される2つの名前データ「editor」、「doctor」が選択肢として示されている。GUIが用いられる場合には、ユーザは、これらの選択肢のうちのいずれかのラジオボタンに対し、選択のための入力を行うことができ、「OK」ボタンのクリックにより、入力内容が確定される。またGUIが用いられる場合においては、ユーザは、「>>」の後に、「editor」を選択する場合には「1」、「doctor」を選択する場合には「2」を入力し、Enterキーを押すことにより、入力内容が確定される。
図9は、併合部16による併合処理が行われるまでの、本実施形態に係る併合装置1による処理のフローを例示する。
図9に示すように、併合装置1における差分取得部12は、記憶部10に記憶される複数の変更命令の各々に係る情報から、各変更命令についての差分情報を抽出する(ステップS100)。
図10~12は、2つの変更命令があった場合における差分情報の抽出処理について具体的に説明するための図である。なお、2つの変更命令のうちの一方を変更命令A、他方を変更命令Bとする。また元の文書データを文書データSとする。
図10には、変更命令Aによる差分情報の抽出処理の具体例が示される。図10に示されるように、文書データSは、変更命令Aにより、文書データA1から文書データA2、文書データA2から文書データA3へと書き換えられる。
図10に示されるように、差分取得部12は、文書データSから文書データA1への変更のための変更文データを抽出する。この変更文データは、文書データSにおいて「website」に属する「usar」を、「user」へ書き換えるためのものである。
差分取得部12は、文書データA1から文書データA2への変更のための変更文データを抽出する。この場合の変更文データは2つである。当該2つの変更文データのうちの一方は、文書データA1における「website」に属する「user」に属する、2番目の値データ「B」を「C」に変更する。他方は、同じく「user」に属する、3番目の値データ「C」を削除する。
差分取得部12は、文書データA2から文書データA3への変更のための変更文データを抽出する。この変更文データは、文書データA2において「website」に属する「user」を、「account」へ変更する。
図11には、変更命令Bによる差分情報の抽出処理の具体例が示される。文書データSは、変更命令Bにより、文書データB1から文書データB2、文書データB2から文書データB3へと書き換えられる。
差分取得部12は、文書データSから文書データB1への変更のための変更文データを抽出する。この場合の変更文データは3つである。このうちの1つ目は、「website」に属する「usar」に属する、1番目の値データ「A」を「B」に変更する。2つ目は、同じく「usar」に属する、2番目の値データ「B」を「C」に変更する。3つ目は、同じく「usar」に属する、3番目の値データ「C」を削除する。
差分取得部12は、文書データB1から文書データB2への変更のための変更文データを抽出する。この変更文データは、文書データB1において「website」に属する「usar」を、「users」へ変更する。
差分取得部12は、文書データB2から文書データB3への変更のための変更文データを抽出する。この変更文データは、文書データB2において「website」に属する「users」に属する3番目の値データとして、「D」を追加する。
図12には、変更命令Aに係る差分情報における変更文データ、変更命令Bに係る差分情報における変更文データが例示される。差分取得部12により抽出された変更文データは、文書データの変更の順に差分情報に含まれる。
図12に示す例によれば、変更命令Aによる差分情報において、文書データSを文書データA1に変更する変更文データ(変更文データA-1とする)が最初に含まれる。この差分情報において、次に、文書データA1を文書データA2に変更する2つの変更文データが含まれる。なお、この2つの変更文データの差分情報における順序は、どちらが先であってもよい。ここでは、上記の「B」を「C」に変更する変更文データを変更文データA-2、「C」を削除する変更文データを変更文データA-3とし、差分情報はこの順序でこれらの変更文データを含むものとする。また、この差分情報において、最後に、文書データA2を文書データA3に変更する変更文データ(変更文データA-4とする)が含まれる。
図12に示す例によれば、変更命令Bによる差分情報において、文書データSを文書データB1に変更する3つの変更文データが最初に含まれる。なお、この3つの変更文データの差分情報における順序は、任意である。ここでは、上記の「A」を「B」に変更する変更文データを変更文データB-1、「B」を「C」に変更する変更文データを変更文データB-2、「C」を削除する変更文データを変更文データB-3とし、差分情報はこの順序でこれらの変更文を含むものとする。また、この差分情報において、次に、文書データB1を文書データB2に変更する変更文データ(変更文データB-4とする)が含まれる。また、この差分情報において、最後に、文書データB2を文書データB3に変更する変更文データ(変更文データB-5)が含まれる。
図9のフローチャートに示されるように、集約部13は、差分情報に含まれる2つの変更文データについて、以下の条件が満たされる場合に、集約処理を行う(ステップS101)。以下の条件は、2つの変更文データの各適用対象の語句データが同一パスであることと、差分情報に先に含まれる変更文データによる変更後の語句データと、後に含まれる変更文データによる変更前の語句データが等しいことである。集約処理の詳細については後述する。
ソート部14は、集約部13による集約処理後の変更文データを、その変更文データの適用対象の語句データのパスの階層に基づき並び替える(ステップS102)。この並べ替えは、上述したように、階層の深さの昇順になるように行われる。
本実施形態においては、集約部13によるステップS101の処理が、ソート部14によるステップS102の処理に先立って実行されるが、この順番は逆であってもよい。
図13は、ソート部14による処理内容の一例を示す。ここに示す変更命令Aに係る変更文データと変更命令Bに係る変更文データは、それぞれ図12に例示された各変更文データに対し集約処理を行ったものである。図12における変更文データA-1、A-4は集約されており、これらの集約処理後の変更文は、図13において変更文データA-1’である。また変更文データB-3、B-5は集約されており、これらの集約処理後の変更文データは、図13においてB-3’である。
図13に示されるように、変更文データA-1’、A-2、A-3における、変更対象の語句データのパスの階層は、それぞれ2、3、3である。
同様に、変更文データB-1、B-2、B-3’、B-4における、変更対象の語句データのパスの階層は、それぞれ3、3、3、2である。
変更命令Aに係る各変更文データは、差分情報において、変更対象の語句データのパスの階層の昇順にソート前から並んでいる。このため、ソート前後で、変更文データA-1’、A-2、A-3の順番は変わらない。
変更命令Bに係る各変更文データは、ソート部14により、変更対象の語句データのパスの階層の昇順に、変更文データB-4、B-1、B-2、B-3’の順に並べ替えられる。
図9を参照すると、併合部16は、ソース取得部15が取得した変更前の文書データに対し、ステップS102において並び替えられた順序に基づいて変更文データを適用する(ステップS103)。これにより、併合部16は、1つの文書データに対し複数の変更命令を適用して生成される複数の文書データを併合する。
図14は、ステップS101における集約部13による処理の詳細を例示する。ここでは、集約部13により、2つの変更命令の各々に係る変更文データの集約処理を行う場合を例に挙げ説明する。この2つの変更命令を変更命令A、変更命令Bと記載する。集約部13は、変更命令A、Bの各々について、ステップS200~S202までの処理を実行する。例えば、集約部13は、変更命令Aに係る差分情報における変更文データについて、ステップS200~S202の処理を実行し、その後に変更命令Bに係る差分情報における変更文データについて、ステップS200~S202の処理を実行する。
ステップS200において、集約部13は、変更文データの集約化のための前処理を行う。前処理は、集約の際に変更文データにおけるパスの指定の誤りを防ぐための処理である。本実施形態における前処理は、ある変更文データの適用による名前データの変更に基づく、別の変更文データにおけるパスの変更がある場合、この変更後の当該別の変更文データにおけるパスを当該変更前のパスへ書き換える処理である。
図15は、前処理のフローの一部を例示する。iは、差分情報における変更文データの順序に対応する1からNまでの自然数である。またNは1以上の自然数である。i=1の変更文データは、差分情報における最初の変更文データであり、i=Nの変更文データは、差分情報における最後の変更文データである。集約部13は、1番目からN番目までの各変更文データに対し、この順番に、ステップS300の処理を実行する。
集約部13は、i番目の変更文データが、名前データを変更対象としているか否かを判定する(ステップS300)。なお、本実施形態では、名前データが変更対象であるかを判定し、値データが変更対象であるかを判定しない。本実施形態における変更文データには値データは含まれないが、名前データはパスの一部として含まれるからである。ただし、これに限定されず、名前データ以外にも値データがパスに含まれる場合、集約部13は、ステップS300における判定処理を行わず、ステップS301における処理を行ってもよい。
i番目の変更文データが、名前データを変更対象としない場合(ステップS300:No)、集約部13は、i番目の変更文データに対する前処理を終了し、i+1をiに置き換え、ステップS300の処理を行う。i=Nの場合における変更文データが名前データを変更対象としない場合、集約部13は、図14に示す集約処理を実行する(ステップS201)。この集約処理については後述する。 集約部13は、i番目の変更文データが名前データを変更対象とする場合(ステップS300:Yes)、i+1~N番目の各変更文データに対し、ステップS301の処理を実行する。集約部13は、ステップS301の処理の終了後、i<Nの場合には、i+1をiに置き換え、ステップS300へと処理を戻し、i=Nの場合には、図14に示す集約処理を実行する(ステップS201)。
図16は、上記ステップS301における集約部13による処理についての詳細を例示するフローチャートである。集約部13は、i+1番目からN番目の各変更文データについて、図16に示される、以下のステップS400以降の処理を実行する。
集約部13は、i番目の変更文データの適用後の名前データのパスを、j番目(i+1≦j≦N)の変更文データにおけるパスが含むか否かを判定する(ステップS400)。i番目の変更文データの適用後の名前データのパスを、j番目の変更文データにおけるパスが含まず(ステップS400:No)、且つjがNより小さい場合、集約部13は、j+1をjに置き換え、ステップS400へ処理を戻す。j=Nの場合には、集約部13は、前処理を終了し、図14に示すステップS201の集約処理を実行する。
ステップS400における判定条件が満たされた場合(ステップS400:Yes)、集約部13は、j番目の変更文データが、i番目の変更文データの適用後の名前データを更に変更するかを判定する(ステップS401)。
j番目の変更文データの適用により、i番目の変更文データの適用後の名前データが更に変更されない場合(ステップS401:No)、集約部13は、j番目の変更文データにおけるパスをi番目の変更文データ適用前のものへ書き換える(ステップS402)。
集約部13は、j番目の変更文の識別子と書き換え前後の各パスを、互いに関連付けて一時的に記憶する(ステップS403)。このステップS403の処理は、後述する後処理のためである。なお、識別子は、差分情報における各変更文に対し一意的に与えられている数値、文字、又は記号等を含む値であり、上記A-1等もこの識別子の一例である。なお、以下ではステップS403において一時的に記憶される情報を書換情報とも記載する。また、書換情報の一時的な記憶とは、例えば、後述する後処理の終了まで期間を指す。
なお、本実施形態においては、ステップS403の処理は、ステップS402の処理後に実行されているが、この順序は逆でもよい。
ステップS403の処理の実行後であって、jがNより小さい場合、集約部13は、j+1をjに置き換え、ステップS400へ処理を戻す。j=Nの場合には、集約部13は、前処理を終了し、図14に示すステップS201の集約処理を実行する。
j番目の変更文データの適用により、i番目の変更文データの適用後の名前データが更に変更される場合(ステップS401:Yes)、集約部13は、j+1番目からN番目の各変更文データについて、ステップS404の処理を実行する。このステップS404の処理は、図16に詳細が示されるステップS301の処理と同様である。
ステップS404のサブルーチン処理について、図12に示す変更文データA-1から変更文データA-4に対し集約部13による処理が行われる場合を例に挙げて説明する。このとき差分情報において、変更文データA-4の後に、「/website/account」を含むパスを有する変更文データA-5が含まれているケースを想定して説明する。すなわち、変更文データA-5は、名前データ「website」における名前データ「account」に含まれる語句データを変更対象とする。
集約部13は、図15におけるステップS300において変更文データA-1の変更対象が名前データであると判定し、ステップS301の処理を開始し、変更文データA-2から変更文データA-4に対し、ステップS400以降の処理を実行する。
この際に、変更文データA-2、A-3は名前データを変更するものではないので、これらの変更文データについては、ステップS401の処理の後、ステップS402の処理とステップS403の処理が行われる。このとき、変更文データA-2、A-3の各パスに含まれる「user」は、ステップS402において「usar」へと書き換えられ、ステップS403において、各識別子と書き換え前後の各パスが関連付けられ書換情報として記憶される。このとき変更文データA-2の場合においては、書換情報に含まれる書き換え前後のパスはそれぞれ「/website/user/2」、「/website/usar/2」である。
集約部13は、ステップS401において変更文データA-4の適用により、変更文データA-1の適用後の名前データが更に変更されると判定する。具体的に、変更文データA-1の適用により「/website/usar」で示されるパスにおける名前データ「usar」は「user」に変更され、この「user」は変更文データA-4の適用により「account」に変更される。
このため、変更文データA-4については、集約部13は、ステップS401の処理後、ステップS404の処理を実行する。変更文データA-5におけるパスは、変更文データA-4により変更された名前データのパスを含むため、ステップS402において、パスにおける「/website/account」は、「/website/usar」に書き換えられる。
なお、本実施形態においてステップS404におけるステップS402の処理において書き換え後のパスとされるものは、i番目の変更文データの適用前の名前データのパスを含むものである。
ステップS404におけるステップS403の処理により、変更文データA-5について書き換え前後の各パスとして、「/website/account」を含むパスと、「/website/usar」を含むパスが記憶される。書換情報には、変更文データA-2、A-3における各パスに含まれる「/website/user」と、変更文データA-5におけるパスに含まれる「/website/account」が、それぞれ同じ「/website/usar」に対応付けられる。
この場合、後の集約処理(ステップS201)と後処理(ステップS202)における文書データの整合等のために、集約部13は、パスにおける「/website/usar」を「/website/account」とを関連付ける。これに伴い、集約部13は、変更文データA-2、A-3についての書換情報における、書き換え前のパスに含まれる「/website/user」を「/website/account」へと置き換える。
図17は、集約部13による前処理の実行前後の変更文データの具体例を示す図である。図17を参照し、変更命令Bに係る変更文データに対し実行される前処理について説明する。図17に示されるように、変更文データB―1から変更文データB-3は、パスの変更を伴わない、値データの変更に係るものである。一方、変更文データB-4は、名前データ「usar」を「users」へ変更するものであり、この変更に伴い、この名前データを指定するパスは「/website/usar」から「/website/users」になる。
差分情報において、変更文データB-4の次の変更文データB-5のパスには、変更文データB-4の適用後の名前データを指定するパス「/website/users」が含まれている。変更文データB-5は、変更文データB-4の変更対象の名前データの更なる変更を行うためのものではない。
集約部13は、変更文データB-5における「/website/users」を、変更文データB-4の適用前の「/website/usar」へ書き換える。
図14に示されるように、集約部13は、上述した前処理(ステップS200)の実行後に集約処理を実行する(ステップS201)。
図18は、ステップS201の集約処理の詳細を例示するフローチャートである。集約部13は、差分情報におけるi番目とj番目の各変更文データにおけるパスが一致し、且つ、i番目の変更文データの適用後の語句データと、j番目の変更文データの適用前の語句データが等しいかを判定する(ステップS500)。iは、1からNまでの自然数である。Nは、差分情報において含まれる変更文データの総数であり、1以上の自然数である。またjは、i+1からNの間の自然数である。集約部13は、ステップS500の処理に先立ち、iに1を格納し、jに2(=i+1)を格納し、ステップS201の処理を開始する。
集約部13は、i番目とj番目の各変更文データにおけるパスが不一致、又は、i番目の変更文データの適用後の語句データと、j番目の変更文データの適用前の語句データが等しくない場合(ステップS500:No)、j+1をjに置き換える。この場合、処理は、ステップS500の処理へ戻る。なお、j=Nの場合で、且つiがNより小さい場合、集約部13は、i+1をiに置き換え、ステップS500の処理に戻る。i=Nの場合、集約部13は、図14に示すステップS201の処理を終了し、ステップS202の後処理を実行する。
集約部13は、i、j番目の各変更文データにおけるパスが一致し、i番目の変更文データの適用後の語句データとj番目の変更文データの適用前の語句データが等しい場合(ステップS500:Yes)、i番目の変更文データを変更する(ステップS501)。詳細には、集約部13は、i番目の変更文データにおいて、例えば図2に示されるように、「dst」として示される変更後の語句データを、j番目の変更文データにおいて「dst」として示される変更後の語句データへ変更する。
2つ以上の変更文データの組み合わせが、あるパスで指定される語句データを推移的に変更するに対応する場合には、集約部13は、これらを1つにまとめる。1つにまとめられた変更文データは、この組み合わせのうち1つも変更文の適用がされない場合の語句データから、この変更文データの組み合わせの適用がされた場合の語句データへの変更を指示するものとなる。この集約処理により、複数回の変更文データの適用を1回にまとめることができ、後の併合処理等の処理時間が短縮される。
集約部13は、j番目の変更文データを差分情報から削除する(ステップS502)。i番目の変更文データにより、文書データにおいて、j番目の変更文データによる変更結果が得られるからである。
図19は、集約処理について具体的に説明するための図である。図19に示されるように、差分情報において3番目の変更文データB-3と5番目の変更文データB-5の各パスは一致している。また変更文データB-3の適用後(dst)の語句データ「None」(語句データ「None」は、削除された空のデータを指すものとする)と、変更文データB-5の適用前の語句データ「None」とが等しい。
このため、集約部13は、ステップS500における判定条件が満たされているものとして、ステップS501において、変更文データB-3における変更後の語句データ「None」を、変更文データB-5における変更後の語句データ「D」に変更する。この変更後の変更文データB-3の識別子は、B-3’へ置き換えられる。変更文データB-5は、ステップS502において削除される。
また不図示であるが、変更文データA-1と変更文データA-4も集約化され、集約後の変更文データA-1’におけるパスは「/website/usar」、変更文データA-1’の適用前後の語句データはそれぞれ「usar」、「account」となる。
集約部13は、ステップS201の処理後、前処理において書き換えた情報を元に戻す後処理を実行する(ステップS202)。
図20は、ステップS202の後処理の詳細を例示するフローチャートである。図20において、集約部13は、差分情報に含まれる変更文データの順番に、ステップS600以降の処理を実行する。集約部13は、ステップS202の開始の際にiに1を格納する。
集約部13は、書換情報を参照し、差分情報中のi番目の変更文データの識別子が含まれているかを判定する(ステップS600)。
i番目の変更文データの識別子が書換情報に含まれていない場合で(ステップS600:No)、iがN’未満である場合には、集約部13は、i+1をiに置き換え、ステップS600の処理へ戻る。N’は、集約処理後の、差分情報に含まれる変更文データの総数である。i=N’の場合には、図14に示されるように、集約部13による、1つの差分情報に対する処理は終了する。図14におけるある差分情報に対する後処理(ステップS202)の後であって、他の差分情報について後処理が終了していない場合、集約部13は、他の差分情報についてステップS200以降の処理を実行する。他の差分情報についてステップS202の処理が終了に伴い、集約部13は、処理を終了する。
i番目の変更文データの識別子が書換情報に含まれる場合(ステップS600:Yes)、集約部13は、この識別子に関連付けられ記憶されている、ステップS402の書き換え前後の各パスを参照する。集約部13は、この記憶されている各パスに基づき、書き換え後のパスを書き換え前のパスへ変更する(ステップS601)。これにより、例えば、変更文データA-2におけるパス「/website/usar/2」は、変更文データA-1’の適用による変更に基づいた「/website/account/2」となる。
図21は、併合部16による処理のフローを例示する。図21に示す処理の際に、差分情報は、変更対象の語句データを指定するパスの階層の昇順に変更文データがソートされている。ここでは、2つの差分情報を用いて、併合処理を行う場合を例に挙げて説明する。2つの差分情報の一方を差分情報A、他方を差分情報Bとする。2つの差分情報A、Bにおける変更文データに含まれるパスの階層のうちの最も深い階層をMとする。Mは1以上の自然数である。
併合部16は、差分情報Aにおいて、パスの階層がkの変更文データがあるかを判定する(ステップS700)。なお、ステップS700に先立ち、kには、最初に1が格納される。パスの階層がkの変更文データが差分情報A、Bに存在しない場合(ステップS700:No)、併合部16は、k+1をkに置き換え、ステップS700の処理に戻る。パスの階層がkの変更文が差分情報A、Bに存在する場合(ステップS700:Yes)、併合部16は、パスの階層がkの変更文データの1つを処理対象として選択する(ステップS701)。ステップS701において併合部16が選択した変更文データを変更文データPと記載する。以下、変更文データPが差分情報Aに含まれる場合について説明する。
併合部16は、差分情報Bにおいて、パスの階層がkの変更文データであって、変更文データPのパスと同一のパスを含む変更文データがあるか否かを判定する(ステップS702)。ここで、パスの階層がkで、変更文データPのパスと同一のパスを含む、差分情報Bにおける変更文データを変更文データQとする。変更文データQがある場合(ステップS702:Yes)、併合部16は、変更文データP、Qの適用後(dst)の各語句データが等しいか判定する(ステップS703)。変更文データP、Qの適用後の各語句データが等しい場合(ステップS703:Yes)、併合部16は、変更文データBを削除し(ステップS704)、差分情報A、Bの適用対象の文書データに対し、変更文Pを適用する(ステップS705)。このとき、併合部16は、変更文データP適用後の文書データに、変更文データP適用後の語句データ以外に、変更文データP適用前の語句データを含ませてもよい。なお、以下では差分情報A、Bの適用対象の文書データを文書データSと記載する。
変更文データP、Q適用後の各語句データが異なる場合(ステップS703:No)、併合部16は、文書データSに対し変更文データP、Qの各適用後の語句データを、変更後の文書データSに候補として含ませる(ステップS706)。これらの候補は、例えば、図6において例示したように、互いに「or」で結び付けられる。
ここで、変更文データP、Qのいずれか一方が語句データを削除するためのものである場合、本実施形態においては、当該変更文データの適用はされず、他方の変更文データが適用される。
併合部16が、差分情報A、Bの各変更文データの適用の際に、同一のパスについてステップS703~S706の処理を行うことにより、1つの語句データに対する競合する複数の変更命令のいずれをも活用することができる。これにより、複数のユーザによる1つの語句データの更新において、一方のユーザによる更新のために他方のユーザによる更新結果が消去等される事態や、望まない更新結果が得られる事態を防ぐことができる。 併合部16は、ステップS705又はステップS706による変更文データが、名前データを変更するためのものか否かを判定する(ステップS707)。併合部16は、ステップS705、S706による変更文データが、名前データの変更に係るものでない場合(ステップS707:No)、ステップ700へ処理を戻す。
ステップS705、S706における変更文データP、Qが、名前データの変更に係る場合(ステップS707:Yes)、併合部16は、変更前の名前データを指定するパスを、他の変更文データにおけるパスが含むか判定する(ステップS708)。併合部16は、変更文データP、Q適用前における名前データを指定するパスを含む他の変更文データが存在しない場合(ステップS708:No)、ステップ700へ処理を戻す。
変更文データP、Q適用前における名前データを指定するパスを含む他の変更文データが存在する場合(ステップS708:Yes)、併合部16は、この他の変更文データにおけるパスに対し、変更文データP又は変更文データQを適用する(ステップS709)。この際に、併合部16は、この他の変更文データにおける、変更文データP、Qの適用前の各パスと、適用後の各パスとを対応付け、一時的に記憶する。例えば、ステップS706において、変更文データP、Qの適用により名前データが変更され、これによりステップS709において、他の変更文データにおけるパスが変更される場合を考える。この場合、差分情報Aにおいてパスが変更された変更文データと、差分情報Bにおいてパスが変更された変更文データが、変更前は同じパスであったにも関わらず、異なるパスとなっている可能性がある。このため、変更前には同じパスで、変更後は互いに異なるパスとなる、差分情報A、Bの各変更文データにおけるパスについては、互いに関連付けておく。これにより、以降のステップS702において、差分情報A、Bの各変更文において、本来同一であるはずのパスが異なるものとして扱われることが防止できる。
ステップS700~S709の処理において、併合部16は、2以上の差分情報における各変更文データを、パスの浅いものから順番に、併せて適用する。これにより、文書データにおいて、浅いパスで指定される語句データから深いパスで指定される語句データまでを、順番に、2つ以上の変更命令を活かしつつ、変更していくことができる。このため2つ以上の変更命令の活かした併合結果を得ることができる。
このことについて、図13を参照して具体的に説明する。例えば、変更命令Aにおいては階層が浅いパスを含む変更文データから適用され、変更命令Bにおいては階層が深いパスから適用される場合を考える。変更命令Aにおいては変更文データA-1、A-3がこの順番で適用されるとし、変更命令Bにおいては変更文データB-3’、B-4がこの順番で適用されるとする。このときに変更文データB-3’が変更文データA-3より先に適用されると、変更文データA-3の適用対象の語句データ「C」が存在しなくなる。もし変更文データA-3が「C」を「E」に変更するためのものである場合には、変更文データA-3は活用されなくなる。同様に例えば、変更文データA-1’を変更文データB-4より先に適用することにより、変更文データB-4の適用対象である語句データ「usar」がなくなってしまい、変更文データB-4を活かすことができなくなる。このようにパスの階層が揃っていない変更文データが適用されると、構造化文書の併合が適切にされず、ユーザにとっては意図しない結果を招くことになる。しかし、パスの階層が揃っている変更文データを適用する場合には、例えば浅い階層のパスで指定される語句データから順番に、変更命令A、Bを活かしながら更新可能となり、変更結果も整合性が満たされる。その結果、構造化文書の併合が適切に行なわれる。
併合部16は、変更後の文書データSにおいて、不要な語句データの候補が存在する場合に、これを消去する(ステップS711)。例えば、ステップS705において、変更文データAの適用前の語句データが候補として、変更後の文書データSに含まれるような場合に、併合部16は、この語句データを削除する。
併合部16は、入出力部11を介して、文書データにおける複数の候補の語句データの中から適切なものをユーザに選択させるための処理の実行を選択部17に指示する(ステップS712)。
図22~25は、併合部16による処理方法を例示する。この例において併合部16は、図13に例示した、ソート処理後の変更文データを用いて併合処理を行う。変更文データA-1’、A-2、A-3を含む差分情報を差分情報Aとし、変更文データB-1、B-2、B-3’、B-4を含む差分情報を差分情報Bとする。
この例において、差分情報A、Bには、パスの階層が1の変更文データが存在せず、階層が2の変更文データが存在する。ここでは、最初のステップS701において、変更文データA-1’が選択される場合について説明する。
ステップS702において、併合部16は、階層2のパスで、変更文データA-1’におけるパスと同一のパスの変更文B-4があることから、ステップS703の処理を実行する。ステップS703において、併合部16は、変更文データA-1’と変更文データB-4の各々の適用後の語句データが異なると判定する。この判定結果に応じて、併合部16は、ステップS706において、変更対象の文書データ(文書データSとする)に対し、変更文A-1’、B-4を適用する。
図22に、変更対象の文書データSを示す。ステップS706における変更文データA-1’、B-4の適用により、文書データSにおける語句データ「usar」は、2つの語句データの候補「account」、「users」を含むデータ「“account” or “users”」に変更される。これにより、文書データSは、文書データS1へと変更される。
ステップS707において、併合部16は、ステップS706において適用した変更文データが名前データの変更に係るものであると判定する。併合部16は、ステップS708において、図22に示すように、変更文データB-4の適用前の名前データ「usar」のパスを含む、変更文データB-1、B-2、B-3が存在すると判定し、ステップS709の処理を実行する。併合部16は、ステップS709において、変更文データB-1、B-2、B-3の各々のパスにおける「usar」を、「users」に変更する。
なお、後の処理のために、併合部16は、パス「/website/account」とパス「/website/users/」とを対応付けて一時的に記憶する。
併合部16は、階層が2のパスを含む変更文データが他にないことから、階層が3の場合についてステップS700以降の処理を行う。この処理について、図21と図23~25を参照し、説明する。なお、図23以降においては既に適用済みの変更文データを記載しない。
併合部16は、ステップS701において変更文A-2を選択するものとする。図23を参照すると、変更文データA-2におけるパスの階層は、変更文データB-2におけるパスの階層と等しい。ここで併合部16は、「/website/account」と「/website/users/」を互いに対応付けて記憶している。このため併合部16は、ステップS702において、変更文データA-2におけるパス「/website/account/2」と同一のパス「/website/users/」を含む変更文データB-2があると判定する。
変更文データA-2、B-2の適用後の各語句データは互いに等しく、「C」であるため、併合部16は、変更文データB-2を削除し、ステップS705において文書データS1に対し変更文データA-2を適用する。なお、この変更は、値データの変更であり、名前データの変更ではない。このため、差分情報における他の変更文データのパスの変更はされない。
図23に示される文書データS1は、3つの値データのうちの2番目の「B」が「C」へと変更され、文書データS2に変更される。
次に、併合部16はステップS701において変更文データA-3を選択する場合を考える。図24を参照すると、変更文データA-3におけるパスの階層は、変更文データB-3’におけるパスの階層と等しい。上記の「/website/account」と「/website/users/」の対応から、変更文データA-3、B-3’における各パス「/website/account/3」、「/website/users/3」は、ステップS702で一致する。
変更文データA-3は、値データ「C」を削除するためのもので、変更文データB-3’は、この値データ「C」を「D」に変更するためのものである。このため、併合部16は、ステップS706において、文言データS2に対し変更文データB-3’を適用する。これにより、図24に示されるように文書データS2は文書データS3に変更され、文書データS2における値データ「C」は、文書データS3においては値データ「D」に変更されていることがわかる。
併合部16は、未だ適用されていない変更文データB-1をステップS701において選択し、ステップS705において変更文データB-1を文書データS3に適用する。変更文データB-1の適用により、図25に示すように、文書データS3における値データ「A」は「B」に変更され、文書データS3は文書データS4に変更される。
図26は、本実施形態に係る併合装置1のハードウェア構成を例示する。ここでは、併合装置1は、一般的なコンピュータとしてハードウェアを有し、併合装置1による処理は、以下に示すハードウェア2を具体的に利用することにより実行される。
ハードウェア2は、互いにバス24によって接続されたプロセッサ20、メモリ21、記憶装置22、およびユーザインターフェース回路23等を備える。
プロセッサ20は、例えばシングルコア、デュアルコア、またはマルチコアのプロセッサである。
メモリ21は、例えばROM(Read Only Memory)、RAM(Random Access Memory)、若しくは半導体メモリ等、又はこれらの組み合わせである。
プロセッサ20が、メモリ21に記憶された各種プログラム(併合プログラムを含む)等を実行することにより、上記の差分取得部12、集約部13、ソート部14、ソース取得部15、併合部16、および選択部17の各機能が実現され得る。
記憶装置22は、例えばハードディスクドライブ、光ディスク装置等、又はこれらの組み合わせであり、また可搬型記憶媒体等が含まれてもよい。当該記憶装置22により、上述した記憶部10の機能が実現され得る。
ユーザインターフェース回路23は、例えば液晶やCRT(Cathode Ray Tube)等を用いる表示装置などの出力装置や、キーボードやマウス等の入力装置を、併合装置1に接続するための回路である。ユーザインターフェース回路23と、これに接続された入力装置と出力装置等により、上記入出力部11の機能が実現され得る。
なお、上述した場合以外にも、図1に示す併合装置1の機能ブロックの全て、又はその一部の機能は、適宜、専用のハードウェアにより実現されてもよい。
本実施形態に係る併合装置1は、複数の変更命令における各変更文データにおけるパスの階層に応じ、変更文データを並べ替える。併合装置1は、2以上の差分情報における各変更文データを、パスの浅い(又は深い)ものから順番に、併せて適用する。これにより、文書データにおいて、浅いパスで指定される語句データから深いパスで指定される語句データまでを、順番に、2つ以上の変更命令を活かしつつ、変更していくことができる。このため文書データの構造に即し、且つ2つ以上の変更命令の活かした併合結果を得ることができる。また、併合装置1は、2以上の差分情報の各々において、同一のパスの語句データを変更する変更文データがある場合に、これらの変更文データの適用結果のいずれも、変更後の文書データに盛り込むことにより活用する。これにより競合する2つ以上の変更命令がある場合でも、文書データを破壊せずに、これら変更命令を活かすことができる。
また、併合装置1は、文書データの或る位置における文言データに対する変更文が1つの差分情報中に2つ以上存在し、これらの変更文を用いる変更が推移的なものである場合に、これらの変更文を集約する。これにより併合処理のための時間の短縮が図られる。
本発明は、本発明の広義の精神と範囲を逸脱することなく、様々な実施形態および変形が可能とされるものである。また、上述した実施形態は、本発明を説明するためのものであり、本発明の範囲を限定するものではない。特許請求の範囲内およびそれと同等の発明の意義の範囲内で施される様々な変形も、本発明の範囲内とみなされる。