2007.
[idzebra-moved-to-github.git] / index / rpnsearch.c
index 9529573..7743362 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: rpnsearch.c,v 1.3 2006-11-30 10:33:19 adam Exp $
-   Copyright (C) 1995-2006
+/* $Id: rpnsearch.c,v 1.6 2007-01-15 15:10:17 adam Exp $
+   Copyright (C) 1995-2007
    Index Data ApS
 
 This file is part of the Zebra server.
@@ -78,19 +78,25 @@ struct grep_info {
     ISAM_P *isam_p_buf;
     int isam_p_size;        
     int isam_p_indx;
+    int trunc_max;
     ZebraHandle zh;
     int reg_type;
     ZebraSet termset;
 };        
 
-static void add_isam_p(const char *name, const char *info,
-                      struct grep_info *p)
+static int add_isam_p(const char *name, const char *info,
+                      struct grep_info *p)
 {
     if (!log_level_set)
     {
         log_level_rpn = yaz_log_module_level("rpn");
         log_level_set = 1;
     }
+    /* we may have to stop this madness.. NOTE: -1 so that if
+       truncmax == trunxlimit we do *not* generate result sets */
+    if (p->isam_p_indx >= p->trunc_max - 1)
+        return 1;
+
     if (p->isam_p_indx == p->isam_p_size)
     {
         ISAM_P *new_isam_p_buf;
@@ -140,12 +146,12 @@ static void add_isam_p(const char *name, const char *info,
                         index_name, term_tmp);
     }
     (p->isam_p_indx)++;
+    return 0;
 }
 
 static int grep_handle(char *name, const char *info, void *p)
 {
-    add_isam_p(name, info, (struct grep_info *) p);
-    return 0;
+    return add_isam_p(name, info, (struct grep_info *) p);
 }
 
 static int term_pre(ZebraMaps zebra_maps, int reg_type, const char **src,
@@ -1209,6 +1215,7 @@ static ZEBRA_RES grep_info_prepare(ZebraHandle zh,
 #ifdef TERM_COUNT
     grep_info->term_no = 0;
 #endif
+    grep_info->trunc_max = atoi(res_get_def(zh->res, "truncmax", "10000"));
     grep_info->isam_p_size = 0;
     grep_info->isam_p_buf = NULL;
     grep_info->zh = zh;
@@ -1692,7 +1699,7 @@ static int numeric_relation(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     yaz_log(log_level_rpn, "dict_lookup_grep: %s", term_tmp);
     r = dict_lookup_grep(zh->reg->dict, term_dict, 0, grep_info, max_pos,
                           0, grep_handle);
-    if (r)
+    if (r != 0 && r != 1)
         yaz_log(YLOG_WARN, "dict_lookup_grep fail, rel = gt: %d", r);
     yaz_log(log_level_rpn, "%d positions", grep_info->isam_p_indx);
     return 1;