--- trunk/MWS_swish.pm 2004/05/06 23:06:08 16 +++ trunk/MWS_swish.pm 2004/05/08 14:27:54 24 @@ -36,20 +36,54 @@ sub search_index { my $self = shift; - my $s = shift || croak "search_index needs query"; + croak "search_index needs query" if (! @_); my $index = $self->open_index; - if ($s =~ /:/) { - my ($fld,$val) = split(/:/,$s,2); - $s = "$fld=($val)"; + my $sw; + + my $sort_map = { + 'date' => 'date_utime', + 'from' => 'from_phrase', + 'to' => 'to_phrase', + 'rank' => 'swishrank', + }; + + my $sort_by; + + foreach my $s (@_) { + + if ($s =~ /^\s*(\w+):(.+)\s*$/) { + my ($f,$v) = ($1,$2); + if (lc($f) eq "sort") { + my ($sf,$sv) = split(/ /,$v,2); + $sort_by = $sort_map->{$sf} || croak "unsupported sort by field $v - fix sort_map"; + $sort_by .= " $sv"; + } else { + $sw .= "$f=($v)"; + } + } else { + # and/or/not operators + $sw .= " $s "; + } } - print STDERR "swish search: $s\n"; - my $results = $index->Query($s); + print STDERR "swish search: $sw\n"; + + # convert to UTF-8 + $sw = $iso2utf->convert($sw) || $sw; + + my $search = $index->New_Search_Object; + $search->SetSort( $sort_by ); + my $results = $search->Execute($sw); + + # store total number of hits + $self->{'total_hits'} = $results->Hits; my @res_ids; + my $count = 1; + while ( my $r = $results->NextResult ) { sub p($$) { @@ -63,15 +97,23 @@ push @res_ids, $id; foreach my $p (qw(from to cc bcc)) { - @{$self->{cache}->{$id}->{$p}} = split(/##/, p($r,$p.'_phrase')); + @{$self->{cache}->{$id}->{$p}} = (); + foreach my $v (split(/##/, p($r,$p.'_phrase'))) { + push @{$self->{cache}->{$id}->{$p}}, $v; + $self->add_counter($p,$v); + } } - foreach my $p (qw(subject body date)) { + foreach my $p (qw(subject body date date_utime)) { $self->{cache}->{$id}->{$p} = p($r,$p); } + $self->add_counter_calendar(p($r,'date_utime')); + # this is redundant, but needed for templates later... $self->{cache}->{$id}->{'id'} = $id; + + last if (++$count > $self->{max_results}); } return @res_ids;