+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 attrvalues attr_values;
+ ZOOM_facet_field facet_field = odr_malloc(odr, sizeof(*facet_field));
+ facetattrs(facet->attributes, &attr_values);
+ facet_field->facet_name = odr_strdup(odr, attr_values.useattr);
+ facet_field->num_terms = 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++) {
+ struct facet_term_p *facet_term = odr_malloc(odr, sizeof(*facet_field));
+ Z_FacetTerm *facetTerm = facet->terms[term_index];
+ facet_term->term = get_term_cstr(odr, facetTerm->term);
+ /* TODO */
+ facet_term->frequency = *facetTerm->count;
+ }
+ return facet_field;
+}
+
+static void handle_facet_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_userFacets)
+ {
+ int j;
+ Z_FacetList *fl = ext->u.facetList;
+ resultset->facets = odr_malloc(resultset->odr, fl->num * sizeof(*resultset->facets));
+ for (j = 0; j < fl->num; j++)
+ {
+ resultset->facets[j] = get_zoom_facet_field(resultset->odr, fl->elements[j]);
+ }
+ }
+ }
+ }
+}
+
+