bdd16fd235a872ac2333c686f06a25d47e233266
[yaz-moved-to-github.git] / srw / srw-xcql.c
1 /* $Id: srw-xcql.c,v 1.1 2003-01-06 08:20:28 adam Exp $
2    Copyright (C) 2002-2003
3    Index Data Aps
4
5 This file is part of the YAZ toolkit.
6
7 See the file LICENSE.
8 */
9
10 #include <yaz/srw-util.h>
11
12 struct cql_node *xcql_to_cqlnode(struct xcql__operandType *p)
13 {
14     struct cql_node *cn = 0;
15     if (p && p->searchClause)
16     {
17         cn = cql_node_mk_sc(p->searchClause->index,
18                             p->searchClause->relation->value,
19                             p->searchClause->term);
20         if (p->searchClause->relation->modifiers)
21         {
22             struct xcql__modifiersType *mods =
23                 p->searchClause->relation->modifiers;
24             struct cql_node **cnp = &cn->u.st.modifiers;
25
26             int i;
27             for (i = 0; i < mods->__sizeModifier; i++)
28             {
29                 *cnp = cql_node_mk_mod(mods->modifier[i]->type,
30                                        mods->modifier[i]->value);
31                 cnp = &(*cnp)->u.mod.next;
32             }
33         }
34         if (p->searchClause->prefixes)
35         {
36             struct xcql__prefixesType *prefixes = p->searchClause->prefixes;
37             struct cql_node **cnp = &cn->u.st.prefixes;
38
39             int i;
40             for (i = 0; i < prefixes->__sizePrefix; i++)
41             {
42                 *cnp = cql_node_mk_mod(prefixes->prefix[i]->name,
43                                        prefixes->prefix[i]->identifier);
44                 cnp = &(*cnp)->u.mod.next;
45             }
46         }
47     }
48     else if (p && p->triple)
49     {
50         cn = cql_node_mk_boolean(p->triple->boolean->value);
51
52         if (p->triple->boolean->modifiers)
53         {
54             struct xcql__modifiersType *mods =
55                 p->triple->boolean->modifiers;
56             struct cql_node **cnp = &cn->u.bool.modifiers;
57
58             int i;
59             for (i = 0; i < mods->__sizeModifier; i++)
60             {
61                 *cnp = cql_node_mk_mod(mods->modifier[i]->type,
62                                        mods->modifier[i]->value);
63                 cnp = &(*cnp)->u.mod.next;
64             }
65         }
66         if (p->triple->prefixes)
67         {
68             struct xcql__prefixesType *prefixes = p->triple->prefixes;
69             struct cql_node **cnp = &cn->u.bool.prefixes;
70
71             int i;
72             for (i = 0; i < prefixes->__sizePrefix; i++)
73             {
74                 *cnp = cql_node_mk_mod(prefixes->prefix[i]->name,
75                                        prefixes->prefix[i]->identifier);
76                 cnp = &(*cnp)->u.mod.next;
77             }
78         }
79         cn->u.bool.left = xcql_to_cqlnode(p->triple->leftOperand);
80         cn->u.bool.right = xcql_to_cqlnode(p->triple->rightOperand);
81     }
82     return cn;
83 }
84