X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=zutil%2Fyaz-ccl.c;h=2740396d5813007e2812efb7d70409043fd6f136;hb=e347736dafbae4bbd1eec56e3577353662aee332;hp=4233744f02ef8113719db50a7d461a0dc5ca053d;hpb=0de9135acc6357f14e32cab39f5aa87949b78967;p=yaz-moved-to-github.git diff --git a/zutil/yaz-ccl.c b/zutil/yaz-ccl.c index 4233744..2740396 100644 --- a/zutil/yaz-ccl.c +++ b/zutil/yaz-ccl.c @@ -1,10 +1,19 @@ /* - * Copyright (c) 1996-1998, Index Data. + * Copyright (c) 1996-1999, Index Data. * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: yaz-ccl.c,v $ - * Revision 1.1 1999-06-08 10:12:43 adam + * Revision 1.4 1999-12-20 15:20:13 adam + * Implemented ccl_pquery to convert from CCL tree to prefix query. + * + * Revision 1.3 1999/11/30 13:47:12 adam + * Improved installation. Moved header files to include/yaz. + * + * Revision 1.2 1999/06/16 12:00:08 adam + * Added proximity. + * + * Revision 1.1 1999/06/08 10:12:43 adam * Moved file to be part of zutil (instead of util). * * Revision 1.13 1998/03/31 15:13:20 adam @@ -33,7 +42,7 @@ #include #include -#include +#include static Z_RPNStructure *ccl_rpn_structure (ODR o, struct ccl_rpn_node *p); @@ -145,6 +154,36 @@ static Z_Complex *ccl_rpn_complex (ODR o, struct ccl_rpn_node *p) zo->which = Z_Operator_and_not; zo->u.and = odr_nullval(); break; + case CCL_RPN_PROX: + zo->which = Z_Operator_prox; + zo->u.prox = (Z_ProximityOperator *) + odr_malloc (o, sizeof(*zo->u.prox)); + zo->u.prox->exclusion = 0; + + zo->u.prox->distance = (int *) + odr_malloc (o, sizeof(*zo->u.prox->distance)); + *zo->u.prox->distance = 2; + + zo->u.prox->ordered = (bool_t *) + odr_malloc (o, sizeof(*zo->u.prox->ordered)); + *zo->u.prox->ordered = 0; + + zo->u.prox->relationType = (int *) + odr_malloc (o, sizeof(*zo->u.prox->relationType)); +#ifdef ASN_COMPILED + *zo->u.prox->relationType = Z_ProximityOperator_Prox_lessThan; + zo->u.prox->which = Z_ProximityOperator_known; + zo->u.prox->u.known = + odr_malloc (o, sizeof(*zo->u.prox->u.known)); + *zo->u.prox->u.known = Z_ProxUnit_word; +#else + *zo->u.prox->relationType = Z_Prox_lessThan; + zo->u.prox->which = Z_ProxCode_known; + zo->u.prox->proximityUnitCode = (int*) + odr_malloc (o, sizeof(*zo->u.prox->proximityUnitCode)); + *zo->u.prox->proximityUnitCode = Z_ProxUnit_word; +#endif + break; default: assert (0); } @@ -196,3 +235,59 @@ Z_AttributesPlusTerm *ccl_scan_query (ODR o, struct ccl_rpn_node *p) return NULL; return ccl_rpn_term (o, p); } + +static void ccl_pquery_complex (WRBUF w, struct ccl_rpn_node *p) +{ + switch (p->kind) + { + case CCL_RPN_AND: + wrbuf_puts (w, "@and "); + break; + case CCL_RPN_OR: + wrbuf_puts(w, "@or "); + break; + case CCL_RPN_NOT: + wrbuf_puts(w, "@not "); + break; + case CCL_RPN_PROX: + wrbuf_puts(w, "@prox 0 2 0 1 known 2 "); + break; + default: + assert(0); + }; + ccl_pquery(w, p->u.p[0]); + ccl_pquery(w, p->u.p[1]); +} + +void ccl_pquery (WRBUF w, struct ccl_rpn_node *p) +{ + struct ccl_rpn_attr *att; + + switch (p->kind) + { + case CCL_RPN_AND: + case CCL_RPN_OR: + case CCL_RPN_NOT: + case CCL_RPN_PROX: + ccl_pquery_complex (w, p); + break; + case CCL_RPN_SET: + wrbuf_puts (w, "@set "); + wrbuf_puts (w, p->u.setname); + wrbuf_puts (w, " "); + break; + case CCL_RPN_TERM: + for (att = p->u.t.attr_list; att; att = att->next) + { + char tmpattr[128]; + sprintf(tmpattr, "@attr %d=%d ", att->type, att->value); + wrbuf_puts (w, tmpattr); + } + wrbuf_puts (w, "{"); + wrbuf_puts (w, p->u.t.term); + wrbuf_puts (w, "} "); + break; + default: + assert (0); + }; +}