Changeset 406

Show
Ignore:
Timestamp:
06/13/04 16:15:37 (5 years ago)
Author:
kake
Message:

Allow OS coords as input to distance search.

Location:
trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/lib/OpenGuides/SuperSearch.pm

    r403 r406  
    9797    $tt_vars{ss_info_url} = 'http://london.openguides.org/?Search_Script'; 
    9898 
    99     # Strip out any non-digits from dist; lat and long also allowed '-' and '.' 
    100     $vars{lat} =~ s/[^-\.0-9]//g; 
    101     $vars{long} =~ s/[^-\.0-9]//g; 
    102     $vars{distance_in_metres} =~ s/[^0-9]//g; 
     99    # Strip out any non-digits from dist and OS co-ords; lat and long 
     100    # also allowed '-' and '.' 
     101    foreach my $param( qw( lat long ) ) { 
     102        if ( defined $vars{$param} ) { 
     103            $vars{$param} =~ s/[^-\.0-9]//g; 
     104            # will check for definedness later as can be 0. 
     105            delete $vars{$param} if $vars{$param} eq ""; 
     106        } 
     107    } 
     108    foreach my $param ( qw( os_x os_y distance_in_metres ) ) { 
     109        if ( defined $vars{$param} ) { 
     110            $vars{$param} =~ s/[^0-9]//g; 
     111            # will check for definedness later as can be 0. 
     112            delete $vars{$param} if $vars{$param} eq ""; 
     113        } 
     114    } 
    103115 
    104116    # Strip leading and trailing whitespace from search text. 
     
    110122    my $doing_search; 
    111123    if ( $vars{search} 
    112          or ( defined $vars{lat} 
    113               && defined $vars{long} 
     124         or ( ( (defined $vars{lat} && defined $vars{long}) 
     125                or (defined $vars{os_x} && defined $vars{os_y}) ) 
    114126              && defined $vars{distance_in_metres} ) 
    115127    ) { 
    116128        $doing_search = 1; 
    117129        $tt_vars{search_terms} = $vars{search}; 
    118         $tt_vars{lat} = $vars{lat}; 
    119         $tt_vars{long} = $vars{long}; 
    120130        $tt_vars{dist} = $vars{distance_in_metres}; 
     131        foreach my $param ( qw( lat long os_x os_y ) ) { 
     132            $tt_vars{$param} = $vars{$param}; 
     133        } 
    121134        $self->_perform_search( vars => \%vars ); 
    122135    } 
     
    312325 
    313326    # Now filter by distance if required. 
    314     my ($lat, $long, $dist) = @vars{ qw( lat long distance_in_metres ) }; 
    315     if ( defined $lat && defined $long && $dist ) { 
     327    my ($os_x, $os_y, $lat, $long, $dist) = 
     328                         @vars{ qw( os_x os_y lat long distance_in_metres ) }; 
     329    if ( ( (defined $lat && defined $long) 
     330           or (defined $os_x and defined $os_y) 
     331                                                ) && $dist ) { 
    316332        my %results = %{ $self->{results} || {} }; 
    317         my @close = $self->{locator}->find_within_distance( 
    318                                                             lat    => $lat, 
    319                                                             long   => $long, 
    320                                                             metres => $dist, 
    321                                                           ); 
     333        my @close; 
     334        if ( defined $lat && defined $long ) { 
     335            @close = $self->{locator}->find_within_distance( 
     336                                                             lat    => $lat, 
     337                                                             long   => $long, 
     338                                                             metres => $dist, 
     339                                                           ); 
     340        } else { 
     341            @close = $self->{locator}->find_within_distance( 
     342                                                             os_x   => $os_x, 
     343                                                             os_y   => $os_y, 
     344                                                             metres => $dist, 
     345                                                           ); 
     346        } 
    322347        my %close_hash = map { $_ => 1 } @close; 
    323348        my @nodes = keys %results; 
     
    326351            $unmunged =~ s/_/ /g; 
    327352            if ( exists $close_hash{$unmunged} ) { 
    328                 my $distance = $self->{locator}->distance( 
     353                my $distance; 
     354                if ( defined $lat && defined $long ) { 
     355                    $distance = $self->{locator}->distance( 
    329356                                                 from_lat  => $lat, 
    330357                                                 from_long => $long, 
    331358                                                 to_node   => $unmunged, 
    332359                                                 unit      => "metres" 
    333                                                          ); 
     360                                                          ); 
     361                } else { 
     362                    $distance = $self->{locator}->distance( 
     363                                                 from_os_x => $os_x, 
     364                                                 from_os_y => $os_y, 
     365                                                 to_node   => $unmunged, 
     366                                                 unit      => "metres" 
     367                                                          ); 
     368                } 
    334369                $results{$node}{distance} = $distance;                 
    335370            } else { 
  • trunk/t/33_supersearch_advanced_search.t

    r402 r406  
    33use Config::Tiny; 
    44use OpenGuides::SuperSearch; 
    5 use Test::More tests => 4; 
     5use Test::More tests => 8; 
    66 
    77eval { require DBD::SQLite; }; 
     
    99 
    1010SKIP: { 
    11     skip "DBD::SQLite not installed - no database to test with", 4 
     11    skip "DBD::SQLite not installed - no database to test with", 8 
    1212      unless $have_sqlite; 
    1313 
     
    127127                             return_tt_vars => 1, 
    128128                             vars => { 
     129                                       os_x => 523450, 
     130                                       os_y => 177650, 
     131                                       distance_in_metres => 1000, 
     132                                       search => " ", 
     133                                     }, 
     134                           ); 
     135    @ordered = map { $_->{name} } @{ $tt_vars{results} || [] }; 
     136    @found = sort @ordered; 
     137    is_deeply( \@found, 
     138               [ "Blue_Anchor", "Crabtree_Tavern", "Hammersmith_Bridge" ], 
     139               "...works with OS co-ords" ); 
     140 
     141    %tt_vars = eval { 
     142               $search->run( 
     143                             return_tt_vars => 1, 
     144                             vars => { 
     145                                       os_x => 523450, 
     146                                       os_y => 177650, 
     147                                       distance_in_metres => 1000, 
     148                                       search => " ", 
     149                                       lat => " ", 
     150                                       long => " ", 
     151                                     }, 
     152                           ); 
     153    }; 
     154    is( $@, "", "...works with OS co-ords and whitespace-only lat/long" ); 
     155    @ordered = map { $_->{name} } @{ $tt_vars{results} || [] }; 
     156    @found = sort @ordered; 
     157    is_deeply( \@found, 
     158               [ "Blue_Anchor", "Crabtree_Tavern", "Hammersmith_Bridge" ], 
     159                 "...returns the right stuff" ); 
     160 
     161    %tt_vars = $search->run( 
     162                             return_tt_vars => 1, 
     163                             vars => { 
    129164                                       lat  => 51.484320, 
    130165                                       long => -0.223484, 
     
    136171    is_deeply( \@found, [ "Blue_Anchor", "Crabtree_Tavern", ], 
    137172               "distance search in combination with text search works" ); 
     173 
     174    %tt_vars = $search->run( 
     175                             return_tt_vars => 1, 
     176                             vars => { 
     177                                       os_x => 523450, 
     178                                       os_y => 177650, 
     179                                       distance_in_metres => 1000, 
     180                                       search => "pubs", 
     181                                     }, 
     182                           ); 
     183    @found = sort map { $_->{name} } @{ $tt_vars{results} || [] }; 
     184    is_deeply( \@found, [ "Blue_Anchor", "Crabtree_Tavern", ], 
     185               "...works with OS co-ords too" ); 
    138186} 
  • trunk/templates/supersearch.tt

    r404 r406  
    3232    latitude <input type="text" name="lat" value="[% lat %]" size="10" maxlength="10" /> 
    3333    longitude <input type="text" name="long" value="[% long %]" size="10" maxlength="10" /> 
     34    <strong>or</strong> of OS co-ordinates 
     35    <input type="text" name="os_x" value="[% os_x %]" size="10" maxlength="10" />, 
     36    <input type="text" name="os_y" value="[% os_y %]" size="10" maxlength="10" /> 
    3437    <br /> 
    3538    <input type="submit" name="go" class="form_button" value="Go" />