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

Last change on this file since 15836 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
Line 
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
61 logout << text_t2ascii << "configuration error: sqlbrowsefilter contains a null sqldbclass\n\n";
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 {
75 logout << text_t2ascii << "warning: database \"" << sql_db_filename << "\" does not exist\n\n";
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
94 logout << text_t2ascii << "configuration error: sqlbrowsefilter contains a null sqldbclass\n\n";
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)
103 logout << text_t2ascii << "system problem: open on database \"" << sql_db_filename << "\" failed\n\n";
104 err = systemProblem;
105 return;
106 }
107
108 // Request for the metadata values assigned to an element
109 if (request.requestParams == "GetMetadataValues")
110 {
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
122 text_tarray metadata_values = sql_db_ptr->get_metadata_values (metadata_element_name);
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;
126 text_tarray::iterator metadata_value_iterator = metadata_values.begin();
127 while (metadata_value_iterator != metadata_values.end())
128 {
129 text_t metadata_value = *metadata_value_iterator;
130
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
145 metadata_value_iterator++;
146 }
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 }
155 }
156
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 = "";
162 text_t sort_by_metadata_element_name = "";
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 }
174 if ((*options_iterator).name == "SortByMetadataElement")
175 {
176 sort_by_metadata_element_name = (*options_iterator).value;
177 }
178 options_iterator++;
179 }
180
181 text_tarray document_OIDs = sql_db_ptr->get_documents_with_metadata_value (metadata_element_name, metadata_value, sort_by_metadata_element_name);
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
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.