greenstone.org greenstone wiki greenstone trac planet greenstone

Changeset 16206

Show
Ignore:
Timestamp:
2008-06-26 13:52:53 (5 months ago)
Author:
mdewsnip
Message:

Added support for a "-split_greenstone_dates" option that builds a hierarchy from Greenstone "YYYYMMDD" date metadata values.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • gsdl/trunk/src/recpt/dynamicclassifieraction.cpp

    r16196 r16206  
    198198  text_t classifier_node_OID = args["dcn"]; 
    199199  text_t classifier_node_metadata_value = classifier_node_OID; 
     200  text_t classifier_node_metadata_value_filter = classifier_node_metadata_value + "|*"; 
    200201 
    201202  // Split the classifier node OID into its components, then remove any we've already dealt with 
     
    206207    classifier_node_OID_parts_remaining.pop_front(); 
    207208 
    208     // Update classifier_node_metadata_value to remove any grouping node components 
     209    // Update classifier_node_metadata_value (and consequently the filter) to remove the grouping node component 
    209210    joinchar (classifier_node_OID_parts_remaining, '|', classifier_node_metadata_value); 
     211    classifier_node_metadata_value_filter = classifier_node_metadata_value + "|*"; 
    210212  } 
    211213  if (classifier_options["-use_hlist_at_top"] == "1") 
    212214  { 
    213215    classifier_node_OID_parts_remaining.pop_front(); 
     216  } 
     217 
     218  // If "-split_greenstone_dates" is on the metadata value and filter doesn't quite match the OID -- fix this 
     219  if (classifier_options["-split_greenstone_dates"] == "1") 
     220  { 
     221    classifier_node_metadata_value.replace("|", ""); 
     222    classifier_node_metadata_value_filter = classifier_node_metadata_value; 
     223    classifier_node_metadata_value_filter += ((classifier_node_metadata_value_filter.size() == 8) ? "|*" : "*"); 
    214224  } 
    215225 
     
    217227  if (classifier_node_metadata_value == "") 
    218228  { 
    219     output_child_classifier_nodes (classifier_node_OID, classifier_node_metadata_value, current_metadata_value_filter, classifier_node_indent, classifier_options, args, collectproto, browsers, disp, outconvert, textout, logout); 
     229    output_child_classifier_nodes (classifier_node_OID, "", current_metadata_value_filter, classifier_node_indent, classifier_options, args, collectproto, browsers, disp, outconvert, textout, logout); 
    220230  } 
    221231 
     
    227237 
    228238    // Output the child classifier nodes 
    229     text_t metadata_value_filter = classifier_node_metadata_value + "|*"; 
    230     output_child_classifier_nodes (classifier_node_OID, classifier_node_metadata_value, metadata_value_filter, classifier_node_indent, classifier_options, args, collectproto, browsers, disp, outconvert, textout, logout); 
     239    output_child_classifier_nodes (classifier_node_OID, classifier_node_metadata_value, classifier_node_metadata_value_filter, classifier_node_indent, classifier_options, args, collectproto, browsers, disp, outconvert, textout, logout); 
    231240 
    232241    // Get the document nodes at this level 
     
    316325  while (metadata_value_iterator != metadata_values_response.docInfo.end()) 
    317326  { 
    318     text_t metadata_value = (*metadata_value_iterator).OID
    319  
    320     // Is this metadata value hierarchical? 
    321     text_t::iterator hierarchy_split_position = findchar(metadata_value.begin(), metadata_value.end(), '|')
    322     if (hierarchy_split_position != metadata_value.end()) 
    323     { 
    324       // Yes, so use the first part of the hierarchy only 
    325       metadata_value = substr(metadata_value.begin(), hierarchy_split_position); 
    326     } 
    327  
    328     // Create a node for this metadata value if we haven't seen it before 
    329     if (hlist_classifier_nodes.find(metadata_value) == hlist_classifier_nodes.end()) 
    330     { 
    331       hlist_classifier_nodes[metadata_value] = 0; 
     327    text_t hierarchical_metadata_value = split_metadata_value ((*metadata_value_iterator).OID, classifier_options)
     328 
     329    // Assume for now we're always at the top 
     330    text_t hlist_metadata_value = hierarchical_metadata_value
     331 
     332    // Determine the label for the hlist classifier node from the metadata value 
     333    text_tarray hlist_metadata_value_parts; 
     334    splitchar (hlist_metadata_value.begin(), hlist_metadata_value.end(), '|', hlist_metadata_value_parts); 
     335    text_t hlist_classifier_node_label = hlist_metadata_value_parts.front(); 
     336 
     337    // Create a node for this value if we haven't seen it before 
     338    if (hlist_classifier_nodes.find(hlist_classifier_node_label) == hlist_classifier_nodes.end()) 
     339    { 
     340      hlist_classifier_nodes[hlist_classifier_node_label] = 0; 
    332341    } 
    333342 
    334343    // Increment the occurrence count 
    335     hlist_classifier_nodes[metadata_value] += (*metadata_value_iterator).result_num; 
     344    hlist_classifier_nodes[hlist_classifier_node_label] += (*metadata_value_iterator).result_num; 
    336345 
    337346    metadata_value_iterator++; 
     
    446455  while (metadata_value_iterator != metadata_values_response.docInfo.end()) 
    447456  { 
    448     text_t metadata_value = (*metadata_value_iterator).OID; 
     457    text_t hierarchical_metadata_value = split_metadata_value ((*metadata_value_iterator).OID, classifier_options); 
     458    text_t classifier_node_hierarchical_metadata_value = split_metadata_value (classifier_node_metadata_value, classifier_options); 
    449459 
    450460    // We need to remove the current position from the metadata value to leave the child metadata value 
    451     text_t child_metadata_value = metadata_value; 
    452     if (starts_with(metadata_value, classifier_node_metadata_value + "|")) 
    453     { 
    454       child_metadata_value = substr(metadata_value.begin() + (classifier_node_metadata_value + "|").size(), metadata_value.end()); 
     461    text_t child_metadata_value = hierarchical_metadata_value; 
     462    if (starts_with(hierarchical_metadata_value, classifier_node_hierarchical_metadata_value + "|")) 
     463    { 
     464      child_metadata_value = substr(hierarchical_metadata_value.begin() + (classifier_node_hierarchical_metadata_value + "|").size(), hierarchical_metadata_value.end()); 
    455465    } 
    456466 
     
    499509 
    500510 
     511text_t dynamicclassifieraction::split_metadata_value (text_t metadata_value, text_tmap classifier_options) 
     512{ 
     513  text_t hierarchical_metadata_value = metadata_value; 
     514 
     515  // Add hierarchy separators into Greenstone date values (YYYYMMDD -> YYYY|MM|DD) 
     516  if (classifier_options["-split_greenstone_dates"] == "1") 
     517  { 
     518    if (metadata_value.size() == 4 || metadata_value.size() == 6 || metadata_value.size() == 8) 
     519    { 
     520      // Add year 
     521      hierarchical_metadata_value = substr(metadata_value.begin(), metadata_value.begin() + 4); 
     522      if (metadata_value.size() == 6 || metadata_value.size() == 8) 
     523      { 
     524        // Add month 
     525        hierarchical_metadata_value += "|" + substr(metadata_value.begin() + 4, metadata_value.begin() + 6); 
     526        if (metadata_value.size() == 8) 
     527        { 
     528          // Add day 
     529          hierarchical_metadata_value += "|" + substr(metadata_value.begin() + 6, metadata_value.begin() + 8); 
     530        } 
     531      } 
     532    } 
     533  } 
     534 
     535  return hierarchical_metadata_value; 
     536} 
     537 
     538 
    501539void dynamicclassifieraction::display_classifier_nodes (FilterResponse_t classifier_nodes_response, 
    502540                                                        text_t classifier_nodes_type, 
  • gsdl/trunk/src/recpt/dynamicclassifieraction.h

    r16115 r16206  
    9090                                      ostream &textout, ostream &logout); 
    9191 
     92  text_t split_metadata_value (text_t metadata_value, text_tmap classifier_options); 
     93 
    9294  void display_classifier_nodes (FilterResponse_t classifier_nodes_response, 
    9395                                 text_t classifier_nodes_type,