Changeset 406
- Timestamp:
- 06/13/04 16:15:37 (5 years ago)
- Location:
- trunk
- Files:
-
- 3 modified
-
lib/OpenGuides/SuperSearch.pm (modified) (4 diffs)
-
t/33_supersearch_advanced_search.t (modified) (4 diffs)
-
templates/supersearch.tt (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/lib/OpenGuides/SuperSearch.pm
r403 r406 97 97 $tt_vars{ss_info_url} = 'http://london.openguides.org/?Search_Script'; 98 98 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 } 103 115 104 116 # Strip leading and trailing whitespace from search text. … … 110 122 my $doing_search; 111 123 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}) ) 114 126 && defined $vars{distance_in_metres} ) 115 127 ) { 116 128 $doing_search = 1; 117 129 $tt_vars{search_terms} = $vars{search}; 118 $tt_vars{lat} = $vars{lat};119 $tt_vars{long} = $vars{long};120 130 $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 } 121 134 $self->_perform_search( vars => \%vars ); 122 135 } … … 312 325 313 326 # 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 ) { 316 332 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 } 322 347 my %close_hash = map { $_ => 1 } @close; 323 348 my @nodes = keys %results; … … 326 351 $unmunged =~ s/_/ /g; 327 352 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( 329 356 from_lat => $lat, 330 357 from_long => $long, 331 358 to_node => $unmunged, 332 359 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 } 334 369 $results{$node}{distance} = $distance; 335 370 } else { -
trunk/t/33_supersearch_advanced_search.t
r402 r406 3 3 use Config::Tiny; 4 4 use OpenGuides::SuperSearch; 5 use Test::More tests => 4;5 use Test::More tests => 8; 6 6 7 7 eval { require DBD::SQLite; }; … … 9 9 10 10 SKIP: { 11 skip "DBD::SQLite not installed - no database to test with", 411 skip "DBD::SQLite not installed - no database to test with", 8 12 12 unless $have_sqlite; 13 13 … … 127 127 return_tt_vars => 1, 128 128 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 => { 129 164 lat => 51.484320, 130 165 long => -0.223484, … … 136 171 is_deeply( \@found, [ "Blue_Anchor", "Crabtree_Tavern", ], 137 172 "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" ); 138 186 } -
trunk/templates/supersearch.tt
r404 r406 32 32 latitude <input type="text" name="lat" value="[% lat %]" size="10" maxlength="10" /> 33 33 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" /> 34 37 <br /> 35 38 <input type="submit" name="go" class="form_button" value="Go" />
