+static int log_level_set=0;
+static int log_level_sorting=0;
+static int log_level_searchhits=0;
+static int log_level_searchterms=0;
+static int log_level_resultsets=0;
+
+static void loglevels()
+{
+ if (log_level_set)
+ return;
+ log_level_sorting = yaz_log_module_level("sorting");
+ log_level_searchhits = yaz_log_module_level("searchhits");
+ log_level_searchterms = yaz_log_module_level("searchterms");
+ log_level_resultsets = yaz_log_module_level("resultsets");
+ log_level_set = 1;
+}
+
+ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem,
+ Z_RPNQuery *rpn, ZebraSet sset)
+{
+ RSET rset = 0;
+ oident *attrset;
+ Z_SortKeySpecList *sort_sequence;
+ int sort_status, i;
+ ZEBRA_RES res;
+
+ zh->errCode = 0;
+ zh->errString = NULL;
+ zh->hits = 0;
+
+ sort_sequence = (Z_SortKeySpecList *)
+ nmem_malloc(nmem, sizeof(*sort_sequence));
+ sort_sequence->num_specs = 10; /* FIXME - Hard-coded number */
+ sort_sequence->specs = (Z_SortKeySpec **)
+ nmem_malloc(nmem, sort_sequence->num_specs *
+ sizeof(*sort_sequence->specs));
+ for (i = 0; i<sort_sequence->num_specs; i++)
+ sort_sequence->specs[i] = 0;
+
+ attrset = oid_getentbyoid (rpn->attributeSetId);
+ res = rpn_search_top(zh, rpn->RPNStructure, attrset->value,
+ nmem, rset_nmem,
+ sort_sequence,
+ sset->num_bases, sset->basenames,
+ &rset);
+ if (res != ZEBRA_OK)
+ {
+ sset->rset = 0;
+ return res;
+ }
+
+ if (zh->errCode)
+ yaz_log(YLOG_DEBUG, "search error: %d", zh->errCode);
+
+ for (i = 0; sort_sequence->specs[i]; i++)
+ ;
+ sort_sequence->num_specs = i;
+ if (!i)
+ resultSetRank (zh, sset, rset, rset_nmem);
+ else
+ {
+ yaz_log(YLOG_DEBUG, "resultSetSortSingle in rpn_search");
+ resultSetSortSingle (zh, nmem, sset, rset,
+ sort_sequence, &sort_status);
+ if (zh->errCode)
+ {
+ yaz_log(YLOG_DEBUG, "resultSetSortSingle status = %d", zh->errCode);
+ }
+ }
+ sset->rset = rset;
+ return ZEBRA_OK;
+}
+
+
+ZEBRA_RES resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn,
+ int num_bases, char **basenames,
+ const char *setname)
+{
+ ZebraSet zebraSet;
+ int i;
+ ZEBRA_RES res;
+
+ zh->errCode = 0;
+ zh->errString = NULL;
+ zh->hits = 0;
+
+ zebraSet = resultSetAdd (zh, setname, 1);
+ if (!zebraSet)
+ return ZEBRA_FAIL;
+ zebraSet->locked = 1;
+ zebraSet->rpn = 0;
+ zebraSet->nmem = m;
+ zebraSet->rset_nmem = nmem_create();
+
+ zebraSet->num_bases = num_bases;
+ zebraSet->basenames =
+ nmem_malloc (zebraSet->nmem, num_bases * sizeof(*zebraSet->basenames));
+ for (i = 0; i<num_bases; i++)
+ zebraSet->basenames[i] = nmem_strdup (zebraSet->nmem, basenames[i]);
+
+ res = resultSetSearch(zh, zebraSet->nmem, zebraSet->rset_nmem,
+ rpn, zebraSet);
+ zh->hits = zebraSet->hits;
+ if (zebraSet->rset)
+ zebraSet->rpn = rpn;
+ zebraSet->locked = 0;
+ if (!zebraSet->rset)
+ return ZEBRA_FAIL;
+ return res;
+}
+
+void resultSetAddTerm (ZebraHandle zh, ZebraSet s, int reg_type,
+ const char *db, int set,
+ int use, const char *term)
+{
+ assert(zh); /* compiler shut up */
+ if (!s->nmem)
+ s->nmem = nmem_create ();
+ if (!s->term_entries)
+ {
+ int i;
+ s->term_entries_max = 1000;
+ s->term_entries =
+ nmem_malloc (s->nmem, s->term_entries_max *
+ sizeof(*s->term_entries));
+ for (i = 0; i < s->term_entries_max; i++)
+ s->term_entries[i].term = 0;
+ }
+ if (s->hits < s->term_entries_max)
+ {
+ s->term_entries[s->hits].reg_type = reg_type;
+ s->term_entries[s->hits].db = nmem_strdup (s->nmem, db);
+ s->term_entries[s->hits].set = set;
+ s->term_entries[s->hits].use = use;
+ s->term_entries[s->hits].term = nmem_strdup (s->nmem, term);
+ }
+ (s->hits)++;
+}