Changeset 3824
- Timestamp:
- 2003-03-10T11:00:14+13:00 (21 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gsdl3/src/java/org/greenstone/gsdl3/service/GS2MGPPSearch.java
r3680 r3824 19 19 package org.greenstone.gsdl3.service; 20 20 21 // greenstone classes 21 22 // Greenstone classes 22 23 import org.greenstone.mgpp.*; 23 import org.greenstone.gdbm.*;24 24 import org.greenstone.gsdl3.util.*; 25 // xml classes 26 import org.w3c.dom.Document; 25 26 // XML classes 27 import org.w3c.dom.Element; 27 28 import org.w3c.dom.Node; 28 import org.w3c.dom.Text;29 import org.w3c.dom.Element;30 29 import org.w3c.dom.NodeList; 31 // general java classes 30 31 // General Java classes 32 32 import java.util.HashMap; 33 33 import java.util.Vector; … … 35 35 import java.util.Map; 36 36 import java.util.Iterator; 37 import java.util.Locale; 37 38 38 39 39 /** … … 45 45 */ 46 46 public class GS2MGPPSearch 47 extends ServiceRack{47 extends GS2Search { 48 48 49 49 // these strings must match what is found in the properties file 50 50 // the services on offer 51 private static final String TEXT_QUERY_SERVICE = "TextQuery";52 51 private static final String FIELD_QUERY_SERVICE = "FieldQuery"; 53 52 private static final String ADVANCED_FIELD_QUERY_SERVICE = "AdvancedFieldQuery"; 54 // params used 55 private static final String CASE_PARAM = "case"; 56 private static final String STEM_PARAM = "stem"; 57 private static final String MATCH_PARAM = "matchMode"; 58 private static final String MATCH_PARAM_ALL = "all"; 59 private static final String MATCH_PARAM_SOME = "some"; 53 54 // Parameters used 60 55 private static final String INDEX_PARAM = "index"; 61 56 private static final String LEVEL_PARAM = "level"; … … 63 58 private static final String RANK_PARAM_RANK = "rank"; 64 59 private static final String RANK_PARAM_NONE = "natural"; 65 private static final String MAXDOCS_PARAM = "maxDocs";66 private static final String BOOLEAN_PARAM_ON = "1";67 private static final String BOOLEAN_PARAM_OFF = "0";68 private static final String QUERY_PARAM = "query";69 60 private static final String SIMPLE_FIELD_PARAM = "simpleField"; 70 61 private static final String ADVANCED_FIELD_PARAM = "complexField"; … … 78 69 private static final String FIELD_COMBINE_PARAM_OR = "1"; 79 70 private static final String FIELD_COMBINE_PARAM_NOT = "2"; 80 81 // elements used in the config file that are specific to this class71 72 // Elements used in the config file that are specific to this class 82 73 private static final String DEFAULT_INDEX_ELEM = "defaultIndex"; 83 74 private static final String DEFAULT_LEVEL_ELEM = "defaultLevel"; 84 75 private static final String INDEX_ELEM = "index"; 85 76 private static final String LEVEL_ELEM = "level"; 86 77 87 78 private MGPPWrapper mgpp_src_=null; 88 private GDBMWrapper gdbm_src_=null; 89 79 90 80 private String default_index_=null; 91 81 private String default_level_=null; 92 82 93 private Element config_info_ = null;94 83 95 84 /** constructor */ 96 public GS2MGPPSearch() { 85 public GS2MGPPSearch() 86 { 97 87 mgpp_src_ = new MGPPWrapper(); 98 gdbm_src_ = new GDBMWrapper(); 99 100 } 88 } 89 101 90 102 91 /** configure this service */ 103 public boolean configure(Element info) { 104 105 System.out.println("configuring GS2MGPPSearch"); 106 config_info_ = info; 107 108 // get the default index from <defaultIndex> 109 Element def = (Element)GSXML.getChildByTagName(info, DEFAULT_INDEX_ELEM ); 110 if (def !=null) { 92 public boolean configure(Element info) 93 { 94 // Do generic configuration 95 if (super.configure(info) == false) 96 return false; 97 98 // Do specific configuration 99 System.out.println("Configuring GS2MGPPSearch..."); 100 101 // Get the default index out of <defaultIndex> (buildConfig.xml) 102 Element def = (Element) GSXML.getChildByTagName(info, DEFAULT_INDEX_ELEM); 103 if (def != null) { 111 104 default_index_ = def.getAttribute(GSXML.NAME_ATT); 112 105 } 113 if (default_index_ ==null||default_index_.equals("")) {106 if (default_index_ == null || default_index_.equals("")) { 114 107 System.err.println("Error: default index not specified!"); 115 108 return false; 116 109 } 117 118 // get the default level out of <defaultLevel> 119 def = (Element)GSXML.getChildByTagName(info, DEFAULT_LEVEL_ELEM); 120 if (def !=null) { 110 // System.out.println("Default index: " + default_index_); 111 112 // Get the default level out of <defaultLevel> (buildConfig.xml) 113 def = (Element) GSXML.getChildByTagName(info, DEFAULT_LEVEL_ELEM); 114 if (def != null) { 121 115 default_level_ = def.getAttribute(GSXML.NAME_ATT); 122 116 } 123 if (default_level_ ==null||default_level_.equals("")) {117 if (default_level_ == null || default_level_.equals("")) { 124 118 System.err.println("Error: default level not specified!"); 125 119 return false; 126 120 } 121 // System.out.println("Default level: " + default_level_); 122 127 123 // the default level is also the level which gdbm is expecting 128 124 mgpp_src_.setReturnLevel(default_level_); 129 125 130 126 // set up which services are available for this collection 131 Element e = null;132 127 // these entries should reflect the build config file - some services may not be available depending on how the collection was built. 133 128 134 129 // set up short_service_info_ - for now just has name and type 135 e = doc_.createElement(GSXML.SERVICE_ELEM); 136 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_QUERY); 137 e.setAttribute(GSXML.NAME_ATT, TEXT_QUERY_SERVICE); 138 short_service_info_.appendChild(e); 139 140 e = doc_.createElement(GSXML.SERVICE_ELEM); 141 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_QUERY); 142 e.setAttribute(GSXML.NAME_ATT, FIELD_QUERY_SERVICE); 143 short_service_info_.appendChild(e); 144 145 e = doc_.createElement(GSXML.SERVICE_ELEM); 146 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_QUERY); 147 e.setAttribute(GSXML.NAME_ATT, ADVANCED_FIELD_QUERY_SERVICE); 148 short_service_info_.appendChild(e); 130 Element fq_service = doc_.createElement(GSXML.SERVICE_ELEM); 131 fq_service.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_QUERY); 132 fq_service.setAttribute(GSXML.NAME_ATT, FIELD_QUERY_SERVICE); 133 short_service_info_.appendChild(fq_service); 134 135 Element afq_service = doc_.createElement(GSXML.SERVICE_ELEM); 136 afq_service.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_QUERY); 137 afq_service.setAttribute(GSXML.NAME_ATT, ADVANCED_FIELD_QUERY_SERVICE); 138 short_service_info_.appendChild(afq_service); 149 139 150 140 // set up service_info_map_ - for now, just has the same elements as above 151 141 // should have full details about each service incl params lists etc. 152 142 // do the text query one - for now a static list. later use buildcfg.xml values to dynamically change this 153 e = doc_.createElement(GSXML.SERVICE_ELEM); 154 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_QUERY); 155 e.setAttribute(GSXML.NAME_ATT, TEXT_QUERY_SERVICE); 156 Element param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 157 createTextQueryParamList(param_list, false, null); 158 e.appendChild(param_list); 159 service_info_map_.put(TEXT_QUERY_SERVICE, e); 160 161 e = doc_.createElement(GSXML.SERVICE_ELEM); 162 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_QUERY); 163 e.setAttribute(GSXML.NAME_ATT, FIELD_QUERY_SERVICE); 164 Element param_list1 = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 165 createFieldQueryParamList(param_list1, false, null); 166 e.appendChild(param_list1); 167 service_info_map_.put(FIELD_QUERY_SERVICE, e); 168 169 e = doc_.createElement(GSXML.SERVICE_ELEM); 170 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_QUERY); 171 e.setAttribute(GSXML.NAME_ATT, ADVANCED_FIELD_QUERY_SERVICE); 172 Element param_list2 = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 173 createAdvancedFieldQueryParamList(param_list2, false, null); 174 e.appendChild(param_list2); 175 service_info_map_.put(ADVANCED_FIELD_QUERY_SERVICE, e); 176 177 if (gdbm_src_.openDatabase(GSFile.GDBMDatabaseFile(site_home_, cluster_name_), GDBMWrapper.READER)) { 178 return true; 179 } 180 else { 181 System.err.println("couldn't open gdbm database!"); 182 return false; 183 } 184 } 143 Element fq_service_full = (Element) fq_service.cloneNode(true); 144 Element fq_param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 145 createFieldQueryParamList(fq_param_list, false, null); 146 fq_service_full.appendChild(fq_param_list); 147 service_info_map_.put(FIELD_QUERY_SERVICE, fq_service_full); 148 149 Element afq_service_full = (Element) afq_service.cloneNode(true); 150 Element afq_param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 151 createAdvancedFieldQueryParamList(afq_param_list, false, null); 152 afq_service_full.appendChild(afq_param_list); 153 service_info_map_.put(ADVANCED_FIELD_QUERY_SERVICE, afq_service_full); 154 155 return true; 156 } 157 185 158 186 159 /** creates a new param element and adds it to the param list */ 187 160 protected void createParameter(String name, Element param_list, boolean display, String lang) { 188 161 Element param=null; 189 162 190 163 if (name.equals(INDEX_PARAM)) { 191 164 // the index info - read from config file … … 221 194 } 222 195 } 223 } else if (name.equals(STEM_PARAM)) {224 if (display) {225 String[] bool_ops = {"0", "1"};226 String[] bool_texts = {getTextString("param.boolean.off", lang),getTextString("param.boolean.on", lang)};227 param = GSXML.createParameterDisplay(doc_, STEM_PARAM, getTextString("param."+STEM_PARAM, lang), bool_ops, bool_texts);228 } else {229 param = GSXML.createParameter(doc_, STEM_PARAM, GSXML.PARAM_TYPE_BOOLEAN, BOOLEAN_PARAM_ON, null);230 }231 } else if (name.equals(CASE_PARAM)) {232 if (display) {233 String[] bool_ops = {"0", "1"};234 String[] bool_texts = {getTextString("param.boolean.off", lang),getTextString("param.boolean.on", lang)};235 param = GSXML.createParameterDisplay(doc_, CASE_PARAM, getTextString("param."+CASE_PARAM, lang), bool_ops, bool_texts);236 } else {237 param = GSXML.createParameter(doc_, CASE_PARAM, GSXML.PARAM_TYPE_BOOLEAN, BOOLEAN_PARAM_ON, null);238 }239 } else if (name.equals(MATCH_PARAM)) {240 String []vals = {MATCH_PARAM_ALL, MATCH_PARAM_SOME};241 if (display) {242 String []val_texts = {getTextString("param."+MATCH_PARAM+"."+MATCH_PARAM_ALL, lang),getTextString("param."+MATCH_PARAM+"."+MATCH_PARAM_SOME, lang)};243 244 param = GSXML.createParameterDisplay(doc_, MATCH_PARAM, getTextString("param."+MATCH_PARAM, lang), vals, val_texts);245 } else {246 param = GSXML.createParameter(doc_, MATCH_PARAM, GSXML.PARAM_TYPE_ENUM_SINGLE, MATCH_PARAM_ALL, vals);247 }248 196 } else if (name.equals(RANK_PARAM)) { 249 197 String [] vals1 = {RANK_PARAM_RANK, RANK_PARAM_NONE }; … … 255 203 } else { 256 204 param = GSXML.createParameter(doc_, RANK_PARAM, GSXML.PARAM_TYPE_ENUM_SINGLE, RANK_PARAM_RANK, vals1 ); 257 }258 } else if (name.equals(MAXDOCS_PARAM)) {259 if (display) {260 param = GSXML.createParameterDisplay(doc_, MAXDOCS_PARAM, getTextString("param."+MAXDOCS_PARAM, lang), null, null);261 } else {262 param = GSXML.createParameter(doc_, MAXDOCS_PARAM, GSXML.PARAM_TYPE_INTEGER, "10", null);263 }264 } else if (name.equals(QUERY_PARAM)) {265 if (display) {266 param = GSXML.createParameterDisplay(doc_, QUERY_PARAM, getTextString("param."+QUERY_PARAM, lang), null, null);267 } else {268 param = GSXML.createParameter(doc_, QUERY_PARAM, GSXML.PARAM_TYPE_STRING, null, null);269 205 } 270 206 } else if (name.equals(FIELD_QUERY_PARAM)) { … … 327 263 param_list.appendChild(param); 328 264 } 329 } 265 else { 266 super.createParameter(name, param_list, display, lang); 267 } 268 } 269 270 330 271 /** this creates all teh params and appends them to param_list. 331 272 * if display=true it creates the text strings version 332 273 * otherwise it creates the description version 333 274 */ 334 protected boolean createTextQueryParamList(Element param_list, boolean display, String lang) { 335 275 protected boolean createTextQueryParamList(Element param_list, boolean display, 276 String lang) 277 { 336 278 // the order they are specified here is the order they appear on 337 279 // the query form 338 280 createParameter(INDEX_PARAM, param_list, display, lang); 339 281 createParameter(LEVEL_PARAM, param_list, display, lang); 340 createParameter(CASE_PARAM, param_list, display, lang);341 createParameter(STEM_PARAM, param_list, display, lang);342 createParameter(MATCH_PARAM, param_list, display, lang);343 282 createParameter(RANK_PARAM, param_list, display, lang); 344 createParameter(MAXDOCS_PARAM,param_list, display, lang);345 createParameter(QUERY_PARAM, param_list, display, lang); 346 return true; 347 } 283 return super.createTextQueryParamList(param_list, display, lang); 284 } 285 286 348 287 /** this creates all teh params and appends them to param_list. 349 288 * if display=true it creates the text strings version 350 289 * otherwise it creates the description version 351 290 */ 352 protected boolean createFieldQueryParamList(Element param_list, boolean display, String lang) { 353 291 protected boolean createFieldQueryParamList(Element param_list, boolean display, 292 String lang) 293 { 354 294 createParameter(MATCH_PARAM, param_list, display, lang); 355 295 createParameter(LEVEL_PARAM, param_list, display, lang); … … 382 322 } 383 323 384 protected boolean createAdvancedFieldQueryParamList(Element param_list, boolean display, String lang) { 324 protected boolean createAdvancedFieldQueryParamList(Element param_list, boolean display, 325 String lang) { 385 326 386 327 // first do index and level params … … 426 367 return true; 427 368 } 428 /** creates a display element containing all the text strings needed to display the service page, in the language specified */ 429 protected Element createServiceDisplay(String service, String lang) { 430 Element display = doc_.createElement(GSXML.DISPLAY_ELEM); 431 display.appendChild(GSXML.createTextElement(doc_, GSXML.DISPLAY_NAME_ELEM, getTextString(service+".name", lang))); 432 display.appendChild(GSXML.createTextElement(doc_, GSXML.DISPLAY_SUBMIT_ELEM, getTextString(service+".submit", lang))); 433 434 // now need to add in the params 435 if (service.equals(TEXT_QUERY_SERVICE)) { 436 437 createTextQueryParamList(display, true, lang); 438 } 439 // now need to add in the params 369 370 371 /** creates a display element containing all the text strings needed to display 372 the service page, in the language specified */ 373 protected Element createServiceDisplay(String service, String lang) 374 { 375 // Create a service display for the basic text query service 376 Element display = super.createServiceDisplay(service, lang); 377 378 // Now add MGPP's special services 440 379 if (service.equals(FIELD_QUERY_SERVICE)) { 441 442 createFieldQueryParamList(display, true, lang); 443 } 444 // now need to add in the params 380 createFieldQueryParamList(display, true, lang); 381 } 445 382 if (service.equals(ADVANCED_FIELD_QUERY_SERVICE)) { 446 447 383 createAdvancedFieldQueryParamList(display, true, lang); 448 384 } 385 449 386 return display; 450 451 387 } 452 388 453 389 454 390 /** process a text query */ 455 protected Element processTextQuery(Element request) { 456 391 protected Element processTextQuery(Element request) 392 { 393 // Create a new (empty) result message 457 394 Element result = doc_.createElement(GSXML.RESPONSE_ELEM); 458 395 String from = GSPath.appendLink(cluster_name_, TEXT_QUERY_SERVICE); 459 396 result.setAttribute(GSXML.FROM_ATT, from); 460 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_QUERY); 461 462 // get param list 463 Element param_list = (Element)GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 464 if (param_list==null) { 465 System.err.println("GS2MGPPSearch, TextQuery Error: no param list in request!"); 466 return result; // empty result 467 } 397 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS); 398 Element result_content = doc_.createElement(GSXML.CONTENT_ELEM); 399 result.appendChild(result_content); 400 401 // Get the parameters of the request 402 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 403 if (param_list == null) { 404 System.err.println("Error: TextQuery request had no paramList."); 405 return result; // Return the empty result 406 } 407 408 // Process the request parameters 468 409 HashMap params = GSXML.extractParams(param_list); 469 String query = (String)params.get(QUERY_PARAM); 470 if (query == null) { 471 // nothing to query 472 return result; 473 } 474 475 String index = (String)params.get(INDEX_PARAM); 476 if (index==null) { // if its not present, use the default index 477 index=default_index_; 478 } 479 480 // now set up the mgpp stuff 481 String basedir = GSFile.collectionBaseDir(site_home_, 482 cluster_name_); 410 411 // Make sure a query has been specified 412 String query = (String) params.get(QUERY_PARAM); 413 if (query == null || query == "") { 414 return result; // Return the empty result 415 } 416 417 // If an index hasn't been specified, use the default 418 String index = (String) params.get(INDEX_PARAM); 419 if (index == null) { 420 index = default_index_; 421 } 422 423 // The location of the MGPP text files 424 String basedir = GSFile.collectionBaseDir(site_home_, cluster_name_); 483 425 String indexdir = GSFile.collectionIndexPath(cluster_name_, index); 426 System.out.println("Base directory: " + basedir); 427 System.out.println("Index directory: " + indexdir); 484 428 485 429 mgpp_src_.loadIndexData(basedir, indexdir); 430 486 431 setStandardQueryParams(params); 487 488 mgpp_src_.runQuery(query); 432 mgpp_src_.runQuery(query); 489 433 MGPPQueryResult mqr= mgpp_src_.getQueryResult(); 490 491 // get the docnums out, and convert to HASH ids 434 long totalDocs = mqr.getTotalDocs(); 435 System.out.println("Total documents: " + totalDocs); 436 437 // Get the docnums out, and convert to HASH ids 492 438 Vector docs = mqr.getDocs(); 493 439 if (docs.size()==0) { 494 // no docs found 495 return result; 496 } 497 // create a documentList element 498 Element c = doc_.createElement(GSXML.CONTENT_ELEM); 499 result.appendChild(c); 440 System.out.println("Warning: No results found...\n"); 441 // return result; 442 } 443 444 // Create a metadata list to store information about the query results 445 Element metadata_list = GSXML.addMetaList(doc_, result); 446 447 // Add a metadata element specifying the number of matching documents 448 Element num_matches_elem = doc_.createElement(GSXML.METADATA_ELEM); 449 num_matches_elem.setAttribute(GSXML.NAME_ATT, "numDocsMatched"); 450 num_matches_elem.setAttribute(GSXML.VALUE_ATT, "" + totalDocs); 451 metadata_list.appendChild(num_matches_elem); 452 453 // Create a document list to store the matching documents, and add them 500 454 Element document_list = doc_.createElement(GSXML.DOCUMENT_ELEM+GSXML.LIST_MODIFIER); 501 c.appendChild(document_list); 502 // add each document 503 for (int d=0; d<docs.size(); d++) { 504 long docnum = ((MGPPDocInfo)docs.elementAt(d)).num_; 505 String id = gdbm_src_.docnum2Oid(docnum); 506 Node no = GSXML.createDocumentElement(doc_, id); 507 document_list.appendChild(no); 508 } 455 result_content.appendChild(document_list); 456 for (int d = 0; d < docs.size(); d++) { 457 long docnum = ((MGPPDocInfo) docs.elementAt(d)).num_; 458 String doc_id = gdbm_src_.docnum2Oid(docnum); 459 Element doc_node = createDocumentNodeElement(doc_id); 460 document_list.appendChild(doc_node); 461 } 462 463 // Create a term list to store the term information, and add it 464 Element term_list = doc_.createElement(GSXML.TERM_ELEM+GSXML.LIST_MODIFIER); 465 result_content.appendChild(term_list); 466 Vector terms = mqr.getTerms(); 467 for (int t = 0; t < terms.size(); t++) { 468 MGPPTermInfo term_info = (MGPPTermInfo) terms.get(t); 469 470 String term = term_info.term_; 471 int stem_method = term_info.stem_method_; 472 Vector equiv_terms = term_info.equiv_terms_; 473 474 Element term_elem = doc_.createElement(GSXML.TERM_ELEM); 475 term_elem.setAttribute(GSXML.NAME_ATT, term); 476 term_elem.setAttribute(STEM_ATT, "" + stem_method); 477 478 Element equiv_term_list = doc_.createElement(EQUIV_TERM_ELEM+GSXML.LIST_MODIFIER); 479 term_elem.appendChild(equiv_term_list); 480 481 for (int et = 0; et < equiv_terms.size(); et++) { 482 String equiv_term = (String) equiv_terms.get(et); 483 484 Element equiv_term_elem = doc_.createElement(GSXML.TERM_ELEM); 485 equiv_term_elem.setAttribute(GSXML.NAME_ATT, equiv_term); 486 equiv_term_elem.setAttribute(NUM_DOCS_MATCH_ATT, ""); 487 equiv_term_elem.setAttribute(FREQ_ATT, ""); 488 equiv_term_list.appendChild(equiv_term_elem); 489 } 490 491 term_elem.setAttribute(FREQ_ATT, "" + term_info.term_freq_); 492 term_list.appendChild(term_elem); 493 } 494 509 495 return result; 510 }//processTextQuery 496 } 497 511 498 512 499 protected Element processFieldQuery(Element request) { … … 514 501 } 515 502 503 516 504 protected Element processAdvancedFieldQuery(Element request) { 517 505 return processAnyFieldQuery(request, "advanced"); 518 506 } 507 519 508 520 509 /** process a fielded query */
Note:
See TracChangeset
for help on using the changeset viewer.