finalized helper utilities for record class, and added unit tests
[pazpar2-moved-to-github.git] / src / test_relevance.c
1 /* $Id: test_relevance.c,v 1.7 2007-04-23 12:33:00 marc Exp $
2    Copyright (c) 2006-2007, Index Data.
3
4 This file is part of Pazpar2.
5
6 Pazpar2 is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2, or (at your option) any later
9 version.
10
11 Pazpar2 is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Pazpar2; see the file LICENSE.  If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA.
20  */
21
22 #include <stdlib.h>
23 #include <stdio.h>
24 #include <string.h>
25 #include <sys/time.h>
26 #include <unistd.h>
27 #include <sys/socket.h>
28 #include <netdb.h>
29 #include <signal.h>
30 #include <ctype.h>
31 #include <assert.h>
32
33 #if HAVE_CONFIG_H
34 #include "cconfig.h"
35 #endif
36
37 #define USE_TIMING 0
38 #if USE_TIMING
39 #include <yaz/timing.h>
40 #endif
41
42 #include <yaz/test.h>
43
44
45 //#include "pazpar2.h"
46 #include "config.h"
47 #include "relevance.h"
48 #include "record.h"
49 #include "pazpar2.h"
50
51
52 void test_relevance(int argc, char **argv)
53 {
54   NMEM  nmem = nmem_create();
55   int numrecs = 10;
56
57   const char * queryterms[] = 
58       {"abe", "fisk", 0};
59   //    {"ål", "økologi", "æble", 0};
60
61   //struct record_cluster *cluster = 0;
62   struct conf_service *service = 0; 
63   struct reclist *list = 0;
64   struct record *record = 0;
65   //const char *mergekey = "amergekey";
66   //int total = 0;
67
68   struct relevance *rel = 0;
69   struct client *client = 0;
70   
71
72   rel = relevance_create(nmem, queryterms, numrecs);
73   YAZ_CHECK(rel);
74   
75   list = reclist_create(nmem, numrecs);
76   YAZ_CHECK(list);
77
78   service =  conf_service_create(nmem, 4, 3);
79   YAZ_CHECK(service);
80
81   YAZ_CHECK(conf_service_add_metadata(nmem, service, 0, "title",
82                             Metadata_type_generic, Metadata_merge_unique,
83                             1, 1, 1, 0));
84
85   YAZ_CHECK(conf_service_add_metadata(nmem, service, 1, "author",
86                             Metadata_type_generic, Metadata_merge_longest,
87                             1, 1, 1, 0));
88
89   YAZ_CHECK(conf_service_add_metadata(nmem, service, 2, "isbn",
90                             Metadata_type_number, Metadata_merge_no,
91                             1, 1, 1, 0));
92
93   YAZ_CHECK(conf_service_add_metadata(nmem, service, 3, "year",
94                             Metadata_type_year, Metadata_merge_range,
95                             1, 1, 1, 0));
96
97   YAZ_CHECK(conf_service_add_sortkey(nmem, service, 0, "relevance",
98                                      Metadata_sortkey_relevance));
99
100   YAZ_CHECK(conf_service_add_sortkey(nmem, service, 1, "title",
101                                      Metadata_sortkey_string));
102   
103   YAZ_CHECK(conf_service_add_sortkey(nmem, service, 2, "year",
104                                      Metadata_sortkey_numeric));
105   
106
107
108
109   // testing record things
110   record = record_create(nmem, 4, 3);
111   YAZ_CHECK(record);
112
113   // why on earth do we have a client dangeling from the record ??
114   record->client = client;
115
116   char * bla = "blabla";
117   union data_types data_text;
118   data_text.text = bla;
119
120   
121   union data_types data_num;
122   data_num.number.min = 2;
123   data_num.number.max = 5;
124
125   struct record_metadata * tmp_md = 0;
126   tmp_md = record_metadata_insert(nmem, &(record->metadata[0]), data_text);
127   YAZ_CHECK(tmp_md);
128   tmp_md = record_metadata_insert(nmem, &tmp_md, data_text);
129   YAZ_CHECK(tmp_md);
130
131   YAZ_CHECK(record_add_metadata_field_id(nmem, record, 3, data_num));
132   YAZ_CHECK(record_add_metadata_field_id(nmem, record, 3, data_num));
133
134   YAZ_CHECK(record_add_metadata(nmem, record, service, "author", data_text));
135   YAZ_CHECK(record_add_metadata(nmem, record, service, "author", data_text));
136
137
138   YAZ_CHECK(record_assign_sortkey_field_id(nmem, record, 0, data_text));
139   YAZ_CHECK(record_assign_sortkey_field_id(nmem, record, 1, data_text));
140   YAZ_CHECK(record_assign_sortkey_field_id(nmem, record, 2, data_num));
141
142   YAZ_CHECK(record_assign_sortkey(nmem, record, service, "relevance", data_text));
143   YAZ_CHECK(record_assign_sortkey(nmem, record, service, "title", data_text));
144   YAZ_CHECK(record_assign_sortkey(nmem, record, service, "year", data_num));
145
146
147
148
149
150   // now we need to put some actual data into the record ... how ??
151   // there is a hell of a lot spagetti code in logic.c ingest_record()
152   // line 694 ff snippet from there:
153   // this code needs to be analyzed and the fundamental stuff extracted
154
155 #if 0 
156   service->metadata[imeta].name;
157   md = &service->metadata[imeta];
158    if (md->sortkey_offset >= 0)
159                         sk = &service->sortkeys[md->sortkey_offset];
160
161  
162   // Find out where we are putting it           if (md->merge == Metadata_merge_no)
163                 wheretoput = &res->metadata[imeta];
164             else
165                 wheretoput = &cluster->metadata[imeta];
166             
167             
168             // Put it there
169             newm = nmem_malloc(se->nmem, sizeof(struct record_metadata));
170             newm->next = 0;
171             if (md->type == Metadata_type_generic)
172             {
173                 char *p, *pe;
174                 for (p = (char *) value; *p && isspace(*p); p++)
175                     ;
176                 for (pe = p + strlen(p) - 1;
177                         pe > p && strchr(" ,/.:([", *pe); pe--)
178                     *pe = '\0';
179                 newm->data.text = nmem_strdup(se->nmem, p);
180
181             }
182             else if (md->type == Metadata_type_year)
183             {
184                 if (extract_years((char *) value, &first, &last) < 0)
185                     continue;
186             }
187             else
188             {
189                 yaz_log(YLOG_WARN, "Unknown type in metadata element %s", type);
190                 continue;
191             }
192             if (md->type == Metadata_type_year && md->merge != Metadata_merge_range)
193             {
194                 yaz_log(YLOG_WARN, "Only range merging supported for years");
195                 continue;
196             }
197             if (md->merge == Metadata_merge_unique)
198             {
199                 struct record_metadata *mnode;
200                 for (mnode = *wheretoput; mnode; mnode = mnode->next)
201                     if (!strcmp((const char *) mnode->data.text, newm->data.text))
202                         break;
203                 if (!mnode)
204                 {
205                     newm->next = *wheretoput;
206                     *wheretoput = newm;
207                 }
208             }
209             else if (md->merge == Metadata_merge_longest)
210             {
211                 if (!*wheretoput ||
212                         strlen(newm->data.text) > strlen((*wheretoput)->data.text))
213                 {
214                     *wheretoput = newm;
215                     if (sk)
216                     {
217                         char *s = nmem_strdup(se->nmem, newm->data.text);
218                         if (!cluster->sortkeys[md->sortkey_offset])
219                             cluster->sortkeys[md->sortkey_offset] = 
220                                 nmem_malloc(se->nmem, sizeof(union data_types));
221                         normalize_mergekey(s,
222                                 (sk->type == Metadata_sortkey_skiparticle));
223                         cluster->sortkeys[md->sortkey_offset]->text = s;
224                     }
225                 }
226             }
227             else if (md->merge == Metadata_merge_all || md->merge == Metadata_merge_no)
228             {
229                 newm->next = *wheretoput;
230                 *wheretoput = newm;
231             }
232             else if (md->merge == Metadata_merge_range)
233             {
234                 assert(md->type == Metadata_type_year);
235                 if (!*wheretoput)
236                 {
237                     *wheretoput = newm;
238                     (*wheretoput)->data.number.min = first;
239                     (*wheretoput)->data.number.max = last;
240                     if (sk)
241                         cluster->sortkeys[md->sortkey_offset] = &newm->data;
242                 }
243                 else
244                 {
245                     if (first < (*wheretoput)->data.number.min)
246                         (*wheretoput)->data.number.min = first;
247                     if (last > (*wheretoput)->data.number.max)
248                         (*wheretoput)->data.number.max = last;
249                 }
250             if (md->rank)
251                 relevance_countwords(se->relevance, cluster, 
252                                      (char *) value, md->rank);
253             if (md->termlist)
254             {
255                 if (md->type == Metadata_type_year)
256                 {
257                     char year[64];
258                     sprintf(year, "%d", last);
259                     add_facet(se, (char *) type, year);
260                     if (first != last)
261                     {
262                         sprintf(year, "%d", first);
263                         add_facet(se, (char *) type, year);
264                     }
265                 }
266                 else
267                     add_facet(se, (char *) type, (char *) value);
268             }
269 #endif
270
271   //mergekey_norm = (xmlChar *) nmem_strdup(se->nmem, (char*) mergekey);
272   //normalize_mergekey((char *) mergekey_norm, 0);
273
274
275 #if 0
276   // insert one record into recordlist/cluster - what's a cluster, exactly??
277   cluster = reclist_insert(list, service, record, (char *)mergekey, &total);
278   relevance_newrec(rel, cluster);
279 #endif
280
281
282
283
284
285
286   //relevance_prepare_read(rel, list);
287
288
289   //relevance_donerecord(rel, cluster);
290   // relevance_countwords(se->rel, cluster, 
291   //                                   (char *) value, service->metadata->rank);
292   //      
293
294
295   nmem_destroy(nmem);
296
297   //YAZ_CHECK(0 == 0);
298   //YAZ_CHECK_EQ(0, 1);
299 }
300
301
302 int main(int argc, char **argv)
303 {
304     YAZ_CHECK_INIT(argc, argv); 
305     YAZ_CHECK_LOG(); 
306
307
308     test_relevance(argc, argv); 
309
310     
311     YAZ_CHECK_TERM;
312 }
313
314
315
316
317 /*
318  * Local variables:
319  * c-basic-offset: 4
320  * indent-tabs-mode: nil
321  * End:
322  * vim: shiftwidth=4 tabstop=8 expandtab
323  */