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
    private String trust;
29

    
30

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

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

    
36

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

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

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

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

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

    
69
        //TODO: add code for Zenodo Communities
70

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

    
77
        final ResultProtos.Result.Metadata.Builder mBuilder = builder.getEntityBuilder().getResultBuilder().getMetadataBuilder();
78

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

    
84
        for(String contextId:communities){
85

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

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

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

    
103
        }
104

    
105
        return builder.build();
106
    }
107

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

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

    
130

    
131
    public void setTrust(String s) {
132
        trust = s;
133
    }
134
}
(3-3/3)