Changeset 21969

Show
Ignore:
Timestamp:
27.04.2010 16:00:59 (9 years ago)
Author:
kjdon
Message:

store the offsets in add_vlist for all the cases, not just for when there is only one item for a particular metadata value

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone2/perllib/classify/List.pm

    r20904 r21969  
    793793    if (@OIDs == 1 && $self->{$metadata_group . ".bookshelf_type"} ne "always") { 
    794794        my $OID = $OIDs[0]; 
    795  
    796         # Find the offset of this metadata value 
    797         my $offset = 0; 
    798         my $OID_to_metadata_values_hash_ref = $self->{$metadata_group . ".list"}; 
    799         my @metadata_values = @{$OID_to_metadata_values_hash_ref->{$OID}}; 
    800         for (my $i = 0; $i < scalar(@metadata_values); $i++) { 
    801         if ($metadata_value eq $metadata_values[$i]) { 
    802             $offset = $i; 
    803             last; 
    804         } 
    805         } 
     795        my $offset = $self->metadata_offset($metadata_group, $OID, $metadata_value); 
    806796        push(@{$classifier_node->{'contains'}}, { 'OID' => $OID, 'offset' => $offset }); 
    807     }  
     797    } 
    808798    # If 'bookshelf_type' is 'never', list all the items even if there are duplicated values 
    809799    elsif ($self->{$metadata_group . ".bookshelf_type"} eq "never") { 
    810        $self->add_sorted_leaf_items(\@OIDs, $classifier_node);  
     800        @OIDs = $self->sort_leaf_items(\@OIDs); 
     801        foreach my $OID (@OIDs) { 
     802        my $offset = $self->metadata_offset($metadata_group, $OID, $metadata_value); 
     803        push(@{$classifier_node->{'contains'}}, { 'OID' => $OID , 'offset' => $offset }); 
     804        } 
     805     
    811806    } 
    812807    # Otherwise create a sublist (bookshelf) for the metadata value 
     
    814809        my %child_classifier_node = ( 'Title' => $self->convert_unicode_string_to_utf8_string($metadata_value), 
    815810                      'childtype' => "VList", 
     811                      'mdtype' => $metadata_group, 
    816812                      'contains' => [] ); 
    817813 
     
    824820        # Otherwise just add the documents as children of this list 
    825821        else { 
    826         $self->add_sorted_leaf_items(\@OIDs, \%child_classifier_node);  
     822        @OIDs = $self->sort_leaf_items(\@OIDs); 
     823        foreach my $OID (@OIDs) { 
     824            my $offset = $self->metadata_offset($metadata_group, $OID, $metadata_value); 
     825            push(@{$child_classifier_node{'contains'}}, { 'OID' => $OID , 'offset' => $offset }); 
     826        } 
     827 
    827828        } 
    828829 
     
    833834} 
    834835 
    835 sub add_sorted_leaf_items 
     836sub metadata_offset 
     837{ 
     838    my $self = shift(@_); 
     839    my $metadata_group = shift(@_); 
     840    my $OID = shift(@_); 
     841    my $metadata_value = shift(@_); 
     842     
     843    my $OID_to_metadata_values_hash_ref = $self->{$metadata_group . ".list"}; 
     844    my @metadata_values = @{$OID_to_metadata_values_hash_ref->{$OID}}; 
     845    for (my $i = 0; $i < scalar(@metadata_values); $i++) { 
     846    if ($metadata_value eq $metadata_values[$i]) { 
     847        return $i; 
     848    } 
     849    } 
     850     
     851    return 0; 
     852} 
     853 
     854sub sort_leaf_items 
    836855{ 
    837856    my $self = shift(@_); 
    838857    my @OIDs = @{shift(@_)}; 
    839     my $classifier_node = shift(@_);     
     858#    my $classifier_node = shift(@_); 
    840859     
    841860    # Sort leaf nodes and add to list 
     
    847866    @OIDs = @OIDs[ sort { $OID_to_metadata_values_hash_ref->{$OIDs[$a]}[0] cmp $OID_to_metadata_values_hash_ref->{$OIDs[$b]}[0] || $a <=> $b; } 0..$#OIDs ]; 
    848867    } 
    849  
    850     foreach my $OID (@OIDs) { 
    851     push(@{$classifier_node->{'contains'}}, { 'OID' => $OID }); 
    852     } 
    853 } 
     868    return @OIDs; 
     869} 
     870 
    854871 
    855872