X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fpazpar2.c;h=b5a0ee71719a7047a332ef2ca58028b7cc27d88c;hb=caa025a9ad1dc0f12b5e921acc69a46403e331ac;hp=17ce62fb2c7eb6754b9698f8b7d4c98f3da4ad1f;hpb=6590ecb69cda8c6e25fe137f0130996d2d1ccb9e;p=pazpar2-moved-to-github.git diff --git a/src/pazpar2.c b/src/pazpar2.c index 17ce62f..b5a0ee7 100644 --- a/src/pazpar2.c +++ b/src/pazpar2.c @@ -1,4 +1,4 @@ -/* $Id: pazpar2.c,v 1.20 2007-01-08 19:39:12 quinn Exp $ */; +/* $Id: pazpar2.c,v 1.22 2007-01-09 22:06:49 quinn Exp $ */; #include #include @@ -424,6 +424,35 @@ static xmlDoc *normalize_record(struct client *cl, Z_External *rec) return rdoc; } +// Extract what appears to be years from buf, storing highest and +// lowest values. +static int extract_years(const char *buf, int *first, int *last) +{ + *first = -1; + *last = -1; + while (*buf) + { + const char *e; + int len; + + while (*buf && !isdigit(*buf)) + buf++; + len = 0; + for (e = buf; *e && isdigit(*e); e++) + len++; + if (len == 4) + { + int value = atoi(buf); + if (*first < 0 || value < *first) + *first = value; + if (*last < 0 || value > *last) + *last = value; + } + buf = e; + } + return *first; +} + static struct record *ingest_record(struct client *cl, Z_External *rec) { xmlDoc *xdoc = normalize_record(cl, rec); @@ -449,18 +478,15 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) res = nmem_malloc(se->nmem, sizeof(struct record)); res->next = 0; - res->target_offset = -1; - res->term_frequency_vec = 0; res->metadata = nmem_malloc(se->nmem, sizeof(struct record_metadata*) * service->num_metadata); bzero(res->metadata, sizeof(struct record_metadata*) * service->num_metadata); - res->relevance = 0; mergekey_norm = nmem_strdup(se->nmem, (char*) mergekey); xmlFree(mergekey); normalize_mergekey(mergekey_norm); - cluster = reclist_insert(se->reclist, res, mergekey_norm); + cluster = reclist_insert(se->reclist, res, mergekey_norm, &se->total_merged); if (!cluster) { /* no room for record */ @@ -487,6 +513,7 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) struct conf_metadata *md = 0; struct record_metadata **wheretoput, *newm; int imeta; + int first, last; // First, find out what field we're looking at for (imeta = 0; imeta < service->num_metadata; imeta++) @@ -514,11 +541,21 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) { newm->data.text = nmem_strdup(se->nmem, value); } + else if (md->type == Metadata_type_year) + { + if (extract_years(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; @@ -542,6 +579,23 @@ static struct record *ingest_record(struct client *cl, Z_External *rec) newm->next = *wheretoput; *wheretoput = newm; } + else if (md->merge == Metadata_merge_range) + { + assert(md->type == Metadata_type_year); + if (!*wheretoput) + { + *wheretoput = newm; + (*wheretoput)->data.year.year1 = first; + (*wheretoput)->data.year.year2 = last; + } + else + { + if (first < (*wheretoput)->data.year.year1) + (*wheretoput)->data.year.year1 = first; + if (last > (*wheretoput)->data.year.year2) + (*wheretoput)->data.year.year2 = last; + } + } else yaz_log(YLOG_WARN, "Don't know how to merge on element name %s", md->name); @@ -1158,7 +1212,7 @@ char *search(struct session *se, char *query) se->reclist = reclist_create(se->nmem, maxrecs); extract_terms(se->nmem, query, p); se->relevance = relevance_create(se->nmem, (const char **) p, maxrecs); - se->total_records = se->total_hits = 0; + se->total_records = se->total_hits = se->total_merged = 0; se->expected_maxrecs = maxrecs; } else @@ -1247,6 +1301,17 @@ void report_nmem_stats(void) } #endif +struct record_cluster *show_single(struct session *s, int id) +{ + struct record_cluster *r; + + reclist_rewind(s->reclist); + while ((r = reclist_read_record(s->reclist))) + if (r->recid == id) + return r; + return 0; +} + struct record_cluster **show(struct session *s, int start, int *num, int *total, int *sumhits, NMEM nmem_show) {