]> Raphaƫl G. Git Repositories - airbundle/blobdiff - Repository/LocationRepository.php
Fix coalesce warning
[airbundle] / Repository / LocationRepository.php
index d8acc143009e4d10c43299bd6ea073d644ba039d..9b621ef3cafe2b073c511ee42867c2bd665bf8e4 100644 (file)
 namespace Rapsys\AirBundle\Repository;
 
 use Doctrine\ORM\Query\ResultSetMapping;
 namespace Rapsys\AirBundle\Repository;
 
 use Doctrine\ORM\Query\ResultSetMapping;
+
 use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use Symfony\Component\Routing\RouterInterface;
 
 use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use Symfony\Component\Routing\RouterInterface;
 
+use Rapsys\AirBundle\Repository;
+
 /**
  * LocationRepository
  *
  * @TODO: use new window function syntax https://mariadb.com/kb/en/window-functions-overview/ MAX(updated) OVER (PARTITION updated) AS modified ???
  */
 /**
  * LocationRepository
  *
  * @TODO: use new window function syntax https://mariadb.com/kb/en/window-functions-overview/ MAX(updated) OVER (PARTITION updated) AS modified ???
  */
-class LocationRepository extends EntityRepository {
+class LocationRepository extends Repository {
        /**
         * Find locations
         *
        /**
         * Find locations
         *
@@ -48,8 +51,8 @@ SELECT
        l.longitude,
        l.indoor,
        l.updated
        l.longitude,
        l.indoor,
        l.updated
-FROM RapsysAirBundle:Location AS l
-LEFT JOIN RapsysAirBundle:Session AS s ON (l.id = s.location_id)
+FROM Rapsys\AirBundle\Entity\Location AS l
+LEFT JOIN Rapsys\AirBundle\Entity\Session AS s ON (l.id = s.location_id)
 GROUP BY l.id
 ORDER BY COUNT(IF(s.date BETWEEN :begin AND :end, s.id, NULL)) DESC, COUNT(s.id) DESC, l.id
 SQL;
 GROUP BY l.id
 ORDER BY COUNT(IF(s.date BETWEEN :begin AND :end, s.id, NULL)) DESC, COUNT(s.id) DESC, l.id
 SQL;
@@ -93,7 +96,7 @@ SQL;
                                'updated' => $data['updated'],
                                //XXX: Useless ???
                                'slug' => $location = $this->slugger->slug($title),
                                'updated' => $data['updated'],
                                //XXX: Useless ???
                                'slug' => $location = $this->slugger->slug($title),
-                               'link' => $this->router->generate('rapsys_air_location_view', ['id' => $data['id'], 'location' => $this->slugger->slug($location)])
+                               'link' => $this->router->generate('rapsysair_location_view', ['id' => $data['id'], 'location' => $this->slugger->slug($location)])
                        ];
                }
 
                        ];
                }
 
@@ -122,7 +125,7 @@ SELECT
        GROUP_CONCAT(a.longitude ORDER BY a.pcount DESC, a.count DESC, a.id SEPARATOR "\\n") AS longitudes,
        GROUP_CONCAT(a.indoor ORDER BY a.pcount DESC, a.count DESC, a.id SEPARATOR "\\n") AS indoors,
        GROUP_CONCAT(a.count ORDER BY a.pcount DESC, a.count DESC, a.id SEPARATOR "\\n") AS counts,
        GROUP_CONCAT(a.longitude ORDER BY a.pcount DESC, a.count DESC, a.id SEPARATOR "\\n") AS longitudes,
        GROUP_CONCAT(a.indoor ORDER BY a.pcount DESC, a.count DESC, a.id SEPARATOR "\\n") AS indoors,
        GROUP_CONCAT(a.count ORDER BY a.pcount DESC, a.count DESC, a.id SEPARATOR "\\n") AS counts,
-       MAX(a.updated) AS modified
+       MAX(a.modified) AS modified
 FROM (
        SELECT
                l.id,
 FROM (
        SELECT
                l.id,
@@ -131,18 +134,18 @@ FROM (
                l.latitude,
                l.longitude,
                l.indoor,
                l.latitude,
                l.longitude,
                l.indoor,
-               l.updated,
+               GREATEST(l.created, l.updated, COALESCE(s.created, '1970-01-01'), COALESCE(s.updated, '1970-01-01')) AS modified,
                l.zipcode,
                COUNT(s.id) AS count,
                COUNT(IF(s.date BETWEEN :begin AND :end, s.id, NULL)) AS pcount
                l.zipcode,
                COUNT(s.id) AS count,
                COUNT(IF(s.date BETWEEN :begin AND :end, s.id, NULL)) AS pcount
-       FROM RapsysAirBundle:Location AS l
-       LEFT JOIN RapsysAirBundle:Session AS s ON (l.id = s.location_id)
+       FROM Rapsys\AirBundle\Entity\Location AS l
+       LEFT JOIN Rapsys\AirBundle\Entity\Session AS s ON (l.id = s.location_id)
        GROUP BY l.id
        ORDER BY NULL
        LIMIT 0, :limit
 ) AS a
        GROUP BY l.id
        ORDER BY NULL
        LIMIT 0, :limit
 ) AS a
-GROUP BY a.city, SUBSTRING(a.zipcode, 1, 3)
-ORDER BY a.city, SUBSTRING(a.zipcode, 1, 3)
+GROUP BY a.city, SUBSTRING(a.zipcode, 1, 2)
+ORDER BY a.city, a.zipcode
 SQL;
 
                //Replace bundle entity name by table name
 SQL;
 
                //Replace bundle entity name by table name
@@ -227,7 +230,7 @@ SQL;
                                        'latitude' => floatval($latitudes[$k]),
                                        'longitude' => floatval($longitudes[$k]),
                                        'indoor' => $indoors[$k] == 0 ? $this->translator->trans('outdoor') : $this->translator->trans('indoor'),
                                        'latitude' => floatval($latitudes[$k]),
                                        'longitude' => floatval($longitudes[$k]),
                                        'indoor' => $indoors[$k] == 0 ? $this->translator->trans('outdoor') : $this->translator->trans('indoor'),
-                                       'link' => $this->router->generate('rapsys_air_location_view', ['id' => $id, 'location' => $this->slugger->slug($location)])
+                                       'link' => $this->router->generate('rapsysair_location_view', ['id' => $id, 'location' => $this->slugger->slug($location)])
                                ];
                        }
 
                                ];
                        }
 
@@ -243,7 +246,7 @@ SQL;
                                'modified' => $data['modified'],
                                //XXX: Useless ???
                                'slug' => $city = $this->slugger->slug($data['city']),
                                'modified' => $data['modified'],
                                //XXX: Useless ???
                                'slug' => $city = $this->slugger->slug($data['city']),
-                               'link' => $this->router->generate('rapsys_air_city_view', ['city' => $city, 'latitude' => $data['latitude'], 'longitude' => $data['longitude']]),
+                               'link' => $this->router->generate('rapsysair_city_view', ['city' => $city, 'latitude' => $data['latitude'], 'longitude' => $data['longitude']]),
                                'locations' => $data['locations']
                        ];
                }
                                'locations' => $data['locations']
                        ];
                }
@@ -268,8 +271,8 @@ SELECT
        ROUND(AVG(l.latitude), 6) AS latitude,
        ROUND(AVG(l.longitude), 6) AS longitude,
        MAX(l.updated) AS updated
        ROUND(AVG(l.latitude), 6) AS latitude,
        ROUND(AVG(l.longitude), 6) AS longitude,
        MAX(l.updated) AS updated
-FROM RapsysAirBundle:Location AS l
-GROUP BY city, SUBSTRING(l.zipcode, 1, 3)
+FROM Rapsys\AirBundle\Entity\Location AS l
+GROUP BY city, SUBSTRING(l.zipcode, 1, 2)
 ORDER BY ACOS(SIN(RADIANS(:latitude))*SIN(RADIANS(l.latitude))+COS(RADIANS(:latitude))*COS(RADIANS(l.latitude))*COS(RADIANS(:longitude - l.longitude)))*40030.17/2/PI()
 LIMIT 0, 1
 SQL;
 ORDER BY ACOS(SIN(RADIANS(:latitude))*SIN(RADIANS(l.latitude))+COS(RADIANS(:latitude))*COS(RADIANS(l.latitude))*COS(RADIANS(:longitude - l.longitude)))*40030.17/2/PI()
 LIMIT 0, 1
 SQL;
@@ -315,7 +318,7 @@ SQL;
                        'multimap' => $this->translator->trans($result['city'].' sector map'),
                        //XXX: Useless ???
                        'slug' => $slug = $this->slugger->slug($result['city']),
                        'multimap' => $this->translator->trans($result['city'].' sector map'),
                        //XXX: Useless ???
                        'slug' => $slug = $this->slugger->slug($result['city']),
-                       'link' => $this->router->generate('rapsys_air_city_view', ['city' => $slug, 'latitude' => $result['latitude'], 'longitude' => $result['longitude']])
+                       'link' => $this->router->generate('rapsysair_city_view', ['city' => $slug, 'latitude' => $result['latitude'], 'longitude' => $result['longitude']])
                ];
        }
 
                ];
        }
 
@@ -357,8 +360,9 @@ SELECT
        a.title,
        a.latitude,
        a.longitude,
        a.title,
        a.latitude,
        a.longitude,
+       a.created,
        a.updated,
        a.updated,
-       MAX(a.updated) AS modified,
+       MAX(GREATEST(a.modified, COALESCE(s.created, '1970-01-01'), COALESCE(s.updated, '1970-01-01'))) AS modified,
        COUNT(s.id) AS count
 FROM (
        SELECT
        COUNT(s.id) AS count
 FROM (
        SELECT
@@ -366,12 +370,14 @@ FROM (
                l.title,
                l.latitude,
                l.longitude,
                l.title,
                l.latitude,
                l.longitude,
-               l.updated
-       FROM RapsysAirBundle:Location AS l
+               l.created,
+               l.updated,
+               GREATEST(l.created, l.updated) AS modified
+       FROM Rapsys\AirBundle\Entity\Location AS l
        WHERE l.latitude BETWEEN :minlat AND :maxlat AND l.longitude BETWEEN :minlong AND :maxlong
        LIMIT 0, :limit
 ) AS a
        WHERE l.latitude BETWEEN :minlat AND :maxlat AND l.longitude BETWEEN :minlong AND :maxlong
        LIMIT 0, :limit
 ) AS a
-LEFT JOIN RapsysAirBundle:Session s ON (s.location_id = a.id)
+LEFT JOIN Rapsys\AirBundle\Entity\Session s ON (s.location_id = a.id)
 GROUP BY a.id
 ORDER BY COUNT(IF(s.date BETWEEN :begin AND :end, s.id, NULL)) DESC, count DESC, a.id
 SQL;
 GROUP BY a.id
 ORDER BY COUNT(IF(s.date BETWEEN :begin AND :end, s.id, NULL)) DESC, count DESC, a.id
 SQL;
@@ -390,6 +396,7 @@ SQL;
                        ->addScalarResult('title', 'title', 'string')
                        ->addScalarResult('latitude', 'latitude', 'float')
                        ->addScalarResult('longitude', 'longitude', 'float')
                        ->addScalarResult('title', 'title', 'string')
                        ->addScalarResult('latitude', 'latitude', 'float')
                        ->addScalarResult('longitude', 'longitude', 'float')
+                       ->addScalarResult('created', 'created', 'datetime')
                        ->addScalarResult('updated', 'updated', 'datetime')
                        ->addScalarResult('modified', 'modified', 'datetime')
                        ->addScalarResult('count', 'count', 'integer');
                        ->addScalarResult('updated', 'updated', 'datetime')
                        ->addScalarResult('modified', 'modified', 'datetime')
                        ->addScalarResult('count', 'count', 'integer');
@@ -422,11 +429,12 @@ SQL;
                                'title' => $title = $this->translator->trans($data['title']),
                                'latitude' => $data['latitude'],
                                'longitude' => $data['longitude'],
                                'title' => $title = $this->translator->trans($data['title']),
                                'latitude' => $data['latitude'],
                                'longitude' => $data['longitude'],
+                               'created' => $data['created'],
                                'updated' => $data['updated'],
                                'modified' => $data['modified'],
                                'count' => $data['count'],
                                'slug' => $slug = $this->slugger->slug($title),
                                'updated' => $data['updated'],
                                'modified' => $data['modified'],
                                'count' => $data['count'],
                                'slug' => $slug = $this->slugger->slug($title),
-                               'link' => $this->router->generate('rapsys_air_location_view', ['id' => $data['id'], 'location' => $slug])
+                               'link' => $this->router->generate('rapsysair_location_view', ['id' => $data['id'], 'location' => $slug])
                        ];
                }
 
                        ];
                }
 
@@ -451,8 +459,9 @@ SELECT
        a.city,
        a.latitude,
        a.longitude,
        a.city,
        a.latitude,
        a.longitude,
+       a.created,
        a.updated,
        a.updated,
-       a.modified,
+       MAX(GREATEST(a.modified, COALESCE(s3.created, '1970-01-01'), COALESCE(s3.updated, '1970-01-01'))) AS modified,
        a.pcount,
        COUNT(s3.id) AS tcount
 FROM (
        a.pcount,
        COUNT(s3.id) AS tcount
 FROM (
@@ -462,9 +471,10 @@ FROM (
                b.city,
                b.latitude,
                b.longitude,
                b.city,
                b.latitude,
                b.longitude,
+               b.created,
                b.updated,
                b.updated,
-               COUNT(s2.id) AS pcount,
-               MAX(b.updated) AS modified
+               MAX(GREATEST(b.modified, COALESCE(s2.created, '1970-01-01'), COALESCE(s2.updated, '1970-01-01'))) AS modified,
+               COUNT(s2.id) AS pcount
        FROM (
                SELECT
                        l2.id,
        FROM (
                SELECT
                        l2.id,
@@ -472,7 +482,9 @@ FROM (
                        l2.title,
                        l2.latitude,
                        l2.longitude,
                        l2.title,
                        l2.latitude,
                        l2.longitude,
-                       l2.updated
+                       l2.created,
+                       l2.updated,
+                       GREATEST(l2.created, l2.updated) AS modified
                FROM (
                        SELECT
                                l.id,
                FROM (
                        SELECT
                                l.id,
@@ -517,10 +529,11 @@ SQL;
                        ->addScalarResult('city', 'city', 'string')
                        ->addScalarResult('latitude', 'latitude', 'float')
                        ->addScalarResult('longitude', 'longitude', 'float')
                        ->addScalarResult('city', 'city', 'string')
                        ->addScalarResult('latitude', 'latitude', 'float')
                        ->addScalarResult('longitude', 'longitude', 'float')
+                       ->addScalarResult('created', 'created', 'datetime')
                        ->addScalarResult('updated', 'updated', 'datetime')
                        ->addScalarResult('updated', 'updated', 'datetime')
+                       ->addScalarResult('modified', 'modified', 'datetime')
                        ->addScalarResult('pcount', 'pcount', 'integer')
                        ->addScalarResult('pcount', 'pcount', 'integer')
-                       ->addScalarResult('tcount', 'tcount', 'integer')
-                       ->addScalarResult('modified', 'modified', 'datetime');
+                       ->addScalarResult('tcount', 'tcount', 'integer');
 
                //Get result
                $result = $this->_em
 
                //Get result
                $result = $this->_em
@@ -551,12 +564,13 @@ SQL;
                                'miniature' => $this->translator->trans($data['title'].' miniature'),
                                'latitude' => $data['latitude'],
                                'longitude' => $data['longitude'],
                                'miniature' => $this->translator->trans($data['title'].' miniature'),
                                'latitude' => $data['latitude'],
                                'longitude' => $data['longitude'],
+                               'created' => $data['created'],
                                'updated' => $data['updated'],
                                'updated' => $data['updated'],
+                               'modified' => $data['modified'],
                                'pcount' => $data['pcount'],
                                'tcount' => $data['tcount'],
                                'pcount' => $data['pcount'],
                                'tcount' => $data['tcount'],
-                               'modified' => $data['modified'],
                                'slug' => $slug = $this->slugger->slug($title),
                                'slug' => $slug = $this->slugger->slug($title),
-                               'link' => $this->router->generate('rapsys_air_location_view', ['id' => $data['id'], 'location' => $slug])
+                               'link' => $this->router->generate('rapsysair_location_view', ['id' => $data['id'], 'location' => $slug])
                        ];
                }
 
                        ];
                }
 
@@ -582,12 +596,12 @@ SELECT
        l.longitude,
        l.indoor,
        l.zipcode,
        l.longitude,
        l.indoor,
        l.zipcode,
-       MAX(l2.updated) AS updated,
+       MAX(GREATEST(l.created, l.updated, l2.created, l2.updated)) AS modified,
        SUBSTRING(l.zipcode, 1, 2) AS city_id,
        ROUND(AVG(l2.latitude), 6) AS city_latitude,
        ROUND(AVG(l2.longitude), 6) AS city_longitude
        SUBSTRING(l.zipcode, 1, 2) AS city_id,
        ROUND(AVG(l2.latitude), 6) AS city_latitude,
        ROUND(AVG(l2.longitude), 6) AS city_longitude
-FROM RapsysAirBundle:Location AS l
-JOIN RapsysAirBundle:Location AS l2 ON (l2.city = l.city AND SUBSTRING(l.zipcode, 1, 3) = SUBSTRING(l.zipcode, 1, 3))
+FROM Rapsys\AirBundle\Entity\Location AS l
+JOIN Rapsys\AirBundle\Entity\Location AS l2 ON (l2.city = l.city AND SUBSTRING(l2.zipcode, 1, 2) = SUBSTRING(l.zipcode, 1, 2))
 WHERE l.id = :id
 GROUP BY l.id
 LIMIT 0, 1
 WHERE l.id = :id
 GROUP BY l.id
 LIMIT 0, 1
@@ -610,7 +624,7 @@ SQL;
                        ->addScalarResult('longitude', 'longitude', 'float')
                        ->addScalarResult('indoor', 'indoor', 'boolean')
                        ->addScalarResult('zipcode', 'zipcode', 'string')
                        ->addScalarResult('longitude', 'longitude', 'float')
                        ->addScalarResult('indoor', 'indoor', 'boolean')
                        ->addScalarResult('zipcode', 'zipcode', 'string')
-                       ->addScalarResult('updated', 'updated', 'datetime')
+                       ->addScalarResult('modified', 'modified', 'datetime')
                        ->addScalarResult('city_id', 'city_id', 'integer')
                        ->addScalarResult('city_latitude', 'city_latitude', 'float')
                        ->addScalarResult('city_longitude', 'city_longitude', 'float')
                        ->addScalarResult('city_id', 'city_id', 'integer')
                        ->addScalarResult('city_latitude', 'city_latitude', 'float')
                        ->addScalarResult('city_longitude', 'city_longitude', 'float')
@@ -632,7 +646,7 @@ SQL;
                $result['alternates'] = [];
 
                //Set route
                $result['alternates'] = [];
 
                //Set route
-               $route = 'rapsys_air_location_view';
+               $route = 'rapsysair_location_view';
 
                //Set route params
                $routeParams = ['id' => $id];
 
                //Set route params
                $routeParams = ['id' => $id];
@@ -676,13 +690,13 @@ SQL;
                                'id' => $result['city_id'],
                                'title' => $result['city'],
                                'in' => $this->translator->trans('in '.$result['city']),
                                'id' => $result['city_id'],
                                'title' => $result['city'],
                                'in' => $this->translator->trans('in '.$result['city']),
-                               'link' => $this->router->generate('rapsys_air_city_view', ['city' => $result['city'], 'latitude' => $result['city_latitude'], 'longitude' => $result['city_longitude']])
+                               'link' => $this->router->generate('rapsysair_city_view', ['city' => $result['city'], 'latitude' => $result['city_latitude'], 'longitude' => $result['city_longitude']])
                        ],
                        'title' => $title = $this->translator->trans($result['title']),
                        'latitude' => $result['latitude'],
                        'longitude' => $result['longitude'],
                        'indoor' => $result['indoor'],
                        ],
                        'title' => $title = $this->translator->trans($result['title']),
                        'latitude' => $result['latitude'],
                        'longitude' => $result['longitude'],
                        'indoor' => $result['indoor'],
-                       'updated' => $result['updated'],
+                       'modified' => $result['modified'],
                        'around' => $this->translator->trans('around '.$result['title']),
                        'at' => $this->translator->trans('at '.$result['title']),
                        'atin' => $this->translator->trans('at '.$result['title']).' '.$this->translator->trans('in '.$result['city']),
                        'around' => $this->translator->trans('around '.$result['title']),
                        'at' => $this->translator->trans('at '.$result['title']),
                        'atin' => $this->translator->trans('at '.$result['title']).' '.$this->translator->trans('in '.$result['city']),
@@ -702,18 +716,15 @@ SQL;
         */
        public function findComplementBySessionId(int $id): array {
                //Fetch complement locations
         */
        public function findComplementBySessionId(int $id): array {
                //Fetch complement locations
-               $ret = $this->getEntityManager()
-                         ->createQuery('SELECT l.id, l.title FROM RapsysAirBundle:Session s LEFT JOIN RapsysAirBundle:Session s2 WITH s2.id != s.id AND s2.slot = s.slot AND s2.date = s.date LEFT JOIN RapsysAirBundle:Location l WITH l.id != s.location AND (l.id != s2.location OR s2.location IS NULL) WHERE s.id = :sid GROUP BY l.id ORDER BY l.id')
-                       ->setParameter('sid', $id)
-                       ->getArrayResult();
-
-               //TODO: try to improve with:
-               #->addIndexByScalar('city');
-
-               //Rekey array
-               $ret = array_column($ret, 'id', 'title');
-
-               return $ret;
+               return array_column(
+                       $this->getEntityManager()
+                               #->createQuery('SELECT l.id, l.title FROM Rapsys\AirBundle\Entity\Location l JOIN Rapsys\AirBundle\Entity\Session s WITH s.id = :sid LEFT JOIN Rapsys\AirBundle\Entity\Session s2 WITH s2.id != s.id AND s2.slot = s.slot AND s2.date = s.date WHERE l.id != s.location AND s2.location IS NULL GROUP BY l.id ORDER BY l.id')
+                               ->createQuery('SELECT l.id, l.title FROM Rapsys\AirBundle\Entity\Session s LEFT JOIN Rapsys\AirBundle\Entity\Session s2 WITH s2.id != s.id AND s2.slot = s.slot AND s2.date = s.date LEFT JOIN Rapsys\AirBundle\Entity\Location l WITH l.id != s.location AND (l.id != s2.location OR s2.location IS NULL) WHERE s.id = :sid GROUP BY l.id ORDER BY l.id')
+                               ->setParameter('sid', $id)
+                               ->getArrayResult(),
+                       'id',
+                       'title'
+               );
        }
 
        /**
        }
 
        /**
@@ -725,8 +736,8 @@ SQL;
        public function findByUserId(int $userId): array {
                //Set the request
                $req = 'SELECT l.id, l.title
        public function findByUserId(int $userId): array {
                //Set the request
                $req = 'SELECT l.id, l.title
-FROM RapsysAirBundle:UserLocation AS ul
-JOIN RapsysAirBundle:Location AS l ON (l.id = ul.location_id)
+FROM Rapsys\AirBundle\Entity\UserLocation AS ul
+JOIN Rapsys\AirBundle\Entity\Location AS l ON (l.id = ul.location_id)
 WHERE ul.user_id = :id';
 
                //Replace bundle entity name by table name
 WHERE ul.user_id = :id';
 
                //Replace bundle entity name by table name
@@ -737,7 +748,7 @@ WHERE ul.user_id = :id';
                $rsm = new ResultSetMapping();
 
                //Declare result set for our request
                $rsm = new ResultSetMapping();
 
                //Declare result set for our request
-               $rsm->addEntityResult('RapsysAirBundle:Location', 'l')
+               $rsm->addEntityResult('Rapsys\AirBundle\Entity\Location', 'l')
                        ->addFieldResult('l', 'id', 'id')
                        ->addFieldResult('l', 'title', 'title');
 
                        ->addFieldResult('l', 'id', 'id')
                        ->addFieldResult('l', 'title', 'title');