Changeset 24394 for main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/AbstractSearch.java
- Timestamp:
- 2011-08-12T16:23:31+12:00 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/AbstractSearch.java
r20240 r24394 22 22 import org.greenstone.gsdl3.util.GSXML; 23 23 import org.greenstone.gsdl3.util.GSPath; 24 import org.greenstone.gsdl3.util.AbstractSimpleDocument; 25 import org.greenstone.gsdl3.util.SimpleDocument; 24 26 25 27 // XML classes … … 43 45 { 44 46 45 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.service.AbstractSearch.class.getName()); 46 47 47 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.service.AbstractSearch.class.getName()); 48 48 49 // the search service 49 protected static final String TEXT_QUERY_SERVICE = "TextQuery";50 50 protected String QUERY_SERVICE = null; // set by subclass 51 51 52 // compulsory params 52 53 protected static final String INDEX_PARAM = "index"; … … 54 55 55 56 // optional standard params - some of these have to be implemented 56 protected static final String INDEX_SUBCOLLECTION_PARAM = "indexSubcollection";57 protected static final String INDEX_LANGUAGE_PARAM = "indexLanguage";58 57 protected static final String MAXDOCS_PARAM = "maxDocs"; 59 58 protected static final String HITS_PER_PAGE_PARAM = "hitsPerPage"; 60 59 protected static final String START_PAGE_PARAM = "startPage"; 61 60 62 protected static final String INDEX_SUBCOLLECTION_ELEM = "indexSubcollection"; 63 protected static final String INDEX_LANGUAGE_ELEM = "indexLanguage"; 64 65 66 // some other common params that may be used 67 protected static final String CASE_PARAM = "case"; 68 protected static final String STEM_PARAM = "stem"; 69 protected static final String ACCENT_PARAM="accent"; 70 71 protected static final String BOOLEAN_PARAM_ON = "1"; 72 protected static final String BOOLEAN_PARAM_OFF = "0"; 73 protected static final String MATCH_PARAM = "matchMode"; 74 protected static final String MATCH_PARAM_ALL = "all"; 75 protected static final String MATCH_PARAM_SOME = "some"; 76 77 /** can more than one index be searched at the smae time? */ 61 protected AbstractSimpleDocument gs_doc = null; 62 63 /** can more than one index be searched at the same time? */ 78 64 protected boolean does_multi_index_search = false; 79 65 /** does this service support paging of results? */ … … 90 76 protected String default_index = ""; 91 77 92 protected String default_index_subcollection = "";93 94 protected String default_index_language = "";95 96 78 protected String default_max_docs = "100"; 97 79 … … 102 84 } 103 85 104 /** sets up the short service info for TextQuery. If other services 105 * will be provided, should be added in the subclass configure 106 * also looks for search format info, and document format info 86 /** Sets up the short service info for service by QUERY_SERVICE 87 * (e.g. TextQuery or AudioQuery) 88 * If other services will be provided, should be added in the 89 * subclass configure also looks for search format info, and 90 * document format info 107 91 */ 108 92 public boolean configure(Element info, Element extra_info) … … 116 100 this.config_info = info; 117 101 118 // set up short_service_info_ - for now just has id and type. the name (lang dependent) will be added in if the list is requested. 102 // set up short_service_info_ 103 // => for now just has id and type. the name (lang dependent) 104 // will be added in if the list is requested. 105 119 106 Element tq_service = this.doc.createElement(GSXML.SERVICE_ELEM); 120 107 tq_service.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_QUERY); 121 tq_service.setAttribute(GSXML.NAME_ATT, TEXT_QUERY_SERVICE);108 tq_service.setAttribute(GSXML.NAME_ATT, QUERY_SERVICE); 122 109 this.short_service_info.appendChild(tq_service); 123 110 124 // add some format info to service map if there is any - look in extra info 125 // first look in buildConfig 111 // add some format info to service map if there is any 112 // => lookin extra info first look in buildConfig 113 126 114 Element format = (Element)GSXML.getChildByTagName(info, GSXML.FORMAT_ELEM); 127 115 … … 129 117 String path = GSPath.appendLink(GSXML.SEARCH_ELEM, GSXML.FORMAT_ELEM); 130 118 131 //note by xiao: instead of retrieving the first 'format' element inside the 'search' 132 // element, we are trying to find the real format element which has at least one 133 // 'gsf:template' child element. (extra_info is collectionConfig.xml) 134 //format = (Element) GSXML.getNodeByPath(extra_info, path); 135 Element search_elem = (Element) GSXML.getChildByTagName(extra_info, GSXML.SEARCH_ELEM); 136 NodeList format_elems = null; 137 if (search_elem != null) { 138 format_elems = search_elem.getElementsByTagName(GSXML.FORMAT_ELEM); 139 } 140 for(int i=0; i<format_elems.getLength(); i++) { 141 format = (Element)format_elems.item(i); 142 if (format.getElementsByTagName("gsf:template").getLength() != 0) { 143 break; 144 } 145 } 119 // Note by xiao: instead of retrieving the first 'format' 120 // element inside the 'search' element, we are trying to 121 // find the real format element which has at least one 122 // 'gsf:template' child element. (extra_info is 123 // collectionConfig.xml) 124 125 //format = (Element) GSXML.getNodeByPath(extra_info, path); 126 127 Element search_elem = (Element) GSXML.getChildByTagName(extra_info, GSXML.SEARCH_ELEM); 128 NodeList format_elems = null; 129 if (search_elem != null) { 130 format_elems = search_elem.getElementsByTagName(GSXML.FORMAT_ELEM); 131 } 132 for(int i=0; i<format_elems.getLength(); i++) { 133 format = (Element)format_elems.item(i); 134 if (format.getElementsByTagName("gsf:template").getLength() != 0) { 135 break; 136 } 137 } 146 138 }//end of if(format==null) 147 139 // 148 140 if (format != null) { 149 this.format_info_map.put( TEXT_QUERY_SERVICE, this.doc.importNode(format, true));141 this.format_info_map.put(QUERY_SERVICE, this.doc.importNode(format, true)); 150 142 } 151 143 … … 164 156 } 165 157 158 // Base line for document (might be overriden by sub-classes) 159 gs_doc = new SimpleDocument(this.doc,this.default_document_type); 160 166 161 return true; 167 162 } 168 163 169 /** returns the description of the TextQuery service. If a subclass170 * provides other services they need to provide stheir own descriptions */164 /** returns a basic description for QUERY_SERVICE. If a subclass 165 * provides other services they need to provide their own descriptions */ 171 166 protected Element getServiceDescription(String service, String lang, String subset) 172 167 { 173 if (!service.equals( TEXT_QUERY_SERVICE)) {168 if (!service.equals(QUERY_SERVICE)) { 174 169 return null; 175 170 } … … 177 172 Element tq_service = this.doc.createElement(GSXML.SERVICE_ELEM); 178 173 tq_service.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_QUERY); 179 tq_service.setAttribute(GSXML.NAME_ATT, TEXT_QUERY_SERVICE);174 tq_service.setAttribute(GSXML.NAME_ATT, QUERY_SERVICE); 180 175 if (subset==null || subset.equals(GSXML.DISPLAY_TEXT_ELEM+GSXML.LIST_MODIFIER)) { 181 tq_service.appendChild(GSXML.createDisplayTextElement(this.doc, GSXML.DISPLAY_TEXT_NAME, getServiceName( TEXT_QUERY_SERVICE, lang) ));182 tq_service.appendChild(GSXML.createDisplayTextElement(this.doc, GSXML.DISPLAY_TEXT_SUBMIT, getServiceSubmit( TEXT_QUERY_SERVICE, lang) ));183 tq_service.appendChild(GSXML.createDisplayTextElement(this.doc, GSXML.DISPLAY_TEXT_DESCRIPTION, getServiceDescription( TEXT_QUERY_SERVICE, lang)));176 tq_service.appendChild(GSXML.createDisplayTextElement(this.doc, GSXML.DISPLAY_TEXT_NAME, getServiceName(QUERY_SERVICE, lang) )); 177 tq_service.appendChild(GSXML.createDisplayTextElement(this.doc, GSXML.DISPLAY_TEXT_SUBMIT, getServiceSubmit(QUERY_SERVICE, lang) )); 178 tq_service.appendChild(GSXML.createDisplayTextElement(this.doc, GSXML.DISPLAY_TEXT_DESCRIPTION, getServiceDescription(QUERY_SERVICE, lang))); 184 179 } 185 180 if (subset==null || subset.equals(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER)) { … … 219 214 createParameter(INDEX_PARAM, param_list, lang); 220 215 } 221 if (!default_index_subcollection.equals("")){222 createParameter(INDEX_SUBCOLLECTION_PARAM,param_list, lang);223 }224 if (!default_index_language.equals("")){225 createParameter(INDEX_LANGUAGE_PARAM,param_list, lang);226 }227 216 if (does_chunking) { 228 217 createParameter(MAXDOCS_PARAM, param_list, lang); … … 243 232 // default behaviour, do nothing 244 233 } 245 246 protected void createParameter(String name, Element param_list, String lang) { 247 createParameter(name, param_list, lang, null); 248 } 249 /** default implementations for the standard parameters plus some 250 * other common ones 251 * index, maxDocs, hitsPerPage, startPage, query, case, stem, 234 235 protected void createParameter(String name, Element param_list, String lang) 236 { 237 createParameter(name, param_list, lang, null); 238 } 239 240 protected void createParameter(String name, Element param_list, String lang, String default_value) 241 { 242 // at this level, not interested in boolean return type 243 createParameterChain(name,param_list,lang,default_value); 244 } 245 246 247 /** default implementations for the standard parameters plus some 248 * other common ones index, maxDocs, hitsPerPage, startPage 252 249 */ 253 protected void createParameter(String name, Element param_list, String lang, String default_value) { 250 251 protected boolean createParameterChain(String name, Element param_list, String lang, String default_value) 252 { 254 253 Element param = null; 255 254 String param_default = default_value; 255 256 256 if (name.equals(QUERY_PARAM)) { 257 257 param = GSXML.createParameterDescription(this.doc, QUERY_PARAM, getTextString("param."+QUERY_PARAM, lang), GSXML.PARAM_TYPE_STRING, param_default, null, null); 258 258 param_list.appendChild(param); 259 return true; 259 260 } else if (name.equals(INDEX_PARAM)) { 260 261 … … 272 273 param = GSXML.createParameterDescription2(this.doc, INDEX_PARAM, getTextString("param."+INDEX_PARAM, lang), param_type, param_default, index_ids, index_names); 273 274 param_list.appendChild(param); 274 } 275 else if (name.equals(INDEX_SUBCOLLECTION_PARAM)){ 276 Element index_sub_list = (Element)GSXML.getChildByTagName(this.config_info, INDEX_SUBCOLLECTION_ELEM+GSXML.LIST_MODIFIER); 277 if (index_sub_list == null) return; 278 ArrayList index_sub_ids = new ArrayList(); 279 ArrayList index_sub_names = new ArrayList(); 280 getIndexSubcollectionData(index_sub_ids, index_sub_names, lang); 281 String param_type = GSXML.PARAM_TYPE_ENUM_SINGLE; 282 if (does_multi_index_search) { 283 param_type = GSXML.PARAM_TYPE_ENUM_MULTI; 284 } 275 return true; 276 } 277 else if (name.equals(MAXDOCS_PARAM)) { 285 278 if (param_default == null) { 286 param_default = this.default_index_subcollection; 287 } 288 param = GSXML.createParameterDescription2(this.doc, INDEX_SUBCOLLECTION_PARAM, getTextString("param."+INDEX_SUBCOLLECTION_PARAM, lang), param_type, param_default, index_sub_ids, index_sub_names); 289 param_list.appendChild(param); 290 } 291 else if(name.equals(INDEX_LANGUAGE_PARAM)){ 292 Element index_lang_list = (Element)GSXML.getChildByTagName(this.config_info, INDEX_LANGUAGE_ELEM+GSXML.LIST_MODIFIER); 293 if (index_lang_list == null) return; 294 ArrayList index_lang_ids = new ArrayList(); 295 ArrayList index_lang_names = new ArrayList(); 296 getIndexLanguageData(index_lang_ids, index_lang_names, lang); 297 String param_type = GSXML.PARAM_TYPE_ENUM_SINGLE; 298 if (does_multi_index_search) { 299 param_type = GSXML.PARAM_TYPE_ENUM_MULTI; 300 } 279 param_default = this.default_max_docs; 280 } 281 282 param = GSXML.createParameterDescription(this.doc, name, getTextString("param."+name, lang), GSXML.PARAM_TYPE_INTEGER, param_default, null, null); 283 param_list.appendChild(param); 284 return true; 285 } 286 else if(name.equals(HITS_PER_PAGE_PARAM)){ 301 287 if (param_default == null) { 302 param_default = this.default_index_language; 303 } 304 param = GSXML.createParameterDescription2(this.doc, INDEX_LANGUAGE_PARAM, getTextString("param."+INDEX_LANGUAGE_PARAM, lang), param_type, param_default, index_lang_ids, index_lang_names); 305 param_list.appendChild(param); 306 } 307 else if (name.equals(MAXDOCS_PARAM)) { 308 if (param_default == null) { 309 param_default = this.default_max_docs; 310 } 311 288 param_default = this.default_hits_per_page; 289 } 290 312 291 param = GSXML.createParameterDescription(this.doc, name, getTextString("param."+name, lang), GSXML.PARAM_TYPE_INTEGER, param_default, null, null); 313 292 param_list.appendChild(param); 314 } 315 else if(name.equals(HITS_PER_PAGE_PARAM)){ 316 if (param_default == null) { 317 param_default = this.default_hits_per_page; 318 } 319 320 param = GSXML.createParameterDescription(this.doc, name, getTextString("param."+name, lang), GSXML.PARAM_TYPE_INTEGER, param_default, null, null); 321 param_list.appendChild(param); 322 } 323 else if (name.equals(CASE_PARAM) || name.equals(STEM_PARAM) || name.equals(ACCENT_PARAM)) { 324 if (param_default == null) { 325 param_default = BOOLEAN_PARAM_OFF; 326 } 327 String[] bool_ops = {"0", "1"}; 328 String[] bool_texts = {getTextString("param.boolean.off", lang),getTextString("param.boolean.on", lang)}; 329 param = GSXML.createParameterDescription(this.doc, name, getTextString("param."+name, lang), GSXML.PARAM_TYPE_BOOLEAN, param_default, bool_ops, bool_texts); 330 param_list.appendChild(param); 331 } else if (name.equals(MATCH_PARAM)) { 332 if (param_default == null) { 333 param_default = MATCH_PARAM_SOME; 334 } 335 336 String[] vals = {MATCH_PARAM_SOME, MATCH_PARAM_ALL }; 337 String[] val_texts = {getTextString("param."+MATCH_PARAM+"."+MATCH_PARAM_SOME, lang), getTextString("param."+MATCH_PARAM+"."+MATCH_PARAM_ALL, lang)}; 338 param = GSXML.createParameterDescription(this.doc, MATCH_PARAM, getTextString("param."+MATCH_PARAM, lang), GSXML.PARAM_TYPE_ENUM_SINGLE, param_default, vals, val_texts); 339 param_list.appendChild(param); 293 return true; 340 294 } else if (name.equals(START_PAGE_PARAM)) { 341 if (param_default == null) {342 343 }344 295 if (param_default == null) { 296 param_default = "1"; 297 } 298 345 299 // start page - set to 1 for the search page 346 300 param = GSXML.createParameterDescription(this.doc, START_PAGE_PARAM, "", GSXML.PARAM_TYPE_INVISIBLE, param_default, null, null); 347 301 param_list.appendChild(param); 348 } 349 350 351 } 302 return true; 303 } 304 305 // Get to there then none of the above params matched 306 // => return false so the chain can continue 307 return false; 308 } 309 310 352 311 /** create an element to go into the search results list. A node element 353 312 * has the form 354 313 * <docNode nodeId='xxx' nodeType='leaf' docType='hierarchy' rank='0.23'/> 355 314 */ 356 protected Element createDocNode(String node_id, String rank) { 357 Element node = this.doc.createElement(GSXML.DOC_NODE_ELEM); 358 node.setAttribute(GSXML.NODE_ID_ATT, node_id); 359 node.setAttribute(GSXML.NODE_RANK_ATT, rank); 360 String doc_type = null; 361 if (default_document_type != null) { 362 doc_type = default_document_type; 363 } else { 364 doc_type = getDocType(node_id); 365 } 366 node.setAttribute(GSXML.DOC_TYPE_ATT, doc_type); 367 String node_type = getNodeType(node_id, doc_type); 368 node.setAttribute(GSXML.NODE_TYPE_ATT, node_type); 369 return node; 315 protected Element createDocNode(String node_id, String rank) 316 { 317 return this.gs_doc.createDocNode(node_id,rank); 318 } 319 320 /** returns the document type of the doc that the specified node 321 belongs to. should be one of 322 GSXML.DOC_TYPE_SIMPLE, 323 GSXML.DOC_TYPE_PAGED, 324 GSXML.DOC_TYPE_HIERARCHY 325 */ 326 protected String getDocType(String node_id){ 327 return this.gs_doc.getDocType(node_id); 370 328 } 371 329 … … 376 334 GSXML.NODE_TYPE_ROOT 377 335 */ 378 protected String getNodeType(String node_id, String doc_type) { 379 if (doc_type.equals(GSXML.DOC_TYPE_SIMPLE)) { 380 return GSXML.NODE_TYPE_LEAF; 381 } 382 383 if (!hasParent(node_id)) { 384 return GSXML.NODE_TYPE_ROOT; 385 } 386 if (doc_type.equals(GSXML.DOC_TYPE_PAGED)) { 387 return GSXML.NODE_TYPE_LEAF; 388 } 389 if (!hasChildren(node_id)) { 390 return GSXML.NODE_TYPE_LEAF; 391 } 392 return GSXML.NODE_TYPE_INTERNAL; 393 394 } 395 396 397 /** returns the document type of the doc that the specified node 398 belongs to. should be one of 399 GSXML.DOC_TYPE_SIMPLE, 400 GSXML.DOC_TYPE_PAGED, 401 GSXML.DOC_TYPE_HIERARCHY 402 default implementation returns GSXML.DOC_TYPE_SIMPLE, over ride 403 if documents can be hierarchical 404 */ 405 protected String getDocType(String node_id) { 406 return GSXML.DOC_TYPE_SIMPLE; 407 } 408 409 /** returns true if the node has child nodes 410 * default implementation returns false, over ride if documents can be 411 * hierarchical 412 */ 413 protected boolean hasChildren(String node_id) { 414 return false; 415 } 416 /** returns true if the node has a parent 417 * default implementation returns false, over ride if documents can be 418 * hierarchical*/ 419 protected boolean hasParent(String node_id) { 420 return false; 421 } 422 423 /** do the actual query 424 * must be implemented by subclass */ 425 abstract protected Element processTextQuery(Element request); 426 336 protected String getNodeType(String node_id, String doc_type) 337 { 338 return this.gs_doc.getNodeType(node_id,doc_type); 339 } 340 341 /** returns true if the node has child nodes */ 342 protected boolean hasChildren(String node_id) 343 { 344 return this.gs_doc.hasChildren(node_id); 345 } 346 347 /** returns true if the node has a parent */ 348 protected boolean hasParent(String node_id) 349 { 350 return this.gs_doc.hasParent(node_id); 351 } 352 353 427 354 /** get the details about the indexes available 428 355 * must be implemented by subclass … … 430 357 abstract protected void getIndexData(ArrayList index_ids, ArrayList index_names, String lang); 431 358 432 /** get the details about the indexexSubcollections available433 * might be implemented by subclass434 */435 protected void getIndexSubcollectionData(ArrayList index_ids, ArrayList index_names, String lang){}436 437 /** get the details about the indexes available438 * might be implemented by subclass439 */440 protected void getIndexLanguageData(ArrayList index_ids, ArrayList index_names, String lang){}441 442 443 359 } 444 360
Note:
See TracChangeset
for help on using the changeset viewer.