#!/usr/bin/perl use lib "../lib"; use Bucky; use Bucky::Search; use Data::Dumper; use DB_File; my $search = new Bucky::Search; my $index = $search->index; my $auto_index = $search->auto_index_write; my $partials = {}; my $partials_with_media = {}; my $med_count = 0; my $much_count = 0; foreach my $word (keys %$index) { # goatse operator my $count =()= $index->{$word} =~ /,/g; next unless $word; my $par = ''; my @letters = split "", $word; for (my $i = 0; $i < scalar @letters; $i++) { $par .= $letters[$i]; if (! exists $partials->{$par} || $partials->{$par}->[0] < $count) { $partials->{$par} = [$count,$word]; } } } foreach my $par (sort keys %$partials) { $auto_index->{$par} = $partials->{$par}->[1]; } exit; # 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); }