Zebra uses string attributes for indexing internally. Using set+numeric
[idzebra-moved-to-github.git] / index / zinfo.c
index 562ae67..3d2aee8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zinfo.c,v 1.60 2006-05-10 12:31:08 adam Exp $
+/* $Id: zinfo.c,v 1.64 2006-05-19 13:49:34 adam Exp $
    Copyright (C) 1995-2006
    Index Data ApS
 
@@ -1438,8 +1438,13 @@ int zebraExplain_lookup_attr_su_any_index(ZebraExplainInfo zei,
                                          int set, int use)
 {
     struct zebSUInfoB *zsui;
+    int ord;
 
     assert (zei->curDatabaseInfo);
+
+    ord = zebraExplain_lookup_attr_su(zei, 'w', set, use);
+    if (ord != -1)
+        return ord;
     for (zsui = zei->curDatabaseInfo->attributeDetails->SUInfo;
         zsui; zsui=zsui->next)
         if (zsui->info.which == ZEB_SU_SET_USE &&
@@ -1486,7 +1491,7 @@ int zebraExplain_lookup_attr_str(ZebraExplainInfo zei, int index_type,
         *zsui; zsui = &(*zsui)->next)
         if ((*zsui)->info.index_type == index_type
             && (*zsui)->info.which == ZEB_SU_STR 
-            && !strcmp((*zsui)->info.u.str, str))
+            && !yaz_matchstr((*zsui)->info.u.str, str))
         {
             struct zebSUInfoB *zsui_this = *zsui;
 
@@ -1577,6 +1582,22 @@ int zebraExplain_ord_get_occurrences(ZebraExplainInfo zei, int ord,
     return -1;
 }
 
+zint zebraExplain_ord_get_doc_occurrences(ZebraExplainInfo zei, int ord)
+{
+    struct zebSUInfoB *zsui = zebraExplain_get_sui_info(zei, ord, 0, 0);
+    if (zsui)
+        return zsui->info.doc_occurrences;
+    return 0;
+}
+
+zint zebraExplain_ord_get_term_occurrences(ZebraExplainInfo zei, int ord)
+{
+    struct zebSUInfoB *zsui = zebraExplain_get_sui_info(zei, ord, 0, 0);
+    if (zsui)
+        return zsui->info.term_occurrences;
+    return 0;
+}
+
 int zebraExplain_lookup_ord(ZebraExplainInfo zei, int ord,
                            int *index_type, 
                            const char **db,
@@ -1656,43 +1677,44 @@ void zebraExplain_addAttributeSet (ZebraExplainInfo zei, int set)
     }
 }
 
-int zebraExplain_add_attr_su(ZebraExplainInfo zei, int index_type,
-                            int set, int use)
+struct zebSUInfoB *zebraExplain_add_sui_info(ZebraExplainInfo zei,
+                                             int index_type)
 {
     struct zebSUInfoB *zsui;
 
     assert (zei->curDatabaseInfo);
-    zebraExplain_addAttributeSet (zei, set);
     zsui = (struct zebSUInfoB *) nmem_malloc (zei->nmem, sizeof(*zsui));
     zsui->next = zei->curDatabaseInfo->attributeDetails->SUInfo;
     zei->curDatabaseInfo->attributeDetails->SUInfo = zsui;
     zei->curDatabaseInfo->attributeDetails->dirty = 1;
     zei->dirty = 1;
     zsui->info.index_type = index_type;
+    zsui->info.doc_occurrences = 0;
+    zsui->info.term_occurrences = 0;
+    zsui->info.ordinal = (zei->ordinalSU)++;
+    return zsui;
+}
+
+int zebraExplain_add_attr_su(ZebraExplainInfo zei, int index_type,
+                            int set, int use)
+{
+    struct zebSUInfoB *zsui = zebraExplain_add_sui_info(zei, index_type);
+
+    yaz_log(YLOG_WARN, "add_attr_su");
+    zebraExplain_addAttributeSet (zei, set);
     zsui->info.which = ZEB_SU_SET_USE;
     zsui->info.u.su.set = set;
     zsui->info.u.su.use = use;
-    zsui->info.ordinal = (zei->ordinalSU)++;
-    zsui->info.doc_occurrences = 0;
-    zsui->info.term_occurrences = 0;
     return zsui->info.ordinal;
 }
 
 int zebraExplain_add_attr_str(ZebraExplainInfo zei, int index_type,
                              const char *index_name)
 {
-    struct zebSUInfoB *zsui;
+    struct zebSUInfoB *zsui = zebraExplain_add_sui_info(zei, index_type);
 
-    assert (zei->curDatabaseInfo);
-    zsui = (struct zebSUInfoB *) nmem_malloc (zei->nmem, sizeof(*zsui));
-    zsui->next = zei->curDatabaseInfo->attributeDetails->SUInfo;
-    zei->curDatabaseInfo->attributeDetails->SUInfo = zsui;
-    zei->curDatabaseInfo->attributeDetails->dirty = 1;
-    zei->dirty = 1;
-    zsui->info.index_type = index_type;
     zsui->info.which = ZEB_SU_STR;
     zsui->info.u.str = nmem_strdup(zei->nmem, index_name);
-    zsui->info.ordinal = (zei->ordinalSU)++;
     return zsui->info.ordinal;
 }