greenstone.org greenstone wiki greenstone trac planet greenstone

Changeset 16180

Show
Ignore:
Timestamp:
2008-06-25 15:38:55 (7 months ago)
Author:
mdewsnip
Message:

Modifying get_metadata_values() and get_documents_with_metadata_value() to take an array of metadata elements, rather than just one metadata element. This allows building a dynamic classifier on multiple metadata elements.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • gsdl/trunk/src/colservr/sqlbrowsefilter.cpp

    r16040 r16180  
    109109  if (request.requestParams == "GetMetadataValues") 
    110110  { 
    111     text_t metadata_element_name = ""
     111    text_tarray metadata_element_names
    112112    text_t metadata_value_filter = ""; 
    113113    text_t metadata_value_grouping_expression = ""; 
     
    115115    while (options_iterator != request.filterOptions.end()) 
    116116    { 
    117       if ((*options_iterator).name == "MetadataElement") 
    118       { 
    119         metadata_element_name = (*options_iterator).value
     117      if ((*options_iterator).name == "MetadataElements") 
     118      { 
     119        splitchar ((*options_iterator).value.begin(), (*options_iterator).value.end(), ',', metadata_element_names)
    120120      } 
    121121      if ((*options_iterator).name == "MetadataValueFilter") 
     
    130130    } 
    131131 
    132     text_tarray metadata_values = sql_db_ptr->get_metadata_values (metadata_element_name, metadata_value_filter, metadata_value_grouping_expression); 
     132    text_tarray metadata_values = sql_db_ptr->get_metadata_values (metadata_element_names, metadata_value_filter, metadata_value_grouping_expression); 
    133133 
    134134    // Create a map from metadata value to ResultDocInfo_t, to remove duplicate values and obtain occurrence counts 
     
    168168  else if (request.requestParams == "GetDocumentsWithMetadataValue") 
    169169  { 
    170     text_t metadata_element_name = ""
     170    text_tarray metadata_element_names
    171171    text_t metadata_value = ""; 
    172172    text_t sort_by_metadata_element_name = ""; 
     
    174174    while (options_iterator != request.filterOptions.end()) 
    175175    { 
    176       if ((*options_iterator).name == "MetadataElement") 
    177       { 
    178         metadata_element_name = (*options_iterator).value
     176      if ((*options_iterator).name == "MetadataElements") 
     177      { 
     178        splitchar ((*options_iterator).value.begin(), (*options_iterator).value.end(), ',', metadata_element_names)
    179179      } 
    180180      if ((*options_iterator).name == "MetadataValue") 
     
    189189    } 
    190190 
    191     text_tarray document_OIDs = sql_db_ptr->get_documents_with_metadata_value (metadata_element_name, metadata_value, sort_by_metadata_element_name); 
     191    text_tarray document_OIDs = sql_db_ptr->get_documents_with_metadata_value (metadata_element_names, metadata_value, sort_by_metadata_element_name); 
    192192 
    193193    // Fill in response.docInfo with the document OIDs 
  • gsdl/trunk/src/lib/sqldbclass.h

    r16039 r16180  
    4343 
    4444  // returns array of document OIDs 
    45   virtual text_tarray get_documents_with_metadata_value (const text_t &metadata_element_name
     45  virtual text_tarray get_documents_with_metadata_value (const text_tarray &metadata_element_names
    4646                                                         const text_t &metadata_value, 
    4747                                                         const text_t &sort_by_metadata_element_name) = 0; 
    4848 
    4949  // returns array of values 
    50   virtual text_tarray get_metadata_values (const text_t &metadata_element_name
     50  virtual text_tarray get_metadata_values (const text_tarray &metadata_element_names
    5151                                           const text_t &metadata_value_filter, 
    5252                                           const text_t &metadata_value_grouping_expression) = 0; 
  • gsdl/trunk/src/lib/sqlitedbclass.cpp

    r16041 r16180  
    9999 
    100100// returns array of document OIDs 
    101 text_tarray sqlitedbclass::get_documents_with_metadata_value (const text_t &metadata_element_name
     101text_tarray sqlitedbclass::get_documents_with_metadata_value (const text_tarray &metadata_element_names
    102102                                                              const text_t &metadata_value, 
    103103                                                              const text_t &sort_by_metadata_element_name) 
     
    105105  text_tarray document_OIDs; 
    106106 
    107   // Check a metadata element and value has been specified 
    108   if (metadata_element_name == "" || metadata_value == "") 
     107  // Check at least one metadata element and a metadata value has been specified 
     108  if (metadata_element_names.empty() || metadata_value == "") 
    109109  { 
    110110    return document_OIDs; 
     
    112112 
    113113  // Get the entries in the "document_metadata" table where the element and value matches those specified 
    114   text_t sql_cmd = "SELECT DISTINCT docOID FROM document_metadata WHERE element='" + sqlite_safe(metadata_element_name) + "' AND value='" + sqlite_safe(metadata_value) + "'"; 
     114  text_t sql_cmd = "SELECT DISTINCT docOID FROM document_metadata WHERE element IN ('" + sqlite_safe(metadata_element_names[0]) + "'"; 
     115  for (int i = 1; i < metadata_element_names.size(); i++) 
     116  { 
     117    sql_cmd += ",'" + sqlite_safe(metadata_element_names[i]) + "'"; 
     118  } 
     119  sql_cmd += ") AND value='" + sqlite_safe(metadata_value) + "'"; 
    115120 
    116121  // If we're sorting the documents by a certain metadata element, extend the SQL command to do this 
     
    190195 
    191196// returns array of values 
    192 text_tarray sqlitedbclass::get_metadata_values (const text_t &metadata_element_name
     197text_tarray sqlitedbclass::get_metadata_values (const text_tarray &metadata_element_names
    193198                                                const text_t &metadata_value_filter, 
    194199                                                const text_t &metadata_value_grouping_expression) 
     
    196201  text_tarray metadata_values; 
    197202 
    198   // Check a metadata element has been specified 
    199   if (metadata_element_name == ""
     203  // Check at least one metadata element has been specified 
     204  if (metadata_element_names.empty()
    200205  { 
    201206    return metadata_values; 
     
    210215 
    211216  // Get the entries in the "document_metadata" table where the element matches that specified 
    212   text_t sql_cmd = "SELECT DISTINCT docOID," + value_select_expression + " FROM document_metadata WHERE element='" + sqlite_safe(metadata_element_name) + "'"; 
     217  text_t sql_cmd = "SELECT DISTINCT docOID," + value_select_expression + " FROM document_metadata WHERE element IN ('" + sqlite_safe(metadata_element_names[0]) + "'"; 
     218  for (int i = 1; i < metadata_element_names.size(); i++) 
     219  { 
     220    sql_cmd += ",'" + sqlite_safe(metadata_element_names[i]) + "'"; 
     221  } 
     222  sql_cmd += ")"; 
    213223 
    214224  // Add value filter, if one has been defined 
  • gsdl/trunk/src/lib/sqlitedbclass.h

    r16039 r16180  
    4646 
    4747  // returns array of document OIDs 
    48   text_tarray get_documents_with_metadata_value (const text_t &metadata_element_name
     48  text_tarray get_documents_with_metadata_value (const text_tarray &metadata_element_names
    4949                                                 const text_t &metadata_value, 
    5050                                                 const text_t &sort_by_metadata_element_name); 
     
    6060 
    6161  // returns array of values 
    62   text_tarray get_metadata_values (const text_t &metadata_element_name
     62  text_tarray get_metadata_values (const text_tarray &metadata_element_names
    6363                                   const text_t &metadata_value_filter, 
    6464                                   const text_t &metadata_value_grouping_expression); 
  • gsdl/trunk/src/protocol/recptprototools.cpp

    r16039 r16180  
    251251 
    252252 
    253 bool get_metadata_values (const text_t metadata_element_name, const text_t metadata_value_filter, 
     253bool get_metadata_values (const text_t metadata_elements, const text_t metadata_value_filter, 
    254254                          const text_t metadata_value_grouping_expression, const text_t &collection, 
    255255                          recptproto *collectproto, FilterResponse_t &response, ostream &logout) 
     
    265265 
    266266  OptionValue_t request_option; 
    267   request_option.name = "MetadataElement"; 
    268   request_option.value = metadata_element_name
     267  request_option.name = "MetadataElements"; 
     268  request_option.value = metadata_elements
    269269  request.filterOptions.push_back (request_option); 
    270270  request_option.name = "MetadataValueFilter"; 
     
    281281    outconvertclass text_t2ascii; 
    282282    logout << text_t2ascii 
    283            << "Error: call to filter failed for " << metadata_element_name 
     283           << "Error: call to filter failed for " << metadata_elements 
    284284           << " in recptprototools::get_metadata_values ("  
    285285           << get_comerror_string (err) << ")\n"; 
     
    291291 
    292292 
    293 bool get_documents_with_metadata_value (const text_t metadata_element_name, const text_t metadata_value, 
     293bool get_documents_with_metadata_value (const text_t metadata_elements, const text_t metadata_value, 
    294294                                        const text_t sort_by_metadata_element_name, const text_t &collection, 
    295295                                        recptproto *collectproto, FilterResponse_t &response, ostream &logout) 
     
    305305 
    306306  OptionValue_t request_option; 
    307   request_option.name = "MetadataElement"; 
    308   request_option.value = metadata_element_name
     307  request_option.name = "MetadataElements"; 
     308  request_option.value = metadata_elements
    309309  request.filterOptions.push_back (request_option); 
    310310  request_option.name = "MetadataValue"; 
     
    321321    outconvertclass text_t2ascii; 
    322322    logout << text_t2ascii 
    323            << "Error: call to filter failed for " << metadata_element_name << " = " << metadata_value 
     323           << "Error: call to filter failed for " << metadata_elements << " = " << metadata_value 
    324324           << " in recptprototools::get_documents_with_metadata_value ("  
    325325           << get_comerror_string (err) << ")\n"; 
  • gsdl/trunk/src/protocol/recptprototools.h

    r16039 r16180  
    6868                   ostream &logout); 
    6969 
    70 bool get_metadata_values (const text_t metadata_element_name, const text_t metadata_value_filter, 
     70bool get_metadata_values (const text_t metadata_elements, const text_t metadata_value_filter, 
    7171                          const text_t metadata_value_grouping_expression, const text_t &collection, 
    7272                          recptproto *collectproto, FilterResponse_t &response, ostream &logout); 
    7373 
    74 bool get_documents_with_metadata_value (const text_t metadata_element_name, const text_t metadata_value, 
     74bool get_documents_with_metadata_value (const text_t metadata_elements, const text_t metadata_value, 
    7575                                        const text_t sort_by_metadata_element_name, const text_t &collection, 
    7676                                        recptproto *collectproto, FilterResponse_t &response, ostream &logout);