+ public function findAllByUserIdSynchronized(int $userId, \DateTime $synchronized = new \DateTime('1970-01-01')): array {
+ //Set the request
+ $req = <<<SQL
+SELECT ud.dance_id
+FROM Rapsys\AirBundle\Entity\UserDance AS ud
+WHERE ud.user_id = :uid
+SQL;
+
+ //Replace bundle entity name by table name
+ $req = str_replace($this->tableKeys, $this->tableValues, $req);
+
+ //Get result set mapping instance
+ $rsm = new ResultSetMapping();
+
+ //Declare dance id field
+ $rsm->addScalarResult('dance_id', 'dance_id', 'integer');
+
+ //Set dance sql part
+ $danceSql = '';
+
+ //With user dance
+ if (
+ $userDances = $this->_em
+ ->createNativeQuery($req, $rsm)
+ ->setParameter('uid', $userId)
+ ->getResult(AbstractQuery::HYDRATE_SCALAR_COLUMN)
+ ) {
+ //Set dance sql part
+ $danceSql = ' AND a.dance_id IN (:dids)';
+ }
+
+ //Set the request
+ $req = <<<SQL
+SELECT us.subscribed_id
+FROM Rapsys\AirBundle\Entity\UserSubscription AS us
+WHERE us.user_id = :uid
+SQL;
+
+ //Replace bundle entity name by table name
+ $req = str_replace($this->tableKeys, $this->tableValues, $req);
+
+ //Get result set mapping instance
+ $rsm = new ResultSetMapping();
+
+ //Declare user id field
+ $rsm->addScalarResult('subscribed_id', 'subscribed_id', 'integer');
+
+ //Set subscription sql part
+ $subscriptionSql = '';
+
+ //With user subscription
+ if (
+ $userSubscriptions = $this->_em
+ ->createNativeQuery($req, $rsm)
+ ->setParameter('uid', $userId)
+ ->getResult(AbstractQuery::HYDRATE_SCALAR_COLUMN)
+ ) {
+ //Set subscription sql part
+ $subscriptionSql = ' AND a.user_id IN (:uids)';
+ }
+
+ //Set the request
+ $req = <<<SQL
+SELECT
+ s.id,
+ s.date,
+ s.locked,
+ GREATEST(s.created, s.updated, l.created, l.updated, a.created, a.updated, ad.created, ad.updated, au.created, au.updated, COALESCE(p.created, '1970-01-01'), COALESCE(p.updated, '1970-01-01')) AS modified,
+ ADDDATE(ADDTIME(s.date, s.begin), INTERVAL IF(s.slot_id = :afterid, 1, 0) DAY) AS start,
+ ADDDATE(ADDTIME(ADDTIME(s.date, s.begin), s.length), INTERVAL IF(s.slot_id = :afterid, 1, 0) DAY) AS stop,
+ s.location_id AS l_id,
+ l.address AS l_address,
+ l.zipcode AS l_zipcode,
+ l.city AS l_city,
+ l.title AS l_title,
+ l.description AS l_description,
+ l.latitude AS l_latitude,
+ l.longitude AS l_longitude,
+ s.application_id AS a_id,
+ a.canceled AS a_canceled,
+ ad.name AS ad_name,
+ ad.type AS ad_type,
+ a.user_id AS au_id,
+ au.forename AS au_forename,
+ au.pseudonym AS au_pseudonym,
+ p.id AS p_id,
+ p.description AS p_description,
+ p.class AS p_class,
+ p.short AS p_short,
+ p.hat AS p_hat,
+ p.rate AS p_rate,
+ p.contact AS p_contact,
+ p.donate AS p_donate,
+ p.link AS p_link,
+ p.profile AS p_profile
+FROM Rapsys\AirBundle\Entity\Session AS s
+JOIN Rapsys\AirBundle\Entity\Location AS l ON (l.id = s.location_id)
+JOIN Rapsys\AirBundle\Entity\Application AS a ON (a.id = s.application_id{$danceSql}{$subscriptionSql})
+JOIN Rapsys\AirBundle\Entity\Dance AS ad ON (ad.id = a.dance_id)
+JOIN Rapsys\AirBundle\Entity\User AS au ON (au.id = a.user_id)
+LEFT JOIN Rapsys\AirBundle\Entity\Snippet AS p ON (p.locale = :locale AND p.location_id = s.location_id AND p.user_id = a.user_id)
+WHERE GREATEST(GREATEST(s.created, s.updated, l.created, l.updated, a.created, a.updated, ad.created, ad.updated, au.created, au.updated, COALESCE(p.created, '1970-01-01'), COALESCE(p.updated, '1970-01-01')), ADDDATE(ADDTIME(ADDTIME(s.date, s.begin), s.length), INTERVAL IF(s.slot_id = :afterid, 1, 0) DAY)) >= :synchronized
+SQL;
+
+ //Replace bundle entity name by table name
+ $req = str_replace($this->tableKeys, $this->tableValues, $req);
+
+ //Get result set mapping instance
+ $rsm = new ResultSetMapping();
+
+ //Declare all fields
+ //XXX: see vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Types.php
+ //addScalarResult($sqlColName, $resColName, $type = 'string');
+ $rsm
+ ->addScalarResult('id', 'id', 'integer')
+ ->addScalarResult('date', 'date', 'date')
+ ->addScalarResult('locked', 'locked', 'datetime')
+ ->addScalarResult('modified', 'modified', 'datetime')
+ ->addScalarResult('start', 'start', 'datetime')
+ ->addScalarResult('stop', 'stop', 'datetime')
+ ->addScalarResult('l_id', 'l_id', 'integer')
+ ->addScalarResult('l_address', 'l_address', 'string')
+ ->addScalarResult('l_zipcode', 'l_zipcode', 'string')
+ ->addScalarResult('l_city', 'l_city', 'string')
+ ->addScalarResult('l_latitude', 'l_latitude', 'float')
+ ->addScalarResult('l_longitude', 'l_longitude', 'float')
+ ->addScalarResult('l_title', 'l_title', 'string')
+ ->addScalarResult('l_description', 'l_description', 'string')
+ ->addScalarResult('t_id', 't_id', 'integer')
+ ->addScalarResult('t_title', 't_title', 'string')
+ ->addScalarResult('a_id', 'a_id', 'integer')
+ ->addScalarResult('a_canceled', 'a_canceled', 'datetime')
+ ->addScalarResult('ad_name', 'ad_name', 'string')
+ ->addScalarResult('ad_type', 'ad_type', 'string')
+ ->addScalarResult('au_id', 'au_id', 'integer')
+ ->addScalarResult('au_forename', 'au_forename', 'string')
+ ->addScalarResult('au_pseudonym', 'au_pseudonym', 'string')
+ ->addScalarResult('p_id', 'p_id', 'integer')
+ ->addScalarResult('p_description', 'p_description', 'string')
+ ->addScalarResult('p_class', 'p_class', 'string')
+ ->addScalarResult('p_short', 'p_short', 'string')
+ ->addScalarResult('p_hat', 'p_hat', 'integer')
+ ->addScalarResult('p_rate', 'p_rate', 'integer')
+ ->addScalarResult('p_contact', 'p_contact', 'string')
+ ->addScalarResult('p_donate', 'p_donate', 'string')
+ ->addScalarResult('p_link', 'p_link', 'string')
+ ->addScalarResult('p_profile', 'p_profile', 'string')
+ ->addIndexByScalar('id');
+
+ //Return sessions
+ //TODO: XXX: finish here
+ return $this->_em
+ ->createNativeQuery($req, $rsm)
+ ->setParameter('dids', $userDances)
+ ->setParameter('uids', $userSubscriptions)
+ ->setParameter('synchronized', $synchronized)
+ ->getResult(AbstractQuery::HYDRATE_ARRAY);
+ }
+
+ /**
+ * Find session by location, slot and date
+ *
+ * @param Location $location The location
+ * @param Slot $slot The slot
+ * @param DateTime $date The datetime
+ * @return ?Session The found session
+ */
+ public function findOneByLocationSlotDate(Location $location, Slot $slot, \DateTime $date): ?Session {
+ //Return sessions
+ return $this->getEntityManager()
+ ->createQuery('SELECT s FROM Rapsys\AirBundle\Entity\Session s WHERE (s.location = :location AND s.slot = :slot AND s.date = :date)')
+ ->setParameter('location', $location)
+ ->setParameter('slot', $slot)
+ ->setParameter('date', $date)
+ ->getSingleResult();
+ }
+
+ /**
+ * Fetch sessions by date period
+ *
+ * @XXX: used in calendar command
+ *
+ * @param DatePeriod $period The date period
+ * @return array The session array
+ */
+ public function fetchAllByDatePeriod(\DatePeriod $period): array {
+ //Set the request
+ //TODO: exclude opera and others ?
+ $req = <<<SQL
+SELECT
+ s.id,
+ s.date,
+ s.locked,
+ s.updated,
+ ADDDATE(ADDTIME(s.date, s.begin), INTERVAL IF(s.slot_id = :afterid, 1, 0) DAY) AS start,
+ ADDDATE(ADDTIME(ADDTIME(s.date, s.begin), s.length), INTERVAL IF(s.slot_id = :afterid, 1, 0) DAY) AS stop,
+ s.location_id AS l_id,
+ l.address AS l_address,
+ l.zipcode AS l_zipcode,
+ l.city AS l_city,
+ l.title AS l_title,
+ l.description AS l_description,
+ l.latitude AS l_latitude,
+ l.longitude AS l_longitude,
+ s.application_id AS a_id,
+ a.canceled AS a_canceled,
+ ad.name AS ad_name,
+ ad.type AS ad_type,
+ a.user_id AS au_id,
+ au.forename AS au_forename,
+ au.pseudonym AS au_pseudonym,
+ p.id AS p_id,
+ p.description AS p_description,
+ p.class AS p_class,
+ p.short AS p_short,
+ p.hat AS p_hat,
+ p.rate AS p_rate,
+ p.contact AS p_contact,
+ p.donate AS p_donate,
+ p.link AS p_link,
+ p.profile AS p_profile
+FROM Rapsys\AirBundle\Entity\Session AS s
+JOIN Rapsys\AirBundle\Entity\Location AS l ON (l.id = s.location_id)
+JOIN Rapsys\AirBundle\Entity\Application AS a ON (a.id = s.application_id)
+JOIN Rapsys\AirBundle\Entity\Dance AS ad ON (ad.id = a.dance_id)
+JOIN Rapsys\AirBundle\Entity\User AS au ON (au.id = a.user_id)
+LEFT JOIN Rapsys\AirBundle\Entity\Snippet AS p ON (p.locale = :locale AND p.location_id = s.location_id AND p.user_id = a.user_id)
+WHERE s.date BETWEEN :begin AND :end
+ORDER BY NULL
+SQL;
+
+ //Replace bundle entity name by table name
+ $req = str_replace($this->tableKeys, $this->tableValues, $req);
+
+ //Get result set mapping instance
+ //XXX: DEBUG: see ../blog.orig/src/Rapsys/BlogBundle/Repository/ArticleRepository.php
+ $rsm = new ResultSetMapping();
+
+ //Declare all fields
+ //XXX: see vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Types.php
+ //addScalarResult($sqlColName, $resColName, $type = 'string');
+ $rsm->addScalarResult('id', 'id', 'integer')
+ ->addScalarResult('date', 'date', 'date')
+ ->addScalarResult('locked', 'locked', 'datetime')
+ ->addScalarResult('updated', 'updated', 'datetime')
+ ->addScalarResult('start', 'start', 'datetime')
+ ->addScalarResult('stop', 'stop', 'datetime')
+ ->addScalarResult('l_id', 'l_id', 'integer')
+ ->addScalarResult('l_address', 'l_address', 'string')
+ ->addScalarResult('l_zipcode', 'l_zipcode', 'string')
+ ->addScalarResult('l_city', 'l_city', 'string')
+ ->addScalarResult('l_latitude', 'l_latitude', 'float')
+ ->addScalarResult('l_longitude', 'l_longitude', 'float')
+ ->addScalarResult('l_title', 'l_title', 'string')
+ ->addScalarResult('l_description', 'l_description', 'string')
+ ->addScalarResult('t_id', 't_id', 'integer')
+ ->addScalarResult('t_title', 't_title', 'string')
+ ->addScalarResult('a_id', 'a_id', 'integer')
+ ->addScalarResult('a_canceled', 'a_canceled', 'datetime')
+ ->addScalarResult('ad_name', 'ad_name', 'string')
+ ->addScalarResult('ad_type', 'ad_type', 'string')
+ ->addScalarResult('au_id', 'au_id', 'integer')
+ ->addScalarResult('au_forename', 'au_forename', 'string')
+ ->addScalarResult('au_pseudonym', 'au_pseudonym', 'string')
+ ->addScalarResult('p_id', 'p_id', 'integer')
+ ->addScalarResult('p_description', 'p_description', 'string')
+ ->addScalarResult('p_class', 'p_class', 'string')
+ ->addScalarResult('p_short', 'p_short', 'string')
+ ->addScalarResult('p_hat', 'p_hat', 'integer')
+ ->addScalarResult('p_rate', 'p_rate', 'integer')
+ ->addScalarResult('p_contact', 'p_contact', 'string')
+ ->addScalarResult('p_donate', 'p_donate', 'string')
+ ->addScalarResult('p_link', 'p_link', 'string')
+ ->addScalarResult('p_profile', 'p_profile', 'string')
+ ->addIndexByScalar('id');
+
+ //Fetch result
+ $res = $this->_em
+ ->createNativeQuery($req, $rsm)
+ ->setParameter('begin', $period->getStartDate())
+ ->setParameter('end', $period->getEndDate());
+
+ //Return result
+ return $res->getResult();
+ }