Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/yaz
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 8 Mar 2011 12:30:55 +0000 (13:30 +0100)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 8 Mar 2011 12:30:55 +0000 (13:30 +0100)
src/solr.c
src/sru-p.h
src/srw.c
src/srwutil.c

index 659d16f..569125b 100644 (file)
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 
-const char *xml_node_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name) {
-
-    struct _xmlAttr *attr;
-    // check if the node name matches
-    if (strcmp((const char*) ptr->name, node_name))
-        return 0;
-    // check if the attribute name and return the value
-    for (attr = ptr->properties; attr; attr = attr->next)
-        if (attr->children && attr->children->type == XML_TEXT_NODE) {
-            if (!strcmp((const char *) attr->name, attribute_name))
-                return (const char *) attr->children->content;
-        }
-    return 0;
-}
-
-
 static int match_xml_node_attribute(xmlNodePtr ptr, const char *node_name, const char *attribute_name, const char *value)
 {
     const char *attribute_value;
     // check if the node name matches
     if (strcmp((const char*) ptr->name, node_name))
         return 0;
-    attribute_value = xml_node_attribute_value_get(ptr, node_name, attribute_name);
-    if (attribute_value && !strcmp(attribute_value, value))
+    if (attribute_name) {
+        attribute_value = yaz_element_attribute_value_get(ptr, node_name, attribute_name);
+        if (attribute_value && !strcmp(attribute_value, value))
+            return 1;
+    }
+    else /* No attribute to check */
         return 1;
     return 0;
 }
@@ -117,38 +105,9 @@ static int  yaz_solr_decode_result(ODR o, xmlNodePtr ptr, Z_SRW_searchRetrieveRe
     return -1;
 }
 
-static Z_AttributeList *yaz_solr_use_atttribute_create(ODR o, const char *name) {
-    Z_AttributeList *attributes= (Z_AttributeList *) odr_malloc(o, sizeof(*attributes));
-    Z_AttributeElement ** elements;
-    attributes->num_attributes = 1;
-    /* TODO check on name instead
-    if (!attributes->num_attributes) {
-        attributes->attributes = (Z_AttributeElement**)odr_nullval();
-        return attributes;
-    }
-    */
-    elements = (Z_AttributeElement**) odr_malloc (o, attributes->num_attributes * sizeof(*elements));
-    elements[0] = (Z_AttributeElement*)odr_malloc(o,sizeof(**elements));
-    elements[0]->attributeType = odr_malloc(o, sizeof(*elements[0]->attributeType));
-   *elements[0]->attributeType = 1;
-    elements[0]->attributeSet = odr_nullval();
-    elements[0]->which = Z_AttributeValue_complex;
-    elements[0]->value.complex = (Z_ComplexAttribute *) odr_malloc(o, sizeof(Z_ComplexAttribute));
-    elements[0]->value.complex->num_list = 1;
-    elements[0]->value.complex->list = (Z_StringOrNumeric **) odr_malloc(o, 1 * sizeof(Z_StringOrNumeric *));
-    elements[0]->value.complex->list[0] = (Z_StringOrNumeric *) odr_malloc(o, sizeof(Z_StringOrNumeric));
-    elements[0]->value.complex->list[0]->which = Z_StringOrNumeric_string;
-    elements[0]->value.complex->list[0]->u.string = (Z_InternationalString *) odr_strdup(o, name);
-    elements[0]->value.complex->semanticAction = 0;
-    elements[0]->value.complex->num_semanticAction = 0;
-    attributes->attributes = elements;
-    return attributes;
-}
-
-
 static const char *get_facet_term_count(xmlNodePtr node, int *freq) {
 
-    const char *term = xml_node_attribute_value_get(node, "int", "name");
+    const char *term = yaz_element_attribute_value_get(node, "int", "name");
     xmlNodePtr child;
     WRBUF wrbuf = wrbuf_alloc();
     if (!term)
@@ -172,13 +131,13 @@ Z_FacetField *yaz_solr_decode_facet_field(ODR o, xmlNodePtr ptr, Z_SRW_searchRet
     int index = 0;
     xmlNodePtr node;
     // USE attribute
-    const char* name = xml_node_attribute_value_get(ptr, "lst", "name");
+    const char* name = yaz_element_attribute_value_get(ptr, "lst", "name");
     char *pos = strstr(name, "_exact");
     /* HACK */
     if (pos) {
         pos[0] = 0;
     }
-    list = yaz_solr_use_atttribute_create(o, name);
+    list = yaz_use_atttribute_create(o, name);
     for (node = ptr->children; node; node = node->next) {
         num_terms++;
     }
index 1458d8e..9cd2597 100644 (file)
@@ -34,6 +34,15 @@ void yaz_add_name_value_str(ODR o, char **name, char **value,  int *i,
 
 void yaz_add_name_value_int(ODR o, char **name, char **value, int *i,
                             char *a_name, Odr_int *val);
+
+Z_AttributeList *yaz_use_atttribute_create(ODR o, const char *name);
+
+#if YAZ_HAVE_XML2
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+const char *yaz_element_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name);
+#endif
+
 /*
  * Local variables:
  * c-basic-offset: 4
index d0f8309..bd3c577 100644 (file)
--- a/src/srw.c
+++ b/src/srw.c
 #include <config.h>
 #endif
 
+#include <stdlib.h>
+
 #include <yaz/srw.h>
+#include <yaz/wrbuf.h>
 #if YAZ_HAVE_XML2
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 #include <assert.h>
 
+#include "sru-p.h"
+
 static void add_XML_n(xmlNodePtr ptr, const char *elem, char *val, int len,
                       xmlNsPtr ns_ptr)
 {
@@ -442,11 +447,91 @@ static int yaz_srw_versions(ODR o, xmlNodePtr pptr,
     return 0;
 }
 
+Z_FacetTerm *yaz_sru_proxy_get_facet_term_count(ODR odr, xmlNodePtr node) {
+
+    int freq;
+    xmlNodePtr child;
+    WRBUF wrbuf = wrbuf_alloc();
+    const char *freq_string = yaz_element_attribute_value_get(node, "facetvalue", "est_representation");
+    Z_Term *term;
+    if (freq_string)
+        freq =  atoi(freq_string);
+    else
+        freq = -1;
+
+    for (child = node->children; child ; child = child->next) {
+        if (child->type == XML_TEXT_NODE)
+        wrbuf_puts(wrbuf, (const char *) child->content);
+    }
+    term = term_create(odr, wrbuf_cstr(wrbuf));
+    yaz_log(YLOG_DEBUG, "sru-proxy facet: %s %d", wrbuf_cstr(wrbuf), freq);
+    wrbuf_destroy(wrbuf);
+    return facet_term_create(odr, term, freq);
+};
+
+static Z_FacetField *yaz_sru_proxy_decode_facet_field(ODR odr, xmlNodePtr ptr) {
+    Z_AttributeList *list;
+    Z_FacetField *facet_field;
+    int num_terms = 0;
+    int index = 0;
+    xmlNodePtr node;
+    // USE attribute
+    const char* name = yaz_element_attribute_value_get(ptr, "facet", "code");
+    yaz_log(YLOG_DEBUG, "sru-proxy facet type: %s", name);
+
+    list = yaz_use_atttribute_create(odr, name);
+    for (node = ptr->children; node; node = node->next) {
+        if (match_element(node, "facetvalue"))
+            num_terms++;
+    }
+    facet_field = facet_field_create(odr, list, num_terms);
+    index = 0;
+    for (node = ptr->children; node; node = node->next) {
+        if (match_element(node, "facetvalue")) {
+            facet_field_term_set(odr, facet_field, yaz_sru_proxy_get_facet_term_count(odr, node), index);
+        index++;
+        }
+    }
+    return facet_field;
+}
+
+static int yaz_sru_proxy_decode_facets(ODR o, xmlNodePtr root, Z_FacetList **facetList)
+{
+    xmlNodePtr ptr;
+
+    for (ptr = root->children; ptr; ptr = ptr->next)
+    {
+        if (match_element(ptr, "facets"))
+        {
+            xmlNodePtr node;
+            Z_FacetList *facet_list;
+            int num_facets = 0;
+            for (node = ptr->children; node; node= node->next)
+            {
+                if (node->type == XML_ELEMENT_NODE)
+                    num_facets++;
+            }
+            facet_list = facet_list_create(o, num_facets);
+            num_facets = 0;
+            for (node = ptr->children; node; node= node->next)
+            {
+                if (match_element(node, "facet")) {
+                    facet_list_field_set(o, facet_list, yaz_sru_proxy_decode_facet_field(o, node), num_facets);
+                    num_facets++;
+                }
+            }
+            *facetList = facet_list;
+            break;
+        }
+    }
+    return 0;
+}
+
+
 
 static int yaz_srw_decode_diagnostics(ODR o, xmlNodePtr pptr,
                                       Z_SRW_diagnostic **recs, int *num,
                                       void *client_data, const char *ns)
-    
 {
     int i;
     xmlNodePtr ptr;
@@ -768,6 +853,8 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
                     yaz_srw_diagnostics(o, ptr, &res->diagnostics,
                                         &res->num_diagnostics,
                                         client_data, ns);
+                else if (match_element(ptr, "facet_analysis"))
+                    yaz_sru_proxy_decode_facets(o, ptr, &res->facetList);
             }
         }
         else if (!xmlStrcmp(method->name, BAD_CAST "explainRequest"))
index 7e05318..353286f 100644 (file)
@@ -36,7 +36,51 @@ char *yaz_encode_sru_dbpath_odr(ODR out, const char *db)
     return dst;
 }
 
+Z_AttributeList *yaz_use_atttribute_create(ODR o, const char *name) {
+    Z_AttributeList *attributes= (Z_AttributeList *) odr_malloc(o, sizeof(*attributes));
+    Z_AttributeElement ** elements;
+    attributes->num_attributes = 1;
+    /* TODO check on name instead
+    if (!attributes->num_attributes) {
+        attributes->attributes = (Z_AttributeElement**)odr_nullval();
+        return attributes;
+    }
+    */
+    elements = (Z_AttributeElement**) odr_malloc (o, attributes->num_attributes * sizeof(*elements));
+    elements[0] = (Z_AttributeElement*)odr_malloc(o,sizeof(**elements));
+    elements[0]->attributeType = odr_malloc(o, sizeof(*elements[0]->attributeType));
+   *elements[0]->attributeType = 1;
+    elements[0]->attributeSet = odr_nullval();
+    elements[0]->which = Z_AttributeValue_complex;
+    elements[0]->value.complex = (Z_ComplexAttribute *) odr_malloc(o, sizeof(Z_ComplexAttribute));
+    elements[0]->value.complex->num_list = 1;
+    elements[0]->value.complex->list = (Z_StringOrNumeric **) odr_malloc(o, 1 * sizeof(Z_StringOrNumeric *));
+    elements[0]->value.complex->list[0] = (Z_StringOrNumeric *) odr_malloc(o, sizeof(Z_StringOrNumeric));
+    elements[0]->value.complex->list[0]->which = Z_StringOrNumeric_string;
+    elements[0]->value.complex->list[0]->u.string = (Z_InternationalString *) odr_strdup(o, name);
+    elements[0]->value.complex->semanticAction = 0;
+    elements[0]->value.complex->num_semanticAction = 0;
+    attributes->attributes = elements;
+    return attributes;
+}
+
 #if YAZ_HAVE_XML2
+const char *yaz_element_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name) {
+
+    struct _xmlAttr *attr;
+    // check if the node name matches
+    if (strcmp((const char*) ptr->name, node_name))
+        return 0;
+    // check if the attribute name and return the value
+    for (attr = ptr->properties; attr; attr = attr->next)
+        if (attr->children && attr->children->type == XML_TEXT_NODE) {
+            if (!strcmp((const char *) attr->name, attribute_name))
+                return (const char *) attr->children->content;
+        }
+    return 0;
+}
+
+
 static int yaz_base64decode(const char *in, char *out)
 {
     const char *map = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
@@ -1193,6 +1237,7 @@ int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
         odr_malloc(encode, strlen(hreq->path) + strlen(uri_args) + 4);
 
     sprintf(path, "%s?%s", hreq->path, uri_args);
+    yaz_log(YLOG_DEBUG, "SRU HTTP Get Request %s", path);
     hreq->path = path;
 
     z_HTTP_header_add_content_type(encode, &hreq->headers,