src/Infrastructure/ZonesBundle/Repository/TownRepository.php line 266

Open in your IDE?
  1. <?php
  2. namespace Whater\Infrastructure\ZonesBundle\Repository;
  3. use Whater\Domain\Zones\Model\Town;
  4. use Whater\Domain\Zones\Repository\TownRepositoryInterface;
  5. use Doctrine\ORM\EntityRepository;
  6. use Pagerfanta\Doctrine\ORM\QueryAdapter;
  7. use Pagerfanta\Pagerfanta;
  8. /**
  9. * Class TownRepository
  10. *
  11. * @package Whater\Infrastructure\ZonesBundle\Repository
  12. */
  13. class TownRepository extends EntityRepository implements TownRepositoryInterface
  14. {
  15. public function findOneById(string $townId): ?Town
  16. {
  17. return $this->createQueryBuilder('town')
  18. ->where('town.uuid = :id')
  19. ->setParameter('id', $townId)
  20. ->getQuery()
  21. ->getOneOrNullResult();
  22. }
  23. public function findOneBySlug(string $townSlug): ?Town
  24. {
  25. return $this->createQueryBuilder('town')
  26. ->where('town.slug = :townSlug')
  27. ->setParameter('townSlug', $townSlug)
  28. ->getQuery()
  29. ->getOneOrNullResult();
  30. }
  31. public function findOneByExternalId(string $externalIdName, string $externalIdValue): ?Town
  32. {
  33. return $this->createQueryBuilder('town')
  34. ->where('town.externalIds like :externalIdRegex')
  35. ->setParameter('externalIdRegex', '%"' . $externalIdName . '":"' . $externalIdValue . '"%')
  36. ->getQuery()
  37. ->getOneOrNullResult();
  38. }
  39. public function findAll()
  40. {
  41. $queryBuilder = $this->createQueryBuilder($alias = 'town');
  42. return $queryBuilder->getQuery()->getResult();
  43. }
  44. public function findAllDuplicatedSlug()
  45. {
  46. $queryBuilder = $this->createQueryBuilder($alias = 'town');
  47. $queryBuilder = $queryBuilder->andWhere('town.slug in (SELECT tw.slug FROM Whater\Domain\Zones\Model\Town tw GROUP BY tw.slug HAVING count(tw.slug)>1)');
  48. return $queryBuilder->getQuery()->getResult();
  49. }
  50. public function findAllByCountry(string $countryIsoCode)
  51. {
  52. $queryBuilder = $this->createQueryBuilder($alias = 'town');
  53. $queryBuilder = $queryBuilder->leftJoin('town.countryArea', 'countryArea');
  54. $queryBuilder = $queryBuilder->leftJoin('town.country', 'country');
  55. $queryBuilder = $queryBuilder->andWhere('country.isoCode = :countryIsoCode');
  56. $queryBuilder = $queryBuilder->setParameter('countryIsoCode', $countryIsoCode);
  57. return $queryBuilder->getQuery()->getResult();
  58. }
  59. public function findAllByCountryArea(string $countryAreaIsoCode)
  60. {
  61. $queryBuilder = $this->createQueryBuilder($alias = 'town');
  62. $queryBuilder = $queryBuilder->leftJoin('town.countryArea', 'countryArea');
  63. $queryBuilder = $queryBuilder->andWhere('countryArea.isoCode = :countryAreaIsoCode');
  64. $queryBuilder = $queryBuilder->setParameter('countryAreaIsoCode', $countryAreaIsoCode);
  65. return $queryBuilder->getQuery()->getResult();
  66. }
  67. public function calculateStCenterId(
  68. string $townId
  69. ): ?array {
  70. // calculate centroid
  71. $query = $this->createQueryBuilder('town')
  72. ->select('st_as_text(st_centroid(town.geometryPolygon))')
  73. ->andWhere('town.uuid = :townId')
  74. ->setParameter('townId', $townId);
  75. $centroId = $query->getQuery()->getResult();
  76. $lng = null;
  77. $lat = null;
  78. sscanf($centroId[0]["1"], 'POINT(%f %f)', $lng, $lat);
  79. return [$lat, $lng];
  80. }
  81. public function findAllPaginated(
  82. array $sort = [],
  83. $limit = 500,
  84. $page = 1,
  85. ?string $globalFilter = null,
  86. ?string $countryiso3 = null,
  87. $nameFilter = null,
  88. $slugFilter = null,
  89. $countryAreaNameFilter = null,
  90. $countryNameFilter = null,
  91. ?bool $hasPolygonFilter = null,
  92. $isVerifiedFilter = null,
  93. ?string $whaterOrganizationFilter = null,
  94. ) {
  95. $queryBuilder = $this->createQueryBuilder($alias = 'town');
  96. $joinCountry = false;
  97. $joinCountryArea = false;
  98. $queryBuilder = $queryBuilder->setMaxResults($limit);
  99. $queryBuilder = $queryBuilder->setFirstResult(($page - 1) * $limit);
  100. if (!empty($globalFilter)) {
  101. //Reemplazamos la N, n, C y c
  102. $globalFilter = str_replace(
  103. array('Ñ', 'ñ', 'Ç', 'ç'),
  104. array('N', 'n', 'C', 'c'),
  105. $globalFilter
  106. );
  107. // Agrega '+' al inicio y '.*' al final de cada palabra
  108. $againsWords1 = preg_replace('/\b(\w+)\b/', '+$1.*', $globalFilter);
  109. $queryBuilder = $queryBuilder->andWhere("MATCH(town.name) AGAINST (:againsWords1 boolean) >0");
  110. $queryBuilder = $queryBuilder->setParameter('againsWords1', $againsWords1);
  111. }
  112. if (!empty($countryiso3)) {
  113. $joinCountry = true;
  114. $queryBuilder = $queryBuilder->andWhere('country.isoCode3 = :countryiso3');
  115. $queryBuilder = $queryBuilder->setParameter('countryiso3', $countryiso3);
  116. }
  117. if (!empty($nameFilter)) {
  118. //Reemplazamos la N, n, C y c
  119. $nameFilter = str_replace(
  120. array('Ñ', 'ñ', 'Ç', 'ç'),
  121. array('N', 'n', 'C', 'c'),
  122. $nameFilter
  123. );
  124. // Agrega '+' al inicio y '.*' al final de cada palabra
  125. $againsWords2 = preg_replace('/\b(\w+)\b/', '+$1.*', $nameFilter);
  126. $queryBuilder = $queryBuilder->andWhere("MATCH(town.name) AGAINST (:againsWords2 boolean) >0");
  127. $queryBuilder = $queryBuilder->setParameter('againsWords2', $againsWords2);
  128. }
  129. if (!empty($slugFilter)) {
  130. $queryBuilder = $queryBuilder->andWhere('town.slug = :slugFilter');
  131. $queryBuilder = $queryBuilder->setParameter('slugFilter', $slugFilter);
  132. }
  133. if (!empty($countryAreaNameFilter)) {
  134. $joinCountryArea = true;
  135. $queryBuilder = $queryBuilder->andWhere('countryArea.name like :countryAreaNameFilter');
  136. $queryBuilder = $queryBuilder->setParameter('countryAreaNameFilter', '%' . $countryAreaNameFilter . '%');
  137. }
  138. if (!empty($countryNameFilter)) {
  139. $joinCountry = true;
  140. $queryBuilder = $queryBuilder->andWhere('country.name like :countryNameFilter');
  141. $queryBuilder = $queryBuilder->setParameter('countryNameFilter', '%' . $countryNameFilter . '%');
  142. }
  143. if (!empty($hasPolygonFilter)) {
  144. if ($hasPolygonFilter) {
  145. $queryBuilder = $queryBuilder->andWhere('town.geometryPolygon IS NOT NULL');
  146. } else {
  147. $queryBuilder = $queryBuilder->andWhere('town.geometryPolygon IS NULL');
  148. }
  149. }
  150. if (!empty($isVerifiedFilter)) {
  151. if ($isVerifiedFilter == "Si") {
  152. $queryBuilder = $queryBuilder->andWhere('town.whaterOrganization IS NOT NULL');
  153. } elseif ($isVerifiedFilter == "No") {
  154. $queryBuilder = $queryBuilder->andWhere('town.whaterOrganization IS NULL');
  155. }
  156. }
  157. if (!empty($whaterOrganizationFilter)) {
  158. $queryBuilder = $queryBuilder->leftJoin('town.whaterOrganization', 'whaterOrganization');
  159. $queryBuilder = $queryBuilder->andWhere('whaterOrganization.uuid = :whaterOrganizationFilter');
  160. $queryBuilder = $queryBuilder->setParameter('whaterOrganizationFilter', $whaterOrganizationFilter);
  161. }
  162. foreach ($sort as $property => $order) {
  163. if (!empty($order)) {
  164. if (strcmp($property, 'name') == 0) {
  165. $queryBuilder->addOrderBy('town.name', $order);
  166. } elseif (strcmp($property, 'town_name') == 0) {
  167. $queryBuilder->addOrderBy('town.name', $order);
  168. } elseif (strcmp($property, 'country_area_name') == 0) {
  169. $queryBuilder->addOrderBy('countryArea.name', $order);
  170. $joinCountryArea = true;
  171. } elseif (strcmp($property, 'town_slug') == 0) {
  172. $queryBuilder->addOrderBy('town.slug', $order);
  173. } elseif (strcmp($property, 'country_name') == 0) {
  174. $joinCountry = true;
  175. $queryBuilder->addOrderBy('country.name', $order);
  176. } elseif (strcmp($property, 'created_at') == 0) {
  177. $queryBuilder->addOrderBy('town.createdAt', $order);
  178. } elseif (strcmp($property, 'population') == 0) {
  179. $queryBuilder->addOrderBy('town.population', $order);
  180. } elseif (strcmp($property, 'updated_at') == 0) {
  181. $queryBuilder->addOrderBy('town.updatedAt', $order);
  182. } elseif (strcmp($property, 'sinac_synchonization') == 0) {
  183. $queryBuilder->addOrderBy('town.sinacSynchonizationAt', $order);
  184. }
  185. }
  186. }
  187. if ($joinCountry) {
  188. $queryBuilder = $queryBuilder->leftJoin('town.countryArea', 'countryArea');
  189. $queryBuilder = $queryBuilder->leftJoin('town.country', 'country');
  190. } else if ($joinCountryArea) {
  191. $queryBuilder = $queryBuilder->leftJoin('town.countryArea', 'countryArea');
  192. }
  193. return new Pagerfanta(new QueryAdapter($queryBuilder, false, false));
  194. }
  195. public function countTowns(\DateTime $beforeAt = null): ?int
  196. {
  197. $qb = $this->createQueryBuilder('town')
  198. ->select('count(DISTINCT(town.uuid))');
  199. if (!empty($beforeAt)) {
  200. $qb = $qb->andWhere('town.createdAt <= :beforeAt')
  201. ->setParameter('beforeAt', $beforeAt);
  202. }
  203. $qb = $qb->distinct(true)
  204. ->getQuery();
  205. return $qb->getSingleScalarResult();
  206. }
  207. /**
  208. * @param Town $town
  209. */
  210. public function add(Town $town): void
  211. {
  212. $this->_em->persist($town);
  213. }
  214. public function findOneByNearestLatLong(
  215. float $latitude,
  216. float $longitude,
  217. int $radioInKiloMeters,
  218. string $searchName = null,
  219. ?string $countryCode = null
  220. ): ?Town {
  221. $query = $this->createQueryBuilder('town')
  222. ->andWhere('town.latitude IS NOT NULL')
  223. ->andWhere('town.longitude IS NOT NULL')
  224. ->andWhere('GEO_DISTANCE(town.latitude, town.longitude, :originLatitude, :originLongitude) < :radioInMeters')
  225. ->addOrderBy('GEO_DISTANCE(town.latitude, town.longitude, :originLatitude, :originLongitude )', 'ASC')
  226. ->setParameter('originLatitude', $latitude)
  227. ->setParameter('originLongitude', $longitude)
  228. ->setParameter('radioInMeters', $radioInKiloMeters)
  229. ->setMaxResults(1);
  230. if ($searchName != null) {
  231. $query = $query->andWhere('town.name like :searchName')->setParameter('searchName', $searchName);
  232. }
  233. if ($countryCode != null) {
  234. $query = $query->leftJoin('town.countryArea', 'countryArea');
  235. $query = $query->leftJoin('town.country', 'country');
  236. $query = $query->andWhere('country.isoCode = :countryIsoCode');
  237. $query = $query->setParameter('countryIsoCode', $countryCode);
  238. }
  239. return $query->getQuery()
  240. ->getOneOrNullResult();
  241. }
  242. }