Backport(バックポート) #1612
完了OpenPNE 2 からのアップグレードで、誤ったコミュニティカテゴリの紐付けをおこなってしまうことがある
100%
説明
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つのみの環境で行ったので、それ以上ある場合などの動作は不明です。
Kousuke Ebihara さんがほぼ14年前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 担当者 を Kousuke Ebihara にセット
Kousuke Ebihara さんがほぼ14年前に更新
重複するコミュニティ名がなかった場合に実行されるコミュニティインポート用の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 であるものはインポート対象にされていなかった。
Kousuke Ebihara さんがほぼ14年前に更新
既に OpenPNE 2 から OpenPNE 3.4 へのアップグレードを実施してしまい、コミュニティとカテゴリの紐付けが正しくおこなえていない SNS を修復するためのアップグレード手順も追加します。
Kousuke Ebihara さんがほぼ14年前に更新
既にコンバート済みのデータの修復を以下のようにすることを考えています。
- 残してある OpenPNE 2 のコミュニティとカテゴリの状態から、誤ったコンバートをしていないかどうか推定する
- 誤ったコンバートをしていた場合、*OpenPNE 2 由来のコミュニティとカテゴリについてのみ*、データの修復を試みる
Kousuke Ebihara さんが13年以上前に更新
- 題名 を 2系に存在する「中カテゴリ」がそのままカテゴリの一種としてコンバートされる から OpenPNE 2 からのアップグレードで、誤ったコミュニティカテゴリの紐付けをおこなってしまうことがある に変更
匿名ユーザー さんが13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 8c56130dfcafe5e1333a138f5ef3795083704e8a で適用されました。
Kousuke Ebihara さんが13年以上前に更新
- 対象バージョン を OpenPNE3.6beta11 から OpenPNE3.6beta12 に変更
親チケットが「テスト待ち」「完了」でないものをすべて beta12 以降での対応とします。
Rimpei Ogawa さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
親チケットを差し戻したのでこちらのチケットもステータスを変更しておきます。
http://redmine.openpne.jp/issues/1527#note-13
Kousuke Ebihara さんが13年以上前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
Rimpei Ogawa さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
バックポート確認しました。
Yuma Sakata さんが13年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更