strcpy(type, "xml");
return 0;
}
- else if (!strcmp(syntax, "TXML"))
- {
- strcpy(type, "txml");
- return 0;
- }
else if (!strcmp(syntax, "USmarc") || !strcmp(syntax, "MARC21"))
{
strcpy(type, "xml; charset=marc8-s");
client_set_connection(cl, 0);
}
-// Extract terms from query into null-terminated termlist
-static void extract_terms(NMEM nmem, struct ccl_rpn_node *query, char **termlist)
-{
- int num = 0;
-
- pull_terms(nmem, query, termlist, &num);
- termlist[num] = 0;
-}
// Initialize CCL map for a target
static CCL_bibset prepare_cclmap(struct client *cl)
int i = 0;
const char *name;
const char *value;
+ NMEM nmem_tmp = nmem_create();
for (i = 0; (name = facet_limits_get(facet_limits, i, &value)); i++)
{
struct setting *s = 0;
const char *p = strchr(s->name + 3, ':');
if (p && !strcmp(p + 1, name) && s->value)
{
+ char **values = 0;
+ int i, num = 0;
+ nmem_strsplit_escape2(nmem_tmp, "|", value, &values,
+ &num, 1, '\\', 1);
+
if (!strncmp(s->value, "rpn:", 4))
{
const char *pqf = s->value + 4;
+
wrbuf_puts(w_pqf, "@and ");
wrbuf_puts(w_pqf, pqf);
wrbuf_puts(w_pqf, " ");
- yaz_encode_pqf_term(w_pqf, value, strlen(value));
+ for (i = 0; i < num; i++)
+ {
+ if (i < num - 1)
+ wrbuf_puts(w_pqf, "@or ");
+ yaz_encode_pqf_term(w_pqf, values[i],
+ strlen(values[i]));
+ }
}
else if (!strncmp(s->value, "ccl:", 4))
{
const char *ccl = s->value + 4;
- wrbuf_puts(w_ccl, " and ");
- wrbuf_puts(w_ccl, ccl);
- wrbuf_puts(w_ccl, "=\"");
- wrbuf_puts(w_ccl, value);
- wrbuf_puts(w_ccl, "\"");
+
+ wrbuf_puts(w_ccl, " and (");
+
+ for (i = 0; i < num; i++)
+ {
+ if (i)
+ wrbuf_puts(w_ccl, " or ");
+ wrbuf_puts(w_ccl, ccl);
+ wrbuf_puts(w_ccl, "=\"");
+ wrbuf_puts(w_ccl, values[i]);
+ wrbuf_puts(w_ccl, "\"");
+ }
+ wrbuf_puts(w_ccl, ")");
+
}
break;
}
}
+ nmem_reset(nmem_tmp);
if (!s)
{
- yaz_log(YLOG_WARN, "limit %s used, but no limitmap defined",
- name);
+ yaz_log(YLOG_WARN, "Target %s: limit %s used, but no limitmap defined",
+ (sdb->database ? sdb->database->url : "<no url>"), name);
}
}
+ nmem_destroy(nmem_tmp);
}
// Parse the query given the settings specific to this client
if (!se->relevance)
{
// Initialize relevance structure with query terms
- char *p[512];
- extract_terms(se->nmem, cn, p);
- se->relevance = relevance_create(
- se->service->charsets,
- se->nmem, (const char **) p);
+ se->relevance = relevance_create_ccl(
+ se->service->charsets, se->nmem, cn);
}
ccl_rpn_delete(cn);