Update source headers for 2008. Omit CVS ID keyword subst.
[yaz-moved-to-github.git] / src / cqltransform.c
index 3f54faa..6cd8c10 100644 (file)
@@ -1,11 +1,7 @@
-/* $Id: cqltransform.c,v 1.29 2007-10-31 21:58:07 adam Exp $
-   Copyright (C) 1995-2007, Index Data ApS
-   Index Data Aps
-
-This file is part of the YAZ toolkit.
-
-See the file LICENSE.
-*/
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) 1995-2008 Index Data
+ * See the file LICENSE for details.
+ */
 
 /**
  * \file cqltransform.c
@@ -185,6 +181,18 @@ int cql_pr_attr_uri(cql_transform_t ct, const char *category,
     {
         if (!res)
             res = cql_lookup_property(ct, category, prefix, eval);
+        /* we have some aliases for some relations unfortunately.. */
+        if (!res && !prefix && !strcmp(category, "relation"))
+        {
+            if (!strcmp(val, "=="))
+                res = cql_lookup_property(ct, category, prefix, "exact");
+            if (!strcmp(val, "="))
+                res = cql_lookup_property(ct, category, prefix, "eq");
+            if (!strcmp(val, "<="))
+                res = cql_lookup_property(ct, category, prefix, "le");
+            if (!strcmp(val, ">="))
+                res = cql_lookup_property(ct, category, prefix, "ge");
+        }
         if (!res)
             res = cql_lookup_property(ct, category, prefix, "*");
     }
@@ -493,25 +501,46 @@ void emit_term(cql_transform_t ct,
     for (i = 0; i<length; i++)
     {
         /* pr(int) each character */
-        char buf[3];
-        const char *cp;
+        /* we do not need to deal with \-sequences because the
+           CQL and PQF terms have same \-format, bug #1988 */
+        char buf[2];
 
-        buf[1] = term[i];
-        buf[2] = 0;
-        /* do we have to escape this char? */
-        if (buf[1] == '"')
-        {
-            buf[0] = '\\';
-            cp = buf;
-        }
-        else
-            cp = buf+1;
-        (*pr)(cp, client_data);
+        buf[0] = term[i];
+        buf[1] = '\0';
+        (*pr)(buf, client_data);
     }
     (*pr)("\" ", client_data);
     xfree(z3958_mem);
 }
 
+void emit_terms(cql_transform_t ct,
+                struct cql_node *cn,
+                void (*pr)(const char *buf, void *client_data),
+                void *client_data,
+                const char *op)
+{
+    struct cql_node *ne = cn->u.st.extra_terms;
+    if (ne)
+    {
+        (*pr)("@", client_data);
+        (*pr)(op, client_data);
+        (*pr)(" ", client_data);
+    }
+    emit_term(ct, cn, cn->u.st.term, strlen(cn->u.st.term),
+              pr, client_data);
+    for (; ne; ne = ne->u.st.extra_terms)
+    {
+        if (ne->u.st.extra_terms)
+        {
+            (*pr)("@", client_data);
+            (*pr)(op, client_data);
+            (*pr)(" ", client_data);
+        }            
+        emit_term(ct, cn, ne->u.st.term, strlen(ne->u.st.term),
+                  pr, client_data);
+    }
+}
+
 void emit_wordlist(cql_transform_t ct,
                    struct cql_node *cn,
                    void (*pr)(const char *buf, void *client_data),
@@ -579,18 +608,7 @@ void cql_transform_r(cql_transform_t ct,
             }
         }
         cql_pr_attr(ct, "always", 0, 0, pr, client_data, 0);
-        if (cn->u.st.relation && !cql_strcmp(cn->u.st.relation, "="))
-            cql_pr_attr(ct, "relation", "eq", "scr",
-                        pr, client_data, 19);
-        else if (cn->u.st.relation && !cql_strcmp(cn->u.st.relation, "<="))
-            cql_pr_attr(ct, "relation", "le", "scr",
-                        pr, client_data, 19);
-        else if (cn->u.st.relation && !cql_strcmp(cn->u.st.relation, ">="))
-            cql_pr_attr(ct, "relation", "ge", "scr",
-                        pr, client_data, 19);
-        else
-            cql_pr_attr(ct, "relation", cn->u.st.relation, "eq",
-                        pr, client_data, 19);
+        cql_pr_attr(ct, "relation", cn->u.st.relation, 0, pr, client_data, 19);
         cql_pr_attr(ct, "structure", cn->u.st.relation, 0,
                     pr, client_data, 24);
         if (cn->u.st.relation && !cql_strcmp(cn->u.st.relation, "all"))
@@ -603,8 +621,7 @@ void cql_transform_r(cql_transform_t ct,
         }
         else
         {
-            emit_term(ct, cn, cn->u.st.term, strlen(cn->u.st.term),
-                      pr, client_data);
+            emit_terms(ct, cn, pr, client_data, "and");
         }
         break;
     case CQL_NODE_BOOL: