Skip to content

Commit c8ce2a8

Browse files
committed
Optimize action that loads a users created and favourited patterns.
1 parent bc6657b commit c8ce2a8

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

server/actions/account/patterns.php

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,30 @@ class patterns extends \core\AbstractAction {
2525
public function execute() {
2626
$userProfile = $this->getUserProfile();
2727

28-
$result = $this->db->query("SELECT patterns.*, favorites.patternId = patterns.id as favorite, ur.rating as userRating
29-
FROM patterns
30-
LEFT JOIN userRatings as ur ON ur.userId='{$userProfile->userId}' AND ur.patternId=patterns.id
31-
LEFT JOIN favorites ON favorites.userId = '{$userProfile->userId}'
32-
WHERE patterns.owner = '$userProfile->userId' || favorites.patternId = patterns.id
33-
ORDER BY favorite DESC
34-
");
35-
36-
// Filter out duplicate results.
37-
// We can't user GROUP BY, because it can remove the isFavorite flag from your own patterns.
38-
// Thats why we sort by isFavorite DESC, so we remove the !isFavorite patterns first.
28+
// When using a single query performance is awful, so we run favorites and created separate.
29+
$createdResult = $this->db->query("SELECT patterns.*, ur.rating as userRating
30+
FROM patterns
31+
LEFT JOIN userRatings as ur ON ur.userId='{$userProfile->userId}' AND ur.patternId=patterns.id
32+
WHERE patterns.owner = '{$userProfile->userId}'
33+
");
34+
35+
$favoriteResult = $this->db->query("SELECT patterns.*, favorites.patternId = patterns.id as favorite, ur.rating as userRating
36+
FROM patterns
37+
LEFT JOIN userRatings as ur ON ur.userId='{$userProfile->userId}' AND ur.patternId=patterns.id
38+
LEFT JOIN favorites ON favorites.userId = '{$userProfile->userId}'
39+
WHERE favorites.patternId = patterns.id");
40+
41+
// Merge everything and filter out duplicate results.
42+
$result = \array_merge(\is_array($createdResult)?$createdResult:[], \is_array($favoriteResult)?$favoriteResult:[]);
43+
3944
$cleanResult = [];
4045
if (!is_null($result)) {
4146
$keys = [];
4247
foreach ($result as $value) {
4348
$id = $value->id;
4449
if (!array_key_exists($id, $keys)) {
4550
$cleanResult[] = $value;
46-
$value->favorite = $value->favorite == '1'?true:null;
51+
$value->favorite = property_exists($value, "favorite")?true:null;
4752
$keys[$id] = true;
4853
}
4954
}

0 commit comments

Comments
 (0)