started record constructors. still unfnished, but yet only used in test_relevance.c
[pazpar2-moved-to-github.git] / src / test_relevance.c
1 /* $Id: test_relevance.c,v 1.5 2007-04-20 14:37:17 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   record_add_metadata_fieldno(nmem, record, 0, data);
113   record_add_metadata_fieldno(nmem, record, 0, data2);
114
115   //record_add_metadata_text(nmem, record, 0, bla);
116
117
118   // now we need to put some actual data into the record ... how ??
119   // there is a hell of a lot spagetti code in logic.c ingest_record()
120   // line 694 ff snippet from there:
121   // this code needs to be analyzed and the fundamental stuff extracted
122
123 #if 0 
124   service->metadata[imeta].name;
125   md = &service->metadata[imeta];
126    if (md->sortkey_offset >= 0)
127                         sk = &service->sortkeys[md->sortkey_offset];
128
129  
130   // Find out where we are putting it           if (md->merge == Metadata_merge_no)
131                 wheretoput = &res->metadata[imeta];
132             else
133                 wheretoput = &cluster->metadata[imeta];
134             
135             
136             // Put it there
137             newm = nmem_malloc(se->nmem, sizeof(struct record_metadata));
138             newm->next = 0;
139             if (md->type == Metadata_type_generic)
140             {
141                 char *p, *pe;
142                 for (p = (char *) value; *p && isspace(*p); p++)
143                     ;
144                 for (pe = p + strlen(p) - 1;
145                         pe > p && strchr(" ,/.:([", *pe); pe--)
146                     *pe = '\0';
147                 newm->data.text = nmem_strdup(se->nmem, p);
148
149             }
150             else if (md->type == Metadata_type_year)
151             {
152                 if (extract_years((char *) value, &first, &last) < 0)
153                     continue;
154             }
155             else
156             {
157                 yaz_log(YLOG_WARN, "Unknown type in metadata element %s", type);
158                 continue;
159             }
160             if (md->type == Metadata_type_year && md->merge != Metadata_merge_range)
161             {
162                 yaz_log(YLOG_WARN, "Only range merging supported for years");
163                 continue;
164             }
165             if (md->merge == Metadata_merge_unique)
166             {
167                 struct record_metadata *mnode;
168                 for (mnode = *wheretoput; mnode; mnode = mnode->next)
169                     if (!strcmp((const char *) mnode->data.text, newm->data.text))
170                         break;
171                 if (!mnode)
172                 {
173                     newm->next = *wheretoput;
174                     *wheretoput = newm;
175                 }
176             }
177             else if (md->merge == Metadata_merge_longest)
178             {
179                 if (!*wheretoput ||
180                         strlen(newm->data.text) > strlen((*wheretoput)->data.text))
181                 {
182                     *wheretoput = newm;
183                     if (sk)
184                     {
185                         char *s = nmem_strdup(se->nmem, newm->data.text);
186                         if (!cluster->sortkeys[md->sortkey_offset])
187                             cluster->sortkeys[md->sortkey_offset] = 
188                                 nmem_malloc(se->nmem, sizeof(union data_types));
189                         normalize_mergekey(s,
190                                 (sk->type == Metadata_sortkey_skiparticle));
191                         cluster->sortkeys[md->sortkey_offset]->text = s;
192                     }
193                 }
194             }
195             else if (md->merge == Metadata_merge_all || md->merge == Metadata_merge_no)
196             {
197                 newm->next = *wheretoput;
198                 *wheretoput = newm;
199             }
200             else if (md->merge == Metadata_merge_range)
201             {
202                 assert(md->type == Metadata_type_year);
203                 if (!*wheretoput)
204                 {
205                     *wheretoput = newm;
206                     (*wheretoput)->data.number.min = first;
207                     (*wheretoput)->data.number.max = last;
208                     if (sk)
209                         cluster->sortkeys[md->sortkey_offset] = &newm->data;
210                 }
211                 else
212                 {
213                     if (first < (*wheretoput)->data.number.min)
214                         (*wheretoput)->data.number.min = first;
215                     if (last > (*wheretoput)->data.number.max)
216                         (*wheretoput)->data.number.max = last;
217                 }
218             if (md->rank)
219                 relevance_countwords(se->relevance, cluster, 
220                                      (char *) value, md->rank);
221             if (md->termlist)
222             {
223                 if (md->type == Metadata_type_year)
224                 {
225                     char year[64];
226                     sprintf(year, "%d", last);
227                     add_facet(se, (char *) type, year);
228                     if (first != last)
229                     {
230                         sprintf(year, "%d", first);
231                         add_facet(se, (char *) type, year);
232                     }
233                 }
234                 else
235                     add_facet(se, (char *) type, (char *) value);
236             }
237 #endif
238
239   //mergekey_norm = (xmlChar *) nmem_strdup(se->nmem, (char*) mergekey);
240   //normalize_mergekey((char *) mergekey_norm, 0);
241
242
243 #if 0
244   // insert one record into recordlist/cluster - what's a cluster, exactly??
245   cluster = reclist_insert(list, service, record, (char *)mergekey, &total);
246   relevance_newrec(rel, cluster);
247 #endif
248
249
250
251
252
253
254   //relevance_prepare_read(rel, list);
255
256
257   //relevance_donerecord(rel, cluster);
258   // relevance_countwords(se->rel, cluster, 
259   //                                   (char *) value, service->metadata->rank);
260   //      
261
262
263   nmem_destroy(nmem);
264
265   //YAZ_CHECK(0 == 0);
266   //YAZ_CHECK_EQ(0, 1);
267 }
268
269
270 int main(int argc, char **argv)
271 {
272     YAZ_CHECK_INIT(argc, argv); 
273     YAZ_CHECK_LOG(); 
274
275
276     test_relevance(argc, argv); 
277
278     
279     YAZ_CHECK_TERM;
280 }
281
282
283
284
285 /*
286  * Local variables:
287  * c-basic-offset: 4
288  * indent-tabs-mode: nil
289  * End:
290  * vim: shiftwidth=4 tabstop=8 expandtab
291  */