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