adding additional checks for correct side conditions on next metadata in record
[pazpar2-moved-to-github.git] / src / test_relevance.c
1 /* $Id: test_relevance.c,v 1.8 2007-04-24 13:50:07 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
151
152   // now we need to put some actual data into the record ... how ??
153   // there is a hell of a lot spagetti code in logic.c ingest_record()
154   // line 694 ff snippet from there:
155   // this code needs to be analyzed and the fundamental stuff extracted
156
157 #if 0 
158   service->metadata[imeta].name;
159   md = &service->metadata[imeta];
160    if (md->sortkey_offset >= 0)
161                         sk = &service->sortkeys[md->sortkey_offset];
162
163  
164   // Find out where we are putting it           if (md->merge == Metadata_merge_no)
165                 wheretoput = &res->metadata[imeta];
166             else
167                 wheretoput = &cluster->metadata[imeta];
168             
169             
170             // Put it there
171             newm = nmem_malloc(se->nmem, sizeof(struct record_metadata));
172             newm->next = 0;
173             if (md->type == Metadata_type_generic)
174             {
175                 char *p, *pe;
176                 for (p = (char *) value; *p && isspace(*p); p++)
177                     ;
178                 for (pe = p + strlen(p) - 1;
179                         pe > p && strchr(" ,/.:([", *pe); pe--)
180                     *pe = '\0';
181                 newm->data.text = nmem_strdup(se->nmem, p);
182
183             }
184             else if (md->type == Metadata_type_year)
185             {
186                 if (extract_years((char *) value, &first, &last) < 0)
187                     continue;
188             }
189             else
190             {
191                 yaz_log(YLOG_WARN, "Unknown type in metadata element %s", type);
192                 continue;
193             }
194             if (md->type == Metadata_type_year && md->merge != Metadata_merge_range)
195             {
196                 yaz_log(YLOG_WARN, "Only range merging supported for years");
197                 continue;
198             }
199             if (md->merge == Metadata_merge_unique)
200             {
201                 struct record_metadata *mnode;
202                 for (mnode = *wheretoput; mnode; mnode = mnode->next)
203                     if (!strcmp((const char *) mnode->data.text, newm->data.text))
204                         break;
205                 if (!mnode)
206                 {
207                     newm->next = *wheretoput;
208                     *wheretoput = newm;
209                 }
210             }
211             else if (md->merge == Metadata_merge_longest)
212             {
213                 if (!*wheretoput ||
214                         strlen(newm->data.text) > strlen((*wheretoput)->data.text))
215                 {
216                     *wheretoput = newm;
217                     if (sk)
218                     {
219                         char *s = nmem_strdup(se->nmem, newm->data.text);
220                         if (!cluster->sortkeys[md->sortkey_offset])
221                             cluster->sortkeys[md->sortkey_offset] = 
222                                 nmem_malloc(se->nmem, sizeof(union data_types));
223                         normalize_mergekey(s,
224                                 (sk->type == Metadata_sortkey_skiparticle));
225                         cluster->sortkeys[md->sortkey_offset]->text = s;
226                     }
227                 }
228             }
229             else if (md->merge == Metadata_merge_all || md->merge == Metadata_merge_no)
230             {
231                 newm->next = *wheretoput;
232                 *wheretoput = newm;
233             }
234             else if (md->merge == Metadata_merge_range)
235             {
236                 assert(md->type == Metadata_type_year);
237                 if (!*wheretoput)
238                 {
239                     *wheretoput = newm;
240                     (*wheretoput)->data.number.min = first;
241                     (*wheretoput)->data.number.max = last;
242                     if (sk)
243                         cluster->sortkeys[md->sortkey_offset] = &newm->data;
244                 }
245                 else
246                 {
247                     if (first < (*wheretoput)->data.number.min)
248                         (*wheretoput)->data.number.min = first;
249                     if (last > (*wheretoput)->data.number.max)
250                         (*wheretoput)->data.number.max = last;
251                 }
252             if (md->rank)
253                 relevance_countwords(se->relevance, cluster, 
254                                      (char *) value, md->rank);
255             if (md->termlist)
256             {
257                 if (md->type == Metadata_type_year)
258                 {
259                     char year[64];
260                     sprintf(year, "%d", last);
261                     add_facet(se, (char *) type, year);
262                     if (first != last)
263                     {
264                         sprintf(year, "%d", first);
265                         add_facet(se, (char *) type, year);
266                     }
267                 }
268                 else
269                     add_facet(se, (char *) type, (char *) value);
270             }
271 #endif
272
273   //mergekey_norm = (xmlChar *) nmem_strdup(se->nmem, (char*) mergekey);
274   //normalize_mergekey((char *) mergekey_norm, 0);
275
276
277 #if 0
278   // insert one record into recordlist/cluster - what's a cluster, exactly??
279   cluster = reclist_insert(list, service, record, (char *)mergekey, &total);
280   relevance_newrec(rel, cluster);
281 #endif
282
283
284
285
286
287
288   //relevance_prepare_read(rel, list);
289
290
291   //relevance_donerecord(rel, cluster);
292   // relevance_countwords(se->rel, cluster, 
293   //                                   (char *) value, service->metadata->rank);
294   //      
295
296
297   nmem_destroy(nmem);
298
299   //YAZ_CHECK(0 == 0);
300   //YAZ_CHECK_EQ(0, 1);
301 }
302
303
304 int main(int argc, char **argv)
305 {
306     YAZ_CHECK_INIT(argc, argv); 
307     YAZ_CHECK_LOG(); 
308
309
310     test_relevance(argc, argv); 
311
312     
313     YAZ_CHECK_TERM;
314 }
315
316
317
318
319 /*
320  * Local variables:
321  * c-basic-offset: 4
322  * indent-tabs-mode: nil
323  * End:
324  * vim: shiftwidth=4 tabstop=8 expandtab
325  */