Added support for multiple values in filter statement -- separated by |, eg
authorSebastian Hammer <quinn@indexdata.com>
Fri, 23 Mar 2007 03:26:22 +0000 (03:26 +0000)
committerSebastian Hammer <quinn@indexdata.com>
Fri, 23 Mar 2007 03:26:22 +0000 (03:26 +0000)
filter=id=target1|target2|target3

src/database.c
src/pazpar2.c
src/pazpar2.h

index 9cb2406..5ee51bb 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: database.c,v 1.3 2007-03-20 05:32:58 quinn Exp $ */
+/* $Id: database.c,v 1.4 2007-03-23 03:26:22 quinn Exp $ */
 
 #include <libxml/parser.h>
 #include <libxml/tree.h>
@@ -185,10 +185,17 @@ struct database *find_database(const char *id, int new)
     return load_database(id);
 }
 
+// This will be generalized at some point
 static int match_criterion(struct database *db, struct database_criterion *c)
 {
     if (!strcmp(c->name, "id"))
-        return (!strcmp(c->value, db->url));
+    {
+        struct database_criterion_value *v;
+        for (v = c->values; v; v = v->next)
+            if (!strcmp(v->value, db->url))
+                return 1;
+        return 0;
+    }
     else
         return 0;
 }
index f0bd9be..6c3e196 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: pazpar2.c,v 1.51 2007-03-20 07:27:51 adam Exp $ */
+/* $Id: pazpar2.c,v 1.52 2007-03-23 03:26:22 quinn Exp $ */
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -1276,7 +1276,7 @@ int session_active_clients(struct session *s)
     return res;
 }
 
-// parses crit1=val1,crit2=val2,...
+// parses crit1=val1,crit2=val2|val3,...
 static struct database_criterion *parse_filter(NMEM m, const char *buf)
 {
     struct database_criterion *res = 0;
@@ -1289,6 +1289,9 @@ static struct database_criterion *parse_filter(NMEM m, const char *buf)
     nmem_strsplit(m, ",", buf,  &values, &num);
     for (i = 0; i < num; i++)
     {
+        char **subvalues;
+        int subnum;
+        int subi;
         struct database_criterion *new = nmem_malloc(m, sizeof(*new));
         char *eq = strchr(values[i], '=');
         if (!eq)
@@ -1298,7 +1301,15 @@ static struct database_criterion *parse_filter(NMEM m, const char *buf)
         }
         *(eq++) = '\0';
         new->name = values[i];
-        new->value = eq;
+        nmem_strsplit(m, "|", eq, &subvalues, &subnum);
+        new->values = 0;
+        for (subi = 0; subi < subnum; subi++)
+        {
+            struct database_criterion_value *newv = nmem_malloc(m, sizeof(*newv));
+            newv->value = subvalues[subi];
+            newv->next = new->values;
+            new->values = newv;
+        }
         new->next = res;
         res = new;
     }
index 5b04d73..7a81537 100644 (file)
@@ -75,9 +75,14 @@ struct database {
     struct database *next;
 };
 
+struct database_criterion_value {
+    char *value;
+    struct database_criterion_value *next;
+};
+
 struct database_criterion {
     char *name;
-    char *value;
+    struct database_criterion_value *values;
     struct database_criterion *next;
 };