more records constructor work, no yet finished
[pazpar2-moved-to-github.git] / src / test_relevance.c
1 /* $Id: test_relevance.c,v 1.6 2007-04-23 08:48:50 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   list = reclist_create(nmem, numrecs);
74
75   service =  conf_service_create(nmem, 4, 1);
76   conf_service_add_metadata(nmem, service, 0, "title",
77                             Metadata_type_generic, Metadata_merge_unique,
78                             1, 1, 1, 0);
79
80   conf_service_add_metadata(nmem, service, 1, "author",
81                             Metadata_type_generic, Metadata_merge_longest,
82                             1, 1, 1, 0);
83
84   conf_service_add_metadata(nmem, service, 2, "isbn",
85                             Metadata_type_number, Metadata_merge_no,
86                             1, 1, 1, 0);
87
88   conf_service_add_metadata(nmem, service, 3, "year",
89                             Metadata_type_year, Metadata_merge_range,
90                             1, 1, 1, 0);
91
92
93   // testing record things
94   record = record_create(nmem, 4, 1);
95   YAZ_CHECK(record);
96
97   // why on earth do we have a client dangeling from the record ??
98   record->client = client;
99
100   //union data_types data;
101   //data.text = "sometext";
102
103   char * bla = "blabla";
104   union data_types data;
105   data.text = bla;
106
107   
108   union data_types data2;
109   data.number.min = 2;
110   data.number.max = 5;
111
112   struct record_metadata * tmp_md = 0;
113   tmp_md = record_metadata_insert(nmem, &(record->metadata[0]), data);
114   YAZ_CHECK(tmp_md);
115   tmp_md = record_metadata_insert(nmem, &tmp_md, data);
116   YAZ_CHECK(tmp_md);
117
118   YAZ_CHECK(record_add_metadata_field_id(nmem, record, 3, data2));
119   YAZ_CHECK(record_add_metadata_field_id(nmem, record, 3, data2));
120
121   YAZ_CHECK(record_add_metadata(nmem, record, service, "author", data));
122   YAZ_CHECK(record_add_metadata(nmem, record, service, "author", data));
123
124
125   // now we need to put some actual data into the record ... how ??
126   // there is a hell of a lot spagetti code in logic.c ingest_record()
127   // line 694 ff snippet from there:
128   // this code needs to be analyzed and the fundamental stuff extracted
129
130 #if 0 
131   service->metadata[imeta].name;
132   md = &service->metadata[imeta];
133    if (md->sortkey_offset >= 0)
134                         sk = &service->sortkeys[md->sortkey_offset];
135
136  
137   // Find out where we are putting it           if (md->merge == Metadata_merge_no)
138                 wheretoput = &res->metadata[imeta];
139             else
140                 wheretoput = &cluster->metadata[imeta];
141             
142             
143             // Put it there
144             newm = nmem_malloc(se->nmem, sizeof(struct record_metadata));
145             newm->next = 0;
146             if (md->type == Metadata_type_generic)
147             {
148                 char *p, *pe;
149                 for (p = (char *) value; *p && isspace(*p); p++)
150                     ;
151                 for (pe = p + strlen(p) - 1;
152                         pe > p && strchr(" ,/.:([", *pe); pe--)
153                     *pe = '\0';
154                 newm->data.text = nmem_strdup(se->nmem, p);
155
156             }
157             else if (md->type == Metadata_type_year)
158             {
159                 if (extract_years((char *) value, &first, &last) < 0)
160                     continue;
161             }
162             else
163             {
164                 yaz_log(YLOG_WARN, "Unknown type in metadata element %s", type);
165                 continue;
166             }
167             if (md->type == Metadata_type_year && md->merge != Metadata_merge_range)
168             {
169                 yaz_log(YLOG_WARN, "Only range merging supported for years");
170                 continue;
171             }
172             if (md->merge == Metadata_merge_unique)
173             {
174                 struct record_metadata *mnode;
175                 for (mnode = *wheretoput; mnode; mnode = mnode->next)
176                     if (!strcmp((const char *) mnode->data.text, newm->data.text))
177                         break;
178                 if (!mnode)
179                 {
180                     newm->next = *wheretoput;
181                     *wheretoput = newm;
182                 }
183             }
184             else if (md->merge == Metadata_merge_longest)
185             {
186                 if (!*wheretoput ||
187                         strlen(newm->data.text) > strlen((*wheretoput)->data.text))
188                 {
189                     *wheretoput = newm;
190                     if (sk)
191                     {
192                         char *s = nmem_strdup(se->nmem, newm->data.text);
193                         if (!cluster->sortkeys[md->sortkey_offset])
194                             cluster->sortkeys[md->sortkey_offset] = 
195                                 nmem_malloc(se->nmem, sizeof(union data_types));
196                         normalize_mergekey(s,
197                                 (sk->type == Metadata_sortkey_skiparticle));
198                         cluster->sortkeys[md->sortkey_offset]->text = s;
199                     }
200                 }
201             }
202             else if (md->merge == Metadata_merge_all || md->merge == Metadata_merge_no)
203             {
204                 newm->next = *wheretoput;
205                 *wheretoput = newm;
206             }
207             else if (md->merge == Metadata_merge_range)
208             {
209                 assert(md->type == Metadata_type_year);
210                 if (!*wheretoput)
211                 {
212                     *wheretoput = newm;
213                     (*wheretoput)->data.number.min = first;
214                     (*wheretoput)->data.number.max = last;
215                     if (sk)
216                         cluster->sortkeys[md->sortkey_offset] = &newm->data;
217                 }
218                 else
219                 {
220                     if (first < (*wheretoput)->data.number.min)
221                         (*wheretoput)->data.number.min = first;
222                     if (last > (*wheretoput)->data.number.max)
223                         (*wheretoput)->data.number.max = last;
224                 }
225             if (md->rank)
226                 relevance_countwords(se->relevance, cluster, 
227                                      (char *) value, md->rank);
228             if (md->termlist)
229             {
230                 if (md->type == Metadata_type_year)
231                 {
232                     char year[64];
233                     sprintf(year, "%d", last);
234                     add_facet(se, (char *) type, year);
235                     if (first != last)
236                     {
237                         sprintf(year, "%d", first);
238                         add_facet(se, (char *) type, year);
239                     }
240                 }
241                 else
242                     add_facet(se, (char *) type, (char *) value);
243             }
244 #endif
245
246   //mergekey_norm = (xmlChar *) nmem_strdup(se->nmem, (char*) mergekey);
247   //normalize_mergekey((char *) mergekey_norm, 0);
248
249
250 #if 0
251   // insert one record into recordlist/cluster - what's a cluster, exactly??
252   cluster = reclist_insert(list, service, record, (char *)mergekey, &total);
253   relevance_newrec(rel, cluster);
254 #endif
255
256
257
258
259
260
261   //relevance_prepare_read(rel, list);
262
263
264   //relevance_donerecord(rel, cluster);
265   // relevance_countwords(se->rel, cluster, 
266   //                                   (char *) value, service->metadata->rank);
267   //      
268
269
270   nmem_destroy(nmem);
271
272   //YAZ_CHECK(0 == 0);
273   //YAZ_CHECK_EQ(0, 1);
274 }
275
276
277 int main(int argc, char **argv)
278 {
279     YAZ_CHECK_INIT(argc, argv); 
280     YAZ_CHECK_LOG(); 
281
282
283     test_relevance(argc, argv); 
284
285     
286     YAZ_CHECK_TERM;
287 }
288
289
290
291
292 /*
293  * Local variables:
294  * c-basic-offset: 4
295  * indent-tabs-mode: nil
296  * End:
297  * vim: shiftwidth=4 tabstop=8 expandtab
298  */