@@ -25,25 +25,30 @@ class patterns extends \core\AbstractAction {
25
25
public function execute () {
26
26
$ userProfile = $ this ->getUserProfile ();
27
27
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
+
39
44
$ cleanResult = [];
40
45
if (!is_null ($ result )) {
41
46
$ keys = [];
42
47
foreach ($ result as $ value ) {
43
48
$ id = $ value ->id ;
44
49
if (!array_key_exists ($ id , $ keys )) {
45
50
$ cleanResult [] = $ value ;
46
- $ value ->favorite = $ value-> favorite == ' 1 ' ?true :null ;
51
+ $ value ->favorite = property_exists ( $ value, " favorite " ) ?true :null ;
47
52
$ keys [$ id ] = true ;
48
53
}
49
54
}
0 commit comments