Added support for static ranking. Bug #174. The staticrank is enabled
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 18 Aug 2005 12:50:17 +0000 (12:50 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 18 Aug 2005 12:50:17 +0000 (12:50 +0000)
by specifying staticrank:1 in .cfg. The xslt1 was removed. Filter xslt
can do it all and support specifying split=1. XSLT filter can specify
staticrank using attribute 'z:rank'. Added tests for staticrank and
record ID match in xslt3.c, xslt4.c.

22 files changed:
include/idzebra/recctrl.h
index/extract.c
index/index.h
index/zebraapi.c
index/zinfo.c
index/zinfo.h
index/zsets.c
recctrl/xslt.c
test/api/testlib.c
test/xslt/Makefile.am
test/xslt/index.xsl
test/xslt/marc-col.xml
test/xslt/marc-one.xml
test/xslt/marcschema-col.xml [new file with mode: 0644]
test/xslt/marcschema-one.xml [new file with mode: 0644]
test/xslt/marcschema.xml [deleted file]
test/xslt/xslt1.c
test/xslt/xslt2.c
test/xslt/xslt3.c
test/xslt/xslt4.c [new file with mode: 0644]
test/xslt/zebra.cfg
test/xslt/zebrastaticrank.cfg [new file with mode: 0644]

index ab1941b..e2183e5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: recctrl.h,v 1.12 2005-06-23 06:45:46 adam Exp $
+/* $Id: recctrl.h,v 1.13 2005-08-18 12:50:17 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -76,6 +76,7 @@ struct recExtractCtrl {
     int       flagShowRecords;
     int       seqno[256];
     char      match_criteria[256];
+    int       staticrank;
     void      (*schemaAdd)(struct recExtractCtrl *p, Odr_oid *oid);
     data1_handle dh;
     void      *handle;
index 25a20fc..5cc475e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: extract.c,v 1.188 2005-08-05 10:40:13 adam Exp $
+/* $Id: extract.c,v 1.189 2005-08-18 12:50:17 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -403,6 +403,7 @@ static int file_extract_record(ZebraHandle zh,
     SYSNO sysnotmp;
     Record rec;
     off_t recordOffset = 0;
+    struct recExtractCtrl extractCtrl;
     
     /* announce database */
     if (zebraExplain_curDatabase (zh->reg->zei, zh->basenames[0]))
@@ -414,8 +415,6 @@ static int file_extract_record(ZebraHandle zh,
 
     if (fi->fd != -1)
     {
-       struct recExtractCtrl extractCtrl;
-
         /* we are going to read from a file, so prepare the extraction */
        create_rec_keys_codec(&zh->reg->keys);
 #if NATTR
@@ -436,6 +435,8 @@ static int file_extract_record(ZebraHandle zh,
        extractCtrl.schemaAdd = extract_schema_add;
        extractCtrl.dh = zh->reg->dh;
        extractCtrl.match_criteria[0] = '\0';
+       extractCtrl.staticrank = 0;
+       
        extractCtrl.first_record = fi->file_offset ? 0 : 1;
 
        extract_set_store_data_prepare(&extractCtrl);
@@ -480,7 +481,7 @@ static int file_extract_record(ZebraHandle zh,
             return 0;
         }
         if (extractCtrl.match_criteria[0])
-            matchStr = extractCtrl.match_criteria;
+            matchStr = extractCtrl.match_criteria;     
     }
 
     /* perform match if sysno not known and if match criteria is specified */
@@ -541,13 +542,15 @@ static int file_extract_record(ZebraHandle zh,
         *sysno = rec->sysno;
 
        recordAttr = rec_init_attr (zh->reg->zei, rec);
+       recordAttr->staticrank = extractCtrl.staticrank;
 
         if (matchStr)
         {
             dict_insert (zh->reg->matchDict, matchStr, sizeof(*sysno), sysno);
         }
        extract_flushSortKeys (zh, *sysno, 1, &zh->reg->sortKeys);
-        extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys);
+        extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys,
+                                recordAttr->staticrank);
 
         zh->records_inserted++;
     }
@@ -578,6 +581,7 @@ static int file_extract_record(ZebraHandle zh,
            logRecord (zh);
            return 1;
        }
+       /* flush old keys for sort&search etc. */
         delkeys.buf_used = rec->size[recInfo_delKeys];
        delkeys.buf = rec->info[recInfo_delKeys];
 
@@ -585,7 +589,8 @@ static int file_extract_record(ZebraHandle zh,
         sortKeys.buf = rec->info[recInfo_sortKeys];
 
        extract_flushSortKeys (zh, *sysno, 0, &sortKeys);
-        extract_flushRecordKeys (zh, *sysno, 0, &delkeys);
+        extract_flushRecordKeys (zh, *sysno, 0, &delkeys,
+                                recordAttr->staticrank); /* old values */  
         if (deleteFlag)
         {
             /* record going to be deleted */
@@ -620,11 +625,14 @@ static int file_extract_record(ZebraHandle zh,
             }
             else
             {
+               /* flush new keys for sort&search etc */
                 if (zh->records_processed < zh->m_file_verbose_limit)
                     yaz_log (YLOG_LOG, "update %s %s " PRINTF_OFF_T,
                         zh->m_record_type, fname, recordOffset);
+               recordAttr->staticrank = extractCtrl.staticrank;
                 extract_flushSortKeys (zh, *sysno, 1, &zh->reg->sortKeys);
-                extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys);
+                extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys,
+                                        recordAttr->staticrank);
                 zh->records_updated++;
             }
         }
@@ -920,6 +928,7 @@ ZEBRA_RES buffer_extract_record (ZebraHandle zh,
     extractCtrl.dh = zh->reg->dh;
     extractCtrl.handle = zh;
     extractCtrl.match_criteria[0] = '\0';
+    extractCtrl.staticrank = 0;
     
     init_extractCtrl(zh, &extractCtrl);
 
@@ -1005,7 +1014,7 @@ ZEBRA_RES buffer_extract_record (ZebraHandle zh,
                          sizeof(*sysno), sysno);
         }
        extract_flushSortKeys (zh, *sysno, 1, &zh->reg->sortKeys);
-        extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys);
+        extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys, 0);
 
         zh->records_inserted++;
     } 
@@ -1054,7 +1063,7 @@ ZEBRA_RES buffer_extract_record (ZebraHandle zh,
         sortKeys.buf = rec->info[recInfo_sortKeys];
 
        extract_flushSortKeys (zh, *sysno, 0, &sortKeys);
-        extract_flushRecordKeys (zh, *sysno, 0, &delkeys);
+        extract_flushRecordKeys (zh, *sysno, 0, &delkeys, 0);
         if (delete_flag)
         {
             /* record going to be deleted */
@@ -1100,7 +1109,7 @@ ZEBRA_RES buffer_extract_record (ZebraHandle zh,
                    yaz_log (YLOG_LOG, "update %s %s %ld", recordType,
                             pr_fname, (long) recordOffset);
                 extract_flushSortKeys (zh, *sysno, 1, &zh->reg->sortKeys);
-                extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys);
+                extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys, 0);
                 zh->records_updated++;
             }
         }
@@ -1220,6 +1229,7 @@ int explain_extract (void *handle, Record rec, data1_node *n)
 
     extractCtrl.flagShowRecords = 0;
     extractCtrl.match_criteria[0] = '\0';
+    extractCtrl.staticrank = 0;
     extractCtrl.handle = handle;
     extractCtrl.first_record = 1;
     
@@ -1244,9 +1254,9 @@ int explain_extract (void *handle, Record rec, data1_node *n)
        sortkeys.buf = rec->info[recInfo_sortKeys];
 
        extract_flushSortKeys (zh, rec->sysno, 0, &sortkeys);
-       extract_flushRecordKeys (zh, rec->sysno, 0, &delkeys);
+       extract_flushRecordKeys (zh, rec->sysno, 0, &delkeys, 0);
     }
-    extract_flushRecordKeys (zh, rec->sysno, 1, &zh->reg->keys);
+    extract_flushRecordKeys (zh, rec->sysno, 1, &zh->reg->keys, 0);
     extract_flushSortKeys (zh, rec->sysno, 1, &zh->reg->sortKeys);
 
     xfree (rec->info[recInfo_delKeys]);
@@ -1265,7 +1275,8 @@ int explain_extract (void *handle, Record rec, data1_node *n)
 }
 
 void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno,
-                              int cmd, struct recKeys *reckeys)
+                              int cmd, struct recKeys *reckeys,
+                             zint staticrank)
 {
     void *decode_handle = iscz1_start();
     int off = 0;
@@ -1293,11 +1304,14 @@ void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno,
     while (off < reckeys->buf_used)
     {
         const char *src = reckeys->buf + off;
-        struct it_key key;
-       char *dst = (char*) &key;
+        struct it_key key_in;
+       struct it_key key_out;
+       char *dst = (char*) &key_in;
+       zint *keyp = key_out.mem;
+       size_t key_idx = 0;
 
        iscz1_decode(decode_handle, &dst, &src);
-       assert(key.len == 4);
+       assert(key_in.len == 4);
 
         if (zh->reg->key_buf_used + 1024 > 
             (zh->reg->ptr_top -zh->reg->ptr_i)*sizeof(char*))
@@ -1307,7 +1321,7 @@ void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno,
         (zh->reg->key_buf)[zh->reg->ptr_top - zh->reg->ptr_i] =
            (char*)zh->reg->key_buf + zh->reg->key_buf_used;
 
-       ch = (int) key.mem[0];  /* ordinal for field/use/attribute */
+       ch = (int) key_in.mem[0];  /* ordinal for field/use/attribute */
 
        zh->reg->key_buf_used +=
            key_SU_encode (ch,((char*)zh->reg->key_buf) +
@@ -1318,17 +1332,24 @@ void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno,
         ((char*)(zh->reg->key_buf))[(zh->reg->key_buf_used)++] = '\0';
         ((char*)(zh->reg->key_buf))[(zh->reg->key_buf_used)++] = cmd;
 
-        key.len = 3;
-       if (key.mem[1]) /* filter specified record ID */
-           key.mem[0] = key.mem[1];
+       if (zh->m_staticrank) /* rank config enabled ? */
+       {
+           *keyp++ = staticrank;
+           key_out.len = 4;
+       }
+       else
+           key_out.len = 3;
+
+       if (key_in.mem[1]) /* filter specified record ID */
+           *keyp++ = key_in.mem[1];
        else
-           key.mem[0] = sysno;
-       key.mem[1] = key.mem[2];  /* section_id */
-       key.mem[2] = key.mem[3];  /* sequence .. */
+           *keyp++ = sysno;
+       *keyp++ = key_in.mem[2];  /* section_id */
+       *keyp++ = key_in.mem[3];  /* sequence .. */
 
         memcpy ((char*)zh->reg->key_buf + zh->reg->key_buf_used,
-               &key, sizeof(key));
-        (zh->reg->key_buf_used) += sizeof(key);
+               &key_out, sizeof(key_out));
+        (zh->reg->key_buf_used) += sizeof(key_out);
         off = src - reckeys->buf;
     }
     assert (off == reckeys->buf_used);
index 4e32913..753dac0 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: index.h,v 1.146 2005-08-17 21:29:44 adam Exp $
+/* $Id: index.h,v 1.147 2005-08-18 12:50:17 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -54,7 +54,7 @@ YAZ_BEGIN_CDECL
 
 #define IT_MAX_WORD 256
 
-#define IT_KEY_LEVEL_MAX 4
+#define IT_KEY_LEVEL_MAX 5
 struct it_key {
     int  len;
     zint mem[IT_KEY_LEVEL_MAX];
@@ -292,6 +292,8 @@ struct zebra_session {
 #endif
     int  shadow_enable;
 
+    int m_staticrank;
+
     zint records_inserted;
     zint records_updated;
     zint records_deleted;
@@ -477,7 +479,8 @@ ZEBRA_RES zebra_snippets_hit_vector(ZebraHandle zh, const char *setname,
                                    zint sysno, zebra_snippets *snippets);
 
 void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno,
-                              int cmd, struct recKeys *reckeys);
+                              int cmd, struct recKeys *reckeys,
+                             zint staticrank);
 #if NATTR
 void extract_flushSortKeys (ZebraHandle zh, SYSNO sysno,
                             int cmd, struct recKeys *skp);
index 8b393ec..8a48f7a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zebraapi.c,v 1.181 2005-08-17 21:29:44 adam Exp $
+/* $Id: zebraapi.c,v 1.182 2005-08-18 12:50:17 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -126,6 +126,7 @@ ZebraHandle zebra_open (ZebraService zs)
     zh->lock_shadow = 0;
 
     zh->shadow_enable = 1;
+    zh->m_staticrank = 0;
 
     default_encoding = res_get_def(zs->global_res, "encoding", "ISO-8859-1");
 
@@ -699,6 +700,13 @@ static void zebra_select_register (ZebraHandle zh, const char *new_reg)
        if (res_get_int(zh->res, "estimatehits", &approx) == ZEBRA_OK)
            zebra_set_approx_limit(zh, approx);
     }
+    if (zh->res)
+    {
+       if (res_get_int(zh->res, "staticrank", &zh->m_staticrank) == ZEBRA_OK)
+           yaz_log(YLOG_LOG, "static rank set and is %d", zh->m_staticrank);
+       else
+           yaz_log(YLOG_LOG, "static rank unset");
+    }
 }
 
 void map_basenames_func (void *vp, const char *name, const char *value)
index 3816e51..60ae415 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zinfo.c,v 1.48 2005-08-09 12:30:46 adam Exp $
+/* $Id: zinfo.c,v 1.49 2005-08-18 12:50:18 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -1562,6 +1562,7 @@ RecordAttr *rec_init_attr (ZebraExplainInfo zei, Record rec)
     recordAttr->recordSize = 0;
     recordAttr->recordOffset = 0;
     recordAttr->runNumber = zei->runNumber;
+    recordAttr->staticrank = 0;
     return recordAttr;
 }
 
index 1c55b81..e2b74b6 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zinfo.h,v 1.25 2005-08-05 10:40:13 adam Exp $
+/* $Id: zinfo.h,v 1.26 2005-08-18 12:50:18 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -79,6 +79,7 @@ typedef struct {
     int recordSize;
     off_t recordOffset;
     zint runNumber;
+    zint staticrank;
 } RecordAttr;
 RecordAttr *rec_init_attr (ZebraExplainInfo zei, Record rec);
 
index 999f443..260f567 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zsets.c,v 1.90 2005-06-22 19:42:38 adam Exp $
+/* $Id: zsets.c,v 1.91 2005-08-18 12:50:18 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -398,6 +398,10 @@ ZebraMetaRecord *zebra_meta_records_create(ZebraHandle zh, const char *name,
     RSET rset;
     int i;
     struct zset_sort_info *sort_info;
+    size_t sysno_mem_index = 0;
+
+    if (zh->m_staticrank)
+       sysno_mem_index = 1;
 
     if (!log_level_set)
         loglevels();
@@ -483,7 +487,7 @@ ZebraMetaRecord *zebra_meta_records_create(ZebraHandle zh, const char *name,
            }
             while (num_i < num && rset_read (rfd, &key, 0))
             {
-                zint this_sys = key.mem[0];
+                zint this_sys = key.mem[sysno_mem_index];
                 if (this_sys != psysno)
                 {
                     psysno = this_sys;
@@ -711,6 +715,11 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem,
     TERMID termid;
     TERMID *terms;
     int numTerms = 0;
+    size_t sysno_mem_index = 0;
+
+    if (zh->m_staticrank)
+       sysno_mem_index = 1;
+
 
     assert(nmem); /* compiler shut up about unused param */
     sset->sort_info->num_entries = 0;
@@ -785,7 +794,7 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem,
     rfd = rset_open (rset, RSETF_READ);
     while (rset_read (rfd, &key, &termid))
     {
-        zint this_sys = key.mem[0];
+        zint this_sys = key.mem[sysno_mem_index];
        if (log_level_searchhits)
            key_logdump_txt(log_level_searchhits, &key, termid->name);
        kno++;
@@ -838,6 +847,10 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet,
     rset_getterms(rset, 0, 0, &n);
     terms = (TERMID *) nmem_malloc(nmem, sizeof(*terms)*n);
     rset_getterms(rset, terms, n, &numTerms);
+    size_t sysno_mem_index = 0;
+
+    if (zh->m_staticrank)
+       sysno_mem_index = 1;
 
     rank_class = zebraRankLookup(zh, rank_handler_name);
     if (!rank_class)
@@ -859,7 +872,7 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet,
        zint psysno = 0;
        while (rset_read(rfd, &key, &termid))
        {
-           zint this_sys = key.mem[0];
+           zint this_sys = key.mem[sysno_mem_index];
            zint seqno = key.mem[key.len-1];
            kno++;
            if (log_level_searchhits)
index 6331754..54bf008 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: xslt.c,v 1.12 2005-06-24 13:45:54 adam Exp $
+/* $Id: xslt.c,v 1.13 2005-08-18 12:50:18 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -116,10 +116,6 @@ int zebra_xmlInputCloseCallback (void * context)
     return 0;
 }
 
-
-
-
-
 static void *filter_init_xslt(Res res, RecType recType)
 {
     struct filter_info *tinfo = (struct filter_info *) xmalloc(sizeof(*tinfo));
@@ -141,14 +137,6 @@ static void *filter_init_xslt(Res res, RecType recType)
     return tinfo;
 }
 
-static void *filter_init_xslt1(Res res, RecType recType)
-{
-    struct filter_info *tinfo = (struct filter_info *)
-       filter_init_xslt(res, recType);
-    tinfo->split_level = "1";
-    return tinfo;
-}
-
 static int attr_content(struct _xmlAttr *attr, const char *name,
                        const char **dst_content)
 {
@@ -341,21 +329,30 @@ static void index_node(struct filter_info *tinfo,  struct recExtractCtrl *ctrl,
 static void index_record(struct filter_info *tinfo,struct recExtractCtrl *ctrl,
                         xmlNodePtr ptr, RecWord *recWord)
 {
-    if (ptr->type == XML_ELEMENT_NODE && ptr->ns &&
+    if (ptr && ptr->type == XML_ELEMENT_NODE && ptr->ns &&
        !strcmp(ptr->ns->href, zebra_xslt_ns)
        && !strcmp(ptr->name, "record"))
     {
        const char *type_str = "update";
        const char *id_str = 0;
+       const char *rank_str = 0;
        struct _xmlAttr *attr;
        for (attr = ptr->properties; attr; attr = attr->next)
        {
            attr_content(attr, "type", &type_str);
            attr_content(attr, "id", &id_str);
+           attr_content(attr, "rank", &rank_str);
        }
        if (id_str)
            sscanf(id_str, "%255s", ctrl->match_criteria);
-
+       if (rank_str)
+       {
+           ctrl->staticrank = atoi(rank_str);
+           yaz_log(YLOG_LOG, "rank=%d",ctrl->staticrank);
+       }
+       else
+           yaz_log(YLOG_LOG, "no rank");
+       
        ptr = ptr->children;
     }
     index_node(tinfo, ctrl, ptr, recWord);
@@ -378,6 +375,7 @@ static int extract_doc(struct filter_info *tinfo, struct recExtractCtrl *p,
 
     if (schema && schema->stylesheet_xsp)
     {
+       xmlNodePtr root_ptr;
        xmlDocPtr resDoc = 
            xsltApplyStylesheet(schema->stylesheet_xsp,
                                doc, params);
@@ -387,7 +385,15 @@ static int extract_doc(struct filter_info *tinfo, struct recExtractCtrl *p,
            fwrite(buf_out, len_out, 1, stdout);
            xmlFree(buf_out);
        }
-       index_record(tinfo, p, xmlDocGetRootElement(resDoc), &recWord);
+       root_ptr = xmlDocGetRootElement(resDoc);
+       if (root_ptr)
+           index_record(tinfo, p, root_ptr, &recWord);
+       else
+       {
+           yaz_log(YLOG_WARN, "No root for index XML record."
+                   " split_level=%s stylesheet=%s",
+                   tinfo->split_level, schema->stylesheet);
+       }
        xmlFreeDoc(resDoc);
     }
     xmlDocDumpMemory(doc, &buf_out, &len_out);
@@ -649,16 +655,6 @@ static struct recType filter_type_xslt = {
     filter_retrieve
 };
 
-static struct recType filter_type_xslt1 = {
-    0,
-    "xslt1",
-    filter_init_xslt1,
-    filter_config,
-    filter_destroy,
-    filter_extract,
-    filter_retrieve
-};
-
 RecType
 #ifdef IDZEBRA_STATIC_XSLT
 idzebra_filter_xslt
@@ -668,8 +664,5 @@ idzebra_filter
 
 [] = {
     &filter_type_xslt,
-#ifdef LIBXML_READER_ENABLED
-    &filter_type_xslt1,
-#endif
     0,
 };
index e5a7745..79cdc41 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: testlib.c,v 1.25 2005-08-09 12:30:47 adam Exp $
+/* $Id: testlib.c,v 1.26 2005-08-18 12:50:18 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -141,10 +141,10 @@ void init_data(ZebraHandle zh, const char **recs)
     zebra_select_database(zh, "Default");
     yaz_log(log_level, "going to call init");
     i = zebra_init(zh);
-    yaz_log(log_level, "init returned %d", i);
+    yaz_log(log_level, "init_data returned %d", i);
     if (i) 
     {
-        printf("init failed with %d\n",i);
+        printf("init_data failed with %d\n",i);
         zebra_result(zh, &i, &addinfo);
         printf("  Error %d   %s\n", i, addinfo);
         exit(1);
index 8936ba8..01ff86f 100644 (file)
@@ -1,14 +1,16 @@
-# $Id: Makefile.am,v 1.6 2005-06-07 11:38:16 adam Exp $
+# $Id: Makefile.am,v 1.7 2005-08-18 12:50:18 adam Exp $
 
-check_PROGRAMS = xslt1 xslt2 xslt3
+check_PROGRAMS = xslt1 xslt2 xslt3 xslt4
 TESTS = $(check_PROGRAMS)
 
-EXTRA_DIST=zebra.cfg marc-col.xml marc-one.xml index.xsl id.xsl \
- marcschema.xml snippet.xsl
+EXTRA_DIST=zebra.cfg zebrastaticrank.cfg \
+ marc-col.xml marc-one.xml index.xsl id.xsl \
+ marcschema-col.xml marcschema-one.xml snippet.xsl
 
 xslt1_SOURCES = xslt1.c
 xslt2_SOURCES = xslt2.c
 xslt3_SOURCES = xslt3.c
+xslt4_SOURCES = xslt4.c
 
 AM_CPPFLAGS = -I$(srcdir)/../api -I$(top_srcdir)/include $(YAZINC)
 
index ccdec83..2fbecb3 100644 (file)
@@ -2,7 +2,7 @@
   xmlns:m="http://www.loc.gov/MARC21/slim"
   xmlns:z="http://indexdata.dk/zebra/xslt/1"
   version="1.0">
-  <!-- $Id: index.xsl,v 1.4 2005-06-24 13:45:54 adam Exp $ -->
+  <!-- $Id: index.xsl,v 1.5 2005-08-18 12:50:19 adam Exp $ -->
   <xsl:output indent="yes" method="xml" version="1.0" encoding="UTF-8"/>
   
 
@@ -10,7 +10,9 @@
 
 
   <xsl:template match="/m:record">
-    <z:record id="{normalize-space(m:controlfield[@tag='001'])}">
+    <z:record z:id="{normalize-space(m:controlfield[@tag='001'])}"
+        z:rank="{normalize-space(m:rank)}"
+       >
       <xsl:apply-templates/>
     </z:record>
   </xsl:template>
   </xsl:template>
   
   <xsl:template match="m:datafield[@tag='245']/m:subfield[@code='a']">
+    <!-- nested. does not have to be! -->
     <z:index name="title">
+      <z:index name="title" type="p">
+        <xsl:value-of select="."/>
+      </z:index>
+    </z:index>
+
+    <!-- can do. But sort register only supports numeric attributes. -->
+    <z:index name="title" type="s"> 
       <xsl:value-of select="."/>
     </z:index>
-  </xsl:template>
-  
 
+  </xsl:template>
 
 </xsl:stylesheet>
index 195be74..c5d527f 100644 (file)
@@ -1,5 +1,6 @@
 <collection xmlns="http://www.loc.gov/MARC21/slim">
 <record xmlns="http://www.loc.gov/MARC21/slim">
+  <rank>1</rank>
   <leader>00366nam  22001698a 4500</leader>
   <controlfield tag="001">   11224466   </controlfield>
   <controlfield tag="003">DLC  </controlfield>
@@ -32,6 +33,7 @@
   </datafield>
 </record>
 <record xmlns="http://www.loc.gov/MARC21/slim">
+  <rank>5</rank>
   <leader>00366nam  22001698a 4500</leader>
   <controlfield tag="001">   11224467   </controlfield>
   <controlfield tag="003">DLC  </controlfield>
@@ -64,6 +66,7 @@
   </datafield>
 </record>
 <record xmlns="http://www.loc.gov/MARC21/slim">
+  <rank>3</rank>
   <leader>01369cam  2200265 i 4500</leader>
   <controlfield tag="001">   73090924 //r82  </controlfield>
   <controlfield tag="003">DLC  </controlfield>
index 0a61202..3c80ed4 100644 (file)
@@ -1,4 +1,5 @@
 <record xmlns="http://www.loc.gov/MARC21/slim">
+  <rank>42</rank>
   <leader>00366nam  22001698a 4500</leader>
   <controlfield tag="001">   11224466   </controlfield>
   <controlfield tag="003">DLC  </controlfield>
diff --git a/test/xslt/marcschema-col.xml b/test/xslt/marcschema-col.xml
new file mode 100644 (file)
index 0000000..6a329ae
--- /dev/null
@@ -0,0 +1,11 @@
+<schemaInfo>
+  <!-- $Id: marcschema-col.xml,v 1.1 2005-08-18 12:50:19 adam Exp $ -->
+  <schema name="index" identifier="http://indexdata.dk/zebra/xslt/1"
+          stylesheet="index.xsl" />
+  <schema name="F" stylesheet="id.xsl" />
+  <schema name="FS" snippet="20" stylesheet="id.xsl" />
+  <schema name="snippet" snippet="10" stylesheet="snippet.xsl" />
+  <split level="1"/>
+</schemaInfo>
+
+   
diff --git a/test/xslt/marcschema-one.xml b/test/xslt/marcschema-one.xml
new file mode 100644 (file)
index 0000000..2707ab3
--- /dev/null
@@ -0,0 +1,11 @@
+<schemaInfo>
+  <!-- $Id: marcschema-one.xml,v 1.1 2005-08-18 12:50:19 adam Exp $ -->
+  <schema name="index" identifier="http://indexdata.dk/zebra/xslt/1"
+          stylesheet="index.xsl" />
+  <schema name="F" stylesheet="id.xsl" />
+  <schema name="FS" snippet="20" stylesheet="id.xsl" />
+  <schema name="snippet" snippet="10" stylesheet="snippet.xsl" />
+  <split level="0"/> <!-- default 0 -->
+</schemaInfo>
+
+   
diff --git a/test/xslt/marcschema.xml b/test/xslt/marcschema.xml
deleted file mode 100644 (file)
index 952ec49..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<schemaInfo>
-  <!-- $Id: marcschema.xml,v 1.3 2005-06-07 13:10:52 adam Exp $ -->
-  <schema name="index" identifier="http://indexdata.dk/zebra/xslt/1"
-          stylesheet="index.xsl" />
-  <schema name="F" stylesheet="id.xsl" />
-  <schema name="FS" snippet="20" stylesheet="id.xsl" />
-  <schema name="snippet" snippet="10" stylesheet="snippet.xsl" />
-</schemaInfo>
-
-   
index 07788ee..8266fe5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: xslt1.c,v 1.3 2005-05-31 14:18:17 adam Exp $
+/* $Id: xslt1.c,v 1.4 2005-08-18 12:50:20 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -29,13 +29,13 @@ int main(int argc, char **argv)
     ZebraService zs = start_up(0, argc, argv);
     ZebraHandle  zh = zebra_open(zs);
 
-    check_filter(zs, "xslt1");
+    check_filter(zs, "xslt");
 
     zebra_select_database(zh, "Default");
 
     zebra_init(zh);
 
-    zebra_set_resource(zh, "recordType", "xslt1.marcschema.xml");
+    zebra_set_resource(zh, "recordType", "xslt.marcschema-col.xml");
 
     zebra_begin_trans(zh, 1);
     sprintf(path, "%.200s/marc-col.xml", get_srcdir());
index fe42211..0d63762 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: xslt2.c,v 1.3 2005-05-31 14:18:17 adam Exp $
+/* $Id: xslt2.c,v 1.4 2005-08-18 12:50:20 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -36,13 +36,13 @@ int main(int argc, char **argv)
     ZebraService zs = start_up(0, argc, argv);
     ZebraHandle  zh = zebra_open(zs);
 
-    check_filter(zs, "xslt1");
+    check_filter(zs, "xslt");
 
     zebra_select_database(zh, "Default");
     
     zebra_init(zh);
 
-    zebra_set_resource(zh, "recordType", "xslt1.marcschema.xml");
+    zebra_set_resource(zh, "recordType", "xslt.marcschema-col.xml");
 
     sprintf(path, "%.200s/marc-col.xml", get_srcdir());
     f = fopen(path, "rb");
index 0fb1405..7bab9e8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: xslt3.c,v 1.2 2005-05-31 14:18:17 adam Exp $
+/* $Id: xslt3.c,v 1.3 2005-08-18 12:50:20 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -42,7 +42,7 @@ int main(int argc, char **argv)
     
     zebra_init(zh);
 
-    zebra_set_resource(zh, "recordType", "xslt.marcschema.xml");
+    zebra_set_resource(zh, "recordType", "xslt.marcschema-one.xml");
 
     sprintf(path, "%.200s/marc-one.xml", get_srcdir());
     f = fopen(path, "rb");
@@ -61,14 +61,25 @@ int main(int argc, char **argv)
 
     record_buf[r] = '\0';
 
-    /* for now only the first of the records in the collection is
-       indexed. That can be seen as a bug */
+    /* index this one record */
     init_data(zh, records_array);
 
     /* only get hits from first record .. */
     do_query(__LINE__, zh, "@attr 1=title computer", 1);
     do_query(__LINE__, zh, "@attr 1=control 11224466", 1);
     do_query_x(__LINE__, zh, "@attr 1=titl computer", 0, 121);
+
+    
+    /* index one more time to see that we don't get dups, since
+     index.xsl has a record ID associated with them */
+    zebra_add_record(zh, record_buf, strlen(record_buf));
+
+    /* only get hits from first record .. */
+    do_query(__LINE__, zh, "@attr 1=title computer", 1);
+    do_query(__LINE__, zh, "@attr 1=control 11224466", 1);
+    do_query_x(__LINE__, zh, "@attr 1=titl computer", 0, 121);
+    
+
     
     return close_down(zh, zs, 0);
 }
diff --git a/test/xslt/xslt4.c b/test/xslt/xslt4.c
new file mode 100644 (file)
index 0000000..26d1a9c
--- /dev/null
@@ -0,0 +1,62 @@
+/* $Id: xslt4.c,v 1.1 2005-08-18 12:50:20 adam Exp $
+   Copyright (C) 1995-2005
+   Index Data ApS
+
+This file is part of the Zebra server.
+
+Zebra is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Zebra; see the file LICENSE.zebra.  If not, write to the
+Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.
+*/
+
+#include "testlib.h"
+       
+int main(int argc, char **argv)
+{
+    char path[256];
+
+    ZebraService zs = start_up("zebrastaticrank.cfg", argc, argv);
+    ZebraHandle  zh = zebra_open(zs);
+
+    check_filter(zs, "xslt");
+
+    zebra_select_database(zh, "Default");
+
+    zebra_init(zh);
+
+    zebra_set_resource(zh, "recordType", "xslt.marcschema-col.xml");
+    zebra_set_resource(zh, "staticrank", "1");
+
+    zebra_begin_trans(zh, 1);
+    sprintf(path, "%.200s/marc-col.xml", get_srcdir());
+    zebra_repository_update(zh, path);
+
+    zebra_end_trans(zh);
+    zebra_commit(zh);
+
+
+    do_query(__LINE__, zh, "@attr 1=title computer", 3);
+    do_query(__LINE__, zh, "@attr 1=control 11224466", 1);
+    do_query_x(__LINE__, zh, "@attr 1=titl computer", 0, 121);
+
+    if (1)
+    {
+       zint ids[5];
+       ids[0] = 2;
+       ids[1] = 4;
+       ids[2] = 3;
+       do_sort(zh, "@attr 1=title computer", 3, ids);
+    }
+    return close_down(zh, zs, 0);
+}
index 50b32c7..c890599 100644 (file)
@@ -2,3 +2,4 @@ profilePath: ${srcdir:-.}/../../tab
 
 modulePath: ../../recctrl/.libs
 
+
diff --git a/test/xslt/zebrastaticrank.cfg b/test/xslt/zebrastaticrank.cfg
new file mode 100644 (file)
index 0000000..4fe0f24
--- /dev/null
@@ -0,0 +1,6 @@
+profilePath: ${srcdir:-.}/../../tab
+
+modulePath: ../../recctrl/.libs
+
+staticrank: 1
+