Added 'virtual' facet named 'xtargets' to termlist command, which returns
authorSebastian Hammer <quinn@indexdata.com>
Thu, 4 Jan 2007 20:00:58 +0000 (20:00 +0000)
committerSebastian Hammer <quinn@indexdata.com>
Thu, 4 Jan 2007 20:00:58 +0000 (20:00 +0000)
information about targets with the most hitcounts. Description in PROTOCOL

PROTOCOL
src/http_command.c
src/pazpar2.c
www/test1/search.js

index 5e3ad07..a3a68c4 100644 (file)
--- a/PROTOCOL
+++ b/PROTOCOL
@@ -136,21 +136,33 @@ search.pz2?session=2044502273&command=termlist&name=author,subject
 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>
index c4837a6..25871a0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $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>
@@ -144,6 +144,34 @@ static void cmd_init(struct http_channel *c)
     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;
@@ -177,16 +205,21 @@ static void cmd_termlist(struct http_channel *c)
         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 == ',')
index 1537054..66a1d12 100644 (file)
@@ -1,4 +1,4 @@
-/* $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>
@@ -465,7 +465,7 @@ static struct record *ingest_record(struct client *cl, Z_External *rec)
         }
         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);
index 94fd03a..c3658fc 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: search.js,v 1.5 2007-01-04 03:06:40 quinn Exp $
+/* $Id: search.js,v 1.6 2007-01-04 20:00:58 quinn Exp $
  * ---------------------------------------------------
  * Javascript container
  */
@@ -260,12 +260,12 @@ function show_termlist()
     }
 }
 
-
 function check_termlist()
 {
     var url = "search.pz2?" +
         "command=termlist" +
-       "&session=" + session;
+       "&session=" + session +
+       "&name=" + "subject";
     xtermlist = GetXmlHttpObject();
     xtermlist.onreadystatechange=show_termlist;
     xtermlist.open("GET", url);