package org.molgenis.data.semanticsearch.repository;
import org.molgenis.data.DataService;
import org.molgenis.data.populate.IdGenerator;
import org.molgenis.data.meta.MetaDataServiceImpl;
import org.molgenis.data.meta.model.Tag;
import org.molgenis.data.meta.model.TagFactory;
import org.molgenis.data.meta.model.TagMetadata;
import org.molgenis.data.semantic.Relation;
import static java.util.Objects.requireNonNull;
import static org.molgenis.data.meta.model.TagMetadata.*;
/**
* Helper class around the {@link TagMetadata} repository. Internal implementation class, use
* {@link MetaDataServiceImpl} instead.
*/
public class TagRepository
{
private final DataService dataService;
private final IdGenerator idGenerator;
private final TagFactory tagFactory;
public TagRepository(DataService dataService, IdGenerator idGenerator, TagFactory tagFactory)
{
this.dataService = requireNonNull(dataService);
this.idGenerator = requireNonNull(idGenerator);
this.tagFactory = requireNonNull(tagFactory);
}
/**
* Fetches a tag from the repository. Creates a new one if it does not yet exist.
*
* @param objectIRI IRI of the object
* @param label label of the object
* @param relation {@link Relation} of the tag
* @param codeSystemIRI the IRI of the code system of the tag
* @return {@link Tag} of type {@link TagMetadata}
*/
public Tag getTagEntity(String objectIRI, String label, Relation relation, String codeSystemIRI)
{
Tag tag = dataService.query(TAG, Tag.class).eq(OBJECT_IRI, objectIRI).and().eq(RELATION_IRI, relation.getIRI())
.and().eq(CODE_SYSTEM, codeSystemIRI).findOne();
if (tag == null)
{
tag = tagFactory.create();
tag.setId(idGenerator.generateId());
tag.setObjectIri(objectIRI);
tag.setLabel(label);
tag.setRelationIri(relation.getIRI());
tag.setRelationLabel(relation.getLabel());
tag.setCodeSystem(codeSystemIRI);
dataService.add(TAG, tag);
}
return tag;
}
}