source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/GS2MGSearch.java@ 25635

Last change on this file since 25635 was 25635, checked in by sjm84, 12 years ago

Fixing Greenstone 3's use (or lack thereof) of generics, this was done automatically so we may want to change it over time. This change will also auto-format any files that have not already been formatted.

  • Property svn:keywords set to Author Date Id Revision
File size: 9.5 KB
Line 
1/*
2 * GS2MGSearch.java
3 * Copyright (C) 2002 New Zealand Digital Library, http://www.nzdl.org
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18package org.greenstone.gsdl3.service;
19
20
21// Greenstone classes
22import org.greenstone.mg.*;
23import org.greenstone.gsdl3.util.*;
24
25// XML classes
26import org.w3c.dom.Document;
27import org.w3c.dom.Element;
28import org.w3c.dom.NodeList;
29
30// java
31import java.util.Vector;
32import java.util.ArrayList;
33import java.util.HashMap;
34import java.util.Map;
35import java.util.Set;
36import java.util.Iterator;
37import java.io.File;
38import java.io.Serializable;
39
40import org.apache.log4j.*;
41
42/**
43 *
44 * @author <a href="mailto:[email protected]">Katherine Don</a>
45 * @author <a href="mailto:[email protected]">Michael Dewsnip</a>
46 */
47
48public class GS2MGSearch
49extends AbstractGS2TextSearch {
50
51 protected static MGSearchWrapper mg_src = null;
52
53 static Logger logger = Logger.getLogger (org.greenstone.gsdl3.service.GS2MGSearch.class.getName ());
54
55
56 /** constructor */
57 public GS2MGSearch () {
58 if(this.mg_src == null){
59 this.mg_src = new MGSearchWrapper ();
60 }
61 }
62 public void cleanUp () {
63 super.cleanUp ();
64 this.mg_src.unloadIndexData ();
65 }
66
67 /** configure this service */
68 public boolean configure (Element info, Element extra_info) {
69 if (!super.configure (info, extra_info)){
70 return false;
71 }
72
73 this.mg_src.setMaxNumeric (this.maxnumeric);
74 return true;
75 }
76
77
78
79 /** do the actual query */
80 protected Element processTextQuery (Element request) {
81 synchronized(this.mg_src){
82 // Create a new (empty) result message ('doc' is in ServiceRack.java)
83 Element result = this.doc.createElement (GSXML.RESPONSE_ELEM);
84 result.setAttribute (GSXML.FROM_ATT, QUERY_SERVICE);
85 result.setAttribute (GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS);
86
87 // Get the parameters of the request
88 Element param_list = (Element) GSXML.getChildByTagName (request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
89 if (param_list == null) {
90 logger.error ("TextQuery request had no paramList.");
91 return result; // Return the empty result
92 }
93
94 // Process the request parameters
95 HashMap<String, Serializable> params = GSXML.extractParams (param_list, false);
96
97 // Make sure a query has been specified
98 String query = (String) params.get (QUERY_PARAM);
99 if (query == null || query.equals ("")) {
100 return result; // Return the empty result
101 }
102
103 // If an index hasn't been specified, use the default
104 String index = (String) params.get (INDEX_PARAM);
105 if (index == null) {
106 index = this.default_index;
107 }
108
109 // If a subcollection index has been specified, use it
110 String indexSub = (String) params.get (INDEX_SUBCOLLECTION_PARAM);
111 if (indexSub != null) {
112 index += indexSub;
113 }
114 else{
115 if (!this.default_index_subcollection.equals ("")){
116 index += this.default_index_subcollection;
117 }
118 }
119
120 // If a subcollection index has been specified, use it
121 String indexLang = (String) params.get (INDEX_LANGUAGE_PARAM);
122 if (indexLang != null) {
123 index += indexLang;
124 }
125 else{
126 if (!this.default_index_language.equals ("")){
127 index += this.default_index_language;
128 }
129 }
130
131 // The location of the MG index and text files
132 String basedir = GSFile.collectionBaseDir (this.site_home, this.cluster_name) + File.separatorChar; // Needed for MG
133 String textdir = GSFile.collectionTextPath (this.index_stem);
134 String indexpath = GSFile.collectionIndexPath (this.index_stem, index);
135 this.mg_src.setIndex (indexpath);
136
137 // set the mg query parameters to the values the user has specified
138 setStandardQueryParams (params);
139 this.mg_src.runQuery (basedir, textdir, query);
140 MGQueryResult mqr = this.mg_src.getQueryResult ();
141 if (mqr.isClear ()) {
142 // something has gone wrong
143 GSXML.addError (this.doc, result, "Couldn't query the mg database", GSXML.ERROR_TYPE_SYSTEM);
144 return result;
145 }
146 long totalDocs = mqr.getTotalDocs ();
147
148 // Get the docnums out, and convert to HASH ids
149 Vector docs = mqr.getDocs ();
150 if (docs.size () == 0) {
151 logger.error ("No results found...\n");
152 }
153
154 // Create a metadata list to store information about the query results
155 Element metadata_list = this.doc.createElement (GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER);
156 result.appendChild (metadata_list);
157
158 // Add a metadata element specifying the number of matching documents
159 // because teh total number is just the number returned, use numDocsReturned, not numDocsMatched
160 GSXML.addMetadata (this.doc, metadata_list, "numDocsReturned", ""+totalDocs);
161 // add a metadata item to specify what actual query was done - eg if stuff was stripped out etc. and then we can use the query later, cos we don't know which parameter was the query
162 GSXML.addMetadata (this.doc, metadata_list, "query", query);
163
164 if (docs.size () > 0) {
165 // Create a document list to store the matching documents, and add them
166 Element document_list = this.doc.createElement (GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER);
167 result.appendChild (document_list);
168 for (int d = 0; d < docs.size (); d++) {
169 long docnum = ((MGDocInfo) docs.elementAt (d)).num_;
170 float rank = ((MGDocInfo) docs.elementAt (d)).rank_;
171 String doc_id = internalNum2OID (docnum);
172 Element doc_node = createDocNode (doc_id, Float.toString (rank));
173 document_list.appendChild (doc_node);
174 }
175 }
176
177 // Create a term list to store the term information, and add it
178 Element term_list = this.doc.createElement (GSXML.TERM_ELEM+GSXML.LIST_MODIFIER);
179 result.appendChild (term_list);
180 Vector terms = mqr.getTerms ();
181 for (int t = 0; t < terms.size (); t++) {
182 MGTermInfo term_info = (MGTermInfo) terms.get (t);
183
184 String term = term_info.term_;
185 int stem_method = term_info.stem_method_;
186 Vector equiv_terms = term_info.equiv_terms_;
187
188 Element term_elem = this.doc.createElement (GSXML.TERM_ELEM);
189 term_elem.setAttribute (GSXML.NAME_ATT, term);
190 term_elem.setAttribute (STEM_ATT, "" + stem_method);
191
192 Element equiv_term_list = this.doc.createElement (EQUIV_TERM_ELEM+GSXML.LIST_MODIFIER);
193 term_elem.appendChild (equiv_term_list);
194
195 long total_term_freq = 0;
196 for (int et = 0; et < equiv_terms.size (); et++) {
197 MGEquivTermInfo equiv_term_info = (MGEquivTermInfo) equiv_terms.get (et);
198
199 Element equiv_term_elem = this.doc.createElement (GSXML.TERM_ELEM);
200 equiv_term_elem.setAttribute (GSXML.NAME_ATT, equiv_term_info.term_);
201 equiv_term_elem.setAttribute (NUM_DOCS_MATCH_ATT, "" + equiv_term_info.match_docs_);
202 equiv_term_elem.setAttribute (FREQ_ATT, "" + equiv_term_info.term_freq_);
203 equiv_term_list.appendChild (equiv_term_elem);
204
205 total_term_freq += equiv_term_info.term_freq_;
206 }
207
208 term_elem.setAttribute (FREQ_ATT, "" + total_term_freq);
209 term_list.appendChild (term_elem);
210 }
211 return result;
212 }//end of synchronized
213 }
214
215 // should probably use a list rather than map
216 protected boolean setStandardQueryParams(HashMap<String, Serializable> params)
217 {
218 // set the default settings that gs uses
219 this.mg_src.setReturnTerms(true);
220 this.mg_src.setCase(true);
221 this.mg_src.setStem(false);
222 Set entries = params.entrySet();
223 Iterator i = entries.iterator();
224 while (i.hasNext()) {
225 Map.Entry m = (Map.Entry)i.next();
226 String name = (String)m.getKey();
227 String value = (String)m.getValue();
228
229 if (name.equals(CASE_PARAM) && this.does_case) {
230 boolean val = (value.equals(BOOLEAN_PARAM_ON) ? true : false);
231 this.mg_src.setCase(val);
232 }
233 else if (name.equals(STEM_PARAM) && this.does_stem) {
234 boolean val = (value.equals(BOOLEAN_PARAM_ON) ? true : false);
235 this.mg_src.setStem(val);
236 }
237 else if (name.equals(MATCH_PARAM)) {
238 int mode = (value.equals(MATCH_PARAM_ALL) ? 1 : 0);
239 this.mg_src.setMatchMode(mode);
240 }
241 else if (name.equals(MAXDOCS_PARAM)) {
242 int docs = Integer.parseInt(value);
243 this.mg_src.setMaxDocs(docs);
244 } // ignore any others
245 }
246 return true;
247 }
248
249
250}
251
252
Note: See TracBrowser for help on using the repository browser.