Moving to GitHub.
[platal.git] / classes / geocoder.php
index 357891e..30d6fbd 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2010 Polytechnique.org                              *
+ *  Copyright (C) 2003-2014 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
 abstract class Geocoder {
     // Geocodes @p the address, and returns the corresponding updated address.
     // Unknown key-value pairs available in the input map are retained as-is.
-    abstract public function getGeocodedAddress(Address &$address);
+    abstract public function getGeocodedAddress(Address $address);
 
     // Cleans the address from its geocoded data
-    abstract public function stripGeocodingFromAddress(Address &$address);
+    abstract public function stripGeocodingFromAddress(Address $address);
 
-    // Updates geoloc_administrativeareas, geoloc_subadministrativeareas and
-    // geoloc_localities databases with new geocoded data and returns the
-    // corresponding id.
-    static public function getAreaId(Address &$address, $area)
+    // Updates profile_addresses_components_enum, if needed, with new
+    // geocoded data and returns the corresponding id.
+    static public function getComponentId(array $component)
     {
-        static $databases = array(
-            'administrativeArea'    => 'geoloc_administrativeareas',
-            'subAdministrativeArea' => 'geoloc_subadministrativeareas',
-            'locality'              => 'geoloc_localities',
-        );
+        $where = '';
+        foreach ($component['types'] as $type) {
+            $where .= XDB::format(' AND FIND_IN_SET({?}, types)', $type);
+        }
 
-        $areaName = $area . 'Name';
-        $areaId = $area . 'Id';
-        if (!is_null($address->$areaName) && isset($databases[$area])) {
-            $res = XDB::query('SELECT  id
-                                 FROM  ' . $databases[$area] . '
-                                WHERE  name = {?}',
-                              $address->$areaName);
-            if ($res->numRows() == 0) {
-                XDB::execute('INSERT INTO  ' . $databases[$area] . ' (name, country)
-                                   VALUES  ({?}, {?})',
-                             $address->$areaName, $address->countryId);
-                $address->$areaId = XDB::insertId();
-            } else {
-                $address->$areaId = $res->fetchOneCell();
-            }
-        } elseif (empty($address->$areaId)) {
-            $address->$areaId = null;
+        $id = XDB::fetchOneCell('SELECT  id
+                                   FROM  profile_addresses_components_enum
+                                  WHERE  short_name = {?} AND long_name = {?}' . $where,
+                                $component['short_name'], $component['long_name']);
+        if (is_null($id)) {
+            XDB::execute('INSERT INTO  profile_addresses_components_enum (short_name, long_name, types)
+                               VALUES  ({?}, {?}, {?})',
+                         $component['short_name'], $component['long_name'], implode(',', $component['types']));
+            $id = XDB::insertId();
         }
+        return $id;
     }
 
     // Returns the part of the text preceeding the line with the postal code
     // and the city name, within the limit of $limit number of lines.
     static public function getFirstLines($text, $postalCode, $limit)
     {
-        $textArray  = explode("\n", $text);
+        $text = str_replace("\r", '', $text);
+        $textArray = explode("\n", $text);
+        $linesNb = $limit;
+
         for ($i = 0; $i < count($textArray); ++$i) {
-            if ($i > $limit || strpos($textLine, $postalCode) !== false) {
-                $limit = $i;
+            if ($i > $limit || strpos($textArray[$i], $postalCode) !== false) {
+                $linesNb = $i;
                 break;
             }
         }
-        return implode("\n", array_slice($textArray, 0, $limit));
+        $firstLines = implode("\n", array_slice($textArray, 0, $linesNb));
+
+        // Adds empty lines to complete the $limit lines required.
+        for (; $i < $limit; ++$i) {
+            $firstLines .= "\n";
+        }
+        return $firstLines;
     }
 
-    // Returns the number of non geocoded addresses for a user.
-    static public function countNonGeocoded($pid, $jobid = null, $type = Address::LINK_PROFILE)
+    // Returns the number of non geocoded addresses for a profile.
+    static public function countNonGeocoded($pid)
     {
-        $where = array();
-        if (!is_null($pid)) {
-            $where[] = XDB::format('pid = {?}', $pid);
-        }
-        if (!is_null($jobid)) {
-            $where[] = XDB::format('jobid = {?}', $jobid);
-        }
-        $where[] = XDB::format('FIND_IN_SET({?}, type) AND accuracy = 0', $type);
-        $res = XDB::query('SELECT  COUNT(*)
-                             FROM  profile_addresses
-                            WHERE  ' . implode(' AND ', $where),
-                          $pid);
-        return $res->fetchOneCell();
+        $count = XDB::fetchOneCell('SELECT  COUNT(*)
+                                      FROM  profile_addresses AS pa
+                                     WHERE  pid = {?} AND type = \'home\'
+                                            AND NOT EXISTS (SELECT  *
+                                                              FROM  profile_addresses_components AS pc
+                                                             WHERE  pa.pid = pc.pid AND pa.jobid = pc.jobid AND pa.groupid = pc.groupid
+                                                                    AND pa.type = pc.type AND pa.id = pc.id)',
+                                   $pid);
+        return $count;
     }
 }
 
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
 ?>