Merge branch 'xorg/master' into xorg/f/xnet-accounts
[platal.git] / upgrade / 1.0.1 / merge_issues.php
CommitLineData
74e1e725
SJ
1#!/usr/bin/php5
2<?php
0444be72 3// WARNING: this script takes a few minutes to be executed completly, thus run it into a screen.
74e1e725
SJ
4
5require_once 'connect.db.inc.php';
6require_once '../../classes/phone.php';
cee99643 7require_once '../../classes/address.php';
74e1e725
SJ
8
9$globals->debug = 0; // Do not store backtraces.
10
ea647c8b
SJ
11$abbreviations = array(
12 'commandant' => 'cdt',
13 'docteur' => 'dr',
14 'haut' => 'ht',
15 'haute' => 'ht',
16 'hauts' => 'ht',
17 'hts' => 'ht',
18 'general' => 'gen',
19 'gal ' => 'gen ',
20 'grand' => 'gd',
21 'grande' => 'gd',
22 'grands' => 'gd',
23 'gde ' => 'gd ',
24 'gds ' => 'gd ',
25 'lieutenant' => 'lt',
26 'marechal' => 'mal',
27 'notre dame' => 'n d',
28 'nouveau' => 'nouv',
29 'president' => 'pdt',
30 'saint' => 'st',
31 'sainte' => 'st',
32 'saintes' => 'st',
33 'saints' => 'st',
34 'ste ' => 'st ',
35 'appartement' => 'app',
36 'apt' => 'app',
37 'appt' => 'app',
38 'appart' => 'app',
39 'arrondissement'=> 'arr',
40 'batiment' => 'bat',
41 'escalier' => 'esc',
42 'etage' => 'etg',
43 'et ' => 'etg',
44 'immeuble' => 'imm',
45 'lieu dit' => 'ld',
46 ' lt ' => ' lt ',
47 'porte' => 'pte',
48 'quartier' => 'quart',
49 'residence' => 'res',
50 'resi' => 'res',
51 'villa' => 'vla',
52 'village' => 'vlge',
53 'vil ' => 'vlge ',
54 'allee' => 'all',
55 'avenue' => 'av',
56 'boulevard' => 'bd',
57 'bld' => 'bd',
58 'chemin' => 'ch',
59 'chem ' => 'ch ',
60 'che ' => 'ch ',
61 'cours' => 'crs',
62 'domaine' => 'dom',
63 'doma ' => 'dom ',
64 'faubourg' => 'fg',
65 'fbg' => 'fg',
66 'hameau' => 'ham',
67 'hame ' => 'ham ',
68 'impasse' => 'imp',
69 'impa ' => 'imp ',
70 'lotissement' => 'lot',
71 'montee' => 'mte',
72 'passage' => 'pass',
73 'place' => 'pl',
74 'promenade' => 'pro ',
75 'prom ' => 'pro ',
76 'quai' => 'qu',
77 'rue' => 'r',
78 'route' => 'rte',
79 ' rde ' => ' rte ',
80 ' rle ' => ' rte ',
81 'sentier' => 'sen',
82 'sent ' => 'sen ',
83 'square' => 'sq',
84 'mount' => 'mt',
85 'road' => 'rd',
86 'street' => 'st',
87 'str ' => 'str',
88 'bis' => 'b',
89 'ter' => 't'
90);
91$patterns = array();
92$replacements = array();
93foreach ($abbreviations as $key => $abbreviation) {
94 $patterns[] = '/' . $key . '/';
95 $replacements[] = $abbreviation;
96}
97
98function check($address1, $address2)
99{
100 return $address1['short'] == $address2['short'] || $address1['short'] == $address2['long']
101 || $address1['long'] == $address2['short'] || $address1['long'] == $address2['long'];
102}
103
cee99643
SJ
104print "Deletes duplicated addresses. (1/3)\n";
105$pids = XDB::rawFetchColumn("SELECT DISTINCT(pid)
106 FROM profile_addresses AS a1
107 WHERE type = 'home' AND EXISTS (SELECT *
108 FROM profile_addresses AS a2
109 WHERE a2.type = 'home' AND a2.pid = a1.pid AND a2.id != a1.id)
110 ORDER BY pid");
111$total = count($pids);
112$done = 0;
113$aux = 0;
114$deleted = 0;
115$addresses = array();
116$rawAddresses = array();
117$duplicates = array();
118foreach ($pids as $pid) {
119 $count = 0;
120 $it = Address::iterate(array($pid), array(Address::LINK_PROFILE), array(0));
121 while ($item = $it->next()) {
ea647c8b
SJ
122 $addresses[$count] = $item;
123 $rawAddress = preg_replace('/[^a-z0-9]/', ' ', mb_strtolower(replace_accent($item->text)));
124 $rawAddresses[$count] = array(
125 'long' => preg_replace('/\s+/', '', $rawAddress),
126 'short' => preg_replace('/\s+/', '', preg_replace($patterns, $replacements, $rawAddress)),
127 );
cee99643
SJ
128 ++$count;
129 }
130 for ($i = 0; $i < $count; ++$i) {
131 for ($j = $i + 1; $j < $count; ++$j) {
ea647c8b
SJ
132 if (check($rawAddresses[$i], $rawAddresses[$j])) {
133 $duplicates[$j] = true;
ce774256
SJ
134 $minPub = new ProfileVisibility($addresses[$j]->pub);
135 if ($minPub->isVisible($addresses[$i]->pub)) {
136 $addresses[$i]->pub = $addresses[$j]->pub;
137 }
2dc5748d
SJ
138 if ($addresses[$j]->hasFlag('mail') && !$addresses[$i]->hasFlag('mail')) {
139 $addresses[$i]->addFlag('mail');
140 }
cee99643
SJ
141 }
142 }
143 }
144 foreach ($duplicates as $key => $bool) {
145 unset($addresses[$key]);
146 }
147 if (count($addresses) != $count) {
148 $deleted += ($count - count($addresses));
149 Address::deleteAddresses($pid, 'home');
150 $id = 0;
151 foreach ($addresses as $address) {
152 $address->setId($id);
153 $address->save();
154 ++$id;
155 }
156 XDB::execute('UPDATE IGNORE profile_merge_issues
157 SET issues = REPLACE(issues, \'address\', \'\')
158 WHERE pid = {?}', $pid);
159 }
160 unset($rawAddresses);
161 unset($addresses);
162 unset($duplicates);
163
164 ++$done;
165 ++$aux;
166 if ($aux == 100) {
167 $aux = 0;
168 printf("\r%u / %u", $done, $total);
169 }
170}
171printf("\r%u / %u", $done, $total);
172print "\n$deleted addresses deleted.\n\n";
173
174print "Formats non formated phones. (2/3)\n";
74e1e725
SJ
175$it = XDB::rawIterator("SELECT search_tel AS search, display_tel AS display, comment, link_id,
176 tel_type AS type, link_type, tel_id AS id, pid, pub
177 FROM profile_phones
178 WHERE search_tel = '' OR search_tel IS NULL
179 ORDER BY pid, link_id, tel_id");
0444be72
SJ
180$total = $it->total();
181$i = 0;
182$j = 0;
183while ($item = $it->next()) {
184 $phone = new Phone($item);
185 $phone->delete();
186 $phone->save();
187
188 ++$i;
189 ++$j;
190 if ($j == 100) {
191 $j = 0;
192 printf("\r%u / %u", $i, $total);
193 }
74e1e725 194}
ded51efe 195printf("\r%u / %u", $i, $total);
0444be72 196print "\nFormating done.\n\n";
74e1e725 197
cee99643 198print "Deletes duplicated phones. (3/3)\n";
0444be72
SJ
199$pids = XDB::rawFetchColumn("SELECT DISTINCT(pid)
200 FROM profile_phones AS p1
201 WHERE link_type = 'user' AND EXISTS (SELECT *
202 FROM profile_phones AS p2
203 WHERE p2.link_type = 'user' AND p2.pid = p1.pid AND p2.tel_id != p1.tel_id)
204 ORDER BY pid");
205$total = count($pids);
206$done = 0;
207$aux = 0;
ded51efe 208$deleted = 0;
74e1e725
SJ
209$phones = array();
210$duplicates = array();
0444be72
SJ
211foreach ($pids as $pid) {
212 $count = 0;
f9aba305 213 $it = Phone::iterate(array($pid), array(Phone::LINK_PROFILE), array(0));
0444be72 214 while ($item = $it->next()) {
ded51efe 215 $phones[] = $item;
0444be72
SJ
216 ++$count;
217 }
218 for ($i = 0; $i < $count; ++$i) {
74e1e725 219 for ($j = $i + 1; $j < $count; ++$j) {
0444be72 220 if ($phones[$i]->search() == $phones[$j]->search()) {
ce774256
SJ
221 $duplicates[$j] = true;
222 $minPub = new ProfileVisibility($phones[$j]->pub);
223 if ($minPub->isVisible($phones[$i]->pub)) {
224 $phones[$i]->pub = $phones[$j]->pub;
225 }
226
0444be72 227 }
74e1e725 228 }
0444be72
SJ
229 }
230 foreach ($duplicates as $key => $bool) {
74e1e725 231 unset($phones[$key]);
0444be72
SJ
232 }
233 if (count($phones) != $count) {
ded51efe 234 $deleted += ($count - count($phones));
74e1e725
SJ
235 Phone::deletePhones($pid, 'user');
236 $id = 0;
237 foreach ($phones as $phone) {
0444be72
SJ
238 $phone->setId($id);
239 $phone->save();
240 ++$id;
74e1e725 241 }
0444be72
SJ
242 XDB::execute('UPDATE IGNORE profile_merge_issues
243 SET issues = REPLACE(issues, \'phone\', \'\')
244 WHERE pid = {?}', $pid);
74e1e725 245 }
0444be72 246 unset($duplicates);
74e1e725 247 unset($phones);
74e1e725 248
0444be72
SJ
249 ++$done;
250 ++$aux;
251 if ($aux == 10) {
252 $aux = 0;
253 printf("\r%u / %u", $done, $total);
254 }
255}
256printf("\r%u / %u", $done, $total);
ded51efe
SJ
257print "\n$deleted phones deleted.\n\n";
258
259print "That's all folks!\n";
74e1e725
SJ
260
261/* vim:set et sw=4 sts=4 ts=4: */
262?>