From b3f079a571e404665620e8eb3bb1dd7db1ff6669 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 14 Aug 2012 15:05:25 +0200 Subject: [PATCH] ICU: support @attr 5=2, @attr 5=3 in searches That's left truncation and left+right truncation. --- index/rpnsearch.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/index/rpnsearch.c b/index/rpnsearch.c index 872cf8b..f119eb5 100644 --- a/index/rpnsearch.c +++ b/index/rpnsearch.c @@ -237,7 +237,7 @@ static void add_non_space(const char *start, const char *end, static int term_100_icu(zebra_map_t zm, const char **src, WRBUF term_dict, int space_split, WRBUF display_term, - int right_trunc) + int mode) { int i; const char *res_buf = 0; @@ -251,7 +251,7 @@ static int term_100_icu(zebra_map_t zm, return 0; } wrbuf_write(display_term, display_buf, display_len); - if (right_trunc) + if (mode) { /* ICU sort keys seem to be of the form basechars \x01 accents \x01 length @@ -272,6 +272,8 @@ static int term_100_icu(zebra_map_t zm, } res_len = i; /* reduce res_len */ } + if (mode & 2) + wrbuf_puts(term_dict, ".*"); for (i = 0; i < res_len; i++) { if (strchr(REGEX_CHARS "\\", res_buf[i])) @@ -281,8 +283,11 @@ static int term_100_icu(zebra_map_t zm, wrbuf_putc(term_dict, res_buf[i]); } - if (right_trunc) + if (mode & 1) wrbuf_puts(term_dict, ".*"); + else if (mode) + wrbuf_puts(term_dict, "\x01\x01.*"); + return 1; } @@ -1055,6 +1060,20 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, return ZEBRA_OK; } break; + case 2: + if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 2)) + { + *term_sub = 0; + return ZEBRA_OK; + } + break; + case 3: + if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 3)) + { + *term_sub = 0; + return ZEBRA_OK; + } + break; default: zebra_setError_zint(zh, YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE, -- 1.7.10.4