X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Frpn2solr.c;h=16f9f24e7d4b03c0b02cbcc8b32ab92ebbdfac95;hp=11abe87ade8848da3934f58d09371d29f9679f3f;hb=fd9dee8f998fa0bc00ef967cfbdc732a9655e621;hpb=f1354830c806b65e6ec6dfdc66dba451715608fc diff --git a/src/rpn2solr.c b/src/rpn2solr.c index 11abe87..16f9f24 100644 --- a/src/rpn2solr.c +++ b/src/rpn2solr.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2011 Index Data + * Copyright (C) 1995-2013 Index Data * See the file LICENSE for details. */ /** @@ -48,7 +48,7 @@ static const char *lookup_index_from_string_attr(Z_AttributeList *attributes) } } if (server_choice) - return "solr.serverChoice"; + return "cql.serverChoice"; return 0; } @@ -68,27 +68,27 @@ static const char *lookup_relation_index_from_attr(Z_AttributeList *attributes) 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; @@ -105,7 +105,7 @@ static const char *lookup_relation_index_from_attr(Z_AttributeList *attributes) } static int rpn2solr_attr(solr_transform_t ct, - Z_AttributeList *attributes, WRBUF w) + Z_AttributeList *attributes, WRBUF w, char **close_range) { const char *relation = solr_lookup_reverse(ct, "relation.", attributes); const char *index = solr_lookup_reverse(ct, "index.", attributes); @@ -116,17 +116,16 @@ static int rpn2solr_attr(solr_transform_t ct, 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); + solr_transform_set_error(ct, YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, 0); return -1; } /* for serverChoice we omit index+relation+structure */ - if (strcmp(index, "solr.serverChoice")) + if (strcmp(index, "cql.serverChoice")) { wrbuf_puts(w, index); if (relation) @@ -137,17 +136,14 @@ static int rpn2solr_attr(solr_transform_t ct, else if (!strcmp(relation, "eq")) relation = ":"; else if (!strcmp(relation, "le")) { - /* TODO Not support as such, but could perhaps be transformed into a range - relation = ":[ * to "; - close_range = "]" - */ + /* TODO Not support as such, but could perhaps be transformed into a 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 = "]" - */ + /* TODO Not support as such, but could perhaps be transformed into a range */ + relation = ":["; + *close_range = " TO *]"; } /* Missing mapping of not equal, phonetic, stem and relevance */ wrbuf_puts(w, relation); @@ -164,14 +160,16 @@ static int rpn2solr_attr(solr_transform_t ct, wrbuf_puts(w, " "); } } +// if (close_range) +// wrbuf_puts(w, close_range); } 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]; @@ -179,33 +177,25 @@ static int checkForTruncation(int flag, Z_AttributeList *attributes) { 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 */ } } } - /* No truncation or unsupported */ + /* No truncation given */ return 0; -}; - -static int checkForLeftTruncation(Z_AttributeList *attributes) { - return checkForTruncation(2, attributes); } -static int checkForRightTruncation(Z_AttributeList *attributes) { - return checkForTruncation(1, 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) @@ -219,11 +209,20 @@ static int rpn2solr_simple(solr_transform_t ct, 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); + char *close_range = 0; + ret = rpn2solr_attr(ct, apt->attributes, w, &close_range); - 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; @@ -241,7 +240,7 @@ static int rpn2solr_simple(solr_transform_t ct, solr_transform_set_error(ct, YAZ_BIB1_TERM_TYPE_UNSUPP, 0); } - if (term) + if (sterm) { size_t i; int must_quote = 0; @@ -251,21 +250,37 @@ static int rpn2solr_simple(solr_transform_t ct, must_quote = 1; if (must_quote) wrbuf_puts(w, "\""); - /* Bug 2878: Check and add Truncation */ - if (checkForLeftTruncation(apt->attributes)) - wrbuf_puts(w, "*"); - /* BUG 4415: Escape : (as \:) in string terms */ - for (i = 0 ; i < lterm; i++) { - if (sterm[i] == ':') { - wrbuf_putc(w, '\\'); - } - wrbuf_putc(w, sterm[i]); - } - /* 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, "\""); + if (close_range) + wrbuf_puts(w, close_range); } if (ret == 0) pr(wrbuf_cstr(w), client_data); @@ -275,10 +290,10 @@ static int rpn2solr_simple(solr_transform_t ct, 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); @@ -316,9 +331,9 @@ static int rpn2solr_structure(solr_transform_t ct, } 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(); @@ -330,8 +345,8 @@ int solr_transform_rpn2solr_stream(solr_transform_t ct, 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); }