X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fgeocoder.php;h=01d5e3e048efd0327e1374955a3f746aa3700087;hb=5a8a7dad52b11bee51d21887efcfe38050e28494;hp=fea1be1edd73be4578ed8a15d3246589b3d821da;hpb=a1c554a92888e0b017ba362817a67cc2849a9154;p=platal.git diff --git a/classes/geocoder.php b/classes/geocoder.php index fea1be1..01d5e3e 100644 --- a/classes/geocoder.php +++ b/classes/geocoder.php @@ -24,59 +24,31 @@ 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', - ); - static $extras = array( - 'subAdministrativeArea' => array( - 'field' => 'administrativearea', - 'name' => 'administrativeAreaName' - ) - ); - - $areaName = $area . 'Name'; - $areaNameLocal = $areaName . 'Local'; - $areaId = $area . 'Id'; - if (!is_null($address->$areaName) && isset($databases[$area])) { - $extra = (isset($extras[$area]) ? $extras[$area]['administrativeAreaName'] : false); + $where = ''; + foreach ($component['types'] as $type) { + $where .= XDB::format(' AND FIND_IN_SET({?}, types)', $type); + } - $res = XDB::query('SELECT id, nameLocal - FROM ' . $databases[$area] . ' - WHERE name = {?}', - $address->$areaName); - if ($res->numRows() == 0) { - XDB::execute('INSERT INTO ' . $databases[$area] . ' (name, nameLocal, country' . - ($extra ? ', ' . $extras[$area]['field'] : '') . ') - VALUES ({?}, {?}, {?}' . ($extra ? ', {?}' : '') . ')', - $address->$areaName, $address->$areaNameLocal, $address->countryId, - ($extra ? $address->$extra : null)); - $address->$areaId = XDB::insertId(); - } else { - // XXX: remove this once all areas have both nameLocal and name. - list($id, $name) = $res->fetchOneRow(); - if (is_null($name) && !is_null($address->$areaNameLocal)) { - XDB::execute('UPDATE ' . $databases[$area] . ' - SET nameLocal = {?} - WHERE id = {?}', - $address->$areaNameLocal, $id); - } - $address->$areaId = $id; - } - } 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 @@ -102,22 +74,18 @@ abstract class Geocoder { 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; } }