1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) 1995-2011 Index Data
3 * See the file LICENSE for details.
7 * \brief Implements CQL to XCQL conversion.
19 static int cql_to_ccl_r(struct cql_node *cn,
20 void (*pr)(const char *buf, void *client_data),
23 static void pr_term(struct cql_node *cn,
24 void (*pr)(const char *buf, void *client_data),
30 for (cp = cn->u.st.term; *cp; cp++)
34 if (*cp == '\\' && cp[1])
60 if (cn->u.st.extra_terms)
62 cn = cn->u.st.extra_terms;
66 static int node(struct cql_node *cn,
67 void (*pr)(const char *buf, void *client_data),
70 const char *ccl_field = 0;
71 const char *split_op = 0;
72 const char *ccl_rel = 0;
73 const char *rel = cn->u.st.relation;
75 if (cn->u.st.index && strcmp(cn->u.st.index,
77 ccl_field = cn->u.st.index;
81 else if (!strcmp(rel, "<") || !strcmp(rel, "<=")
82 || !strcmp(rel, ">") || !strcmp(rel, ">=")
83 || !strcmp(rel, "<>") || !strcmp(rel, "="))
85 else if (!strcmp(rel, "all"))
90 else if (!strcmp(rel, "any"))
95 else if (!strcmp(rel, "==") || !strcmp(rel, "adj"))
101 /* unsupported relation */
106 if (ccl_field && ccl_rel)
108 pr(ccl_field, client_data);
109 pr(ccl_rel, client_data);
111 pr_term(cn, pr, client_data);
115 const char *cp = cn->u.st.term;
121 if (ccl_field && ccl_rel)
123 pr(ccl_field, client_data);
124 pr(ccl_rel, client_data);
126 while (*cp && *cp != ' ')
141 pr(" ", client_data);
142 pr(split_op, client_data);
143 pr(" ", client_data);
150 static int bool(struct cql_node *cn,
151 void (*pr)(const char *buf, void *client_data),
154 char *value = cn->u.boolean.value;
157 pr("(", client_data);
158 r = cql_to_ccl_r(cn->u.boolean.left, pr, client_data);
162 pr(" ", client_data);
164 if (strcmp(value, "prox"))
165 { /* not proximity. assuming boolean */
166 pr(value, client_data);
170 struct cql_node *n = cn->u.boolean.modifiers;
173 for (; n ; n = n->u.st.modifiers)
174 if (n->which == CQL_NODE_ST)
176 if (!strcmp(n->u.st.index, "unit"))
178 if (!strcmp(n->u.st.term, "word"))
183 else if (!strcmp(n->u.st.index, "distance"))
185 if (!strcmp(n->u.st.relation, "<="))
186 distance = atoi(n->u.st.term);
187 else if (!strcmp(n->u.st.relation, "<"))
188 distance = atoi(n->u.st.term) - 1;
192 else if (!strcmp(n->u.st.index, "unordered"))
196 else if (!strcmp(n->u.st.index, "ordered"))
203 pr(ordered ? "!" : "%", client_data);
207 sprintf(x, "%d", distance);
211 pr(" ", client_data);
213 r = cql_to_ccl_r(cn->u.boolean.right, pr, client_data);
214 pr(")", client_data);
218 static int cql_to_ccl_r(struct cql_node *cn,
219 void (*pr)(const char *buf, void *client_data),
228 return node(cn, pr, client_data);
230 return bool(cn, pr, client_data);
232 return cql_to_ccl_r(cn->u.sort.search, pr, client_data);
237 int cql_to_ccl(struct cql_node *cn,
238 void (*pr)(const char *buf, void *client_data),
241 return cql_to_ccl_r(cn, pr, client_data);
244 void cql_to_ccl_stdio(struct cql_node *cn, FILE *f)
246 cql_to_ccl(cn, cql_fputs, f);
249 int cql_to_ccl_buf(struct cql_node *cn, char *out, int max)
251 struct cql_buf_write_info info;
256 r = cql_to_ccl(cn, cql_buf_write_handler, &info);
258 info.buf[info.off] = '\0';
260 return -2; /* buffer overflow */
267 * c-file-style: "Stroustrup"
268 * indent-tabs-mode: nil
270 * vim: shiftwidth=4 tabstop=8 expandtab