Browse Source

Réécriture de la requete de récupération des éléments.

bastien 12 years ago
parent
commit
7f428c3124

+ 111 - 66
src/Muzich/CoreBundle/Repository/ElementRepository.php View File

@@ -32,45 +32,61 @@ class ElementRepository extends EntityRepository
32 32
    * @return Doctrine\ORM\Query
33 33
    */
34 34
   public function findBySearch(ElementSearcher $searcher, $user_id)
35
-  {
36
-    $params = array();
37
-    $join_personal = '';
38
-    //$query_with = '';
39
-    $where = '';
35
+  {    
36
+    // Tableaux des paramétres
37
+    $params_ids = array();
38
+    $params_select = array();
39
+    $params_select['uid'] = $user_id;
40
+    
41
+    // Booléen nous permettant de savoir si un where a déjà été écrit
42
+    $is_where = false;
40 43
     
41
-    // ajout du filtres de trie avec les tags transmis
42
-    foreach ($searcher->getTags() as $tag_id)
44
+    // Construction des conditions pour la selection d'ids
45
+    $where_tags = '';
46
+    $join_tags  = '';
47
+    if (count(($tags = $searcher->getTags())))
43 48
     {
44
-      if ($where == '')
45
-      {
46
-        $where .= 'WHERE (t.id = :tid'.$tag_id;
47
-      }
48
-      else
49
+      foreach ($tags as $tag_id)
49 50
       {
50
-        $where .= ' OR t.id = :tid'.$tag_id;
51
+        // LEFT JOIN car un element n'est pas obligatoirement lié a un/des tags
52
+        $join_tags = " LEFT JOIN e_.tags t_";
53
+        
54
+        // Construction du chere pour les tags
55
+        if ($where_tags == '')
56
+        {
57
+          $where_tags .= ' WHERE (t_.id = :tid'.$tag_id;
58
+        }
59
+        else
60
+        {
61
+          $where_tags .= ' OR t_.id = :tid'.$tag_id;
62
+        }
63
+        $params_ids['tid'.$tag_id] = $tag_id;
51 64
       }
52
-      $params['tid'.$tag_id] = $tag_id;
65
+      // Fermeture de la parenthése qui isole la condition des tags
66
+      $where_tags .= ')';
67
+      $is_where = true;
53 68
     }
54 69
     
55
-    if (count($searcher->getTags()))
56
-    {
57
-      // Si on ne met pas les parenthéses, lorsqu'il y a d'autre where (AND, OR)
58
-      // On perd la précision et des résultats se retrouvent dans le tas
59
-      $where .= ')';
60
-    }
61
-    
62
-    // Ajout du filtre limitant au réseau personel si c'est le cas
70
+    // Construction de la condition network
71
+    $join_network  = '';
63 72
     $where_network = '';
64 73
     if ($searcher->getNetwork() == ElementSearcher::NETWORK_PERSONAL)
65 74
     {
66
-      $join_personal = 
67
-       " LEFT JOIN eu.followers_users f"
68
-      ." LEFT JOIN g.followers gf"
75
+      $join_network = 
76
+        " JOIN e_.owner o_"
77
+      // LEFT JOIN car l'element n'est pas obligatoirement lié a un groupe
78
+      . " LEFT JOIN e_.group g_"
79
+      // LEFT JOIN car owner n'est pas obligatoirement lié a des followers
80
+      . " LEFT JOIN o_.followers_users f_"
81
+      // LEFT JOIN car le groupe n'est pas obligatoirement lié a des followers
82
+      . " LEFT JOIN g_.followers gf_"
69 83
       ;
70
-      $where_network = ($where != '') ? ' AND' : ' WHERE';
71
-      $where_network .= ' (f.follower = :userid OR gf.follower = :useridg)';
72
-      $params['userid'] = $user_id;
73
-      $params['useridg'] = $user_id;
84
+      $where_network = ($is_where) ? ' AND' : ' WHERE';
85
+      // Le filtre applique: Soit le proprio fait partis des followeds de l'utilisateur
86
+      // soit l'element est ajouté dans un groupe que l'utilisateur follow.
87
+      $where_network .= ' (f_.follower = :userid OR gf_.follower = :useridg)';
88
+      $params_ids['userid'] = $user_id;
89
+      $params_ids['useridg'] = $user_id;
74 90
     }
75 91
     
76 92
     // ajout du filtre sur un user si c'est le cas
@@ -79,9 +95,9 @@ class ElementRepository extends EntityRepository
79 95
     //                de favoris, on ne filtre pas sur le proprio de l'element
80 96
     if (($search_user_id = $searcher->getUserId()) && !$searcher->isFavorite())
81 97
     {
82
-      $where_user = ($where != '') ? ' AND' : ' WHERE';
83
-      $where_user .= ' e.owner = :suid';
84
-      $params['suid'] = $search_user_id;
98
+      $where_user = ($is_where) ? ' AND' : ' WHERE';
99
+      $where_user .= ' e_.owner = :suid';
100
+      $params_ids['suid'] = $search_user_id;
85 101
     }
86 102
     
87 103
     // ajout du filtre sur un user si c'est le cas
@@ -90,25 +106,27 @@ class ElementRepository extends EntityRepository
90 106
     //               de favoris, on ne filtre pas sur le proprio de l'element
91 107
     if (($search_group_id = $searcher->getGroupId()) && !$searcher->isFavorite())
92 108
     {
93
-      $where_group = ($where != '') ? ' AND' : ' WHERE';
94
-      $where_group .= ' e.group = :sgid';
95
-      $params['sgid'] = $search_group_id;
109
+      $where_group = ($is_where) ? ' AND' : ' WHERE';
110
+      $where_group .= ' e_.group = :sgid';
111
+      $params_ids['sgid'] = $search_group_id;
96 112
     }
97 113
     
98
-    // Filtre pour afficher que les elements mis en favoris si c'est la demande
99
-    $join_favorite = ''; $where_favorite = '';
114
+    // Filtre pour afficher uniquement les elements mis en favoris
115
+    $join_favorite = ''; 
116
+    $where_favorite = '';
100 117
     if ($searcher->isFavorite())
101 118
     {
102
-      $where_favorite = ($where != '') ? ' AND' : ' WHERE';
119
+      $where_favorite = ($is_where) ? ' AND' : ' WHERE';
103 120
       if (($favorite_user_id = $searcher->getUserId()) && !$searcher->getGroupId())
104 121
       {
105
-        $join_favorite = 'JOIN e.elements_favorites fav2';
106
-        $where_favorite .= ' fav2.user = :fuid';
107
-        $params['fuid'] = $favorite_user_id;
122
+        // Pas de LEFT JOIN car on ne veut que les elements mis en favoris
123
+        $join_favorite = 'JOIN e_.elements_favorites fav2_';
124
+        $where_favorite .= ' fav2_.user = :fuid';
125
+        $params_ids['fuid'] = $favorite_user_id;
108 126
       }
109 127
       else if (($favorite_group_id = $searcher->getGroupId()) && !$searcher->getUserId())
110 128
       {
111
-        // TODO: Faire en sorte que ça affiche les favrois des gens suivant
129
+        // TODO: Faire en sorte que ça affiche les favoris des gens suivant
112 130
         // le groupe
113 131
       }
114 132
       else
@@ -117,33 +135,60 @@ class ElementRepository extends EntityRepository
117 135
       }
118 136
     }
119 137
     
120
-    // Construction de la requête finale
121
-    $query_string = "SELECT e, et, t2, eu, g, fav
122
-      FROM MuzichCoreBundle:Element e 
123
-      LEFT JOIN e.group g 
124
-      LEFT JOIN e.type et 
125
-      LEFT JOIN e.tags t 
126
-      LEFT JOIN e.tags t2 
127
-      LEFT JOIN e.elements_favorites fav WITH fav.user = :uid
128
-      $join_favorite
129
-      JOIN e.owner eu $join_personal
130
-      $where
131
-      $where_network
132
-      $where_user
133
-      $where_group
134
-      $where_favorite
135
-      GROUP BY e, et, t2, eu, g, fav
136
-      ORDER BY e.created DESC, e.name DESC"
138
+    // Requête qui selectionnera les ids en fonction des critéres
139
+    $r_ids = $this->getEntityManager()
140
+      ->createQuery(
141
+        "SELECT e_.id
142
+        FROM MuzichCoreBundle:Element e_
143
+        $join_tags
144
+        $join_network
145
+        $join_favorite
146
+        $where_tags
147
+        $where_network
148
+        $where_user
149
+        $where_group
150
+        $where_favorite
151
+        GROUP BY e_.id
152
+        ORDER BY e_.created DESC, e_.id DESC")
153
+     ->setParameters($params_ids)
154
+     ->setMaxResults($searcher->getCount())
155
+     ->getArrayResult()
137 156
     ;
138
-    $params['uid'] = $user_id;
139 157
     
140
-    $query = $this->getEntityManager()
141
-      ->createQuery($query_string)
142
-      ->setParameters($params)
143
-      ->setMaxResults($searcher->getCount())
144
-    ;
158
+    $ids = array();
159
+    
160
+    if (count($r_ids))
161
+    {
162
+      foreach ($r_ids as $r_id)
163
+      {
164
+        $ids[] = $r_id['id'];
165
+      }
166
+
167
+      // C'est la requête qui récupérera les données element avec ses jointures.
168
+      $query_select = "SELECT e, ty, t, o, g, fav
169
+        FROM MuzichCoreBundle:Element e 
170
+        LEFT JOIN e.group g 
171
+        LEFT JOIN e.type ty 
172
+        LEFT JOIN e.tags t 
173
+        LEFT JOIN e.elements_favorites fav WITH fav.user = :uid
174
+        JOIN e.owner o
175
+        WHERE e.id IN (:ids)
176
+        ORDER BY e.created DESC, e.id DESC"
177
+      ;
178
+
179
+      $params_select['ids'] = $ids;
180
+      $query = $this->getEntityManager()
181
+        ->createQuery($query_select)
182
+        ->setParameters($params_select)
183
+      ;
184
+
185
+      return $query;
186
+    }
145 187
     
146
-    return $query;
188
+    // Il faut retourner une Query
189
+    return $query = $this->getEntityManager()
190
+      ->createQuery("SELECT e FROM MuzichCoreBundle:Element e WHERE 1 = 2")
191
+    ;
147 192
   }
148 193
   
149 194
   /**

+ 13 - 2
src/Muzich/CoreBundle/Searcher/ElementSearcher.php View File

@@ -178,9 +178,20 @@ class ElementSearcher extends Searcher implements SearcherInterface
178 178
    * @param int $user_id
179 179
    * @return collection
180 180
    */
181
-  public function getElements(Registry $doctrine, $user_id)
181
+  public function getElements(Registry $doctrine, $user_id, $exec_type = 'execute')
182 182
   {
183
-    return $this->getQuery($doctrine, $user_id)->execute();
183
+    $query = $this->getQuery($doctrine, $user_id);
184
+    
185
+    switch ($exec_type)
186
+    {
187
+      case 'execute':
188
+        return $query->execute();
189
+      break;
190
+    
191
+      default :
192
+        throw new \Exception('Mode de récupération des Elements non supporté.');
193
+      break;
194
+    }
184 195
   }
185 196
   
186 197
 }

+ 1 - 1
src/Muzich/HomeBundle/Resources/config/routing.yml View File

@@ -5,7 +5,7 @@ home:
5 5
   defaults: { _controller: MuzichHomeBundle:Home:index }
6 6
   
7 7
 home_more:
8
-  pattern:  /{count}
8
+  pattern:  /more/{count}
9 9
   defaults: { _controller: MuzichHomeBundle:Home:index, count: null }
10 10
   
11 11
 show_user:

+ 1 - 1
src/Muzich/MynetworkBundle/Controller/MynetworkController.php View File

@@ -16,7 +16,7 @@ class MynetworkController extends Controller
16 16
    * @Template()
17 17
    */
18 18
   public function indexAction()
19
-  {
19
+  {    
20 20
     $user = $this->getUser(true, array('join' => array(
21 21
       'followeds_users', 'followers_users', 'followeds_groups'
22 22
     )));