In conversion from RPN to CQL (function cql_transform_rpn2cql_).. USE
string attributes are used as a fallback if there is no match in the
CQL transform (properties) lookup. Also change behavior so that
unsupported use attribute if there is no match .. Ie if there is a
numeric use attribute in a query and that is not matched anywhere.
}
if (i == e->attr_list.num_attributes)
}
if (i == e->attr_list.num_attributes)
+ return e->pattern + clen;
#include <yaz/z-core.h>
#include <yaz/wrbuf.h>
#include <yaz/z-core.h>
#include <yaz/wrbuf.h>
+static const char *lookup_index_from_string_attr(Z_AttributeList *attributes)
+{
+ int j;
+ for (j = 0; j < attributes->num_attributes; j++)
+ {
+ Z_AttributeElement *ae = attributes->attributes[j];
+ if (*ae->attributeType == 1) /* use attribute */
+ {
+ if (ae->which == Z_AttributeValue_complex)
+ {
+ Z_ComplexAttribute *ca = ae->value.complex;
+ int i;
+ for (i = 0; i < ca->num_list; i++)
+ {
+ Z_StringOrNumeric *son = ca->list[i];
+ if (son->which == Z_StringOrNumeric_string)
+ return son->u.string;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
static int rpn2cql_attr(cql_transform_t ct,
Z_AttributeList *attributes, WRBUF w)
{
const char *relation = cql_lookup_reverse(ct, "relation.", attributes);
const char *index = cql_lookup_reverse(ct, "index.", attributes);
const char *structure = cql_lookup_reverse(ct, "structure.", attributes);
static int rpn2cql_attr(cql_transform_t ct,
Z_AttributeList *attributes, WRBUF w)
{
const char *relation = cql_lookup_reverse(ct, "relation.", attributes);
const char *index = cql_lookup_reverse(ct, "index.", attributes);
const char *structure = cql_lookup_reverse(ct, "structure.", attributes);
- if (index && strcmp(index, "index.cql.serverChoice"))
+
+ /* if transform (properties) do not match, we'll just use a USE
+ string attribute (bug #2978) */
+ if (!index)
+ index = lookup_index_from_string_attr(attributes);
+
+ if (!index)
- wrbuf_puts(w, index+6);
+ cql_transform_set_error(ct,
+ YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, 0);
+ return -1;
+ }
+ /* for serverChoice we omit index+relation+structure */
+ if (strcmp(index, "cql.serverChoice"))
+ {
+ wrbuf_puts(w, index);
if (!strcmp(relation, "exact"))
relation = "==";
else if (!strcmp(relation, "eq"))
if (!strcmp(relation, "exact"))
relation = "==";
else if (!strcmp(relation, "eq"))
if (strcmp(structure, "*"))
{
wrbuf_puts(w, "/");
if (strcmp(structure, "*"))
{
wrbuf_puts(w, "/");