projects
/
pazpar2-moved-to-github.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
New merge attribute type: 'first'
[pazpar2-moved-to-github.git]
/
src
/
session.c
diff --git
a/src/session.c
b/src/session.c
index
250734e
..
ec2f270
100644
(file)
--- a/
src/session.c
+++ b/
src/session.c
@@
-1,5
+1,5
@@
/* This file is part of Pazpar2.
/* This file is part of Pazpar2.
- Copyright (C) 2006-2012 Index Data
+ Copyright (C) 2006-2013 Index Data
Pazpar2 is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Pazpar2 is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
@@
-1781,6
+1781,7
@@
static int ingest_to_cluster(struct client *cl,
struct conf_service *service = se->service;
int term_factor = 1;
struct record_cluster *cluster;
struct conf_service *service = se->service;
int term_factor = 1;
struct record_cluster *cluster;
+ struct record_metadata **metadata0;
struct session_database *sdb = client_get_database(cl);
struct record *record = record_create(se->nmem,
service->num_metadata,
struct session_database *sdb = client_get_database(cl);
struct record *record = record_create(se->nmem,
service->num_metadata,
@@
-1876,6
+1877,11
@@
static int ingest_to_cluster(struct client *cl,
relevance_newrec(se->relevance, cluster);
relevance_newrec(se->relevance, cluster);
+ // original metadata, to check if first existence of a field
+ metadata0 = xmalloc(sizeof(*metadata0) * service->num_metadata);
+ memcpy(metadata0, cluster->metadata,
+ sizeof(*metadata0) * service->num_metadata);
+
// now parsing XML record and adding data to cluster or record metadata
for (n = root->children; n; n = n->next)
{
// now parsing XML record and adding data to cluster or record metadata
for (n = root->children; n; n = n->next)
{
@@
-1921,6
+1927,9
@@
static int ingest_to_cluster(struct client *cl,
// merged metadata
rec_md = record_metadata_init(se->nmem, (const char *) value,
ser_md->type, 0);
// merged metadata
rec_md = record_metadata_init(se->nmem, (const char *) value,
ser_md->type, 0);
+
+ // see if the field was not in cluster already (from beginning)
+
if (!rec_md)
continue;
if (!rec_md)
continue;
@@
-1929,9
+1938,16
@@
static int ingest_to_cluster(struct client *cl,
wheretoput = &cluster->metadata[md_field_id];
wheretoput = &cluster->metadata[md_field_id];
- // and polulate with data:
- // assign cluster or record based on merge action
- if (ser_md->merge == Metadata_merge_unique)
+ if (ser_md->merge == Metadata_merge_first)
+ {
+ if (!metadata0[md_field_id])
+ {
+ while (*wheretoput)
+ wheretoput = &(*wheretoput)->next;
+ *wheretoput = rec_md;
+ }
+ }
+ else if (ser_md->merge == Metadata_merge_unique)
{
while (*wheretoput)
{
{
while (*wheretoput)
{
@@
-2057,6
+2073,7
@@
static int ingest_to_cluster(struct client *cl,
if (value)
xmlFree(value);
if (value)
xmlFree(value);
+ xfree(metadata0);
relevance_donerecord(se->relevance, cluster);
se->total_records++;
relevance_donerecord(se->relevance, cluster);
se->total_records++;