예제 #1
0
파일: rpn2solr.c 프로젝트: mekentosj/yazpp
static int rpn2solr_simple(solr_transform_t ct,
                           void (*pr)(const char *buf, void *client_data),
                           void *client_data,
                           Z_AttributesPlusTerm *apt, WRBUF w,
                           Z_AttributesPlusTerm *apt2)
 {
     int ret = 0;
     Z_Term *term = apt->term;
     Odr_int trunc = get_truncation(apt);
     const char *relation2 = 0;
     const char *relation1 = solr_lookup_reverse(ct, "relation.",
                                                 apt->attributes);
     /* Attempt to fix bug #2978: Look for a relation attribute */
     if (!relation1)
         relation1 = lookup_relation_index_from_attr(apt->attributes);
     if (!relation1)
     {
         return YAZ_BIB1_UNSUPP_RELATION_ATTRIBUTE;
     }
     if (apt2)
     {
         relation2 = solr_lookup_reverse(ct, "relation.",
                                         apt2->attributes);
         if (!relation2)
             relation2 = lookup_relation_index_from_attr(apt2->attributes);
     }
     wrbuf_rewind(w);
     ret = rpn2solr_attr(ct, apt->attributes, w);
     if (ret)
         return ret;
     if ((trunc >= 0 && trunc <= 3) || trunc == 100 || trunc == 104)
             ;
     else
     {
         return YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE;
     }

     if (!relation1)
         ret = emit_term(ct, w, term, trunc);
     else if (relation1[0] == '<' || relation1[0] == 'l')
     {
         wrbuf_puts(w, "[* TO ");
         ret = emit_term(ct, w, term, trunc);
         if (!strcmp(relation1, "le") || !strcmp(relation1, "<="))
             wrbuf_puts(w, "]");
         else
             wrbuf_puts(w, "}");
     }
     else if (relation1[0] == '>' || relation1[0] == 'g')
     {
         if (!strcmp(relation1, ">=") || !strcmp(relation1, "ge"))
             wrbuf_puts(w, "[");
         else
             wrbuf_puts(w, "{");
         ret = emit_term(ct, w, term, trunc);
         wrbuf_puts(w, " TO ");
         if (apt2)
         {
             emit_term(ct, w, apt2->term, 0);
             if (!relation2 || !strcmp(relation2, "<=") ||
                 !strcmp(relation2, "le"))
                 wrbuf_puts(w, "]");
             else
                 wrbuf_puts(w, "}");
         }
         else
             wrbuf_puts(w, "*]");
     }
     else
         ret = emit_term(ct, w, term, trunc);
     if (ret == 0)
         pr(wrbuf_cstr(w), client_data);
     return ret;
 }
예제 #2
0
파일: rpn2solr.c 프로젝트: nla/yaz
static int rpn2solr_simple(solr_transform_t ct,
                           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)
    {
        ret = -1;
        solr_transform_set_error(ct, YAZ_BIB1_RESULT_SET_UNSUPP_AS_A_SEARCH_TERM, 0);
    }
    else
    {
        Z_AttributesPlusTerm *apt = q->u.attributesPlusTerm;
        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);

        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;
            sterm = (const char *) term->u.general->buf;
            break;
        case Z_Term_numeric:
            wrbuf_printf(w, ODR_INT_PRINTF, *term->u.numeric);
            break;
        case Z_Term_characterString:
            sterm = term->u.characterString;
            lterm = strlen(sterm);
            break;
        default:
            ret = -1;
            solr_transform_set_error(ct, YAZ_BIB1_TERM_TYPE_UNSUPP, 0);
        }

        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, "\"");
            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 (ret == 0)
            pr(wrbuf_cstr(w), client_data);
    }
    return ret;
}