package org.molgenis.data.annotation.core.resources.impl;
import org.molgenis.data.Entity;
import org.molgenis.data.MolgenisDataException;
import org.molgenis.data.Query;
import org.molgenis.data.QueryRule.Operator;
import org.molgenis.data.RepositoryCapability;
import org.molgenis.data.csv.CsvRepository;
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.AbstractRepository;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;
public class GeneCsvRepository extends AbstractRepository
{
private final CsvRepository repository;
private final Map<Object, Entity> index = new HashMap<Object, Entity>();
private final String sourceAttributeName;
private final String targetAttributeName;
public GeneCsvRepository(File file, String sourceAttributeName, String targetAttributeName,
EntityTypeFactory entityTypeFactory, AttributeFactory attrMetaFactory, char separator)
{
this.repository = new CsvRepository(file, entityTypeFactory, attrMetaFactory, null, separator);
this.sourceAttributeName = sourceAttributeName;
this.targetAttributeName = targetAttributeName;
}
@Override
public Set<RepositoryCapability> getCapabilities()
{
return repository.getCapabilities();
}
@Override
public EntityType getEntityType()
{
return repository.getEntityType();
}
@Override
public Iterator<Entity> iterator()
{
return repository.iterator();
}
@Override
public Stream<Entity> findAll(Query<Entity> q)
{
if (q.getRules().isEmpty()) return getIndex().values().stream();
if ((q.getRules().size() != 1) || (q.getRules().get(0).getOperator() != Operator.EQUALS) || !targetAttributeName
.equals(q.getRules().get(0).getField()))
{
throw new MolgenisDataException(
"The only query allowed on this Repository is '" + targetAttributeName + " EQUALS'");
}
Entity result = getIndex().get(q.getRules().get(0).getValue());
return result == null ? Stream.empty() : Stream.of(result);
}
private Map<Object, Entity> getIndex()
{
if (index.isEmpty())
{
forEach(e ->
{
Object key = e.get(sourceAttributeName);
if (key == null) throw new MolgenisDataException(
"Missing value for attribute [" + sourceAttributeName + "] in entity [" + e + "]");
index.put(key, e);
});
}
return index;
}
}