source: gsdl/trunk/src/colservr/sqlbrowsefilter.cpp@ 15851

Last change on this file since 15851 was 15836, checked in by mdewsnip, 16 years ago

(Adding dynamic classifiers) Not sure if this is necessarily the best place to do this, but added the ability to request the documents from a "get_documents_with_metadata_value()" call to be sorted based on a certain metadata element. Thanks to John Thompson for the SQL statement help.

File size: 6.3 KB
RevLine 
[15757]1/**********************************************************************
2 *
3 * sqlbrowsefilter.cpp --
4 * Copyright (C) 2008 DL Consulting Ltd
5 *
6 * A component of the Greenstone digital library software
7 * from the New Zealand Digital Library Project at the
8 * University of Waikato, New Zealand.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 *
24 *********************************************************************/
25
26#include "sqlbrowsefilter.h"
27#include "fileutil.h"
28
29
30sqlbrowsefilterclass::sqlbrowsefilterclass ()
31{
32 sql_db_ptr = NULL;
33}
34
35
36sqlbrowsefilterclass::~sqlbrowsefilterclass ()
37{
38}
39
40
41void sqlbrowsefilterclass::configure (const text_t &key, const text_tarray &cfgline)
42{
43 filterclass::configure (key, cfgline);
44
45 if (key == "indexstem")
46 {
47 indexstem = cfgline[0];
48 }
49}
50
51
52bool sqlbrowsefilterclass::init (ostream &logout)
53{
54 outconvertclass text_t2ascii;
55
56 if (!filterclass::init(logout)) return false;
57
58 if (sql_db_ptr == NULL)
59 {
60 // most likely a configuration problem
[15766]61 logout << text_t2ascii << "configuration error: sqlbrowsefilter contains a null sqldbclass\n\n";
[15757]62 return false;
63 }
64
65 if (indexstem.empty())
66 {
67 indexstem = collection;
68 }
69
70 // get the filename for the database and make sure it exists
71 sql_db_filename = filename_cat(dbhome, "collect", collection, "index", "text", indexstem);
72 sql_db_filename += sql_db_ptr->getfileextension();
73 if (!file_exists(sql_db_filename))
74 {
[15766]75 logout << text_t2ascii << "warning: database \"" << sql_db_filename << "\" does not exist\n\n";
[15757]76 return false;
77 }
78
79 return true;
80}
81
82
83void sqlbrowsefilterclass::filter (const FilterRequest_t &request,
84 FilterResponse_t &response,
85 comerror_t &err, ostream &logout)
86{
87 outconvertclass text_t2ascii;
88
89 response.clear();
90 err = noError;
91
92 if (sql_db_ptr == NULL) {
93 // most likely a configuration problem
[15765]94 logout << text_t2ascii << "configuration error: sqlbrowsefilter contains a null sqldbclass\n\n";
[15757]95 err = configurationError;
96 return;
97 }
98
99 // open the database
100 sql_db_ptr->setlogout (&logout);
101 if (!sql_db_ptr->opendatabase (sql_db_filename, DB_READER, 100, false)) {
102 // most likely a system problem (we have already checked that the database exists)
[15765]103 logout << text_t2ascii << "system problem: open on database \"" << sql_db_filename << "\" failed\n\n";
[15757]104 err = systemProblem;
105 return;
106 }
107
[15764]108 // Request for the metadata values assigned to an element
[15802]109 if (request.requestParams == "GetMetadataValues")
[15757]110 {
[15802]111 text_t metadata_element_name = "";
112 OptionValue_tarray::const_iterator options_iterator = request.filterOptions.begin();
113 while (options_iterator != request.filterOptions.end())
114 {
115 if ((*options_iterator).name == "MetadataElement")
116 {
117 metadata_element_name = (*options_iterator).value;
118 }
119 options_iterator++;
120 }
121
[15797]122 text_tarray metadata_values = sql_db_ptr->get_metadata_values (metadata_element_name);
[15764]123
124 // Create a map from metadata value to ResultDocInfo_t, to remove duplicate values and obtain occurrence counts
125 map<text_t, ResultDocInfo_t> unique_metadata_values_map;
[15757]126 text_tarray::iterator metadata_value_iterator = metadata_values.begin();
127 while (metadata_value_iterator != metadata_values.end())
128 {
[15764]129 text_t metadata_value = *metadata_value_iterator;
[15757]130
[15764]131 // If no ResultDocInfo_t has already been created for this metadata value, create one now
132 if (unique_metadata_values_map.find(metadata_value) == unique_metadata_values_map.end())
133 {
134 ResultDocInfo_t metadata_value_result_doc;
135 metadata_value_result_doc.OID = metadata_value;
136 metadata_value_result_doc.result_num = 1;
137 unique_metadata_values_map[metadata_value] = metadata_value_result_doc;
138 }
139 // Otherwise we've seen this value before, so just update the occurrence count
140 else
141 {
142 unique_metadata_values_map[metadata_value].result_num++;
143 }
144
[15757]145 metadata_value_iterator++;
146 }
[15764]147
148 // Fill in response.docInfo with the ResultDocInfo_t objects we've created above
149 map<text_t, ResultDocInfo_t>::iterator unique_metadata_values_iterator = unique_metadata_values_map.begin();
150 while (unique_metadata_values_iterator != unique_metadata_values_map.end())
151 {
152 response.docInfo.push_back ((*unique_metadata_values_iterator).second);
153 unique_metadata_values_iterator++;
154 }
[15757]155 }
156
[15804]157 // Request for the documents with a certain metadata value assigned
158 else if (request.requestParams == "GetDocumentsWithMetadataValue")
159 {
160 text_t metadata_element_name = "";
161 text_t metadata_value = "";
[15836]162 text_t sort_by_metadata_element_name = "";
[15804]163 OptionValue_tarray::const_iterator options_iterator = request.filterOptions.begin();
164 while (options_iterator != request.filterOptions.end())
165 {
166 if ((*options_iterator).name == "MetadataElement")
167 {
168 metadata_element_name = (*options_iterator).value;
169 }
170 if ((*options_iterator).name == "MetadataValue")
171 {
172 metadata_value = (*options_iterator).value;
173 }
[15836]174 if ((*options_iterator).name == "SortByMetadataElement")
175 {
176 sort_by_metadata_element_name = (*options_iterator).value;
177 }
[15804]178 options_iterator++;
179 }
180
[15836]181 text_tarray document_OIDs = sql_db_ptr->get_documents_with_metadata_value (metadata_element_name, metadata_value, sort_by_metadata_element_name);
[15804]182
183 // Fill in response.docInfo with the document OIDs
184 text_tarray::iterator document_OID_iterator = document_OIDs.begin();
185 while (document_OID_iterator != document_OIDs.end())
186 {
187 ResultDocInfo_t document_result_doc;
188 document_result_doc.OID = *document_OID_iterator;
189 response.docInfo.push_back (document_result_doc);
190 document_OID_iterator++;
191 }
192 }
193
[15757]194 sql_db_ptr->closedatabase(); // Important that local library doesn't leave any files open
195}
Note: See TracBrowser for help on using the repository browser.