summaryrefslogtreecommitdiff
path: root/bucky2/t/search.pl
diff options
context:
space:
mode:
Diffstat (limited to 'bucky2/t/search.pl')
-rwxr-xr-xbucky2/t/search.pl146
1 files changed, 146 insertions, 0 deletions
diff --git a/bucky2/t/search.pl b/bucky2/t/search.pl
new file mode 100755
index 0000000..b4897fb
--- /dev/null
+++ b/bucky2/t/search.pl
@@ -0,0 +1,146 @@
+#!/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 <STDIN>);
+ }
+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);
+ }
+