Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/pazpar2
authorDennis Schafroth <dennis@indexdata.com>
Fri, 30 Sep 2011 12:34:11 +0000 (14:34 +0200)
committerDennis Schafroth <dennis@indexdata.com>
Fri, 30 Sep 2011 12:34:11 +0000 (14:34 +0200)
1  2 
src/client.c

diff --combined src/client.c
@@@ -916,14 -916,10 +916,14 @@@ static char *make_solrquery(struct clie
      ODR odr_out = odr_createmem(ODR_ENCODE);
  
      zquery = p_query_rpn(odr_out, cl->pquery);
 +    if (zquery == 0) {
 +        yaz_log(YLOG_WARN, "Failed to generate RPN from PQF: %s", cl->pquery);
 +        return 0;
 +    }
      yaz_log(YLOG_LOG, "PQF: %s", cl->pquery);
      if ((status = solr_transform_rpn2solr_wrbuf(sqlt, wrb, zquery)))
      {
 -        yaz_log(YLOG_WARN, "Failed to generate SOLR query, code=%d", status);
 +        yaz_log(YLOG_WARN, "Failed to generate SOLR query from PQF %s, code=%d", cl->pquery, status);
          r = 0;
      }
      else
@@@ -943,6 -939,7 +943,7 @@@ static void apply_limit(struct session_
      int i = 0;
      const char *name;
      const char *value;
+     NMEM nmem_tmp = nmem_create();
      for (i = 0; (name = facet_limits_get(facet_limits, i, &value)); i++)
      {
          struct setting *s = 0;
              const char *p = strchr(s->name + 3, ':');
              if (p && !strcmp(p + 1, name) && s->value)
              {
+                 char **values = 0;
+                 int i, num = 0;
+                 nmem_strsplit_escape2(nmem_tmp, "|", value, &values,
+                                       &num, 1, '\\', 1);
                  if (!strncmp(s->value, "rpn:", 4))
                  {
                      const char *pqf = s->value + 4;
                      wrbuf_puts(w_pqf, "@and ");
                      wrbuf_puts(w_pqf, pqf);
                      wrbuf_puts(w_pqf, " ");
-                     yaz_encode_pqf_term(w_pqf, value, strlen(value));
+                     for (i = 0; i < num; i++)
+                     {
+                         if (i < num - 1)
+                             wrbuf_puts(w_pqf, "@or ");
+                         yaz_encode_pqf_term(w_pqf, values[i],
+                                             strlen(values[i]));
+                     }
                  }
                  else if (!strncmp(s->value, "ccl:", 4))
                  {
                      const char *ccl = s->value + 4;
-                     wrbuf_puts(w_ccl, " and ");
-                     wrbuf_puts(w_ccl, ccl);
-                     wrbuf_puts(w_ccl, "=\"");
-                     wrbuf_puts(w_ccl, value);
-                     wrbuf_puts(w_ccl, "\"");
+                     wrbuf_puts(w_ccl, " and (");
+                     for (i = 0; i < num; i++)
+                     {
+                         if (i)
+                             wrbuf_puts(w_ccl, " or ");
+                         wrbuf_puts(w_ccl, ccl);
+                         wrbuf_puts(w_ccl, "=\"");
+                         wrbuf_puts(w_ccl, values[i]);
+                         wrbuf_puts(w_ccl, "\"");
+                     }
+                     wrbuf_puts(w_ccl, ")");
                  }
                  break;
              }
          }
+         nmem_reset(nmem_tmp);
          if (!s)
          {
              yaz_log(YLOG_WARN, "Target %s: limit %s used, but no limitmap defined",
                      (sdb->database ? sdb->database->url : "<no url>"), name);
          }
      }
+     nmem_destroy(nmem_tmp);
  }
                          
  // Parse the query given the settings specific to this client