package eu.dnetlib.iis.wf.export.actionmanager.module; import java.util.Arrays; import java.util.List; import org.apache.hadoop.conf.Configuration; import eu.dnetlib.actionmanager.actions.AtomicAction; import eu.dnetlib.actionmanager.common.Agent; import eu.dnetlib.data.mapreduce.util.OafDecoder; import eu.dnetlib.data.proto.KindProtos.Kind; import eu.dnetlib.data.proto.OafProtos.Oaf; import eu.dnetlib.data.proto.OafProtos.OafRel; import eu.dnetlib.data.proto.RelTypeProtos.RelType; import eu.dnetlib.data.proto.RelTypeProtos.SubRelType; import eu.dnetlib.data.proto.ResultResultProtos.ResultResult; import eu.dnetlib.data.proto.ResultResultProtos.ResultResult.PublicationDataset; import eu.dnetlib.iis.common.InfoSpaceConstants; import eu.dnetlib.iis.referenceextraction.dataset.schemas.DocumentToDataSet; /** * {@link DocumentToDataSet} based action builder module. * * @author mhorst * */ public class DocumentToDataSetActionBuilderModuleFactory extends AbstractActionBuilderFactory<DocumentToDataSet> { public static final String REL_CLASS_ISRELATEDTO = PublicationDataset.RelName.isRelatedTo.toString(); // ------------------------ CONSTRUCTORS -------------------------- public DocumentToDataSetActionBuilderModuleFactory() { super(AlgorithmName.document_referencedDatasets); } // ------------------------ LOGIC --------------------------------- @Override public ActionBuilderModule<DocumentToDataSet> instantiate(Configuration config, Agent agent, String actionSetId) { return new DocumentToDataSetActionBuilderModule(provideTrustLevelThreshold(config), agent, actionSetId); } // ------------------------ INNER CLASS -------------------------- class DocumentToDataSetActionBuilderModule extends AbstractBuilderModule<DocumentToDataSet> { // ------------------------ CONSTRUCTORS -------------------------- /** * @param trustLevelThreshold trust level threshold or null when all records should be exported * @param agent action manager agent details * @param actionSetId action set identifier */ public DocumentToDataSetActionBuilderModule(Float trustLevelThreshold, Agent agent, String actionSetId) { super(trustLevelThreshold, buildInferenceProvenance(), agent, actionSetId); } // ------------------------ LOGIC -------------------------- @Override public List<AtomicAction> build(DocumentToDataSet object) throws TrustLevelThresholdExceededException { Oaf.Builder oafBuilder = instantiateOafBuilder(object); Oaf oaf = oafBuilder.build(); Oaf oafInverted = invertBidirectionalRelationAndBuild(oafBuilder); return Arrays.asList(new AtomicAction[] { getActionFactory().createAtomicAction(getActionSetId(), getAgent(), object.getDocumentId().toString(), OafDecoder.decode(oaf).getCFQ(), object.getDatasetId().toString(), oaf.toByteArray()), // setting reverse relation in referenced object getActionFactory().createAtomicAction(getActionSetId(), getAgent(), object.getDatasetId().toString(), OafDecoder.decode(oafInverted).getCFQ(), object.getDocumentId().toString(), oafInverted.toByteArray()) }); } // ------------------------ PRIVATE -------------------------- private Oaf.Builder instantiateOafBuilder(DocumentToDataSet object) throws TrustLevelThresholdExceededException { String docId = object.getDocumentId().toString(); String currentRefId = object.getDatasetId().toString(); Oaf.Builder oafBuilder = Oaf.newBuilder(); oafBuilder.setKind(Kind.relation); oafBuilder.setRel(buildOafRel(docId, currentRefId)); oafBuilder.setDataInfo(buildInference(object.getConfidenceLevel())); oafBuilder.setLastupdatetimestamp(System.currentTimeMillis()); return oafBuilder; } private OafRel buildOafRel(String docId, String currentRefId) { OafRel.Builder relBuilder = OafRel.newBuilder(); relBuilder.setChild(false); relBuilder.setRelType(RelType.resultResult); relBuilder.setSubRelType(SubRelType.publicationDataset); relBuilder.setRelClass(REL_CLASS_ISRELATEDTO); relBuilder.setSource(docId); relBuilder.setTarget(currentRefId); ResultResult.Builder resResultBuilder = ResultResult.newBuilder(); PublicationDataset.Builder pubDatasetBuilder = PublicationDataset.newBuilder(); pubDatasetBuilder.setRelMetadata(buildRelMetadata( InfoSpaceConstants.SEMANTIC_SCHEME_DNET_RELATIONS_RESULT_RESULT, REL_CLASS_ISRELATEDTO)); resResultBuilder.setPublicationDataset(pubDatasetBuilder.build()); relBuilder.setResultResult(resResultBuilder.build()); return relBuilder.build(); } } }