-
- // Find out where we are putting it if (md->merge == Metadata_merge_no)
- wheretoput = &res->metadata[imeta];
- else
- wheretoput = &cluster->metadata[imeta];
-
-
- // Put it there
- newm = nmem_malloc(se->nmem, sizeof(struct record_metadata));
- newm->next = 0;
- if (md->type == Metadata_type_generic)
- {
- char *p, *pe;
- for (p = (char *) value; *p && isspace(*p); p++)
- ;
- for (pe = p + strlen(p) - 1;
- pe > p && strchr(" ,/.:([", *pe); pe--)
- *pe = '\0';
- newm->data.text = nmem_strdup(se->nmem, p);
-
- }
- else if (md->type == Metadata_type_year)
- {
- if (extract_years((char *) value, &first, &last) < 0)
- continue;
- }
- else
- {
- yaz_log(YLOG_WARN, "Unknown type in metadata element %s", type);
- continue;
- }
- if (md->type == Metadata_type_year && md->merge != Metadata_merge_range)
- {
- yaz_log(YLOG_WARN, "Only range merging supported for years");
- continue;
- }
- if (md->merge == Metadata_merge_unique)
- {
- struct record_metadata *mnode;
- for (mnode = *wheretoput; mnode; mnode = mnode->next)
- if (!strcmp((const char *) mnode->data.text, newm->data.text))
- break;
- if (!mnode)
- {
- newm->next = *wheretoput;
- *wheretoput = newm;
- }
- }
- else if (md->merge == Metadata_merge_longest)
- {
- if (!*wheretoput ||
- strlen(newm->data.text) > strlen((*wheretoput)->data.text))
- {
- *wheretoput = newm;
- if (sk)
- {
- char *s = nmem_strdup(se->nmem, newm->data.text);
- if (!cluster->sortkeys[md->sortkey_offset])
- cluster->sortkeys[md->sortkey_offset] =
- nmem_malloc(se->nmem, sizeof(union data_types));
- normalize_mergekey(s,
- (sk->type == Metadata_sortkey_skiparticle));
- cluster->sortkeys[md->sortkey_offset]->text = s;
- }
- }
- }
- else if (md->merge == Metadata_merge_all || md->merge == Metadata_merge_no)
- {
- newm->next = *wheretoput;
- *wheretoput = newm;
- }
- else if (md->merge == Metadata_merge_range)
- {
- assert(md->type == Metadata_type_year);
- if (!*wheretoput)
- {
- *wheretoput = newm;
- (*wheretoput)->data.number.min = first;
- (*wheretoput)->data.number.max = last;
- if (sk)
- cluster->sortkeys[md->sortkey_offset] = &newm->data;
- }
- else
- {
- if (first < (*wheretoput)->data.number.min)
- (*wheretoput)->data.number.min = first;
- if (last > (*wheretoput)->data.number.max)
- (*wheretoput)->data.number.max = last;
- }
- if (md->rank)
- relevance_countwords(se->relevance, cluster,
- (char *) value, md->rank);
- if (md->termlist)
- {
- if (md->type == Metadata_type_year)
- {
- char year[64];
- sprintf(year, "%d", last);
- add_facet(se, (char *) type, year);
- if (first != last)
- {
- sprintf(year, "%d", first);
- add_facet(se, (char *) type, year);
- }
- }
- else
- add_facet(se, (char *) type, (char *) value);
- }
-#endif