/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2011 Index Data
+ * Copyright (C) 1995-2012 Index Data
* See the file LICENSE for details.
*/
/**
switch (*relation)
{
/* Unsure on whether this is the relation attribute constants? */
- case Z_ProximityOperator_Prox_lessThan:
+ case Z_ProximityOperator_Prox_lessThan:
return 0;
- case Z_ProximityOperator_Prox_lessThanOrEqual:
+ case Z_ProximityOperator_Prox_lessThanOrEqual:
return 0;
- case Z_ProximityOperator_Prox_equal:
+ case Z_ProximityOperator_Prox_equal:
return ":";
- case Z_ProximityOperator_Prox_greaterThanOrEqual:
+ case Z_ProximityOperator_Prox_greaterThanOrEqual:
return 0;
- case Z_ProximityOperator_Prox_greaterThan:
+ case Z_ProximityOperator_Prox_greaterThan:
return 0;
- case Z_ProximityOperator_Prox_notEqual:
+ case Z_ProximityOperator_Prox_notEqual:
return 0;
- case 100:
+ case 100:
/* phonetic is not implemented*/
- return 0;
- case 101:
+ return 0;
+ case 101:
/* stem is not not implemented */
- return 0;
- case 102:
+ return 0;
+ case 102:
/* relevance is supported in SOLR, but not implemented yet */
- return 0;
+ return 0;
default:
/* Invalid relation */
return 0;
}
static int rpn2solr_attr(solr_transform_t ct,
- Z_AttributeList *attributes, WRBUF w)
+ Z_AttributeList *attributes, WRBUF w)
{
const char *relation = solr_lookup_reverse(ct, "relation.", attributes);
const char *index = solr_lookup_reverse(ct, "index.", attributes);
index = lookup_index_from_string_attr(attributes);
/* Attempt to fix bug #2978: Look for a relation attribute */
- if (!relation)
+ if (!relation)
relation = lookup_relation_index_from_attr(attributes);
if (!index)
{
solr_transform_set_error(ct,
- YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, 0);
+ YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, 0);
return -1;
}
/* for serverChoice we omit index+relation+structure */
relation = ":";
else if (!strcmp(relation, "le")) {
/* TODO Not support as such, but could perhaps be transformed into a range
- relation = ":[ * to ";
- close_range = "]"
+ relation = ":[ * to ";
+ close_range = "]"
*/
}
else if (!strcmp(relation, "ge")) {
/* TODO Not support as such, but could perhaps be transformed into a range
- relation = "[";
- relation = ":[ * to ";
- close_range = "]"
+ relation = "[";
+ relation = ":[ * to ";
+ close_range = "]"
*/
}
/* Missing mapping of not equal, phonetic, stem and relevance */
return 0;
}
-/* Bug 2878: Currently only support left and right truncation. Specific check for this */
-static int checkForTruncation(int flag, Z_AttributeList *attributes)
+static Odr_int get_truncation(Z_AttributesPlusTerm *apt)
{
int j;
+ Z_AttributeList *attributes = apt->attributes;
for (j = 0; j < attributes->num_attributes; j++)
{
Z_AttributeElement *ae = attributes->attributes[j];
{
if (ae->which == Z_AttributeValue_numeric)
{
- Odr_int truncation = *(ae->value.numeric);
- /* This logic only works for Left, right and both. eg. 1,2,3 */
- if (truncation <= 3)
- return ((int) truncation & flag);
+ return *(ae->value.numeric);
+ }
+ else if (ae->which == Z_AttributeValue_complex) {
+ ;
+ //yaz_log(YLOG_DEBUG, "Z_Attribute_complex");
+ /* Complex: Shouldn't happen */
}
- /* Complex: Shouldn't happen */
}
}
- /* No truncation or unsupported */
+ /* No truncation given */
return 0;
-};
-
-static int checkForLeftTruncation(Z_AttributeList *attributes) {
- return checkForTruncation(1, attributes);
}
-static int checkForRightTruncation(Z_AttributeList *attributes) {
- return checkForTruncation(2, attributes);
-};
+#define SOLR_SPECIAL "+-&|!(){}[]^\"~*?:\\"
static int rpn2solr_simple(solr_transform_t ct,
- void (*pr)(const char *buf, void *client_data),
- void *client_data,
- Z_Operand *q, WRBUF w)
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data,
+ Z_Operand *q, WRBUF w)
{
int ret = 0;
if (q->which != Z_Operand_APT)
Z_Term *term = apt->term;
const char *sterm = 0;
size_t lterm = 0;
+ Odr_int trunc = get_truncation(apt);
wrbuf_rewind(w);
ret = rpn2solr_attr(ct, apt->attributes, w);
- switch(term->which)
+ if (trunc == 0 || trunc == 1 || trunc == 100 || trunc == 104)
+ ;
+ else
+ {
+ solr_transform_set_error(ct, YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE, 0);
+ return -1;
+ }
+ switch (term->which)
{
case Z_Term_general:
lterm = term->u.general->len;
solr_transform_set_error(ct, YAZ_BIB1_TERM_TYPE_UNSUPP, 0);
}
- if (term)
+ if (sterm)
{
size_t i;
int must_quote = 0;
+
for (i = 0 ; i < lterm; i++)
if (sterm[i] == ' ')
must_quote = 1;
if (must_quote)
wrbuf_puts(w, "\"");
- /* Bug 2878: Check and add Truncation */
- if (checkForLeftTruncation(apt->attributes))
- wrbuf_puts(w, "*");
- wrbuf_write(w, sterm, lterm);
- /* Bug 2878: Check and add Truncation */
- if (checkForRightTruncation(apt->attributes))
+ for (i = 0 ; i < lterm; i++)
+ {
+ if (sterm[i] == '\\' && i < lterm - 1)
+ {
+ i++;
+ if (strchr(SOLR_SPECIAL, sterm[i]))
+ wrbuf_putc(w, '\\');
+ wrbuf_putc(w, sterm[i]);
+ }
+ else if (sterm[i] == '?' && trunc == 104)
+ {
+ wrbuf_putc(w, '*');
+ }
+ else if (sterm[i] == '#' && trunc == 104)
+ {
+ wrbuf_putc(w, '?');
+ }
+ else if (strchr(SOLR_SPECIAL, sterm[i]))
+ {
+ wrbuf_putc(w, '\\');
+ wrbuf_putc(w, sterm[i]);
+ }
+ else
+ wrbuf_putc(w, sterm[i]);
+ }
+ if (trunc == 1)
wrbuf_puts(w, "*");
if (must_quote)
wrbuf_puts(w, "\"");
static int rpn2solr_structure(solr_transform_t ct,
- void (*pr)(const char *buf, void *client_data),
- void *client_data,
- Z_RPNStructure *q, int nested,
- WRBUF w)
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data,
+ Z_RPNStructure *q, int nested,
+ WRBUF w)
{
if (q->which == Z_RPNStructure_simple)
return rpn2solr_simple(ct, pr, client_data, q->u.simple, w);
}
int solr_transform_rpn2solr_stream(solr_transform_t ct,
- void (*pr)(const char *buf, void *client_data),
- void *client_data,
- Z_RPNQuery *q)
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data,
+ Z_RPNQuery *q)
{
int r;
WRBUF w = wrbuf_alloc();
int solr_transform_rpn2solr_wrbuf(solr_transform_t ct,
- WRBUF w,
- Z_RPNQuery *q)
+ WRBUF w,
+ Z_RPNQuery *q)
{
return solr_transform_rpn2solr_stream(ct, wrbuf_vputs, w, q);
}