Changeset 16180


Ignore:
Timestamp:
2008-06-25T15:38:55+12:00 (16 years 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.

Location:
gsdl/trunk/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • 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);
Note: See TracChangeset for help on using the changeset viewer.