Backport(バックポート) #1612
OpenPNE 2 からのアップグレードで、誤ったコミュニティカテゴリの紐付けをおこなってしまうことがある
100%
Description
Overview (現象)¶
OpenPNE 2 からのアップグレードで、誤ったコミュニティカテゴリの紐付けをおこなってしまうことがある。
この誤ったカテゴリの紐付けによって、中カテゴリにコミュニティがぶら下がってしまったり、 OpenPNE 3 からは閲覧できないコミュニティなどが生まれてしまう。
なお、この現象は OpenPNE 2 側データで「重複したコミュニティ名を持つコミュニティ」が存在している場合は発生しない(たとえば、 OpenPNE 公式 SNS には重複したコミュニティ名が存在していたため、この現象が発生しなかった)。
再現バージョン¶
- OpenPNE2.12.12 → 3.4.6
Causes (原因)¶
重複するコミュニティ名が存在しなかった場合に発行される、 OpenPNE 3 から OpenPNE 2 へのコミュニティインポート用の SQL に誤りがあった(この誤りは 2f36df96135741e537042bb028353bd1b90d83b8 で修正された)。
OpenPNE 2 からコミュニティを取得する SQL の WHERE 句の c_commu_category_id に指定される ID は、 OpenPNE 2 のコミュニティカテゴリ ID であるべきであるにも関わらず、 OpenPNE 3 のコミュニティカテゴリ ID を指定してしまっていた。
OpenPNE 2 のコミュニティカテゴリと OpenPNE 3 のコミュニティカテゴリはデータ構造が異なっており、 OpenPNE 2 では別テーブルであった中カテゴリも小カテゴリと同一のテーブルに格納される。そのため、小カテゴリの ID を OpenPNE 2 のものから意図的にずらしている。また、 OpenPNE 2 と OpenPNE 3 のどちらも、コミュニティは中カテゴリではなく小カテゴリに属するような実装になっている。
そこで、コンバータは小カテゴリに属するコミュニティ群のみを取得しにいこうとする。しかし、この誤った SQL では、コンバート対象とする小カテゴリIDの一覧は OpenPNE 3 のものであったので、 OpenPNE 2 では小カテゴリの ID だが OpenPNE 3 では中カテゴリの ID であるものはインポート対象にされていなかった。
Way to fix (修正内容)¶
1. まず、「原因」の項に示した問題を修正するために、重複するコミュニティ名が存在しなかった場合に発行する SQL でも、 OpenPNE 2 のカテゴリ ID を基にコミュニティのインポートをおこなうように修正した
2. 「1.」の修正はこれからコンバートをおこなう SNS にのみ有効なもので、既にコンバートしてしまった SNS が対象になるものではないので、このような SNS への救済措置として openpne:fix-wrong-categorized-community タスクを用意した
openpne:fix-wrong-categorized-community タスクがおこなうこと¶
- OpenPNE 2 の c_commu テーブルのうち、 OpenPNE 3 の community テーブルに移行されていないコミュニティを community テーブルにインポートする
- OpenPNE 2 と同名の中カテゴリ内に存在する同名の小カテゴリに属するコミュニティのみ、 OpenPNE 3 の正しいコミュニティカテゴリに紐付け直す
※タスクの実行中に手動で修復することを選択した場合は、上であげた処理と同等の SQL を画面に出力する。
※OpenPNE 3 からのコンバート後に名前を変更していたり、同じ名前でも属する中カテゴリが異なる小カテゴリについては、カテゴリの紐付け直しはおこなわない
報告元¶
http://sns.openpne.jp/diary/24998から転載
OpenPNE2.12.12から3.4.6へコンバートする際に、 OpenPNE2に存在していた「中カテゴリ」がそのままカテゴリの一種としてコンバートされてしまい、結果としてIDがOpenPNE2とOpenPNE3とではずれてしまう(当方では中カテゴリ一つだったので1づつずれている)。 結果、コミュニティ表示のカテゴリはまったく違うものとなる。 また、OpenPNE2で先頭のIDを持つコミュは消えてしまう (どうやらコンバート時にOpenPNE3用のテーブルにはコンバートされていない様子)
コメントにもバグに関する情報がありましたので追記します。
中カテゴリのコンバートをしないように opUpgradeFrom2ImportCommunityCategoryStrategy.class.php の61行目 $this->conn->execute($newParentSQL.' '.$oldParentSQL, array($parent['c_commu_category_parent_id'])); をコメントアウトしたところ、一応こちらの望むようにコンバートできました。 ただし、中カテゴリが1つのみの環境で行ったので、それ以上ある場合などの動作は不明です。
Related issues
Associated revisions
History
#1
Updated by Kousuke Ebihara about 13 years ago
- Target version changed from OpenPNE 3.7.0 to OpenPNE 3.6beta6
#2
Updated by Kousuke Ebihara almost 13 years ago
- Target version changed from OpenPNE 3.6beta6 to OpenPNE 3.6beta7
#3
Updated by Kousuke Ebihara almost 13 years ago
- Target version changed from OpenPNE 3.6beta7 to OpenPNE 3.6beta8
#4
Updated by Kousuke Ebihara over 12 years ago
- Target version changed from OpenPNE 3.6beta8 to OpenPNE3.6beta9
#5
Updated by Kousuke Ebihara over 12 years ago
- Status changed from New(新規) to Accepted(着手)
- Assignee set to Kousuke Ebihara
#6
Updated by Kousuke Ebihara over 12 years ago
重複するコミュニティ名がなかった場合に実行されるコミュニティインポート用のSQLが誤っていた。
OpenPNE 2 からコミュニティを取得する SQL の WHERE 句の c_commu_category_id に指定される ID は、 OpenPNE 2 のコミュニティカテゴリ ID であるべきであるにも関わらず、 OpenPNE 3 のコミュニティカテゴリ ID を指定してしまっていた。
OpenPNE 2 のコミュニティカテゴリと OpenPNE 3 のコミュニティカテゴリはデータ構造が異なっており、 OpenPNE 2 では別テーブルであった中カテゴリも小カテゴリと同一のテーブルに格納される。そのため、小カテゴリの ID を OpenPNE 2 のものから意図的にずらしている。また、 OpenPNE 2 と OpenPNE 3 のどちらも、コミュニティは中カテゴリではなく小カテゴリに属するような実装になっている。
コンバータは小カテゴリに属するコミュニティ群のみを取得しにいこうとする。しかし、このときのコンバート対象とする小カテゴリIDの一覧は OpenPNE 3 のものであるので、 OpenPNE 2 では小カテゴリの ID だが OpenPNE 3 では中カテゴリの ID であるものはインポート対象にされていなかった。
#7
Updated by Kousuke Ebihara over 12 years ago
既に OpenPNE 2 から OpenPNE 3.4 へのアップグレードを実施してしまい、コミュニティとカテゴリの紐付けが正しくおこなえていない SNS を修復するためのアップグレード手順も追加します。
#8
Updated by Kousuke Ebihara over 12 years ago
既にコンバート済みのデータの修復を以下のようにすることを考えています。
- 残してある OpenPNE 2 のコミュニティとカテゴリの状態から、誤ったコンバートをしていないかどうか推定する
- 誤ったコンバートをしていた場合、*OpenPNE 2 由来のコミュニティとカテゴリについてのみ*、データの修復を試みる
#9
Updated by Kousuke Ebihara over 12 years ago
- Target version changed from OpenPNE3.6beta9 to OpenPNE3.6beta11
#10
Updated by Masato Nagasawa over 12 years ago
- Target version changed from OpenPNE3.6beta11 to OpenPNE 3.6.0
#11
Updated by Masato Nagasawa over 12 years ago
- Target version changed from OpenPNE 3.6.0 to OpenPNE3.6beta11
#12
Updated by Kousuke Ebihara over 12 years ago
- Subject changed from 2系に存在する「中カテゴリ」がそのままカテゴリの一種としてコンバートされる to OpenPNE 2 からのアップグレードで、誤ったコミュニティカテゴリの紐付けをおこなってしまうことがある
#13 Updated by Anonymous over 12 years ago
- Status changed from Accepted(着手) to Pending Review(レビュー待ち)
- % Done changed from 0 to 50
更新履歴 8c56130dfcafe5e1333a138f5ef3795083704e8a で適用されました。
#14
Updated by Kousuke Ebihara over 12 years ago
- Target version changed from OpenPNE3.6beta11 to OpenPNE3.6beta12
親チケットが「テスト待ち」「完了」でないものをすべて beta12 以降での対応とします。
#15
Updated by Kousuke Ebihara about 12 years ago
更新履歴 bc619b7925527bba30f837d0dff15ab2f19e5ec0 で適用されました。
#16
Updated by Rimpei Ogawa about 12 years ago
- Status changed from Pending Review(レビュー待ち) to Rejected(差し戻し)
親チケットを差し戻したのでこちらのチケットもステータスを変更しておきます。
http://redmine.openpne.jp/issues/1527#note-13
#17
Updated by Kousuke Ebihara about 12 years ago
- Status changed from Rejected(差し戻し) to Pending Review(レビュー待ち)
#18
Updated by Rimpei Ogawa about 12 years ago
- Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
- % Done changed from 50 to 70
バックポート確認しました。
#19
Updated by Yuma Sakata about 12 years ago
テストOKです。
#20
Updated by Yuma Sakata about 12 years ago
- Status changed from Pending Testing(テスト待ち) to Fixed(完了)
- % Done changed from 70 to 100