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';
9 $globals->debug
= 0; // Do not store backtraces.
11 $abbreviations = array(
12 'commandant' => 'cdt',
27 'notre dame' => 'n d',
35 'appartement' => 'app',
39 'arrondissement'=> 'arr',
48 'quartier' => 'quart',
70 'lotissement' => 'lot',
74 'promenade' => 'pro ',
92 $replacements = array();
93 foreach ($abbreviations as $key => $abbreviation) {
94 $patterns[] = '/' . $key . '/';
95 $replacements[] = $abbreviation;
98 function check($address1, $address2)
100 return $address1['short'] == $address2['short'] ||
$address1['short'] == $address2['long']
101 ||
$address1['long'] == $address2['short'] ||
$address1['long'] == $address2['long'];
104 print "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)
111 $total = count($pids);
115 $addresses = array();
116 $rawAddresses = array();
117 $duplicates = array();
118 foreach ($pids as $pid) {
120 $it = Address
::iterate(array($pid), array(Address
::LINK_PROFILE
), array(0));
121 while ($item = $it->next()) {
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)),
130 for ($i = 0; $i < $count; ++
$i) {
131 for ($j = $i +
1; $j < $count; ++
$j) {
132 if (check($rawAddresses[$i], $rawAddresses[$j])) {
133 $duplicates[$j] = true
;
134 $minPub = new ProfileVisibility($addresses[$j]->pub
);
135 if ($minPub->isVisible($addresses[$i]->pub
)) {
136 $addresses[$i]->pub
= $addresses[$j]->pub
;
138 if ($addresses[$j]->hasFlag('mail') && !$addresses[$i]->hasFlag('mail')) {
139 $addresses[$i]->addFlag('mail');
144 foreach ($duplicates as $key => $bool) {
145 unset($addresses[$key]);
147 if (count($addresses) != $count) {
148 $deleted +
= ($count - count($addresses));
149 Address
::deleteAddresses($pid, 'home');
151 foreach ($addresses as $address) {
152 $address->setId($id);
156 XDB
::execute('UPDATE IGNORE profile_merge_issues
157 SET issues = REPLACE(issues, \'address\', \'\')
158 WHERE pid = {?}', $pid);
160 unset($rawAddresses);
168 printf("\r%u / %u", $done, $total);
171 printf("\r%u / %u", $done, $total);
172 print "\n$deleted addresses deleted.\n\n";
174 print "Formats non formated phones. (2/3)\n";
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
178 WHERE search_tel = '' OR search_tel IS NULL
179 ORDER BY pid, link_id, tel_id");
180 $total = $it->total();
183 while ($item = $it->next()) {
184 $phone = new Phone($item);
192 printf("\r%u / %u", $i, $total);
195 printf("\r%u / %u", $i, $total);
196 print "\nFormating done.\n\n";
198 print "Deletes duplicated phones. (3/3)\n";
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)
205 $total = count($pids);
210 $duplicates = array();
211 foreach ($pids as $pid) {
213 $it = Phone
::iterate(array($pid), array(Phone
::LINK_PROFILE
), array(0));
214 while ($item = $it->next()) {
218 for ($i = 0; $i < $count; ++
$i) {
219 for ($j = $i +
1; $j < $count; ++
$j) {
220 if ($phones[$i]->search() == $phones[$j]->search()) {
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
;
230 foreach ($duplicates as $key => $bool) {
231 unset($phones[$key]);
233 if (count($phones) != $count) {
234 $deleted +
= ($count - count($phones));
235 Phone
::deletePhones($pid, 'user');
237 foreach ($phones as $phone) {
242 XDB
::execute('UPDATE IGNORE profile_merge_issues
243 SET issues = REPLACE(issues, \'phone\', \'\')
244 WHERE pid = {?}', $pid);
253 printf("\r%u / %u", $done, $total);
256 printf("\r%u / %u", $done, $total);
257 print "\n$deleted phones deleted.\n\n";
259 print "That's all folks!\n";
261 /* vim:set et sw=4 sts=4 ts=4: */