package org.molgenis.data.annotation.core.entity.impl.hpo;
import com.google.common.base.Optional;
import org.molgenis.data.Entity;
import org.molgenis.data.MolgenisDataException;
import org.molgenis.data.annotation.core.entity.ResultFilter;
import org.molgenis.data.meta.model.Attribute;
import org.molgenis.data.meta.model.AttributeFactory;
import org.molgenis.data.meta.model.EntityType;
import org.molgenis.data.meta.model.EntityTypeFactory;
import org.molgenis.data.support.DynamicEntity;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import static org.molgenis.data.annotation.core.entity.impl.hpo.HPOAnnotator.HPO_IDS;
import static org.molgenis.data.annotation.core.entity.impl.hpo.HPOAnnotator.HPO_TERMS;
import static org.molgenis.data.annotation.core.entity.impl.hpo.HPORepository.HPO_ID_COL_NAME;
import static org.molgenis.data.annotation.core.entity.impl.hpo.HPORepository.HPO_TERM_COL_NAME;
public class HpoResultFilter implements ResultFilter
{
private EntityTypeFactory entityTypeFactory;
private AttributeFactory attributeFactory;
private HPOAnnotator hpoAnnotator;
public HpoResultFilter(EntityTypeFactory entityTypeFactory, AttributeFactory attributeFactory,
HPOAnnotator hpoAnnotator)
{
this.entityTypeFactory = entityTypeFactory;
this.attributeFactory = attributeFactory;
this.hpoAnnotator = hpoAnnotator;
}
@Override
public Collection<Attribute> getRequiredAttributes()
{
return Collections.emptyList();
}
@Override
public Optional<Entity> filterResults(Iterable<Entity> results, Entity annotatedEntity, boolean updateMode)
{
if (updateMode == true)
{
throw new MolgenisDataException("This annotator/filter does not support updating of values");
}
StringBuilder ids = new StringBuilder();
StringBuilder terms = new StringBuilder();
Iterator<Entity> it = results.iterator();
while (it.hasNext())
{
Entity hpoEntity = it.next();
if (ids.length() > 0)
{
ids.append('/');
terms.append('/');
}
String hpoId = hpoEntity.getString(HPO_ID_COL_NAME);
String hpoTerm = hpoEntity.getString(HPO_TERM_COL_NAME);
ids.append(hpoId);
terms.append(hpoTerm);
}
EntityType emd = entityTypeFactory.create().setName(HPOAnnotator.NAME);
emd.addAttributes(Arrays.asList(hpoAnnotator.getIdsAttr(), hpoAnnotator.getTermsAttr()));
Entity aggregated = new DynamicEntity(emd);
aggregated.set(HPO_IDS, ids.toString());
aggregated.set(HPO_TERMS, terms.toString());
return ids.length() == 0 ? Optional.absent() : Optional.of(aggregated);
}
}