Changeset 9807 for branches


Ignore:
Timestamp:
2005-05-04T15:37:29+12:00 (19 years ago)
Author:
kjdon
Message:

changed the way filterDocList determines if paging is done by the service or not. rearranged the processTextQuery - request type can now be r, d or rd/dr. only return the service description if a d is present in rt. because the description request is not necessarily carried out anymore, the format request is piggy backed onto the query.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ant-install-branch/gsdl3/src/java/org/greenstone/gsdl3/action/QueryAction.java

    r9794 r9807  
    6060    String to = GSPath.appendLink(collection, service_name);
    6161   
    62     // part of the response is the service description
    63     // for now get this again from the service.
    64     // this will probably need to be cached somehow later on.
    65     Element mr_info_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
    66     Element mr_info_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE,  to, lang, uid);
    67     mr_info_message.appendChild(mr_info_request);
    68 
     62    if (request_type.indexOf("d")!=-1) {
     63        // we have been asked for the service description
     64        Element mr_info_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
     65        Element mr_info_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE,  to, lang, uid);
     66        mr_info_message.appendChild(mr_info_request);
     67       
     68        // process the message
     69        Element mr_info_response = (Element) this.mr.process(mr_info_message);
     70        // the response
     71        Element service_response = (Element)GSXML.getChildByTagName(mr_info_response, GSXML.RESPONSE_ELEM);
     72       
     73        Element service_description = (Element)this.doc.importNode(GSXML.getChildByTagName(service_response, GSXML.SERVICE_ELEM), true);
     74        page_response.appendChild(service_description);
     75    }
     76   
     77    if (request_type.indexOf("r") == -1) {
     78        // just a display request, no actual processing to do
     79        return page_response;
     80    }
     81   
     82    // check that we have some service params
     83    HashMap service_params = (HashMap)params.get("s1");
     84    if (service_params == null) { // no query
     85        return page_response;
     86    }
     87
     88    // create the query request
     89    Element mr_query_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
     90    Element mr_query_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_PROCESS, to, lang, uid);
     91    mr_query_message.appendChild(mr_query_request);
     92   
     93    Element query_param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
     94    GSXML.addParametersToList(this.doc, query_param_list, service_params);
     95    mr_query_request.appendChild(query_param_list);
     96   
    6997    // also get the format stuff now if there is some
    7098    Element format_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_FORMAT, to, lang, uid);
    71     mr_info_message.appendChild(format_request);
    72 
    73     // process the messages
    74     Element mr_info_response = (Element) this.mr.process(mr_info_message);
    75    
    76     // the two responses
    77     NodeList responses = mr_info_response.getElementsByTagName(GSXML.RESPONSE_ELEM);
    78     Element service_response = (Element)responses.item(0);
    79     Element format_response = (Element)responses.item(1);
    80    
    81     Element service_description = (Element)this.doc.importNode(GSXML.getChildByTagName(service_response, GSXML.SERVICE_ELEM), true);
    82     page_response.appendChild(service_description);
    83    
    84     if (request_type.equals("d")) {// just a display request
    85         return page_response;
    86     }
    87    
     99    mr_query_message.appendChild(format_request);
     100
     101    // do the query
     102        Element mr_query_response = (Element)this.mr.process(mr_query_message);
     103
     104    // check for errors
     105    if (processErrorElements(mr_query_response, page_response)) {
     106        return page_response;
     107    }
     108   
     109    NodeList responses = mr_query_response.getElementsByTagName(GSXML.RESPONSE_ELEM);
     110    Element query_response = (Element) responses.item(0);
     111    Element format_response = (Element) responses.item(1);
     112   
     113    Element query_result_metadata_list = (Element) GSXML.getChildByTagName(query_response, GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER);
     114    if (query_result_metadata_list == null) {
     115        System.err.println("QueryAction: Warning: No query result metadata.\n");
     116    } else { // add it into the page response
     117        page_response.appendChild(this.doc.importNode(query_result_metadata_list, true));
     118    }
     119   
     120    Element query_term_info_list = (Element) GSXML.getChildByTagName(query_response, GSXML.TERM_ELEM+GSXML.LIST_MODIFIER);
     121    if (query_term_info_list == null) {
     122        System.err.println("QueryAction: Warning: No query term information.\n");
     123    } else { // add it into the page response
     124        page_response.appendChild(this.doc.importNode(query_term_info_list, true));
     125    }
     126   
     127    // check that there are some documents - for now check the list, but later should use a numdocs metadata elem   
     128    Element document_list = (Element)GSXML.getChildByTagName(query_response, GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER);
     129    // documentList not present if no docs found
     130    if (document_list == null) {
     131        return page_response;
     132    }
     133
     134    // now we check to see if there is metadata already - some search services return predefined metadata. if there is some, don't do a metadata request
     135    NodeList doc_metadata = document_list.getElementsByTagName(GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER);
     136    if (doc_metadata.getLength()>0) {
     137        System.err.println("have already found metadata!");
     138        // append the doc list to the result
     139        page_response.appendChild(this.doc.importNode(document_list, true));
     140        return page_response;
     141    }
     142   
     143    // get the metadata elements needed from the format statement if any
    88144    HashSet metadata_names = new HashSet();
    89145    metadata_names.add("Title");
     
    98154        extractMetadataNames(format_elem, metadata_names);
    99155    }
    100 
    101     // do the query
    102     Element mr_query_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
    103     Element mr_query_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_PROCESS, to, lang, uid);
    104     mr_query_message.appendChild(mr_query_request);
    105    
    106     // paramList
    107     HashMap service_params = (HashMap)params.get("s1");
    108     if (service_params == null) { // no query
    109         return page_response;
    110     }
    111     Element query_param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
    112     GSXML.addParametersToList(this.doc, query_param_list, service_params);
    113     ///ystem.out.println("service params are "+this.converter.getString(query_param_list));
    114     mr_query_request.appendChild(query_param_list);
    115 
    116     // do the query
    117         Element mr_query_response = (Element)this.mr.process(mr_query_message);
    118 
    119     //. check for errors
    120     String path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.ERROR_ELEM);
    121     Element error_elem = (Element) GSXML.getNodeByPath(mr_query_response, path);
    122     if (error_elem != null) {
    123         // should we continue?? perhaps have a kind of error - information vs fatal??
    124         System.err.println("found an error elem");
    125         page_response.appendChild(this.doc.importNode(error_elem, true));
    126         return page_response;
    127     }
    128     path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER);
    129     Element query_result_metadata_list = (Element) GSXML.getNodeByPath(mr_query_response, path);
    130     if (query_result_metadata_list == null) {
    131         System.err.println("QueryAction: Warning: No query result metadata.\n");
    132     } else { // add it into the page response
    133         page_response.appendChild(this.doc.importNode(query_result_metadata_list, true));
    134     }
    135    
    136     path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.TERM_ELEM+GSXML.LIST_MODIFIER);
    137     Element query_term_info_list = (Element) GSXML.getNodeByPath(mr_query_response, path);
    138     if (query_term_info_list == null) {
    139         System.err.println("QueryAction: Warning: No query term information.\n");
    140     } else { // add it into the page response
    141         page_response.appendChild(this.doc.importNode(query_term_info_list, true));
    142     }
    143 
    144     // check that there are some documents - for now check the list, but later should use a numdocs metadata elem
    145     path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER);
    146    
    147     Element document_list = (Element)GSXML.getNodeByPath(mr_query_response,
    148                                  path);
    149     // documentList not present if no docs found
    150     if (document_list == null) {
    151         return page_response;
    152     }
    153156   
    154157    // paging of the results is done here - we filter the list to remove unwanted entries before retrieving metadata
    155     Element filtered_doc_list = filterDocList(params, service_description, document_list);
    156    
    157     // now we check to see if there is metadata already - some search services return predefined metadata. if there is some, don't do a metadata request
    158     NodeList doc_metadata = document_list.getElementsByTagName(GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER);
    159     if (doc_metadata.getLength()>0) {
    160         System.err.println("have already found metadata!");
    161         // append the doc list to the result
    162         page_response.appendChild(this.doc.importNode(document_list, true));
    163         return page_response;
    164     }
     158    Element filtered_doc_list = filterDocList(params, service_params, document_list);
     159   
    165160    // do the metadata request on the filtered list
    166161    Element mr_metadata_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
     
    176171    mr_metadata_request.appendChild(dm_param_list);
    177172   
    178    
    179173    // add in the doc node list too
    180174    mr_metadata_request.appendChild(filtered_doc_list);
    181175
    182176    Element mr_metadata_response = (Element) this.mr.process(mr_metadata_message); 
    183    
    184     path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER);
    185     Element query_result_document_list = (Element) GSXML.getNodeByPath(mr_metadata_response, path);
    186 
     177    // check for errors
     178    processErrorElements(mr_metadata_response, page_response);
     179   
     180    Element metadata_response = (Element) GSXML.getChildByTagName(mr_metadata_response, GSXML.RESPONSE_ELEM);
     181
     182    Element query_result_document_list = (Element) GSXML.getChildByTagName(metadata_response, GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER);
     183   
    187184    if (query_result_document_list != null) {
    188185        page_response.appendChild(this.doc.importNode(query_result_document_list, true));
    189186    }
    190 
     187   
    191188    ///ystem.out.println("Query page:\n" + this.converter.getPrettyString(page_response));
    192189    return page_response;
     
    194191
    195192    /** this filters out some of the doc results for result paging */
    196     protected Element filterDocList(HashMap params, Element service_description, Element orig_doc_list) {
    197    
    198     // check in the service descripiton to see if hitsPerpage is a param
    199     Element service_p_list = (Element)GSXML.getChildByTagName(service_description, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
    200     Element hits_param = GSXML.getNamedElement(service_p_list, GSXML.PARAM_ELEM, GSXML.NAME_ATT, "hitsPerPage");
    201    
    202     boolean service_paging = false;
    203     if (hits_param != null) {
    204         service_paging = true;
    205     }
    206     if (service_paging) {
    207         // the service is doing the paging, so we want to display all of teh returned docs
     193    protected Element filterDocList(HashMap params, HashMap service_params, Element orig_doc_list) {
     194   
     195    // check the hits_per_page param - is it a service param??
     196    String hits_pp = (String) service_params.get("hitsPerPage");
     197    if (hits_pp != null) {
     198        // the service is doing the paging, so we want to display all of the returned docs
    208199        return (Element)this.doc.importNode(orig_doc_list, true);
    209200    }
    210201   
    211     String hits_pp = (String)params.get("hitsPerPage");
     202    hits_pp = (String)params.get("hitsPerPage");
    212203    int hits = 20;
    213204    if (hits_pp != null && !hits_pp.equals("")) {
Note: See TracChangeset for help on using the changeset viewer.