Project

General

Profile

Enhancement(機能追加・改善) #2615

Updated by Minoru Takai about 13 years ago

h3. 概要 

 * https://github.com/tejimaya/opRankingPlugin/blob/v1.0.1/lib/opRankingPlugin.php#L55 
 <pre><code class="php"> 
   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(); 
 </code></pre> 
 * https://github.com/tejimaya/opRankingPlugin/blob/v1.0.1/lib/opRankingPlugin.php#L98 
 <pre><code class="php"> 
   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(); 
 </code></pre> 

 と DQL が記述されているが、 COUNT (*) COUNT(*) にエイリアスを与えず SELECT 句と ORDER BY 句に記述しており、可読性が低く、パフォーマンス上も問題になり得る状態になっている。 

 ->fetchArray(); の行を ->getSqlQuery(); に書き換え、結果を代入されている変数をデバッグ出力した結果は次の通り(ここでは改行を入れています)。 

 <pre> 
 ==== $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 
 </pre> 

 また、 getFriendRanking() メソッド内の方は、 MemberRelationship テーブルにエイリアスを与えず若干冗長な記述となっており、 member_id_to の使い方も不自然( member_id_from とすべき箇所を member_id_to としている)に見える。 member_id_to を member_id_from と入れ替える場合は、メソッド内の後続するコードで member_id_to と記述している箇所も書き換える必要がある。 

 h3. 対象バージョン 

 OpenPNE-3.6.0 にバンドルされている v1.0.1 時点のソースについて指摘している。最新バージョンで改善されればよい。 

 h3. 修正方針 

 概要に示した部分の修正と、それに関連して改善できそうな部分の修正を扱いたい。このチケットでどの程度の範囲までコードの修正を行うかは実装担当者に任せる。修正範囲を拡張し、チケットタイトルに対して修正内容がそぐわないようであれば、チケットの編集も行う。

Back