3 // WARNING: this script takes a few minutes to be executed completly, thus run it into a screen.
5 require_once 'connect.db.inc.php';
6 require_once '../../classes/phone.php';
7 require_once '../../classes/address.php';
8 require_once '../../classes/visibility.php';
10 $globals->debug
= 0; // Do not store backtraces.
12 $abbreviations = array(
13 'commandant' => 'cdt',
28 'notre dame' => 'n d',
36 'appartement' => 'app',
40 'arrondissement'=> 'arr',
49 'quartier' => 'quart',
71 'lotissement' => 'lot',
75 'promenade' => 'pro ',
93 $replacements = array();
94 foreach ($abbreviations as $key => $abbreviation) {
95 $patterns[] = '/' . $key . '/';
96 $replacements[] = $abbreviation;
99 function check($address1, $address2)
101 return $address1['short'] == $address2['short'] ||
$address1['short'] == $address2['long']
102 ||
$address1['long'] == $address2['short'] ||
$address1['long'] == $address2['long'];
105 print "Deletes duplicated addresses. (1/4)\n";
106 $pids = XDB
::rawFetchColumn("SELECT DISTINCT(pid)
107 FROM profile_addresses AS a1
108 WHERE type = 'home' AND EXISTS (SELECT *
109 FROM profile_addresses AS a2
110 WHERE a2.type = 'home' AND a2.pid = a1.pid AND a2.id != a1.id)
112 $total = count($pids);
116 $addresses = array();
117 $rawAddresses = array();
118 $duplicates = array();
119 foreach ($pids as $pid) {
121 $it = Address
::iterate(array($pid), array(Address
::LINK_PROFILE
), array(0), Visibility
::get(Visibility
::VIEW_PRIVATE
));
122 while ($item = $it->next()) {
123 $addresses[$count] = $item;
124 $rawAddress = preg_replace('/[^a-z0-9]/', ' ', mb_strtolower(replace_accent($item->text
)));
125 $rawAddresses[$count] = array(
126 'long' => preg_replace('/\s+/', '', $rawAddress),
127 'short' => preg_replace('/\s+/', '', preg_replace($patterns, $replacements, $rawAddress)),
131 for ($i = 0; $i < $count; ++
$i) {
132 for ($j = $i +
1; $j < $count; ++
$j) {
133 if (check($rawAddresses[$i], $rawAddresses[$j])) {
134 $duplicates[$j] = true
;
135 if (Visibility
::isLessRestrictive($addresses[$i]->pub
, $addresses[$j]->pub
)) {
136 $addresses[$i]->pub
= $addresses[$j]->pub
;
138 if ($addresses[$j]->hasFlag('mail') && !$addresses[$i]->hasFlag('mail')) {
139 $addresses[$i]->addFlag('mail');
144 if (count($duplicates)) {
145 foreach ($duplicates as $key => $bool) {
146 unset($addresses[$key]);
149 if (count($addresses) != $count) {
150 $deleted +
= ($count - count($addresses));
151 Address
::deleteAddresses($pid, 'home');
153 foreach ($addresses as $address) {
154 $address->setId($id);
158 XDB
::execute('UPDATE IGNORE profile_merge_issues
159 SET issues = REPLACE(issues, \'address\', \'\')
160 WHERE pid = {?}', $pid);
162 unset($rawAddresses);
170 printf("\r%u / %u", $done, $total);
173 printf("\r%u / %u", $done, $total);
174 print "\n$deleted addresses deleted.\n\n";
176 print "Formats erroneous addresses phones. (3/4)\n";
177 $it = Address
::iterate(array(), array(), array(), Visibility
::get(Visibility
::VIEW_PRIVATE
));
178 $total = $it->total();
182 printf("\r%u / %u", $i, $total);
183 while ($address = $it->next()) {
184 $fix = preg_replace('/\s+r(\.|)\s+/i', ' rue ', $address->text
);
185 if ($fix != $address->text
) {
186 $address->changed
= 0;
187 $address->text
= $fix;
189 if ($address->delete()) {
190 $address->save(false
);
198 printf("\r%u / %u", $i, $total);
200 printf("\r%u / %u", $i, $total);
202 printf("\n%u addresses skipped.\n", $skipped);
205 printf("\n%u addresses fixed.\n", $fixed);
207 print "\nAddress formating done.\n\n";
209 print "Formats non formated phones. (3/4)\n";
210 $it = XDB
::rawIterator("SELECT search_tel AS search, display_tel AS display, comment, link_id,
211 tel_type AS type, link_type, tel_id AS id, pid, pub
213 WHERE search_tel = '' OR search_tel IS NULL
214 ORDER BY pid, link_id, tel_id");
215 $total = $it->total();
218 while ($item = $it->next()) {
219 $phone = new Phone($item);
227 printf("\r%u / %u", $i, $total);
230 printf("\r%u / %u", $i, $total);
231 print "\nFormating done.\n\n";
233 print "Deletes duplicated phones. (4/4)\n";
234 $pids = XDB
::rawFetchColumn("SELECT DISTINCT(pid)
235 FROM profile_phones AS p1
236 WHERE link_type = 'user' AND EXISTS (SELECT *
237 FROM profile_phones AS p2
238 WHERE p2.link_type = 'user' AND p2.pid = p1.pid AND p2.tel_id != p1.tel_id)
240 $total = count($pids);
245 $duplicates = array();
246 foreach ($pids as $pid) {
248 $it = Phone
::iterate(array($pid), array(Phone
::LINK_PROFILE
), array(0), Visibility
::get(Visibility
::VIEW_PRIVATE
));
249 while ($item = $it->next()) {
253 for ($i = 0; $i < $count; ++
$i) {
254 for ($j = $i +
1; $j < $count; ++
$j) {
255 if ($phones[$i]->search
== $phones[$j]->search
) {
256 $duplicates[$j] = true
;
257 if (Visibility
::isLessRestrictive($phones[$i]->pub
, $phones[$j]->pub
)) {
258 $phones[$i]->pub
= $phones[$j]->pub
;
263 if (count($duplicates)) {
264 foreach ($duplicates as $key => $bool) {
265 unset($phones[$key]);
268 if (count($phones) != $count) {
269 $deleted +
= ($count - count($phones));
270 Phone
::deletePhones($pid, 'user');
272 foreach ($phones as $phone) {
277 XDB
::execute('UPDATE IGNORE profile_merge_issues
278 SET issues = REPLACE(issues, \'phone\', \'\')
279 WHERE pid = {?}', $pid);
288 printf("\r%u / %u", $done, $total);
291 printf("\r%u / %u", $done, $total);
292 print "\n$deleted phones deleted.\n\n";
294 print "That's all folks!\n";
296 /* vim:set et sw=4 sts=4 ts=4: */