<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[10474] sites/trunk/api.wordpress.org/public_html/events/1.0: Events API: Update the API to accept the new `type` DB field to disambiguate actual places from States/Countries/others.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://meta.trac.wordpress.org/changeset/10474">10474</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://meta.trac.wordpress.org/changeset/10474","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>dd32</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2020-11-30 03:59:30 +0000 (Mon, 30 Nov 2020)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Events API: Update the API to accept the new `type` DB field to disambiguate actual places from States/Countries/others.

As part of this the table now includes non-city locations such as countries too, and so if the best match is a country it's still handled properly (returning country-wide events rather than just distance around the central point of the country).

Updates the tests to take into account the new database changes, but these are likely to become out-of-date as the data will be updated daily going forward.

See <a href="http://meta.trac.wordpress.org/ticket/3728">#3728</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#sitestrunkapiwordpressorgpublic_htmlevents10indexphp">sites/trunk/api.wordpress.org/public_html/events/1.0/index.php</a></li>
<li><a href="#sitestrunkapiwordpressorgpublic_htmlevents10teststestindexphp">sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunkapiwordpressorgpublic_htmlevents10indexphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/api.wordpress.org/public_html/events/1.0/index.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/api.wordpress.org/public_html/events/1.0/index.php    2020-11-27 16:22:35 UTC (rev 10473)
+++ sites/trunk/api.wordpress.org/public_html/events/1.0/index.php      2020-11-30 03:59:30 UTC (rev 10474)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -347,12 +347,13 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // Exact match
</span><span class="cx" style="display: block; padding: 0 10px">        $query = '
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                SELECT name, latitude, longitude, country
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         SELECT name, latitude, longitude, country, type
</ins><span class="cx" style="display: block; padding: 0 10px">                 FROM geoname_summary
</span><span class="cx" style="display: block; padding: 0 10px">                WHERE name = %s
</span><span class="cx" style="display: block; padding: 0 10px">                ORDER BY
</span><span class="cx" style="display: block; padding: 0 10px">                        FIELD( %s, country  ) DESC,
</span><span class="cx" style="display: block; padding: 0 10px">                        FIELD( %s, timezone ) DESC,
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        LEFT( type, 1 ) = "P" DESC,
</ins><span class="cx" style="display: block; padding: 0 10px">                         population DESC,
</span><span class="cx" style="display: block; padding: 0 10px">                        BINARY LOWER( %s ) = BINARY LOWER( name ) DESC
</span><span class="cx" style="display: block; padding: 0 10px">                LIMIT 1';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -368,12 +369,13 @@
</span><span class="cx" style="display: block; padding: 0 10px">        // Wildcard match
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! $row && $wildcard && 'ASCII' !== mb_detect_encoding( $location_name ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $query = '
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        SELECT name, latitude, longitude, country
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 SELECT name, latitude, longitude, country, type
</ins><span class="cx" style="display: block; padding: 0 10px">                         FROM geoname_summary
</span><span class="cx" style="display: block; padding: 0 10px">                        WHERE name LIKE %s
</span><span class="cx" style="display: block; padding: 0 10px">                        ORDER BY
</span><span class="cx" style="display: block; padding: 0 10px">                                FIELD( %s, country  ) DESC,
</span><span class="cx" style="display: block; padding: 0 10px">                                FIELD( %s, timezone ) DESC,
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                LEFT( type, 1 ) = "P" DESC,
</ins><span class="cx" style="display: block; padding: 0 10px">                                 population DESC,
</span><span class="cx" style="display: block; padding: 0 10px">                                BINARY LOWER( %s ) = BINARY LOWER( LEFT( name, %d ) ) DESC
</span><span class="cx" style="display: block; padding: 0 10px">                        LIMIT 1';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -546,9 +548,29 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $country_code = get_country_code_from_locale( $args['locale'] ?? '' );
</span><span class="cx" style="display: block; padding: 0 10px">                $guess        = guess_location_from_city( $args['location_name'], $args['timezone'] ?? '', $country_code );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( $guess ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $country_types = array(
+                       // See http://download.geonames.org/export/dump/featureCodes_en.txt
+
+                       'A.PCL',   // political entity  
+                       'A.PCLD',  // dependent political entity        
+                       'A.PCLF',  // freely associated state   
+                       'A.PCLH',  // historical political entity       a former political entity
+                       'A.PCLI',  // independent political entity      
+                       'A.PCLIX', // section of independent political entity   
+                       'A.PCLS',  // semi-independent political entity
+                       'A.PRSH',  // parish an ecclesiastical district
+                       'A.TERR',  // territory
+                       'A.ZN',    // zone
+               );
+
+               if ( $guess && in_array( $guess->type, $country_types, true ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         $location = array(
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                'country'     => $guess->country,
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'description' => $guess->name,
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        );
+               } elseif ( $guess ) {
+                       $location = array(
+                               'description' => $guess->name,
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'latitude'    => $guess->latitude,
</span><span class="cx" style="display: block; padding: 0 10px">                                'longitude'   => $guess->longitude,
</span><span class="cx" style="display: block; padding: 0 10px">                                'country'     => $guess->country,
</span></span></pre></div>
<a id="sitestrunkapiwordpressorgpublic_htmlevents10teststestindexphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index.php 2020-11-27 16:22:35 UTC (rev 10473)
+++ sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index.php   2020-11-30 03:59:30 UTC (rev 10474)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -188,7 +188,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><span class="cx" style="display: block; padding: 0 10px">                'city-invalid-private-ip' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                        'input' => array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                'location_name' => 'Rivendell',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         'location_name' => 'InvalidCity',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'ip'            => '127.0.0.1',
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'expected' => false,
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -408,10 +408,6 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                /*
</span><span class="cx" style="display: block; padding: 0 10px">                 * The city endonym, locale, and timezone are given
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                 *
-                * @todo
-                * This is currently failing. A query from PHP shows row id 2220957 has "Yaound?" instead of
-                * "Yaoundé", but it's correct in the database itself.
</del><span class="cx" style="display: block; padding: 0 10px">                  */
</span><span class="cx" style="display: block; padding: 0 10px">                'city-endonym-accents-africa' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                        'input' => array(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -420,7 +416,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                'timezone'      => 'Africa/Douala',
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'expected' => array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                'description' => 'yaounde',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         'description' => 'yaoundé',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'latitude'    => '3.867',
</span><span class="cx" style="display: block; padding: 0 10px">                                'longitude'   => '11.517',
</span><span class="cx" style="display: block; padding: 0 10px">                                'country'     => 'CM',
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -562,8 +558,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'expected' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                'description' => 'Санкт-Петербург',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                'latitude'    => '59.894',
-                               'longitude'   => '30.264',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         'latitude'    => '59.939',
+                               'longitude'   => '30.314',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'country'     => 'RU',
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                ),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -577,8 +573,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'expected' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                'description' => 'Санкт-Петербург',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                'latitude'    => '59.894',
-                               'longitude'   => '30.264',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         'latitude'    => '59.939',
+                               'longitude'   => '30.314',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'country'     => 'RU',
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                ),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -638,8 +634,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'expected' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                'description' => 'portland',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                'latitude'    => '43.661',
-                               'longitude'   => '-70.255',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         'latitude'    => '43.657',
+                               'longitude'   => '-70.259',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'country'     => 'US',
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                ),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -651,7 +647,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                'timezone'      => 'America/Sao_Paulo',
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        'expected' => array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                'description' => 'sao',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         'description' => 'são paulo',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'latitude'    => '-23.548',
</span><span class="cx" style="display: block; padding: 0 10px">                                'longitude'   => '-46.636',
</span><span class="cx" style="display: block; padding: 0 10px">                                'country'     => 'BR',
</span></span></pre>
</div>
</div>

</body>
</html>