WordPress.org

Making WordPress.org

Changeset 5409


Ignore:
Timestamp:
04/21/2017 05:25:46 PM (3 years ago)
Author:
iandunn
Message:

Events: Try a loose LIKE search if all else fails for ideographic queries

Fixes https://github.com/coreymckrill/nearby-wordpress-events/issues/37

Location:
sites/trunk/api.wordpress.org/public_html/events/1.0
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/api.wordpress.org/public_html/events/1.0/index.php

    r5355 r5409  
    230230 * @param string $country
    231231 * @param string $timezone
     232 * @param string $mode          'exact' to only return exact matches from the database;
     233 *                              'loose' to return any match. This has a high chance of false positives.
    232234 *
    233235 * @return stdClass|null
    234236 */
    235 function guess_ideographic_location_from_geonames( $location_name, $country, $timezone ) {
     237function guess_ideographic_location_from_geonames( $location_name, $country, $timezone, $mode = 'exact' ) {
    236238    global $wpdb;
    237239
     
    245247     *
    246248     * Because this will only match entries that are prefixed _and_ postfixed with a comma, it will never match the
    247      * first and last entries in the column. That's ok, though, because the first entry is always an airport code
    248      * in English, which will be matched by other functions. The last entry is often ideographic, so it'd be nice
     249     * first and last entries in the column. That's ok, though, because the first entry is often an airport code
     250     * in English, which is shorter than `ft_min_word_len` anyway. The last entry is often ideographic, so it'd be nice
    249251     * to match it, but this is good enough for now.
    250252     */
    251     $escaped_location_name = sprintf( '%%,%s,%%', $wpdb->esc_like( $location_name ) );
     253    $escaped_location_name = sprintf(
     254        'loose' === $mode ? '%%%s%%' : '%%,%s,%%',
     255        $wpdb->esc_like( $location_name )
     256    );
    252257
    253258    /*
     
    434439                'longitude' => $guess->ip_longitude,
    435440                'country' => $guess->country_short,
     441            );
     442        }
     443    }
     444
     445    /*
     446     * If all else fails for a non-ASCII request, cast a wide net and try to find something before giving up, even
     447     * if the chance of success if lower than normal. Returning false is guaranteed failure, so this improves things
     448     * even if it only works 10% of the time.
     449     *
     450     * This must be done as the very last thing before giving up, because the likelihood of false positives is high.
     451     */
     452    if ( ! $location && isset( $args['location_name'] ) && 'ASCII' !== mb_detect_encoding( $args['location_name'] ) ) {
     453        $guess = guess_ideographic_location_from_geonames( $args['location_name'], $country_code, $args['timezone'] ?? '', 'loose' );
     454
     455        if ( $guess ) {
     456            $location = array(
     457                'description' => $guess->name,
     458                'latitude'    => $guess->latitude,
     459                'longitude'   => $guess->longitude,
     460                'country'     => $guess->country,
    436461            );
    437462        }
  • sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index.php

    r5355 r5409  
    376376        ),
    377377
     378        // The database only has 大阪市 ("Osaka-shi"), not 大阪 ("Osaka"), so an exact match will for 大阪 will fail
     379        'city-endonym-ideographic-municipal-unit-asia' => array(
     380            'input' => array(
     381                'location_name' => '大阪',
     382                'locale'        => 'ja',
     383                'timezone'      => 'Asia/Tokyo',
     384            ),
     385            'expected' => array(
     386                'description' => 'osaka',
     387                'latitude'    => '34.694',
     388                'longitude'   => '135.502',
     389                'country'     => 'JP',
     390            ),
     391        ),
     392
    378393        'city-endonym-europe' => array(
    379394            'input' => array(
Note: See TracChangeset for help on using the changeset viewer.