Still trying to relevance-rank one single record.
[pazpar2-moved-to-github.git] / src / test_relevance.c
1 /* $Id: test_relevance.c,v 1.2 2007-04-17 13:30:24 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 "relevance.h"
47
48
49
50
51
52
53
54
55 void test_relevance(int argc, char **argv)
56 {
57   NMEM  nmem = nmem_create();
58   int numrecs = 10;
59
60   const char * queryterms[] = 
61       {"abe", "fisk", 0};
62   //    {"ål", "økologi", "æble", 0};
63
64   struct record_cluster *cluster = 0;
65   struct conf_service service; 
66   struct reclist *list = 0;
67   struct record *record = 0;
68   const char *mergekey = "amergekey";
69   int total = 0;
70
71   struct relevance *rel = 0;
72
73   rel = relevance_create(nmem, queryterms, numrecs);
74   list = reclist_create(nmem, numrecs);
75
76   // setting up service - sic!
77   // this should have been done by a nice service_create function !!!
78
79   service.num_metadata = 1;
80   service.metadata = 0;
81   service.num_sortkeys = 0;
82   service.sortkeys = 0;
83   if (service.num_metadata)
84       service.metadata 
85           = nmem_malloc(nmem, 
86                         sizeof(struct conf_metadata) * service.num_metadata);
87   else
88       service.metadata = 0;
89   service.metadata->name = nmem_strdup(nmem, "aname");
90   //service.metadata->brief = 1;
91   //service.metadata->termlist = 1;
92   //service.metadata->rank = 1;
93   //service.metadata->type = Metadata_type_generic;
94   //service.metadata->type = Metadata_type_year;
95   //service.metadata->merge = Metadata_merge_no;
96   //service.metadata->merge = Metadata_merge_unique;
97   //service.metadata->merge = Metadata_merge_longest;
98   //service.metadata->merge = Metadata_merge_range;
99   //service.metadata->merge = Metadata_merge_all;
100
101
102   if (service.num_sortkeys)
103       service.sortkeys 
104           = nmem_malloc(nmem, 
105                         sizeof(struct conf_sortkey) * service.num_sortkeys);
106   else
107       service.sortkeys = 0;
108   // service.sortkeys.type = Metadata_sortkey_numeric;
109   // service.sortkeys.type = Metadata_sortkey_skiparticle;
110   // service.sortkeys.name = service.metadata->name;
111   //service.metadata->sortkey_offset = sk_node;
112
113
114
115   // preparing one record
116   // this should have been done by a nice record_create function
117   // why the heck does the record know which client it belongs to ?? 
118
119   record = nmem_malloc(nmem, sizeof(struct record));
120   record->next = 0;
121   // which client should I use for record->client = cl;  ??
122   record->client = 0;
123   // and which sortkeys data_types list should I use ??
124   record->sortkeys = 0;
125   record->metadata 
126       = nmem_malloc(nmem, 
127                     sizeof(struct record_metadata*) * service.num_metadata);
128   memset(record->metadata, 0, 
129          sizeof(struct record_metadata*) * service.num_metadata);
130
131
132   // now we need to put some actual data into the record ... how ??
133   // there is a hell of a lot spagetti code in logic.c ingest_record()
134   // line 694 ff snippet from there:
135   // this code needs to be analyzed and the fundamental stuff extracted
136
137 #if 0 
138   service->metadata[imeta].name;
139   md = &service->metadata[imeta];
140    if (md->sortkey_offset >= 0)
141                         sk = &service->sortkeys[md->sortkey_offset];
142
143  
144   // Find out where we are putting it           if (md->merge == Metadata_merge_no)
145                 wheretoput = &res->metadata[imeta];
146             else
147                 wheretoput = &cluster->metadata[imeta];
148             
149             
150             // Put it there
151             newm = nmem_malloc(se->nmem, sizeof(struct record_metadata));
152             newm->next = 0;
153             if (md->type == Metadata_type_generic)
154             {
155                 char *p, *pe;
156                 for (p = (char *) value; *p && isspace(*p); p++)
157                     ;
158                 for (pe = p + strlen(p) - 1;
159                         pe > p && strchr(" ,/.:([", *pe); pe--)
160                     *pe = '\0';
161                 newm->data.text = nmem_strdup(se->nmem, p);
162
163             }
164             else if (md->type == Metadata_type_year)
165             {
166                 if (extract_years((char *) value, &first, &last) < 0)
167                     continue;
168             }
169             else
170             {
171                 yaz_log(YLOG_WARN, "Unknown type in metadata element %s", type);
172                 continue;
173             }
174             if (md->type == Metadata_type_year && md->merge != Metadata_merge_range)
175             {
176                 yaz_log(YLOG_WARN, "Only range merging supported for years");
177                 continue;
178             }
179             if (md->merge == Metadata_merge_unique)
180             {
181                 struct record_metadata *mnode;
182                 for (mnode = *wheretoput; mnode; mnode = mnode->next)
183                     if (!strcmp((const char *) mnode->data.text, newm->data.text))
184                         break;
185                 if (!mnode)
186                 {
187                     newm->next = *wheretoput;
188                     *wheretoput = newm;
189                 }
190             }
191             else if (md->merge == Metadata_merge_longest)
192             {
193                 if (!*wheretoput ||
194                         strlen(newm->data.text) > strlen((*wheretoput)->data.text))
195                 {
196                     *wheretoput = newm;
197                     if (sk)
198                     {
199                         char *s = nmem_strdup(se->nmem, newm->data.text);
200                         if (!cluster->sortkeys[md->sortkey_offset])
201                             cluster->sortkeys[md->sortkey_offset] = 
202                                 nmem_malloc(se->nmem, sizeof(union data_types));
203                         normalize_mergekey(s,
204                                 (sk->type == Metadata_sortkey_skiparticle));
205                         cluster->sortkeys[md->sortkey_offset]->text = s;
206                     }
207                 }
208             }
209             else if (md->merge == Metadata_merge_all || md->merge == Metadata_merge_no)
210             {
211                 newm->next = *wheretoput;
212                 *wheretoput = newm;
213             }
214             else if (md->merge == Metadata_merge_range)
215             {
216                 assert(md->type == Metadata_type_year);
217                 if (!*wheretoput)
218                 {
219                     *wheretoput = newm;
220                     (*wheretoput)->data.number.min = first;
221                     (*wheretoput)->data.number.max = last;
222                     if (sk)
223                         cluster->sortkeys[md->sortkey_offset] = &newm->data;
224                 }
225                 else
226                 {
227                     if (first < (*wheretoput)->data.number.min)
228                         (*wheretoput)->data.number.min = first;
229                     if (last > (*wheretoput)->data.number.max)
230                         (*wheretoput)->data.number.max = last;
231                 }
232             if (md->rank)
233                 relevance_countwords(se->relevance, cluster, 
234                                      (char *) value, md->rank);
235             if (md->termlist)
236             {
237                 if (md->type == Metadata_type_year)
238                 {
239                     char year[64];
240                     sprintf(year, "%d", last);
241                     add_facet(se, (char *) type, year);
242                     if (first != last)
243                     {
244                         sprintf(year, "%d", first);
245                         add_facet(se, (char *) type, year);
246                     }
247                 }
248                 else
249                     add_facet(se, (char *) type, (char *) value);
250             }
251 #endif
252
253   //mergekey_norm = (xmlChar *) nmem_strdup(se->nmem, (char*) mergekey);
254   //normalize_mergekey((char *) mergekey_norm, 0);
255
256
257   // insert one record into recordlist/cluster - what's a cluster, exactly??
258   cluster = reclist_insert(list, &service, record, (char *)mergekey, &total);
259
260
261   relevance_newrec(rel, cluster);
262
263
264
265
266
267
268
269   //relevance_prepare_read(rel, list);
270
271
272   //relevance_donerecord(rel, cluster);
273   // relevance_countwords(se->rel, cluster, 
274   //                                   (char *) value, service.metadata->rank);
275   //      
276
277
278   nmem_destroy(nmem);
279
280   YAZ_CHECK(0 == 0);
281   YAZ_CHECK_EQ(0, 1);
282
283 }
284
285
286 int main(int argc, char **argv)
287 {
288     YAZ_CHECK_INIT(argc, argv); 
289     YAZ_CHECK_LOG(); 
290
291
292     test_relevance(argc, argv); 
293
294     
295     YAZ_CHECK_TERM;
296 }
297
298
299
300
301 /*
302  * Local variables:
303  * c-basic-offset: 4
304  * indent-tabs-mode: nil
305  * End:
306  * vim: shiftwidth=4 tabstop=8 expandtab
307  */