Changeset 16034


Ignore:
Timestamp:
2008-06-17T14:22:52+12:00 (16 years ago)
Author:
mdewsnip
Message:

Improved SQL command for sorting documents that match a certain element, value pair. The new version is better structured, shorter, still returns the document if it doesn't have a value for the sorting metadata element, and should be more efficient as well.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • gsdl/trunk/src/lib/sqlitedbclass.cpp

    r15947 r16034  
    112112
    113113  // Get the entries in the "document_metadata" table where the element and value matches those specified
    114   text_t sql_cmd;
    115   if (sort_by_metadata_element_name == "")
    116   {
    117     // No sorting required
    118     sql_cmd = "SELECT docOID FROM document_metadata WHERE element='" + sqlite_safe(metadata_element_name) + "' AND value='" + sqlite_safe(metadata_value) + "'";
    119   }
    120   else
    121   {
    122     // Sort the documents by a certain metadata element
    123     // John Thompson thinks this may not be the most efficient solution, and recommends using ON instead of WHERE
    124     sql_cmd = "SELECT b.docOID FROM document_metadata AS a LEFT JOIN document_metadata AS b USING (docOID) WHERE a.element='" + sqlite_safe(metadata_element_name) + "' AND a.value='" + sqlite_safe(metadata_value) + "' AND b.element='" + sqlite_safe(sort_by_metadata_element_name) + "' ORDER BY b.value";
    125   }
     114  text_t sql_cmd = "SELECT docOID FROM document_metadata WHERE element='" + sqlite_safe(metadata_element_name) + "' AND value='" + sqlite_safe(metadata_value) + "'";
     115
     116  // If we're sorting the documents by a certain metadata element, extend the SQL command to do this
     117  if (sort_by_metadata_element_name != "")
     118  {
     119    sql_cmd = "SELECT docOID FROM (" + sql_cmd + ") LEFT JOIN (SELECT docOID,value from document_metadata WHERE element='" + sqlite_safe(sort_by_metadata_element_name) + "') USING (docOID) ORDER by value";
     120  }
     121
     122  // Perform the SQL request
    126123  vector<text_tmap> sql_results;
    127124  if (!sqlgetarray(sql_cmd, sql_results) || sql_results.size() == 0)
Note: See TracChangeset for help on using the changeset viewer.