Changeset 2594
- Timestamp:
- 03/09/10 22:28:15 (2 years ago)
- Location:
- Search-Query-Dialect-KSx/trunk
- Files:
-
- 1 added
- 5 edited
-
Changes (modified) (1 diff)
-
MANIFEST (modified) (1 diff)
-
lib/Search/Query/Dialect/KSx.pm (modified) (10 diffs)
-
lib/Search/Query/Dialect/KSx/Compiler.pm (modified) (1 diff)
-
t/01-parser.t (modified) (1 diff)
-
t/02-search.t (added)
Legend:
- Unmodified
- Added
- Removed
-
Search-Query-Dialect-KSx/trunk/Changes
r2586 r2594 19 19 0.05 xxx 20 20 * refactor scoring via Compiler and Scorer. 21 * fix bugs with NOTQuery 22 * support NOTQuery around a RangeQuery 23 * preserve syntax of RangeQuerys on stringify() 24 -
Search-Query-Dialect-KSx/trunk/MANIFEST
r2566 r2594 11 11 t/00-load.t 12 12 t/01-parser.t 13 t/02-search.t 13 14 t/pod-coverage.t 14 15 t/pod.t -
Search-Query-Dialect-KSx/trunk/lib/Search/Query/Dialect/KSx.pm
r2590 r2594 94 94 '+' => 'AND', 95 95 '' => 'OR', 96 '-' => ' NOT',96 '-' => 'AND', 97 97 ); 98 98 … … 181 181 $op = '!' . $op unless $op =~ m/^!/; 182 182 } 183 if ( $value =~ m/ \*/ ) {183 if ( $value =~ m/[\*\?]|\Q$wildcard/ ) { 184 184 $op =~ s/:/~/g; 185 185 } … … 196 196 } 197 197 198 #warn dump [ $name, $op, $quote, $value ];198 #warn "ks string: " . dump [ $name, $op, $prefix, $quote, $value ]; 199 199 200 200 # invert fuzzy … … 264 264 =cut 265 265 266 my %ks_class_map = ( 267 '+' => 'AND', 268 '' => 'OR', 269 '-' => 'NOT', 270 ); 271 266 272 sub as_ks_query { 267 273 my $self = shift; … … 271 277 foreach my $prefix ( '+', '', '-' ) { 272 278 my @clauses; 273 my $joiner = $ op_map{$prefix};279 my $joiner = $ks_class_map{$prefix}; 274 280 next unless exists $tree->{$prefix}; 275 281 for my $clause ( @{ $tree->{$prefix} } ) { … … 280 286 my $ks_class = 'KinoSearch::Search::' . $joiner . 'Query'; 281 287 282 push @q, @clauses == 1 283 ? $clauses[0] 284 : $ks_class->new( children => [ grep {defined} @clauses ] ); 288 if ( @clauses == 1 ) { 289 if ( $prefix eq '-' ) { 290 push @q, $ks_class->new( negated_query => $clauses[0] ); 291 } 292 else { 293 push @q, $clauses[0]; 294 } 295 } 296 else { 297 if ( $prefix eq '-' ) { 298 my $and_not = KinoSearch::Search::ANDQuery->new( 299 children => \@clauses ); 300 push @q, $and_not; 301 } 302 else { 303 push @q, 304 $ks_class->new( children => [ grep {defined} @clauses ] ); 305 } 306 } 307 285 308 } 286 309 … … 326 349 # normalize operator 327 350 my $op = $clause->{op} || ":"; 328 if ( $op eq '=' ) { 329 $op = ':'; 330 } 351 $op =~ s/=/:/g; 331 352 if ( $prefix eq '-' ) { 332 $op = '!' . $op ;333 } 334 if ( $value =~ m/ \%/ ) {353 $op = '!' . $op unless $op =~ m/^!/; 354 } 355 if ( $value =~ m/[\*\?]|\Q$wildcard/ ) { 335 356 $op = $prefix eq '-' ? '!~' : '~'; 336 357 } … … 348 369 } 349 370 350 #warn dump [ $name, $op, $quote, $value ];371 #warn "as_ks_query: " . dump [ $name, $op, $prefix, $quote, $value ]; 351 372 352 373 # range is un-analyzed … … 375 396 } 376 397 377 croak "NOT Range query not yet supported"; 378 next FIELD; # haha. never get here. 398 my $range_query = KinoSearch::Search::RangeQuery->new( 399 field => $name, 400 lower_term => $value->[0], 401 upper_term => $value->[1], 402 include_lower => 1, 403 include_upper => 1, 404 ); 405 push( 406 @buf, 407 KinoSearch::Search::NOTQuery->new( 408 negated_query => $range_query 409 ) 410 ); 411 next FIELD; 379 412 } 380 413 … … 488 521 @buf, 489 522 KinoSearch::Search::NOTQuery->new( 490 field => $name, 491 term => $term, 523 negated_query => KinoSearch::Search::TermQuery->new( 524 field => $name, 525 term => $term, 526 ) 492 527 ) 493 528 ); -
Search-Query-Dialect-KSx/trunk/lib/Search/Query/Dialect/KSx/Compiler.pm
r2586 r2594 89 89 #carp "$term field:$field: term>$lex_term<"; 90 90 if ($include) { 91 next unless $lex_term =~ $regex;91 last unless $lex_term =~ $regex; 92 92 } 93 93 else { -
Search-Query-Dialect-KSx/trunk/t/01-parser.t
r2593 r2594 149 149 150 150 #dump $range_not_query; 151 is( $range_not_query, qq/NOT date:(1..3)/, "!range expanded" );151 is( $range_not_query, qq/NOT (date:(1..3))/, "!range expanded" ); 152 152 153 153 # operators
Note: See TracChangeset
for help on using the changeset viewer.