Project

General

Profile

1
package eu.dnetlib.data.mapreduce.hbase.bulktag;
2

    
3
import com.google.common.base.Functions;
4
import com.google.common.collect.Maps;
5
import com.google.common.collect.Sets;
6
import eu.dnetlib.data.bulktag.CommunityConfiguration;
7
import eu.dnetlib.data.bulktag.Pair;
8
import eu.dnetlib.data.proto.FieldTypeProtos;
9
import eu.dnetlib.data.proto.OafProtos;
10
import eu.dnetlib.data.proto.ResultProtos;
11
import org.apache.commons.lang3.StringUtils;
12
import org.apache.hadoop.mapreduce.Mapper;
13

    
14
import java.util.*;
15
import java.util.stream.Collectors;
16
import java.util.stream.Stream;
17

    
18
/**
19
 * Created by miriam on 02/08/2018.
20
 */
21
public class ResultTagger {
22
    private final static String DATA_INFO_TYPE = "bulktagging";
23
    private final static String SCHEMA_NAME = "dnet:provenanceActions";
24
    private final static String CLASS_ID = "bulktagging::community";
25
    private final static String SCHEMA_ID = "dnet:provenanceActions";
26
    private final static String COUNTER_GROUP = "Bulk Tagging";
27

    
28

    
29
    public OafProtos.Oaf enrichContext(final OafProtos.Oaf oaf, final CommunityConfiguration conf, final Mapper.Context context) {
30

    
31
        //context.getCounter(COUNTER_GROUP, "to enrich").increment(1);
32
        final OafProtos.Oaf.Builder builder = OafProtos.Oaf.newBuilder(oaf);
33

    
34

    
35
        if(oaf.getDataInfo().getDeletedbyinference()){
36
            context.getCounter(COUNTER_GROUP, "deleted by inference").increment(1);
37
            return null;
38
        }
39
        //context.getCounter(COUNTER_GROUP, "not deleted by inference").increment(1);
40

    
41
        final List<ResultProtos.Result.Context> contextList = oaf.getEntity().getResult().getMetadata().getContextList();
42

    
43
        if(contextList.size()>0){
44
            context.getCounter(COUNTER_GROUP, "exist context list").increment(1);
45
        }else{
46
            context.getCounter(COUNTER_GROUP, "not exist context list").increment(1);
47
        }
48
        //communities contains all the communities to be added as context for the result
49
        final Set<String> communities = new HashSet<>();
50

    
51
        oaf.getEntity().getResult().getMetadata().getSubjectList().stream()
52
                .map(subject -> subject.getValue())
53
                .filter(StringUtils::isNotBlank)
54
                .map(String::toLowerCase)
55
                .map(String::trim)
56
                .collect(Collectors.toCollection(HashSet::new))
57
                .forEach(s -> communities.addAll(conf.getCommunityForSubjectValue(s)));
58

    
59
        oaf.getEntity().getResult().getInstanceList()
60
                .stream()
61
                .map(i -> new Pair<>(i.getCollectedfrom().getKey(), i.getHostedby().getKey()))
62
                .flatMap(p -> Stream.of(p.getFst(), p.getSnd()))
63
                .map(s -> StringUtils.substringAfter(s, "|"))
64
                .collect(Collectors.toCollection(HashSet::new))
65
                .forEach(dsId -> communities.addAll(conf.getCommunityForDatasourceValue(dsId)));
66

    
67
        //TODO: add code for Zenodo Communities
68

    
69
        if(communities.isEmpty()){
70
            context.getCounter(COUNTER_GROUP, "list of communities empty").increment(1);
71
        }else{
72
            context.getCounter(COUNTER_GROUP, "list of communities has values!").increment(1);
73
        }
74

    
75
        final ResultProtos.Result.Metadata.Builder mBuilder = builder.getEntityBuilder().getResultBuilder().getMetadataBuilder();
76

    
77
        final Map<String, ResultProtos.Result.Context.Builder> cBuilders = Maps.newHashMap();
78
        mBuilder.getContextBuilderList().forEach(cBuilder -> {
79
            cBuilders.put(cBuilder.getId(), cBuilder);
80
        });
81

    
82
        for(String contextId:communities){
83

    
84
            final ResultProtos.Result.Context.Builder cBuilder = cBuilders.get(contextId);
85
            if (cBuilder != null) {
86

    
87
                if (!cBuilder.getDataInfoBuilderList().stream()
88
                        .map(di -> di.getInferenceprovenance())
89
                        .anyMatch(s -> DATA_INFO_TYPE.equals(s))) {
90

    
91
                    cBuilder.addDataInfo(buildDataInfo());
92
                    context.getCounter(COUNTER_GROUP, "add provenance").increment(1);
93
                } else {
94
                    context.getCounter(COUNTER_GROUP, "provenance already bulk tagged").increment(1);
95
                }
96
            } else {
97
                context.getCounter(COUNTER_GROUP, "add context").increment(1);
98
                mBuilder.addContext(buildContext(contextId));
99
            }
100

    
101
        }
102

    
103
        return builder.build();
104
    }
105

    
106
    private ResultProtos.Result.Context buildContext(final String contextId) {
107
        return ResultProtos.Result.Context.newBuilder()
108
                .setId(contextId)
109
                .addDataInfo(buildDataInfo())
110
                .build();
111
    }
112

    
113
    private FieldTypeProtos.DataInfo buildDataInfo() {
114
        FieldTypeProtos.DataInfo.Builder builder = FieldTypeProtos.DataInfo.newBuilder()
115
                .setInferred(true)
116
                .setProvenanceaction(
117
                        FieldTypeProtos.Qualifier.newBuilder()
118
                                .setClassid(CLASS_ID)
119
                                .setClassname("Bulk Tagging for Communities")
120
                                .setSchemeid(SCHEMA_ID)
121
                                .setSchemename(SCHEMA_NAME))
122
                .setInferenceprovenance(DATA_INFO_TYPE)
123
                .setTrust("0.85");
124
        return builder
125
                .build();
126
    }
127

    
128

    
129
}
(3-3/3)