New feature: databases. Implemented as prefix to words in dictionary.
[idzebra-moved-to-github.git] / index / kcompare.c
1 /*
2  * Copyright (C) 1994-1995, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: kcompare.c,v $
7  * Revision 1.12  1995-10-17 18:02:08  adam
8  * New feature: databases. Implemented as prefix to words in dictionary.
9  *
10  * Revision 1.11  1995/10/06  16:33:37  adam
11  * Use attribute mappings.
12  *
13  * Revision 1.10  1995/09/29  14:01:41  adam
14  * Bug fixes.
15  *
16  * Revision 1.9  1995/09/28  12:10:32  adam
17  * Bug fixes. Field prefix used in queries.
18  *
19  * Revision 1.8  1995/09/28  09:19:42  adam
20  * xfree/xmalloc used everywhere.
21  * Extract/retrieve method seems to work for text records.
22  *
23  * Revision 1.7  1995/09/27  12:22:28  adam
24  * More work on extract in record control.
25  * Field name is not in isam keys but in prefix in dictionary words.
26  *
27  * Revision 1.6  1995/09/14  07:48:23  adam
28  * Record control management.
29  *
30  * Revision 1.5  1995/09/11  13:09:34  adam
31  * More work on relevance feedback.
32  *
33  * Revision 1.4  1995/09/08  14:52:27  adam
34  * Minor changes. Dictionary is lower case now.
35  *
36  * Revision 1.3  1995/09/07  13:58:36  adam
37  * New parameter: result-set file descriptor (RSFD) to support multiple
38  * positions within the same result-set.
39  * Boolean operators: and, or, not implemented.
40  * Result-set references.
41  *
42  * Revision 1.2  1995/09/06  16:11:17  adam
43  * Option: only one word key per file.
44  *
45  * Revision 1.1  1995/09/04  09:10:36  adam
46  * More work on index add/del/update.
47  * Merge sort implemented.
48  * Initial work on z39 server.
49  *
50  */
51
52 #include <stdlib.h>
53 #include <string.h>
54 #include <stdio.h>
55 #include <ctype.h>
56 #include <assert.h>
57
58 #include "index.h"
59
60 void key_logdump (int logmask, const void *p)
61 {
62     struct it_key key;
63
64     memcpy (&key, p, sizeof(key));
65     logf (logmask, "%7d s=%-4d", key.sysno, key.seqno);
66 }
67
68 int key_compare (const void *p1, const void *p2)
69 {
70     const struct it_key *i1 = p1, *i2 = p2;
71     if (i1->sysno != i2->sysno)
72     {
73         if (i1->sysno > i2->sysno)
74             return 2;
75         else
76             return -2;
77     }
78 #if IT_KEY_HAVE_SEQNO
79     if (i1->seqno != i2->seqno)
80     {
81         if (i1->seqno > i2->seqno)
82             return 1;
83         else
84             return -1;
85     }
86 #else
87     if (i1->freq != i2->freq)
88     {
89         if (i1->freq > i2->freq)
90             return 1;
91         else
92             return -1;
93     }
94 #endif
95     return 0;
96 }
97
98 int key_qsort_compare (const void *p1, const void *p2)
99 {
100     int r;
101     size_t l;
102     char *cp1 = *(char **) p1;
103     char *cp2 = *(char **) p2;
104  
105     if ((r = strcmp (cp1, cp2)))
106         return r;
107     l = strlen(cp1)+1;
108     if ((r = key_compare (cp1+l+1, cp2+l+1)))
109         return r;
110     return cp1[l] - cp2[l];
111 }
112
113 int index_char_cvt (int c)
114 {
115     return tolower (c);
116 }
117
118 int index_word_prefix (char *string, int attset_ordinal,
119                        int local_attribute,
120                        int num_bases,
121                        char **databaseNames)
122 {
123     int i;
124     if (num_bases > 1)
125     {
126         sprintf (string, "%c%04d(", attset_ordinal + '0', local_attribute);
127         strcat (string, databaseNames[i]);
128         for (i = 1; i < num_bases; i++)
129         {
130             strcat (string, "|");
131             strcat (string, databaseNames[i]);
132         }
133         strcat (string, ")@");
134     }
135     else
136         sprintf (string, "%c%04d%s@", attset_ordinal + '0', local_attribute,
137                  *databaseNames);
138     for (i = 0; string[i]; i++)
139         string[i] = index_char_cvt (string[i]);
140     return i;
141 }
142