From: <de...@de...> - 2014-01-30 20:19:07
|
Author: PeterThoeny Date: 2014-01-30 14:19:00 -0600 (Thu, 30 Jan 2014) New Revision: 26967 Trac url: http://develop.twiki.org/trac/changeset/26967 Modified: twiki/branches/TWikiRelease06x00/core/lib/TWiki/Search.pm Log: Item7425: Sort by parent breadcrumb Modified: twiki/branches/TWikiRelease06x00/core/lib/TWiki/Search.pm =================================================================== --- twiki/branches/TWikiRelease06x00/core/lib/TWiki/Search.pm 2014-01-30 20:17:52 UTC (rev 26966) +++ twiki/branches/TWikiRelease06x00/core/lib/TWiki/Search.pm 2014-01-30 20:19:00 UTC (rev 26967) @@ -728,7 +728,7 @@ push(@topicList, @saveShortened); } } - elsif ( $sortOrder =~ /\b(created?|editby|formfield\((.*?)\)|parent)([, ]|$)/ ) { + elsif ( $sortOrder =~ /\b(created?|editby|formfield\((.*?)\)|parent(\(.*?\))?)([, ]|$)/ ) { # sort by topic creation time, author, parent $topicInfo = _sortTopics( $this, $web, \@topicList, $sortOrder, $revSort ); } @@ -806,10 +806,8 @@ foreach my $topic ( @topicList ) { my $forceRendering = 0; unless ( exists( $topicInfo->{$topic} ) ) { - # not previously cached - $topicInfo->{$topic} = - _extractTopicInfo( $this, $web, $topic, 0, undef ); + $topicInfo->{$topic} = _extractTopicInfo( $this, $web, $topic, 0 ); } my $epochSecs = $topicInfo->{$topic}->{modified}; require TWiki::Time; @@ -1134,11 +1132,13 @@ my $users = $this->{session}->{users}; my $topicInfo = {}; + my $topicParents = {}; # initialize parent hash, used to optimize sorting by parents foreach my $topic ( @$topics ) { - $topicInfo->{$topic} = _extractTopicInfo( $this, $web, $topic, $sortfield ); + $topicInfo->{$topic} = _extractTopicInfo( $this, $web, $topic, $sortfield, $topicParents ); } $sortfield =~ s/\bformfield\((.*?)\)/$1/g; + $sortfield =~ s/\bparent\(.*?\)/parent/g; $sortfield =~ s/^ +//; $sortfield =~ s/ +$//; my @sortTokens = @@ -1199,7 +1199,7 @@ # extract topic info sub _extractTopicInfo { - my ( $this, $web, $topic, $sortfield ) = @_; + my ( $this, $web, $topic, $sortfield, $topicParents ) = @_; my $info = {}; my $session = $this->{session}; my $store = $session->{store}; @@ -1225,8 +1225,30 @@ if ( $sortfield =~ /\bcreated?\b/ ) { ( $info->{created} ) = $meta->getRevisionInfo( 1 ); } - if ( $sortfield =~ /\bparent\b/ ) { - ( $info->{parent} ) = $meta->getParent( ); + if ( $sortfield =~ /\bparent(\(([0-9]+)\))?/ ) { + # sort by parent breadcrumb up to indicated level. + # for example, sorting on 3 levels is done with string "GrandParent, Parent, Topic" + my $level = $2 || 1; + my @parents = (); + my $parent = $meta->getParent(); + $parent =~ s/.*\.//; # cut web prefix if present + while( $level-- >= 1 && $parent ) { + $topicParents->{$topic} = $parent if( $topicParents ); # remember for later use + push( @parents, $parent ); + if( $level >= 1 ) { + my $gParent = ''; + if( $topicParents && $topicParents->{$parent} ) { + $gParent = $topicParents->{$parent}; + } elsif( $store->topicExists( $web, $parent ) ) { + my ( $gpMeta ) = _getTextAndMeta( $this, undef, $web, $parent ); + $gParent = $gpMeta->getParent(); + $gParent =~ s/.*\.//; # cut web prefix if present + } + $gParent = '' if( $gParent eq $parent ); # stop if topic points to itself as parent + $parent = $gParent || ''; + } + }; + ( $info->{parent} ) = join( ', ', reverse @parents ); } # handle possily multiple formfield(Name) $sortfield =~ s/\bformfield\((.*?)\)/_setFormFieldInfo( $info, $meta, $1 )/ge; |