+static int generate(ZOOM_query s)
+{
+ if (s->query_string)
+ {
+ Z_External *ext;
+
+ wrbuf_rewind(s->full_query);
+ wrbuf_puts(s->full_query, s->query_string);
+ odr_reset(s->odr_query);
+
+ if (s->sort_spec && s->sort_strategy == SORT_STRATEGY_SRU11)
+ {
+ int r;
+ wrbuf_rewind(s->sru11_sort_spec);
+
+ r = yaz_sort_spec_to_srw_sortkeys(s->sort_spec,
+ s->sru11_sort_spec);
+ if (r)
+ return r;
+ }
+ switch (s->query_type)
+ {
+ case Z_Query_type_1: /* RPN */
+ if (s->sort_spec &&
+ (s->sort_strategy == SORT_STRATEGY_TYPE7 ||
+ s->sort_strategy == SORT_STRATEGY_EMBED))
+ {
+ int r = yaz_sort_spec_to_type7(s->sort_spec, s->full_query);
+ if (r)
+ return r;
+ }
+ s->z_query = (Z_Query *) odr_malloc(s->odr_query,
+ sizeof(*s->z_query));
+ s->z_query->which = Z_Query_type_1;
+ s->z_query->u.type_1 =
+ p_query_rpn(s->odr_query, wrbuf_cstr(s->full_query));
+ if (!s->z_query->u.type_1)
+ {
+ s->z_query = 0;
+ return -1;
+ }
+ break;
+ case Z_Query_type_104: /* CQL */
+ if (s->sort_spec &&
+ (s->sort_strategy == SORT_STRATEGY_CQL ||
+ s->sort_strategy == SORT_STRATEGY_EMBED))
+ {
+ int r = yaz_sort_spec_to_cql(s->sort_spec, s->full_query);
+ if (r)
+ return r;
+ }
+ ext = (Z_External *) odr_malloc(s->odr_query, sizeof(*ext));
+ ext->direct_reference = odr_oiddup(s->odr_query,
+ yaz_oid_userinfo_cql);
+ ext->indirect_reference = 0;
+ ext->descriptor = 0;
+ ext->which = Z_External_CQL;
+ ext->u.cql = odr_strdup(s->odr_query, wrbuf_cstr(s->full_query));
+
+ s->z_query = (Z_Query *) odr_malloc(s->odr_query, sizeof(*s->z_query));
+ s->z_query->which = Z_Query_type_104;
+ s->z_query->u.type_104 = ext;
+
+ break;
+ }
+ }
+ return 0;
+}
+
+const char *ZOOM_query_get_sru11(ZOOM_query s)
+{
+ if (wrbuf_len(s->sru11_sort_spec))
+ return wrbuf_cstr(s->sru11_sort_spec);
+ return 0;
+}
+