package org.nextprot.api.tasks.solr.indexer.entry.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.nextprot.api.core.dao.EntityName;
import org.nextprot.api.core.domain.Entry;
import org.nextprot.api.core.domain.Family;
import org.nextprot.api.core.domain.Overview;
import org.nextprot.api.solr.index.EntryIndex.Fields;
import org.nextprot.api.tasks.solr.indexer.entry.EntryFieldBuilder;
import org.nextprot.api.tasks.solr.indexer.entry.FieldBuilder;
@EntryFieldBuilder
public class NamesFieldBuilder extends FieldBuilder {
@Override
protected void init(Entry entry) {
Overview ovv = entry.getOverview();
//TODO Daniel repeated code in CvFieldBuilder
List <EntityName> altnames = null;
altnames = ovv.getProteinNames();
if(altnames != null )
for (EntityName altname : altnames) {
List <EntityName> paltnames = altname.getSynonyms();
if(paltnames != null )
for (EntityName paltfullname : paltnames) {
if(!paltfullname.getType().equals("enzyme name")) // Enzymes are delt with elsewhere
addField(Fields.ALTERNATIVE_NAMES, paltfullname.getName());
List <EntityName> paltshortnames = paltfullname.getSynonyms();
if(paltshortnames != null )
for (EntityName paltshortname : paltshortnames) {
if(!paltshortname.getType().equals("enzyme name")) addField(Fields.ALTERNATIVE_NAMES, paltshortname.getName());
}
}
}
altnames = ovv.getAdditionalNames(); // special names (INN, allergens)
if(altnames != null )
for (EntityName altname : altnames) {
//System.err.println(altname.getName());
addField(Fields.ALTERNATIVE_NAMES, altname.getName());
String nametype = altname.getType();
if(nametype.equals("CD antigen"))
addField(Fields.CD_ANTIGEN, altname.getName());
else if(nametype.equals("International Nonproprietary Names"))
addField(Fields.INTERNATIONAL_NAME, altname.getName());
}
altnames = ovv.getFunctionalRegionNames(); // The enzymatic activities of a multifunctional enzyme (maybe redundent with getEnzymes)
if(altnames != null )
for (EntityName altname : altnames) {
addField(Fields.REGION_NAME, altname.getName()); // region_name should be renamed activity_name
List <EntityName> paltnames = altname.getSynonyms();
if(paltnames != null )
for (EntityName ecname : paltnames) {
addField(Fields.REGION_NAME, ecname.getName());
List <EntityName> shortnames = ecname.getSynonyms();
if(shortnames != null ){
for (EntityName xname : shortnames) addField(Fields.REGION_NAME, xname.getName());
}
}
}
// Gene names, synonyms and orf names
List <EntityName> genenames = ovv.getGeneNames();
if(genenames != null ) {
String allgenenames = null;
for (EntityName currname : genenames) { // Concatenate official gene names
if (allgenenames == null) allgenenames = currname.getName();
else allgenenames += "; " + currname.getName();
List <EntityName> genesynonames = currname.getSynonyms();
if(genesynonames != null)
for (EntityName genesynoname : genesynonames) {
if(!genesynoname.getType().equals("open reading frame"))
addField(Fields.ALTERNATIVE_GENE_NAMES, genesynoname.getName());
}
}
addField(Fields.RECOMMENDED_GENE_NAMES, allgenenames);
addField(Fields.RECOMMENDED_GENE_NAMES_S, allgenenames);
List <String> orfnames = getORFNames(ovv);
if(orfnames != null)
for( String orfname : orfnames)
addField(Fields.ORF_NAMES, orfname);
}
//else System.err.println("no gene names for: " + entry.getUniqueName());
List<Family> families = ovv.getFamilies();
String allfamilies = null;
for (Family family : families) { // We choose to index the descriptions (like "Belongs to the DNase II family") instead of the names
if (allfamilies == null) allfamilies = family.getDescription(); // allfamilies = family.getName();
else allfamilies += " , " + family.getDescription();
}
if (allfamilies != null) {
addField(Fields.FAMILY_NAMES, allfamilies);
addField(Fields.FAMILY_NAMES_S, allfamilies);
}
}
static List<String> getORFNames (Overview ovv){
List<String> orfnames = new ArrayList<String>();
for(EntityName gn : ovv.getGeneNames()){
if(gn.getCategory().equals("ORF")){
orfnames.add(gn.getName());
}
List<EntityName> synonyms = gn.getSynonyms();
if(synonyms != null)
for(EntityName syn: gn.getSynonyms()){
if(syn.getCategory().equals("ORF")) orfnames.add(syn.getName());
}
}
return orfnames;
}
@Override
public Collection<Fields> getSupportedFields() {
return Arrays.asList(Fields.INTERNATIONAL_NAME, Fields.CD_ANTIGEN, Fields.ORF_NAMES, Fields.FAMILY_NAMES, Fields.FAMILY_NAMES_S, Fields.ALTERNATIVE_GENE_NAMES, Fields.RECOMMENDED_GENE_NAMES, Fields.RECOMMENDED_GENE_NAMES_S, Fields.REGION_NAME, Fields.ALTERNATIVE_NAMES);
}
}