-/* $Id: xcqlutil.c,v 1.1 2003-10-27 12:21:36 adam Exp $
- Copyright (C) 2002-2003
- Index Data Aps
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) 1995-2011 Index Data
+ * See the file LICENSE for details.
+ */
+/**
+ * \file xcqlutil.c
+ * \brief Implements CQL to XCQL conversion.
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
-This file is part of the YAZ toolkit.
-
-See the file LICENSE.
-*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void (*pr)(const char *buf, void *client_data),
void *client_data, int level)
{
- if (cn)
+ int head = 0;
+ if (cn->u.st.index_uri)
{
pr_n("<prefixes>\n", pr, client_data, level);
- for (; cn; cn = cn->u.mod.next)
+ head = 1;
+
+ pr_n("<prefix>\n", pr, client_data, level+2);
+ pr_n("<identifier>", pr, client_data, level+4);
+ pr_cdata(cn->u.st.index_uri, pr, client_data);
+ pr_n("</identifier>\n", pr, client_data, 0);
+ pr_n("</prefix>\n", pr, client_data, level+2);
+ }
+ if (cn->u.st.relation_uri && cn->u.st.relation)
+ {
+ if (!head)
+ pr_n("<prefixes>\n", pr, client_data, level);
+ pr_n("<prefix>\n", pr, client_data, level+2);
+ pr_n("<name>", pr, client_data, level+4);
+ pr_cdata("rel", pr, client_data);
+ pr_n("</name>\n", pr, client_data, 0);
+ pr_n("<identifier>", pr, client_data, level+4);
+ pr_cdata(cn->u.st.relation_uri, pr, client_data);
+ pr_n("</identifier>\n", pr, client_data, 0);
+ pr_n("</prefix>\n", pr, client_data, level+2);
+ }
+ if (head)
+ pr_n("</prefixes>\n", pr, client_data, level);
+}
+
+static void cql_to_xml_mod(struct cql_node *m,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data, int level)
+{
+ if (m)
+ {
+ pr_n("<modifiers>\n", pr, client_data, level);
+ for (; m; m = m->u.st.modifiers)
{
- pr_n("<prefix>\n", pr, client_data, level+2);
- if (cn->u.mod.name)
+ pr_n("<modifier>\n", pr, client_data, level+2);
+ pr_n("<type>", pr, client_data, level+4);
+ pr_cdata(m->u.st.index, pr, client_data);
+ pr_n("</type>\n", pr, client_data, 0);
+ if (m->u.st.relation)
{
- pr_n("<name>", pr, client_data, level+4);
- pr_cdata(cn->u.mod.name, pr, client_data);
- pr_n("</name>\n", pr, client_data, 0);
+ pr_n("<comparison>", pr, client_data, level+4);
+ pr_cdata(m->u.st.relation, pr, client_data);
+ pr_n("</comparison>\n", pr, client_data, 0);
}
- if (cn->u.mod.value)
+ if (m->u.st.term)
{
- pr_n("<identifier>", pr, client_data, level+4);
- pr_cdata(cn->u.mod.value, pr, client_data);
- pr_n("</identifier>\n", pr, client_data, 0);
+ pr_n("<value>", pr, client_data, level+4);
+ pr_cdata(m->u.st.term, pr, client_data);
+ pr_n("</value>\n", pr, client_data, 0);
}
- pr_n("</prefix>\n", pr, client_data, level+2);
+ pr_n("</modifier>\n", pr, client_data, level+2);
}
- pr_n("</prefixes>\n", pr, client_data, level);
+ pr_n("</modifiers>\n", pr, client_data, level);
}
}
-
+
+static void cql_sort_to_xml(struct cql_node *cn,
+ void (*pr)(const char *buf, void *client_data),
+ void *client_data, int level)
+{
+ if (cn)
+ {
+ pr_n("<sortKeys>\n", pr, client_data, level);
+ for (; cn; cn = cn->u.sort.next)
+ {
+ pr_n("<key>\n", pr, client_data, level+2);
+
+ if (cn->u.sort.index)
+ {
+ pr_n("<index>", pr, client_data, level+4);
+ pr_cdata(cn->u.sort.index, pr, client_data);
+ pr_n("</index>\n", pr, client_data, 0);
+
+ cql_to_xml_mod(cn->u.sort.modifiers,
+ pr, client_data, level+6);
+ }
+ pr_n("</key>\n", pr, client_data, level+2);
+ }
+ pr_n("</sortKeys>\n", pr, client_data, level);
+ }
+}
+
static void cql_to_xml_r(struct cql_node *cn,
void (*pr)(const char *buf, void *client_data),
- void *client_data, int level)
+ void *client_data, int level,
+ struct cql_node *sort_node)
{
if (!cn)
return;
{
case CQL_NODE_ST:
pr_n("<searchClause>\n", pr, client_data, level);
- prefixes(cn->u.st.prefixes, pr, client_data, level+2);
+ prefixes(cn, pr, client_data, level+2);
if (cn->u.st.index)
{
pr_n("<index>", pr, client_data, level+2);
}
if (cn->u.st.relation)
{
- struct cql_node *m = cn->u.st.modifiers;
pr_n("<relation>\n", pr, client_data, level+2);
pr_n("<value>", pr, client_data, level+4);
+ if (cn->u.st.relation_uri)
+ pr_cdata("rel.", pr, client_data);
pr_cdata(cn->u.st.relation, pr, client_data);
pr_n("</value>\n", pr, client_data, 0);
- if (m)
+
+ if (cn->u.st.relation_uri)
{
- pr_n("<modifiers>\n", pr, client_data, level+4);
- for (; m; m = m->u.mod.next)
- {
- pr_n("<modifier><value>", pr, client_data, level+6);
- pr_cdata(m->u.mod.value, pr, client_data);
- pr_n("</value></modifier>\n", pr, client_data, 0);
- }
- pr_n("</modifiers>\n", pr, client_data, level+4);
+ pr_n("<identifier>", pr, client_data, level+4);
+ pr_cdata(cn->u.st.relation_uri, pr, client_data);
+ pr_n("</identifier>\n", pr, client_data, 0);
}
+ cql_to_xml_mod(cn->u.st.modifiers,
+ pr, client_data, level+4);
+
pr_n("</relation>\n", pr, client_data, level+2);
}
if (cn->u.st.term)
pr_cdata(cn->u.st.term, pr, client_data);
pr_n("</term>\n", pr, client_data, 0);
}
+ if (cn->u.st.extra_terms)
+ {
+ struct cql_node *n = cn->u.st.extra_terms;
+ for (; n; n = n->u.st.extra_terms)
+ {
+ pr_n("<term>", pr, client_data, level+2);
+ pr_cdata(n->u.st.term, pr, client_data);
+ pr_n("</term>\n", pr, client_data, 0);
+ }
+ }
+ cql_sort_to_xml(sort_node, pr, client_data, level+2);
pr_n("</searchClause>\n", pr, client_data, level);
break;
case CQL_NODE_BOOL:
pr_n("<triple>\n", pr, client_data, level);
- prefixes(cn->u.st.prefixes, pr, client_data, level+2);
if (cn->u.boolean.value)
{
- struct cql_node *m = cn->u.boolean.modifiers;
pr_n("<boolean>\n", pr, client_data, level+2);
pr_n("<value>", pr, client_data, level+4);
pr_cdata(cn->u.boolean.value, pr, client_data);
pr_n("</value>\n", pr, client_data, 0);
- if (m)
- {
- pr_n("<modifiers>\n", pr, client_data, level+4);
- for (; m; m = m->u.mod.next)
- {
- pr_n("<modifier><type>", pr, client_data, level+6);
- pr_cdata(m->u.mod.name, pr, client_data);
- pr_n("</type>", pr, client_data, 0);
- if (m->u.mod.value)
- {
- pr_n("<value>", pr, client_data, 0);
- pr_cdata(m->u.mod.value, pr, client_data);
- pr_n("</value>", pr, client_data, 0);
- }
- pr_n("</modifier>\n", pr, client_data, 0);
- }
- pr_n("</modifiers>\n", pr, client_data, level+4);
- }
+ cql_to_xml_mod(cn->u.boolean.modifiers,
+ pr, client_data, level+4);
+
pr_n("</boolean>\n", pr, client_data, level+2);
}
if (cn->u.boolean.left)
{
printf ("%*s<leftOperand>\n", level+2, "");
- cql_to_xml_r(cn->u.boolean.left, pr, client_data, level+4);
+ cql_to_xml_r(cn->u.boolean.left, pr, client_data, level+4, 0);
printf ("%*s</leftOperand>\n", level+2, "");
}
if (cn->u.boolean.right)
{
printf ("%*s<rightOperand>\n", level+2, "");
- cql_to_xml_r(cn->u.boolean.right, pr, client_data, level+4);
+ cql_to_xml_r(cn->u.boolean.right, pr, client_data, level+4, 0);
printf ("%*s</rightOperand>\n", level+2, "");
}
+ cql_sort_to_xml(sort_node, pr, client_data, level+2);
pr_n("</triple>\n", pr, client_data, level);
+ break;
+ case CQL_NODE_SORT:
+ cql_to_xml_r(cn->u.sort.search, pr, client_data, level, cn);
}
}
void (*pr)(const char *buf, void *client_data),
void *client_data)
{
- cql_to_xml_r(cn, pr, client_data, 0);
+ cql_to_xml_r(cn, pr, client_data, 0, 0);
}
void cql_to_xml_stdio(struct cql_node *cn, FILE *f)
return info.off;
}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+