removed unnecessary header includes
[pazpar2-moved-to-github.git] / src / test_relevance.c
index b3b0f3e..ec393f3 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: test_relevance.c,v 1.1 2007-04-16 13:58:20 marc Exp $
+/* $Id: test_relevance.c,v 1.9 2007-04-25 07:00:33 marc Exp $
    Copyright (c) 2006-2007, Index Data.
 
 This file is part of Pazpar2.
@@ -19,17 +19,6 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.
  */
 
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <signal.h>
-#include <ctype.h>
-#include <assert.h>
-
 #if HAVE_CONFIG_H
 #include "cconfig.h"
 #endif
@@ -42,54 +31,261 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include <yaz/test.h>
 
 
-//#include "pazpar2.h"
+#include "config.h"
 #include "relevance.h"
+#include "record.h"
+#include "reclists.h"
 
 
+void test_relevance(int argc, char **argv)
+{
+  NMEM         nmem = nmem_create();
+  int numrecs = 10;
 
+  const char * queryterms[] = 
+      {"abe", "fisk", 0};
+  //    {"ål", "økologi", "æble", 0};
 
+  //struct record_cluster *cluster = 0;
+  struct conf_service *service = 0; 
+  struct reclist *list = 0;
+  struct record *record = 0;
+  //const char *mergekey = "amergekey";
+  //int total = 0;
 
+  struct relevance *rel = 0;
+  //struct client *client = 0;
+  
 
+  rel = relevance_create(nmem, queryterms, numrecs);
+  YAZ_CHECK(rel);
+  
+  list = reclist_create(nmem, numrecs);
+  YAZ_CHECK(list);
 
+  service =  conf_service_create(nmem, 4, 3);
+  YAZ_CHECK(service);
 
-void test_relevance(int argc, char **argv)
-{
-  NMEM         nmem = nmem_create();
-  struct conf_service service; 
-  struct record record;
-  struct reclist list;
-  struct record_cluster *cluster = 0;
-  struct relevance *rel = 0;
-  int numrecs = 10;
-  char mergekey[128];
-  //const char * terms[] = 
-  //    {"ål",  "abe", "økologi", "fisk", "æble", "yoghurt"};
-  const char * terms[] = 
-      {"abe", "fisk"};
-  int total = 0;
-  struct record_metadata *metadata = 0;
+  YAZ_CHECK(conf_service_add_metadata(nmem, service, 0, "title",
+                            Metadata_type_generic, Metadata_merge_unique,
+                            1, 1, 1, 0));
+
+  YAZ_CHECK(conf_service_add_metadata(nmem, service, 1, "author",
+                            Metadata_type_generic, Metadata_merge_longest,
+                            1, 1, 1, 0));
+
+  YAZ_CHECK(conf_service_add_metadata(nmem, service, 2, "isbn",
+                            Metadata_type_number, Metadata_merge_no,
+                            1, 1, 1, 0));
+
+  YAZ_CHECK(conf_service_add_metadata(nmem, service, 3, "year",
+                            Metadata_type_year, Metadata_merge_range,
+                            1, 1, 1, 0));
+
+  YAZ_CHECK(conf_service_add_sortkey(nmem, service, 0, "relevance",
+                                     Metadata_sortkey_relevance));
+
+  YAZ_CHECK(conf_service_add_sortkey(nmem, service, 1, "title",
+                                     Metadata_sortkey_string));
+  
+  YAZ_CHECK(conf_service_add_sortkey(nmem, service, 2, "year",
+                                     Metadata_sortkey_numeric));
   
 
-  relevance_create(nmem, terms, numrecs);
 
-  relevance_prepare_read(rel, &list); 
 
-  cluster = reclist_insert(&service, &list, &record, mergekey, &total);
+  // testing record things
+  record = record_create(nmem, 4, 3);
+  YAZ_CHECK(record);
 
-  //relevance_newrec(rel, cluster);
+  // why on earth do we have a client dangeling from the record ??
+  // record->client = client;
 
-  //relevance_donerecord(se->relevance, cluster);
-  //          relevance_countwords(se->relevance, cluster, 
-  //                                   (char *) value, md->rank);
+  char * bla = "blabla";
+  union data_types data_text;
+  data_text.text = bla;
+
+  
+  union data_types data_num;
+  data_num.number.min = 2;
+  data_num.number.max = 5;
+
+  struct record_metadata * tmp_md = 0;
+  tmp_md = record_metadata_insert(nmem, &(record->metadata[0]), data_text);
+  YAZ_CHECK(tmp_md);
+  tmp_md = record_metadata_insert(nmem, &tmp_md, data_text);
+  YAZ_CHECK(tmp_md);
+
+  YAZ_CHECK(record_add_metadata_field_id(nmem, record, 3, data_num));
+  YAZ_CHECK(record_add_metadata_field_id(nmem, record, 3, data_num));
+
+  YAZ_CHECK(record_add_metadata(nmem, record, service, "author", data_text));
+  YAZ_CHECK(record_add_metadata(nmem, record, service, "author", data_text));
+
+
+  YAZ_CHECK(record_assign_sortkey_field_id(nmem, record, 0, data_text));
+  YAZ_CHECK(record_assign_sortkey_field_id(nmem, record, 1, data_text));
+  YAZ_CHECK(record_assign_sortkey_field_id(nmem, record, 2, data_num));
+
+  YAZ_CHECK(record_assign_sortkey(nmem, record, service, "relevance", data_text));
+  YAZ_CHECK(record_assign_sortkey(nmem, record, service, "title", data_text));
+  YAZ_CHECK(record_assign_sortkey(nmem, record, service, "year", data_num));
+
+   
+   
+
+
+
+
+  // now we need to put some actual data into the record ... how ??
+  // there is a hell of a lot spagetti code in logic.c ingest_record()
+  // line 694 ff snippet from there:
+  // this code needs to be analyzed and the fundamental stuff extracted
+
+#if 0 
+  service->metadata[imeta].name;
+  md = &service->metadata[imeta];
+   if (md->sortkey_offset >= 0)
+                        sk = &service->sortkeys[md->sortkey_offset];
+
+  // Find out where we are putting it           if (md->merge == Metadata_merge_no)
+                wheretoput = &res->metadata[imeta];
+            else
+                wheretoput = &cluster->metadata[imeta];
+            
+            
+            // Put it there
+            newm = nmem_malloc(se->nmem, sizeof(struct record_metadata));
+            newm->next = 0;
+            if (md->type == Metadata_type_generic)
+            {
+                char *p, *pe;
+                for (p = (char *) value; *p && isspace(*p); p++)
+                    ;
+                for (pe = p + strlen(p) - 1;
+                        pe > p && strchr(" ,/.:([", *pe); pe--)
+                    *pe = '\0';
+                newm->data.text = nmem_strdup(se->nmem, p);
+
+            }
+            else if (md->type == Metadata_type_year)
+            {
+                if (extract_years((char *) value, &first, &last) < 0)
+                    continue;
+            }
+            else
+            {
+                yaz_log(YLOG_WARN, "Unknown type in metadata element %s", type);
+                continue;
+            }
+            if (md->type == Metadata_type_year && md->merge != Metadata_merge_range)
+            {
+                yaz_log(YLOG_WARN, "Only range merging supported for years");
+                continue;
+            }
+            if (md->merge == Metadata_merge_unique)
+            {
+                struct record_metadata *mnode;
+                for (mnode = *wheretoput; mnode; mnode = mnode->next)
+                    if (!strcmp((const char *) mnode->data.text, newm->data.text))
+                        break;
+                if (!mnode)
+                {
+                    newm->next = *wheretoput;
+                    *wheretoput = newm;
+                }
+            }
+            else if (md->merge == Metadata_merge_longest)
+            {
+                if (!*wheretoput ||
+                        strlen(newm->data.text) > strlen((*wheretoput)->data.text))
+                {
+                    *wheretoput = newm;
+                    if (sk)
+                    {
+                        char *s = nmem_strdup(se->nmem, newm->data.text);
+                        if (!cluster->sortkeys[md->sortkey_offset])
+                            cluster->sortkeys[md->sortkey_offset] = 
+                                nmem_malloc(se->nmem, sizeof(union data_types));
+                        normalize_mergekey(s,
+                                (sk->type == Metadata_sortkey_skiparticle));
+                        cluster->sortkeys[md->sortkey_offset]->text = s;
+                    }
+                }
+            }
+            else if (md->merge == Metadata_merge_all || md->merge == Metadata_merge_no)
+            {
+                newm->next = *wheretoput;
+                *wheretoput = newm;
+            }
+            else if (md->merge == Metadata_merge_range)
+            {
+                assert(md->type == Metadata_type_year);
+                if (!*wheretoput)
+                {
+                    *wheretoput = newm;
+                    (*wheretoput)->data.number.min = first;
+                    (*wheretoput)->data.number.max = last;
+                    if (sk)
+                        cluster->sortkeys[md->sortkey_offset] = &newm->data;
+                }
+                else
+                {
+                    if (first < (*wheretoput)->data.number.min)
+                        (*wheretoput)->data.number.min = first;
+                    if (last > (*wheretoput)->data.number.max)
+                        (*wheretoput)->data.number.max = last;
+                }
+            if (md->rank)
+                relevance_countwords(se->relevance, cluster, 
+                                     (char *) value, md->rank);
+            if (md->termlist)
+            {
+                if (md->type == Metadata_type_year)
+                {
+                    char year[64];
+                    sprintf(year, "%d", last);
+                    add_facet(se, (char *) type, year);
+                    if (first != last)
+                    {
+                        sprintf(year, "%d", first);
+                        add_facet(se, (char *) type, year);
+                    }
+                }
+                else
+                    add_facet(se, (char *) type, (char *) value);
+            }
+#endif
+
+  //mergekey_norm = (xmlChar *) nmem_strdup(se->nmem, (char*) mergekey);
+  //normalize_mergekey((char *) mergekey_norm, 0);
+
+
+#if 0
+  // insert one record into recordlist/cluster - what's a cluster, exactly??
+  cluster = reclist_insert(list, service, record, (char *)mergekey, &total);
+  relevance_newrec(rel, cluster);
+#endif
+
+
+
+
+
+
+  //relevance_prepare_read(rel, list);
+
+
+  //relevance_donerecord(rel, cluster);
+  // relevance_countwords(se->rel, cluster, 
+  //                                   (char *) value, service->metadata->rank);
   //      
 
+
   nmem_destroy(nmem);
 
-  YAZ_CHECK(0 == 0);
+  //YAZ_CHECK(0 == 0);
   //YAZ_CHECK_EQ(0, 1);
-
-  
-
 }