X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsolr.c;h=ca35e56639c2ff38b59a849d74fa2627fc5d525b;hb=612ac7d30003582e44d4184c830eee7f1a1a0443;hp=9b9efb60a895dee97aaff62b7de9bef1c61d064b;hpb=1a4d6b95fab9bceec919854df8efe8363df55997;p=yaz-moved-to-github.git diff --git a/src/solr.c b/src/solr.c index 9b9efb6..ca35e56 100644 --- a/src/solr.c +++ b/src/solr.c @@ -264,17 +264,16 @@ static int yaz_solr_decode_scan_result(ODR o, xmlNodePtr ptr, Z_SRW_scanResponse *scr) { xmlNodePtr node; - xmlAttr *attr; char *pos; int i = 0; - + /* find the actual list */ for (node = ptr->children; node; node = node->next) if (node->type == XML_ELEMENT_NODE) { ptr = node; break; } - + scr->num_terms = 0; for (node = ptr->children; node; node = node->next) if (node->type == XML_ELEMENT_NODE && !strcmp((const char *) node->name, "int")) @@ -282,18 +281,18 @@ static int yaz_solr_decode_scan_result(ODR o, xmlNodePtr ptr, if (scr->num_terms) scr->terms = odr_malloc(o, sizeof(*scr->terms) * scr->num_terms); - + for (node = ptr->children; node; node = node->next) { if (node->type == XML_ELEMENT_NODE && !strcmp((const char *) node->name, "int")) { Z_SRW_scanTerm *term = scr->terms + i; - + Odr_int count = 0; const char *val = get_facet_term_count(node, &count); term->numberOfRecords = odr_intdup(o, count); - + /* if val contains a ^ then it is probably term<^>display term so separate them. This is due to * SOLR not being able to encode them into 2 separate attributes. */ @@ -308,11 +307,11 @@ static int yaz_solr_decode_scan_result(ODR o, xmlNodePtr ptr, term->displayTerm = NULL; } term->whereInList = NULL; - + i++; } } - + if (scr->num_terms) return 0; return -1; @@ -330,7 +329,7 @@ int yaz_solr_decode_response(ODR o, Z_HTTP_Response *hres, Z_SRW_PDU **pdup) Z_SRW_PDU *pdu; Z_SRW_searchRetrieveResponse *sr = NULL; Z_SRW_scanResponse *scr = NULL; - + if (!doc) { ret = -1; @@ -453,6 +452,7 @@ int yaz_solr_encode_request(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, char *path; char *q; char *pos; + char *cp; int i = 0; z_HTTP_header_add_basic_auth(encode, &hreq->headers, @@ -461,19 +461,10 @@ int yaz_solr_encode_request(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, { Z_SRW_searchRetrieveRequest *request = srw_pdu->u.request; solr_op = "select"; - switch (srw_pdu->u.request->query_type) - { - case Z_SRW_query_type_pqf: - yaz_add_name_value_str(encode, name, value, &i, - "q", request->query.pqf); - break; - case Z_SRW_query_type_cql: - yaz_add_name_value_str(encode, name, value, &i, - "q", request->query.cql); - break; - default: + if (!srw_pdu->u.request->query) return -1; - } + /* not considering query type here ! */ + yaz_add_name_value_str(encode, name, value, &i, "q", request->query); if (srw_pdu->u.request->startRecord) { Odr_int start = *request->startRecord - 1; @@ -506,32 +497,33 @@ int yaz_solr_encode_request(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, else if (srw_pdu->which == Z_SRW_scan_request) { Z_SRW_scanRequest *request = srw_pdu->u.scan_request; solr_op = "terms"; - switch (srw_pdu->u.scan_request->query_type) + if (!srw_pdu->u.scan_request->scanClause) + return -1; + if (!strcmp(srw_pdu->u.scan_request->queryType, "pqf")) { - case Z_SRW_query_type_pqf: + yaz_add_name_value_str(encode, name, value, &i, + "terms.fl", request->scanClause); + yaz_add_name_value_str(encode, name, value, &i, + "terms.lower", request->scanClause); + } + else if (!strcmp(srw_pdu->u.scan_request->queryType, "cql")) + { + q = request->scanClause; + pos = strchr(q, ':'); + if (pos != NULL) { yaz_add_name_value_str(encode, name, value, &i, - "terms.fl", request->scanClause.pqf); + "terms.lower", odr_strdup(encode, pos + 1)); + *pos = '\0'; yaz_add_name_value_str(encode, name, value, &i, - "terms.lower", request->scanClause.pqf); - break; - case Z_SRW_query_type_cql: - q = request->scanClause.cql; - pos = strchr(q, ':'); - if (pos != NULL) { - yaz_add_name_value_str(encode, name, value, &i, - "terms.lower", odr_strdup(encode, pos + 1)); - *pos = '\0'; - yaz_add_name_value_str(encode, name, value, &i, - "terms.fl", odr_strdup(encode, q)); - *pos = ':'; - } else { - yaz_add_name_value_str(encode, name, value, &i, - "terms.lower", odr_strdup(encode, q)); - } - break; - default: - return -1; + "terms.fl", odr_strdup(encode, q)); + *pos = ':'; + } else { + yaz_add_name_value_str(encode, name, value, &i, + "terms.lower", odr_strdup(encode, q)); + } } + else + return -1; yaz_add_name_value_str(encode, name, value, &i, "terms.sort", "index"); yaz_add_name_value_int(encode, name, value, &i, @@ -561,7 +553,17 @@ int yaz_solr_encode_request(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, odr_malloc(encode, strlen(hreq->path) + strlen(uri_args) + strlen(solr_op) + 4); - sprintf(path, "%s/%s?%s", hreq->path, solr_op, uri_args); + strcpy(path, hreq->path); + cp = strrchr(path, '/'); + if (cp) + { + if (!strcmp(cp, "/select") || !strcmp(cp, "/")) + *cp = '\0'; + } + strcat(path, "/"); + strcat(path, solr_op); + strcat(path, "?"); + strcat(path, uri_args); hreq->path = path; z_HTTP_header_add_content_type(encode, &hreq->headers,