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