#include <yaz/wrbuf.h>
#include <yaz/logrpn.h> /* For yaz_prox_unit_name() */
-static const char *lookup_index_from_string_attr(Z_AttributeList *attributes)
+static const char *lookup_index_from_string_attr(Z_AttributeList *attributes,
+ Odr_int *numeric_value)
{
int j;
int server_choice = 1;
return son->u.string;
}
}
+ else if (ae->which == Z_AttributeValue_numeric)
+ {
+ *numeric_value = *ae->value.numeric;
+ }
server_choice = 0; /* not serverChoice because we have use attr */
}
}
const char *index = cql_lookup_reverse(ct, "index.", attributes);
const char *structure = cql_lookup_reverse(ct, "structure.", attributes);
- /* if transform (properties) do not match, we'll just use a USE string attribute (bug #2978) */
+ /* if transform (properties) do not match, we'll fall back
+ to string or report numeric attribute error */
if (!index)
- index = lookup_index_from_string_attr(attributes);
-
- /* Attempt to fix bug #2978: Look for a relation attribute */
+ {
+ Odr_int use_attribute = -1;
+ index = lookup_index_from_string_attr(attributes, &use_attribute);
+ if (!index)
+ {
+ wrbuf_rewind(w);
+ if (use_attribute != -1)
+ wrbuf_printf(w, ODR_INT_PRINTF, use_attribute);
+ return YAZ_BIB1_UNSUPP_USE_ATTRIBUTE;
+ }
+ }
if (!relation)
relation = lookup_relation_index_from_attr(attributes);
- if (!index)
- return YAZ_BIB1_UNSUPP_USE_ATTRIBUTE;
- /* for serverChoice we omit index+relation+structure */
- if (strcmp(index, "cql.serverChoice"))
+ if (!relation)
+ relation = "=";
+ else if (!strcmp(relation, "exact"))
+ relation = "==";
+ else if (!strcmp(relation, "eq"))
+ relation = "=";
+ else if (!strcmp(relation, "le"))
+ relation = "<=";
+ else if (!strcmp(relation, "ge"))
+ relation = ">=";
+
+ if (strcmp(index, "cql.serverChoice") || strcmp(relation, "=")
+ || (structure && strcmp(structure, "*")))
{
wrbuf_puts(w, index);
- if (relation)
- {
- if (!strcmp(relation, "exact"))
- relation = "==";
- else if (!strcmp(relation, "eq"))
- relation = "=";
- else if (!strcmp(relation, "le"))
- relation = "<=";
- else if (!strcmp(relation, "ge"))
- relation = ">=";
- /* Missing mapping of not equal, phonetic, stem and relevance */
- wrbuf_puts(w, relation);
- }
- else
- wrbuf_puts(w, "=");
+ wrbuf_puts(w, " ");
+ wrbuf_puts(w, relation);
+ wrbuf_puts(w, " ");
- if (structure)
+ if (structure && strcmp(structure, "*"))
{
- if (strcmp(structure, "*"))
- {
- wrbuf_puts(w, "/");
- wrbuf_puts(w, structure);
- wrbuf_puts(w, " ");
- }
+ wrbuf_puts(w, "/");
+ wrbuf_puts(w, structure);
+ wrbuf_puts(w, " ");
}
}
return 0;
Z_Operand *q, WRBUF w)
{
if (q->which != Z_Operand_APT)
+ {
+ wrbuf_rewind(w);
return YAZ_BIB1_RESULT_SET_UNSUPP_AS_A_SEARCH_TERM;
+ }
else
{
Z_AttributesPlusTerm *apt = q->u.attributesPlusTerm;
lterm = strlen(sterm);
break;
default:
+ wrbuf_rewind(w);
+ wrbuf_printf(w, "%d", term->which);
return YAZ_BIB1_TERM_TYPE_UNSUPP;
}
}
else
{
+ wrbuf_rewind(w);
+ wrbuf_printf(w, ODR_INT_PRINTF, trunc);
return YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE;
}
pr(wrbuf_cstr(w), client_data);
*prox->relationType < Z_ProximityOperator_Prox_lessThan ||
*prox->relationType > Z_ProximityOperator_Prox_notEqual)
{
+ wrbuf_rewind(w);
return YAZ_BIB1_UNSUPP_SEARCH;
}
pr(op2name[*prox->relationType-1], client_data);
}
}
+int cql_transform_rpn2cql_stream_r(cql_transform_t ct,
+ WRBUF addinfo,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data,
+ Z_RPNQuery *q)
+{
+ /* addinfo (w) is used for both addinfo and house-keeping ! */
+ int r = rpn2cql_structure(ct, pr, client_data, q->RPNStructure, 0, addinfo);
+ if (!r)
+ wrbuf_rewind(addinfo); /* no additional info if no error */
+ return r;
+}
+
+
int cql_transform_rpn2cql_stream(cql_transform_t ct,
void (*pr)(const char *buf, void *client_data),
void *client_data,
Z_RPNQuery *q)
{
- int r;
WRBUF w = wrbuf_alloc();
- r = rpn2cql_structure(ct, pr, client_data, q->RPNStructure, 0, w);
+ int r = cql_transform_rpn2cql_stream_r(ct, w, pr, client_data, q);
if (r)
- cql_transform_set_error(ct, r, 0);
+ cql_transform_set_error(ct, r, wrbuf_len(w) ? wrbuf_cstr(w) : 0);
wrbuf_destroy(w);
return r;
}