#!/usr/bin/perl use lib "../lib"; use Bucky; use Data::Dumper; use DB_File; my $bucky = new Bucky(); # "carbon"); my %index; tie %index, "DB_File", "gross.db", O_CREAT|O_RDWR, 0666, $DB_HASH ; event_loop(); sub event_loop { my $command = "index"; while (1) { print "> "; $command = line_in(); last if $command eq "exit"; search(\%index, $command) } } sub search { my ($index, $string) = @_; my $scores = {}; print "TERMS : "; my $terms = parse_terms($string); foreach my $term (@$terms) { print "$term "; next unless my $match = $index->{$term}; my @results = split " ", $match; foreach my $result (@results) { $scores->{$result} ||= {}; $scores->{$result}->{count}++; $scores->{$result}->{terms} ||= {}; $scores->{$result}->{terms}->{$term}++; } } print "\n"; my $total = 0; foreach my $obj (sort { scalar(keys %{$scores->{$b}->{terms}}) <=> scalar(keys %{$scores->{$a}->{terms}}) || $scores->{$b}->{count} <=> $scores->{$a}->{count} } keys %$scores ) { print scalar(keys %{$scores->{$obj}->{terms}}) . "x" . $scores->{$obj}->{count} . "\t" . display_object($obj) . "\n" if $total < 10; $total++; } print "$total total\n"; } sub display_object { my ($obj) = @_; my ($type, $id) = split ":", $obj; my $thread = $bucky->thread($id); my $title = $thread ? $thread->_title : "* * *"; return $type . " " . $id . "\t" . $title; } sub parse_terms { my ($s) = @_; my @terms = split /(\W+)/, $s; my $words = []; my $count = 0; foreach my $term (@terms) { if ( $term !~ /\W/ ) { push @$words, $term; } } return $words; } sub show_index { my ($min) = @_; my $max = $min + 24; my $i = 0; foreach my $thread (@$threads) { next if $min > $i++; last if $max == $i; $commands->{$i} = [ \&show_thread, $thread ]; printf " T%02d %-70s\n", $i, $thread->{"title"}; } return $max - 1; } sub show_thread { my ($thread) = @_; print $thread->{'title'} . "\n"; print $thread->{'username'} . " // " . show_date($thread->{createdate}) . "\n"; my $i = 0; foreach my $comment (@$comments) { next if ($comment->{'thread'} != $thread->{'id'}); $commands->{++$i} = [ \&show_comment, $comment ]; printf " c%02d %-10s %-60s\n", $i, $comment->{"username"}, first_line($comment->{"comment"}); } foreach my $file (@$files) { next if ($file->{'thread'} != $thread->{'id'}); printf " f%02d %-10s %-60s\n", ++$i, $file->{'username'}, $file->{'filename'}; } return 1; } sub show_comment { my ($comment) = @_; print $comment->{'username'} . " // " . show_date($comment->{date}) . "\n"; my @lines = split "\n", $comment->{'comment'}; for (my $i = 0; $i < scalar(@lines); $i++) { print $lines[$i] . "\n"; last if $i == 24; } return 1; } sub show_date { return scalar localtime(shift); } sub line_in { return trim(scalar ); } sub trim { my $s = shift; $s =~ s/^\s+//; $s =~ s/\s+$//; return $s; } sub first_line { my $s = shift; $s =~ s/^\s+//; $s =~ s/\n//g; return substr($s,0,70); }