+static int match_metadata_local(struct record *record,
+ struct conf_service *service,
+ int md_field_id,
+ char **values, int num_v)
+{
+ int i;
+ struct conf_metadata *ser_md = &service->metadata[md_field_id];
+ struct record_metadata *rec_md = record->metadata[md_field_id];
+ for (i = 0; i < num_v; )
+ {
+ if (rec_md)
+ {
+ if (ser_md->type == Metadata_type_year
+ || ser_md->type == Metadata_type_date)
+ {
+ int y = atoi(values[i]);
+ if (y >= rec_md->data.number.min
+ && y <= rec_md->data.number.max)
+ break;
+ }
+ else
+ {
+ yaz_log(YLOG_DEBUG, "cmp: '%s' '%s'", rec_md->data.text.disp, values[i]);
+ if (!strcmp(rec_md->data.text.disp, values[i]))
+ {
+ // Value equals, should not be filtered.
+ break;
+ }
+ }
+ rec_md = rec_md->next;
+ }
+ else
+ {
+ rec_md = record->metadata[md_field_id];
+ i++;
+ }
+ }
+ return i < num_v ? 1 : 0;
+}
+
+// Skip record on non-zero
+static int check_limit_local(struct client *cl,
+ struct record *record,
+ int record_no)
+{
+ int skip_record = 0;
+ struct session *se = client_get_session(cl);
+ struct conf_service *service = se->service;
+ NMEM nmem_tmp = nmem_create();
+ struct session_database *sdb = client_get_database(cl);
+ int l = 0;
+ while (!skip_record)
+ {
+ int md_field_id;
+ char **values = 0;
+ int num_v = 0;
+ const char *name =
+ client_get_facet_limit_local(cl, sdb, &l, nmem_tmp,
+ &num_v, &values);
+ if (!name)
+ break;
+
+ if (!strcmp(name, "*"))
+ {
+ for (md_field_id = 0; md_field_id < service->num_metadata;
+ md_field_id++)
+ {
+ if (match_metadata_local(record, service, md_field_id,
+ values, num_v))
+ break;
+ }
+ if (md_field_id == service->num_metadata)
+ skip_record = 1;
+ }
+ else
+ {
+ md_field_id = conf_service_metadata_field_id(service, name);
+ if (md_field_id < 0)
+ {
+ skip_record = 1;
+ break;
+ }
+ if (!match_metadata_local(record, service, md_field_id,
+ values, num_v))
+ {
+ skip_record = 1;
+ }
+ }
+ }
+ nmem_destroy(nmem_tmp);
+ return skip_record;
+}
+