index P flagged articles as their parent
authorTony Cook <tony@develop-help.com>
Sun, 19 Oct 2014 01:47:39 +0000 (12:47 +1100)
committerTony Cook <tony@develop-help.com>
Sun, 19 Oct 2014 01:47:39 +0000 (12:47 +1100)
and update the excerpt generation to extract info from P flagged children

site/cgi-bin/modules/BSE/Index.pm
site/cgi-bin/modules/BSE/TB/Article.pm
site/cgi-bin/modules/BSE/TB/Articles.pm
site/cgi-bin/modules/BSE/UI/Search.pm
site/cgi-bin/search.pl

index e27b0ab..75ee8fb 100644 (file)
@@ -4,7 +4,7 @@ use Time::HiRes qw(time);
 use Constants qw(@SEARCH_EXCLUDE @SEARCH_INCLUDE);
 use BSE::TB::Articles;
 
-our $VERSION = "1.005";
+our $VERSION = "1.006";
 
 my %default_scores =
   (
@@ -101,7 +101,7 @@ sub make_index {
     next unless $article->should_index;
     my $section = $article->section;
     my $id = $article->{id};
-    my $indexas = $article->{level} > $self->{max_level} ? $article->{parentid} : $id;
+    my $indexas = $article->indexed_as;
     my $sectionid = $section->{id};
     eval "use $article->{generator}";
     $@ and die $@;
@@ -146,7 +146,7 @@ sub make_index {
 
       $fields{$field} = $text;
     }
-    $indexer->process_article($article, $section, $indexas, \%fields);
+    $indexer->process_article($article, $section, $indexas->id, \%fields);
   }
   $self->vnote("f::Article scan complete");
 }
index 90d09d1..4056347 100644 (file)
@@ -8,7 +8,7 @@ use vars qw/@ISA/;
 @ISA = qw/Squirrel::Row BSE::TB::SiteCommon BSE::TB::TagOwner/;
 use Carp 'confess';
 
-our $VERSION = "1.026";
+our $VERSION = "1.027";
 
 =head1 NAME
 
@@ -437,7 +437,7 @@ sub possible_stepchildren {
 sub link {
   my ($self, $cfg) = @_;
 
-  if ($self->flags =~ /P/) {
+  if ($self->should_link_to_parent) {
     my $parent = $self->parent;
     $parent and return $parent->link($cfg);
   }
@@ -687,6 +687,71 @@ sub is_dont_index_or_kids {
   return $parent->is_dont_index_or_kids;
 }
 
+=item should_link_to_parent
+
+Returns true links to this article go to the parent (recursively).
+
+=cut
+
+sub should_link_to_parent {
+  my ($self) = @_;
+
+  return $self->flags =~ /P/;
+}
+
+=item indexed_as
+
+Returns the article this article is indexed as, depending on the
+C<should_link_to_parent> flag and the level of the article.
+
+=cut
+
+sub indexed_as {
+  my ($self) = @_;
+
+  if (($self->should_link_to_parent
+       || $self->level > BSE::TB::Articles->max_index_level)
+      && $self->parentid > 0) {
+    return $self->parent->indexed_as;
+  }
+
+  return $self;
+}
+
+=item indexed_as_myself
+
+Returns articles that are indexed as the current article
+
+=cut
+
+sub indexed_as_myself {
+  my ($self) = @_;
+
+  return ( $self, $self->others_indexed_as_myself );
+}
+
+=item others_indexed_as_myself
+
+Returns other articles indexed as the current article.
+
+Used to implement indexed_as_myself.
+
+=cut
+
+sub others_indexed_as_myself {
+  my ($self) = @_;
+
+  my @kids = $self->children;
+  if ($self->level >= BSE::TB::Articles->max_index_level) {
+    # index all kids as myself
+  }
+  else {
+    @kids = grep $_->should_link_to_parent, @kids;
+  }
+
+  return grep $_->should_index, @kids, map($_->others_indexed_as_myself, @kids);
+}
+
 sub restricted_method {
   my ($self, $name) = @_;
 
index fd2cfdf..f6d686f 100644 (file)
@@ -6,7 +6,7 @@ require BSE::TB::TagOwners;
 @ISA = qw(Squirrel::Table BSE::TB::TagOwners);
 use BSE::TB::Article;
 
-our $VERSION = "1.007";
+our $VERSION = "1.008";
 
 =head1 NAME
 
@@ -284,6 +284,14 @@ sub categories {
   return @cats;
 }
 
+sub max_index_level {
+  my ($class, $cfg) = @_;
+
+  $cfg ||= BSE::Cfg->single;
+
+  return $cfg->entry("search", "level", $Constants::SEARCH_LEVEL);
+}
+
 1;
 
 =back
index c90b0f4..e0d5722 100644 (file)
@@ -11,7 +11,7 @@ use BSE::Util::HTML qw':default popup_menu';
 use BSE::Util::Tags qw(tag_article);
 use BSE::Request;
 
-our $VERSION = "1.004";
+our $VERSION = "1.005";
 
 my %actions =
   (
@@ -90,11 +90,13 @@ sub req_search {
     }
   }
   
+  my %index_as;
   for my $article (@articles) {
     my $generator = $article->{generator};
     eval "use $generator";
     my $gen = $generator->new(top=>$article, cfg=>$cfg);
     $article = $gen->get_real_article($article);
+    $index_as{$article->id} = [ $article->others_indexed_as_myself ];
   }
   
   $page_count = int((@results + $results_per_page - 1)/$results_per_page);
@@ -154,22 +156,34 @@ sub req_search {
        ++$article_index;
        if ($article_index < @articles) {
         $current_result = $articles[$article_index];
+        my @excerpts;
+        for my $check (@{$index_as{$current_result->id}}) {
+          my $found_child = 0;
+          my $tmp = excerpt($cfg, $admin, $case_sensitive, $check, \$found_child, \@terms);
+          push @excerpts, $tmp if $found_child;
+        }
         my $found = 0;
-        $excerpt = excerpt($cfg, $admin, $case_sensitive, $current_result, \$found, \@terms);
-        
+        my $first_excerpt = excerpt($cfg, $admin, $case_sensitive, $current_result, \$found, \@terms);
+        unshift @excerpts, $first_excerpt if $found || !@excerpts;
+        $excerpt = join " ", @excerpts;
+
         $req->set_article(result => $current_result);
-        
+
+        %match_tags = ();
         for my $field (qw/pageTitle summary keyword description author product_code/) {
-          my $value = $current_result->{$field};
-          defined $value or $value = '';
-          $value =~ s!$words_re!$highlight_prefix{$field}$1$highlight_suffix{$field}!g 
-            or $value = '';
-          $match_tags{$field} = $value;
+          for my $check ($current_result, @{$index_as{$current_result->id}}) {
+            my $value = $check->{$field};
+            defined $value or $value = '';
+            $value =~ s!$words_re!$highlight_prefix{$field}$1$highlight_suffix{$field}!g
+              or $value = '';
+            $match_tags{$field} .= " $value";
+          }
         }
-        
+        s/^\s+// for values %match_tags;
+
         # match files
         @files = ();
-        for my $file ($current_result->files) {
+        for my $file (map $_->files, $current_result, @{$index_as{$current_result->id}}) {
           my $found;
           my %fileout;
           for my $field (qw(displayName description notes)) {
@@ -334,7 +348,7 @@ sub excerpt {
 
   $gens{$generator} ||= $generator->new(admin=>$admin, cfg=>$cfg, top=>$article);
 
-  return $gens{$generator}->excerpt($article, $found, $case_sensitive, $terms, $type, $text);
+  return $gens{$generator}->excerpt($article, $found, $case_sensitive, $terms, $type, $text, 1);
 }
 
 1;
index f7142b0..28901f5 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl -w
 # -d:ptkdb
-BEGIN { $ENV{DISPLAY} = '192.168.32.51:0.0' }
+BEGIN { $ENV{DISPLAY} = '192.168.32.54:0.0' }
 use strict;
 use FindBin;
 use lib "$FindBin::Bin/modules";