Output:
<termlist>
- <activeclients>3</activeclients>
- <list name="author">
- <term>
- <name>Donald Knuth</name>
- <frequency>10</frequency>
- </term>
- <term>
- <name>Robert Pirsig</name>
- <frequency>2</frequency>
- </term>
- </list>
- <list name="subject">
- <term>
- <name>Computer programming</name>
- <frequency>10</frequency>
- </term>
- </list>
+<activeclients>3</activeclients>
+<list name="author">
+<term>
+<name>Donald Knuth</name>
+<frequency>10</frequency>
+</term>
+<term>
+<name>Robert Pirsig</name>
+<frequency>2</frequency>
+</term>
+</list>
+<list name="subject">
+<term>
+<name>Computer programming</name>
+<frequency>10</frequency>
+</term>
+</list>
</termlist>
+
+For the special termlist name "xtargets", results are returned about the targets
+which have returned the most hits. The 'term' subtree has additional elements,
+specifically a state and diagnostic field (in the example below, a target ID is
+returned in place of 'name'. This may or may not change later.
+
+<term>
+<name>library2.mcmaster.ca</name>
+<frequency>11734</frequency>
+<state>Client_Idle</state>
+<diagnostic>0</diagnostic>
+</term>
/*
- * $Id: http_command.c,v 1.5 2007-01-04 02:53:37 quinn Exp $
+ * $Id: http_command.c,v 1.6 2007-01-04 20:00:58 quinn Exp $
*/
#include <stdio.h>
http_send_response(c);
}
+// Compares two hitsbytarget nodes by hitcount
+static int cmp_ht(const void *p1, const void *p2)
+{
+ const struct hitsbytarget *h1 = p1;
+ const struct hitsbytarget *h2 = p2;
+ return h2->hits - h1->hits;
+}
+
+// This implements functionality somewhat similar to 'bytarget', but in a termlist form
+static void targets_termlist(WRBUF wrbuf, struct session *se)
+{
+ struct hitsbytarget *ht;
+ int count, i;
+
+ if (!(ht = hitsbytarget(se, &count)))
+ return;
+ qsort(ht, count, sizeof(struct hitsbytarget), cmp_ht);
+ for (i = 0; i < count && i < 15; i++)
+ {
+ wrbuf_puts(wrbuf, "\n<term>\n");
+ wrbuf_printf(wrbuf, "<name>%s</name>\n", ht[i].id);
+ wrbuf_printf(wrbuf, "<frequency>%d</frequency>\n", ht[i].hits);
+ wrbuf_printf(wrbuf, "<state>%s</state>\n", ht[i].state);
+ wrbuf_printf(wrbuf, "<diagnostic>%d</diagnostic>\n", ht[i].diagnostic);
+ wrbuf_puts(wrbuf, "\n</term>\n");
+ }
+}
+
static void cmd_termlist(struct http_channel *c)
{
struct http_response *rs = c->response;
strncpy(tname, name, tp - name);
tname[tp - name] = '\0';
- p = termlist(s->psession, tname, &len);
wrbuf_printf(c->wrbuf, "\n<list name=\"%s\">\n", tname);
- if (p)
- for (i = 0; i < len; i++)
- {
- wrbuf_puts(c->wrbuf, "\n<term>");
- wrbuf_printf(c->wrbuf, "<name>%s</name>", p[i]->term);
- wrbuf_printf(c->wrbuf, "<frequency>%d</frequency>", p[i]->frequency);
- wrbuf_puts(c->wrbuf, "</term>");
- }
+ if (!strcmp(tname, "xtargets"))
+ targets_termlist(c->wrbuf, s->psession);
+ else
+ {
+ p = termlist(s->psession, tname, &len);
+ if (p)
+ for (i = 0; i < len; i++)
+ {
+ wrbuf_puts(c->wrbuf, "\n<term>");
+ wrbuf_printf(c->wrbuf, "<name>%s</name>", p[i]->term);
+ wrbuf_printf(c->wrbuf, "<frequency>%d</frequency>", p[i]->frequency);
+ wrbuf_puts(c->wrbuf, "</term>");
+ }
+ }
wrbuf_puts(c->wrbuf, "\n</list>");
name = tp;
if (*name == ',')
-/* $Id: pazpar2.c,v 1.12 2007-01-04 07:38:36 adam Exp $ */;
+/* $Id: pazpar2.c,v 1.13 2007-01-04 20:00:58 quinn Exp $ */;
#include <stdlib.h>
#include <stdio.h>
}
else if (!strcmp(n->name, "metadata"))
{
- xmlChar *type = xmlGetProp(n, "type"), *value;
+ xmlChar *type = xmlGetProp(n, "type");
if (type && !strcmp(type, "title"))
{
xmlChar *value = xmlNodeListGetString(xdoc, n->children, 0);