プロジェクト

全般

プロフィール

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

Minoru Takai12年以上前に更新

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. 修正方針

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

戻る