fc85e3845072499da400ab209a33003c9504b3a1
[pazpar2-moved-to-github.git] / relevance.c
1 /*
2  * $Id: relevance.c,v 1.1 2006-11-24 20:29:07 quinn Exp $
3  */
4
5 #include <ctype.h>
6
7 #include "relevance.h"
8 #include "pazpar2.h"
9
10 struct relevance
11 {
12     struct relevance_record *records;
13     int num_records;
14     int *doc_frequency_vec;
15     int vec_len;
16     struct word_trie *wt;
17     NMEM nmem;
18 };
19
20 struct relevance_record
21 {
22     struct record *record;
23     int *term_frequency_vec;
24 };
25
26 // We use this data structure to recognize terms in input records,
27 // and map them to record term vectors for counting.
28 struct word_trie
29 {
30     struct
31     {
32         struct word_trie *child;
33         int termno;
34     } list[26];
35 };
36
37 static struct word_trie *create_word_trie_node(NMEM nmem)
38 {
39     struct word_trie *res = nmem_malloc(nmem, sizeof(struct word_trie));
40     int i;
41     for (i = 0; i < 26; i++)
42     {
43         res->list[i].child = 0;
44         res->list[i].termno = -1;
45     }
46     return res;
47 }
48
49 static void word_trie_addterm(NMEM nmem, struct word_trie *n, const char *term, int num)
50 {
51     while (*term) {
52         int c = tolower(*term);
53         if (c < 'a' || c > 'z')
54             term++;
55         else
56         {
57             c -= 'a';
58             if (!n->list[c].child)
59             {
60                 struct word_trie *new = create_word_trie_node(nmem);
61                 n->list[c].child = new;
62             }
63             if (!*(++term))
64                 n->list[c].termno = num;
65             else
66                 word_trie_addterm(nmem, n->list[c].child, term, num);
67             break;
68         }
69     }
70
71 }
72
73 static struct word_trie *build_word_trie(NMEM nmem, const char **terms)
74 {
75     struct word_trie *res = create_word_trie_node(nmem);
76     const char **p;
77     int i;
78
79     for (i = 1, p = terms; *p; p++, i++)
80         word_trie_addterm(nmem, res, *p, i);
81     return res;
82 }
83
84 struct relevance *relevance_create(NMEM nmem, const char **terms, int numrecs)
85 {
86     struct relevance *res = nmem_malloc(nmem, sizeof(struct relevance));
87     const char **p;
88     int i;
89
90     for (p = terms, i = 0; *p; p++, i++)
91         ;
92     res->vec_len = ++i;
93     res->doc_frequency_vec = nmem_malloc(nmem, res->vec_len * sizeof(int));
94     bzero(res->doc_frequency_vec, res->vec_len * sizeof(int));
95     res->nmem = nmem;
96     res->num_records = 0;
97     res->records = nmem_malloc(nmem, numrecs * sizeof(struct relevance_record *));
98     res->wt = build_word_trie(nmem, terms);
99     return res;
100 }
101
102 struct relevance_record *relevance_newrec(struct relevance *r, struct record *rec)
103 {
104     struct relevance_record *res = nmem_malloc(r->nmem,
105             sizeof(struct relevance_record));
106     res->record = rec;
107     res->term_frequency_vec = nmem_malloc(r->nmem, r->vec_len * sizeof(int));
108     bzero(res->term_frequency_vec, r->vec_len * sizeof(int));
109     return res;
110 }
111
112 void relevance_countwords(struct relevance_record *rec, const char *words, int len)
113 {
114 }
115
116 void relevance_donerecord(struct relevance_record *rec)
117 {
118 }
119
120 // Prepare for a relevance-sorted read of up to num entries
121 void relevance_prepare_read(struct relevance *r, int num)
122 {
123 }
124
125 struct record *relevance_read(struct relevance *r)
126 {
127     return 0;
128 }
129
130 /*
131  * Local variables:
132  * c-basic-offset: 4
133  * indent-tabs-mode: nil
134  * End:
135  * vim: shiftwidth=4 tabstop=8 expandtab
136  */