操作
Enhancement(機能追加・改善) #2615
未完了フレンド数ランキングとコミュニティ参加人数ランキングの処理で DQL 周りのコードが一部適切でない
ステータス:
New(新規)
優先度:
Normal(通常)
担当者:
-
開始日:
2011-11-18
期日:
進捗率:
0%
予定工数:
説明
概要¶
- https://github.com/tejimaya/opRankingPlugin/blob/v1.0.1/lib/opRankingPlugin.php#L55
public static function getFriendRanking($max, $page) { $memberRelationships = Doctrine::getTable('MemberRelationship')->createQuery() ->select('COUNT(*), MemberRelationship.member_id_to') ->where('MemberRelationship.is_friend = ?', true) ->addWhere('m.is_active = ?', true) ->leftJoin('MemberRelationship.Member m') ->groupBy('m.id') ->orderBy('COUNT(*) DESC') ->offset($page * $max) ->limit($max) ->fetchArray();
- https://github.com/tejimaya/opRankingPlugin/blob/v1.0.1/lib/opRankingPlugin.php#L98
public static function getCommunityRanking($max, $page) { $communityMembers = Doctrine::getTable('CommunityMember')->createQuery() ->select('COUNT(*), community_id') ->groupBy('community_id') ->orderBy('COUNT(*) DESC') ->offset($page * $max) ->limit($max) ->fetchArray();
と DQL が記述されているが、 COUNT (*) にエイリアスを与えず SELECT 句と ORDER BY 句に記述しており、可読性が低く、パフォーマンス上も問題になり得る状態になっている。
->fetchArray(); の行を ->getSqlQuery(); に書き換え、結果を代入されている変数をデバッグ出力した結果は次の通り(ここでは改行を入れています)。
==== $memberRelationships SELECT m.id AS m__id, m.member_id_to AS m__member_id_to, COUNT(*) AS m__0 FROM member_relationship m LEFT JOIN member m2 ON m.member_id_to = m2.id WHERE (m.is_friend = ? AND m2.is_active = ?) GROUP BY m2.id ORDER BY COUNT(*) DESC LIMIT 10 ==== $communityMembers SELECT c.id AS c__id, c.community_id AS c__community_id, COUNT(*) AS c__0 FROM community_member c WHERE (c.is_pre = ?) GROUP BY c.community_id ORDER BY COUNT(*) DESC LIMIT 10
また、 getFriendRanking() メソッド内の方は、 MemberRelationship テーブルにエイリアスを与えず若干冗長な記述となっており、 member_id_to の使い方も不自然( member_id_from とすべき箇所を member_id_to としている)に見える。 member_id_to を member_id_from と入れ替える場合は、メソッド内の後続するコードで member_id_to と記述している箇所も書き換える必要がある。
対象バージョン¶
OpenPNE-3.6.0 にバンドルされている v1.0.1 時点のソースについて指摘している。最新バージョンで改善されればよい。
修正方針¶
概要に示した部分の修正と、それに関連して改善できそうな部分の修正を扱いたい。このチケットでどの程度の範囲までコードの修正を行うかは実装担当者に任せる。修正範囲を拡張し、チケットタイトルに対して修正内容がそぐわないようであれば、チケットの編集も行う。
操作