+static void merge_cluster(struct reclist *l,
+ struct relevance *r,
+ struct record_cluster *dst,
+ struct record_cluster *src)
+{
+ struct record_metadata_attr *mkl;
+ struct record **rp = &dst->records;
+ for (; *rp; rp = &(*rp)->next)
+ ;
+ *rp = src->records;
+
+ for (mkl = src->merge_keys; mkl; mkl = mkl->next)
+ {
+ const char *merge_key = mkl->value;
+ unsigned int bucket =
+ jenkins_hash((unsigned char*) merge_key) % l->hash_size;
+ struct reclist_bucket *p;
+
+ for (p = l->hashtable[bucket]; p; p = p->hash_next)
+ if (p->record == src)
+ p->record = dst;
+ }
+
+ /* not merging metadata and sortkeys yet */
+
+ relevance_mergerec(r, dst, src);
+
+ wrbuf_puts(dst->relevance_explain1, wrbuf_cstr(src->relevance_explain1));
+ wrbuf_puts(dst->relevance_explain2, wrbuf_cstr(src->relevance_explain2));
+
+ wrbuf_destroy(src->relevance_explain1);
+ src->relevance_explain1 = 0;
+ wrbuf_destroy(src->relevance_explain2);
+ src->relevance_explain2 = 0;
+
+ append_merge_keys(&dst->merge_keys, src->merge_keys, l->nmem);
+}
+
+static struct record_cluster *new_cluster(
+ struct reclist *l,
+ struct relevance *r,
+ struct conf_service *service,
+ struct record *record,
+ struct record_metadata_attr *merge_keys
+ )
+{
+ struct record_cluster *cluster;
+ cluster = nmem_malloc(l->nmem, sizeof(*cluster));
+
+ record->next = 0;
+ cluster->retrieval_position = l->num_records;
+ cluster->records = record;
+ cluster->merge_keys = 0;
+ append_merge_keys(&cluster->merge_keys, merge_keys, l->nmem);
+ cluster->relevance_score = 0;
+ cluster->recid = cluster->merge_keys->value;
+ cluster->metadata =
+ nmem_malloc(l->nmem,
+ sizeof(struct record_metadata*) * service->num_metadata);
+ memset(cluster->metadata, 0,
+ sizeof(struct record_metadata*) * service->num_metadata);
+ cluster->sortkeys =
+ nmem_malloc(l->nmem, sizeof(struct record_metadata*) * service->num_sortkeys);
+ memset(cluster->sortkeys, 0,
+ sizeof(union data_types*) * service->num_sortkeys);
+ relevance_newrec(r, cluster);
+ cluster->relevance_explain1 = wrbuf_alloc();
+ cluster->relevance_explain2 = wrbuf_alloc();
+ /* attach to hash list */
+ l->num_records++;
+ l->sorted_list = l->sorted_ptr = 0;
+ return cluster;
+}
+