Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/yaz
authorMike Taylor <mike@indexdata.com>
Wed, 24 Aug 2011 14:03:17 +0000 (15:03 +0100)
committerMike Taylor <mike@indexdata.com>
Wed, 24 Aug 2011 14:03:17 +0000 (15:03 +0100)
NEWS
include/yaz/logrpn.h
src/logrpn.c
src/rpn2cql.c
util/.gitignore
util/yaz-url.c

diff --git a/NEWS b/NEWS
index 357b805..b609c92 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,12 @@
+[IN PROGRESS]
+
+Private function prox_unit_name() renamed to yaz_prox_unit_name() and
+made available as a utility function, declared in <yaz/logrpn.h>
+
+rpn2cql_structure() supports proximity nodes (except that the Type-1
+proximity node's "exclusion" binary is ignored, as there is no way to
+express that in CQL).  Fixes bug #4564.
+
 --- 4.2.9 2011/08/18
 
 Fix SEGV that could occur if set command of zoomsh was given without
index a82499c..c0e9333 100644 (file)
@@ -38,6 +38,7 @@
 
 YAZ_BEGIN_CDECL
 
+YAZ_EXPORT char *yaz_prox_unit_name(Z_ProximityOperator *op);
 YAZ_EXPORT void log_rpn_query(Z_RPNQuery *rpn);
 YAZ_EXPORT void log_rpn_query_level(int loglevel, Z_RPNQuery *rpn);
 
index 56dc01a..e6a2257 100644 (file)
@@ -249,7 +249,7 @@ static char *complex_op_name(Z_Operator *op)
     }
 }
 
-static char *prox_unit_name(Z_ProximityOperator *op)
+char *yaz_prox_unit_name(Z_ProximityOperator *op)
 {
     if (op->which!=Z_ProximityOperator_known)
          return "private";
@@ -292,7 +292,7 @@ static void zlog_structure(Z_RPNStructure *zs, int depth,
                      *op->u.prox->distance,
                      *op->u.prox->ordered ? "T" : "F",
                      relToStr(*op->u.prox->relationType),
-                     prox_unit_name(op->u.prox) );
+                     yaz_prox_unit_name(op->u.prox) );
             break;
         default:
             yaz_log(loglevel, "%*.0s unknown complex", depth, "");
index 8dc40f5..d892986 100644 (file)
@@ -18,6 +18,7 @@
 #include <yaz/diagbib1.h>
 #include <yaz/z-core.h>
 #include <yaz/wrbuf.h>
+#include <yaz/logrpn.h> /* For yaz_prox_unit_name() */
 
 static void wrbuf_vputs(const char *buf, void *client_data)
 {
@@ -275,9 +276,40 @@ static int rpn2cql_structure(cql_transform_t ct,
         case  Z_Operator_and_not:
             pr(" not ", client_data);
             break;
-        case  Z_Operator_prox:
-            cql_transform_set_error(ct, YAZ_BIB1_UNSUPP_SEARCH, 0);
-            return -1;
+        case  Z_Operator_prox: {
+            pr(" prox", client_data);
+            Z_ProximityOperator *prox = op->u.prox;
+            /* No way to express Odr_bool *exclusion -- ignore it */
+            if (prox->distance) {
+                char buf[21]; /* Enough for any 64-bit int */
+                char *op2name[6] = { "<", "<=", "=", ">=", ">","<>" };
+                pr("/distance", client_data);
+                if (!prox->relationType ||
+                    *prox->relationType < Z_ProximityOperator_Prox_lessThan ||
+                    *prox->relationType > Z_ProximityOperator_Prox_notEqual) {
+                    cql_transform_set_error(ct, YAZ_BIB1_UNSUPP_SEARCH,
+                        "unrecognised proximity relationType");
+                    return -1;
+                }
+                pr(op2name[*prox->relationType-1], client_data);
+                sprintf(buf, "%ld", (long) *prox->distance);
+                pr(buf, client_data);
+            }
+            if (prox->ordered) {
+                if (*prox->ordered) {
+                    pr("/ordered", client_data);
+                } else {
+                    pr("/unordered", client_data);
+                }
+            }
+            if (prox->which != Z_ProximityOperator_known ||
+                *prox->u.known != Z_ProxUnit_word) {
+                    pr("/unit=", client_data);
+                    pr(yaz_prox_unit_name(prox), client_data);
+            }
+            pr(" ", client_data);
+            break;
+        }
         }
         r = rpn2cql_structure(ct, pr, client_data, q->u.complex->s2, 1, w);
         if (nested)
index 352981d..33605db 100644 (file)
@@ -22,3 +22,4 @@ yaz-illclient
 yaz-icu
 yaz-json-parse
 yaz-record-conv
+yaz-url
index 5f9a9be..a94f809 100644 (file)
@@ -45,7 +45,7 @@ static char *get_file(const char *fname, size_t *len)
     {
         buf = xmalloc(*len);
         fseek(inf, 0L, SEEK_SET);
-        fread(buf, 1, *len, inf);
+        (void) fread(buf, 1, *len, inf);
     }
     fclose(inf);
     return buf;