+ char opt_name[80];
+
+ switch (exp->which)
+ {
+ case Z_QueryExpression_term:
+ if (exp->u.term && exp->u.term->queryTerm)
+ {
+ sprintf(opt_name, "%s.term", name);
+ handle_queryExpressionTerm(opt, opt_name, exp->u.term->queryTerm);
+ }
+ break;
+ case Z_QueryExpression_query:
+ break;
+ }
+}
+
+static void handle_search_result(ZOOM_connection c, ZOOM_resultset resultset,
+ Z_OtherInformation *o)
+{
+ int i;
+ for (i = 0; o && i < o->num_elements; i++)
+ {
+ if (o->list[i]->which == Z_OtherInfo_externallyDefinedInfo)
+ {
+ Z_External *ext = o->list[i]->information.externallyDefinedInfo;
+
+ if (ext->which == Z_External_searchResult1)
+ {
+ int j;
+ Z_SearchInfoReport *sr = ext->u.searchResult1;
+
+ if (sr->num)
+ ZOOM_options_set_int(
+ resultset->options, "searchresult.size", sr->num);
+
+ for (j = 0; j < sr->num; j++)
+ {
+ Z_SearchInfoReport_s *ent =
+ ext->u.searchResult1->elements[j];
+ char pref[80];
+
+ sprintf(pref, "searchresult.%d", j);
+
+ if (ent->subqueryId)
+ {
+ char opt_name[80];
+ sprintf(opt_name, "%s.id", pref);
+ ZOOM_options_set(resultset->options, opt_name,
+ ent->subqueryId);
+ }
+ if (ent->subqueryExpression)
+ {
+ char opt_name[80];
+ sprintf(opt_name, "%s.subquery", pref);
+ handle_queryExpression(resultset->options, opt_name,
+ ent->subqueryExpression);
+ }
+ if (ent->subqueryInterpretation)
+ {
+ char opt_name[80];
+ sprintf(opt_name, "%s.interpretation", pref);
+ handle_queryExpression(resultset->options, opt_name,
+ ent->subqueryInterpretation);
+ }
+ if (ent->subqueryRecommendation)
+ {
+ char opt_name[80];
+ sprintf(opt_name, "%s.recommendation", pref);
+ handle_queryExpression(resultset->options, opt_name,
+ ent->subqueryRecommendation);
+ }
+ if (ent->subqueryCount)
+ {
+ char opt_name[80];
+ sprintf(opt_name, "%s.count", pref);
+ ZOOM_options_set_int(resultset->options, opt_name,
+ *ent->subqueryCount);
+ }
+ }
+ }
+ }
+ }
+}
+
+static char *get_term_cstr(ODR odr, Z_Term *term) {
+
+ switch (term->which) {
+ case Z_Term_general:
+ return odr_strdupn(odr, (const char *) term->u.general->buf, (size_t) term->u.general->len);
+ break;
+ case Z_Term_characterString:
+ return odr_strdup(odr, term->u.characterString);
+ }
+ return 0;
+}
+
+static ZOOM_facet_field get_zoom_facet_field(ODR odr, Z_FacetField *facet) {
+ int term_index;
+ struct yaz_facet_attr attr_values;
+ ZOOM_facet_field facet_field = odr_malloc(odr, sizeof(*facet_field));
+ yaz_facet_attr_init(&attr_values);
+ yaz_facet_attr_get_z_attributes(facet->attributes, &attr_values);
+ facet_field->facet_name = odr_strdup(odr, attr_values.useattr);
+ facet_field->num_terms = facet->num_terms;
+ yaz_log(YLOG_DEBUG, "ZOOM_facet_field %s %d terms %d", attr_values.useattr, attr_values.limit, facet->num_terms);
+ facet_field->facet_terms = odr_malloc(odr, facet_field->num_terms * sizeof(*facet_field->facet_terms));
+ for (term_index = 0 ; term_index < facet->num_terms; term_index++) {
+ Z_FacetTerm *facetTerm = facet->terms[term_index];
+ facet_field->facet_terms[term_index].frequency = *facetTerm->count;
+ facet_field->facet_terms[term_index].term = get_term_cstr(odr, facetTerm->term);
+ yaz_log(YLOG_DEBUG, " term[%d] %s %d",
+ term_index, facet_field->facet_terms[term_index].term, facet_field->facet_terms[term_index].frequency);
+ }
+ return facet_field;
+}
+
+static void handle_facet_result(ZOOM_connection c, ZOOM_resultset r,
+ Z_OtherInformation *o)
+{
+ int i;
+ for (i = 0; o && i < o->num_elements; i++)
+ {
+ if (o->list[i]->which == Z_OtherInfo_externallyDefinedInfo)
+ {
+ Z_External *ext = o->list[i]->information.externallyDefinedInfo;
+ if (ext->which == Z_External_userFacets)
+ {
+ int j;
+ Z_FacetList *fl = ext->u.facetList;
+ r->num_facets = fl->num;
+ yaz_log(YLOG_DEBUG, "Facets found: %d", fl->num);
+ r->facets = odr_malloc(r->odr, r->num_facets * sizeof(*r->facets));
+ r->facets_names = odr_malloc(r->odr, r->num_facets * sizeof(*r->facets_names));
+ for (j = 0; j < fl->num; j++)
+ {
+ r->facets[j] = get_zoom_facet_field(r->odr, fl->elements[j]);
+ if (!r->facets[j])
+ yaz_log(YLOG_DEBUG, "Facet field missing on index %d !", j);
+ r->facets_names[j] = (char *) ZOOM_facet_field_name(r->facets[j]);
+ }
+ }
+ }
+ }