package org.nextprot.api.solr.index; import java.util.List; import org.apache.solr.client.solrj.SolrQuery.ORDER; import org.nextprot.api.solr.AutocompleteConfiguration; import org.nextprot.api.solr.FieldConfigSet; import org.nextprot.api.solr.IndexConfiguration; import org.nextprot.api.solr.IndexField; import org.nextprot.api.solr.IndexParameter; import org.nextprot.api.solr.IndexTemplate; import org.nextprot.api.solr.SearchByIdConfiguration; import org.nextprot.api.solr.SortConfig; public class EntryIndex extends IndexTemplate { // a way to get it easily from everywhere ! static public final String NAME = "entry"; public EntryIndex() { super(EntryIndex.NAME, "npentries1"); } protected EntryIndex(String name, String index) { super(name, index); } public Class<? extends ConfigurationName> getConfigNames() { return Configurations.class; } public Class<? extends IndexField> getFields() { return Fields.class; } private static class Configurations extends ConfigurationName { public static final String SIMPLE = "simple"; public static final String AUTOCOMPLETE = "autocomplete"; public static final String ID_SEARCH = "id"; public static final String PL_SEARCH = "pl_search"; } @Override protected void setupConfigurations() { // SIMPLE Config IndexConfiguration indexConfig = new IndexConfiguration(Configurations.SIMPLE); indexConfig.addConfigSet(FieldConfigSet.create(IndexParameter.FL) .add(Fields.ID) .add(Fields.EC_NAME) .add(Fields.FILTERS) .add(Fields.RECOMMENDED_AC) .add(Fields.RECOMMENDED_NAME) .add(Fields.CD_ANTIGEN) .add(Fields.INTERNATIONAL_NAME) .add(Fields.UNIPROT_NAME) .add(Fields.RECOMMENDED_GENE_NAMES) .add(Fields.GENE_BAND) .add(Fields.SCORE) .add(Fields.FUNCTION_DESC) .add(Fields.CHR_LOC) .add(Fields.ISOFORM_NUM) .add(Fields.PTM_NUM) .add(Fields.AA_LENGTH) .add(Fields.VAR_NUM) .add(Fields.PROTEIN_EXISTENCE)); indexConfig.addConfigSet(FieldConfigSet.create(IndexParameter.QF) //.add(Fields.ID,64) .add(Fields.IDSP0,64) .add(Fields.RECOMMENDED_AC, 8) .add(Fields.RECOMMENDED_NAME, 32) .add(Fields.CD_ANTIGEN) .add(Fields.INTERNATIONAL_NAME) .add(Fields.UNIPROT_NAME, 16) .add(Fields.ALTERNATIVE_ACS, 8) .add(Fields.ALTERNATIVE_NAMES, 16) .add(Fields.RECOMMENDED_GENE_NAMES, 32) .add(Fields.ALTERNATIVE_GENE_NAMES, 8) .add(Fields.FAMILY_NAMES, 4) .add(Fields.CV_NAMES, 4) .add(Fields.CV_SYNONYMS, 4) .add(Fields.CV_ANCESTORS, 2) .add(Fields.PEPTIDE, 2) .add(Fields.ANTIBODY, 2) .add(Fields.TEXT, 0)); indexConfig.addConfigSet(FieldConfigSet.create(IndexParameter.PF) //.add(Fields.ID, 640) .add(Fields.IDSP0,640) .add(Fields.RECOMMENDED_AC, 80) .add(Fields.RECOMMENDED_NAME, 320) .add(Fields.CD_ANTIGEN) .add(Fields.INTERNATIONAL_NAME) .add(Fields.UNIPROT_NAME, 160) .add(Fields.ALTERNATIVE_ACS, 80) .add(Fields.ALTERNATIVE_NAMES, 160) .add(Fields.RECOMMENDED_GENE_NAMES, 320) .add(Fields.ALTERNATIVE_GENE_NAMES, 80) .add(Fields.FAMILY_NAMES, 40) .add(Fields.CV_NAMES, 40) .add(Fields.CV_SYNONYMS, 40) .add(Fields.CV_ANCESTORS, 20) .add(Fields.PEPTIDE, 20) .add(Fields.ANTIBODY, 20) .add(Fields.TEXT, 20)); indexConfig.addOtherParameter("defType", "edismax") .addOtherParameter("df", "text") .addOtherParameter("mm", "100%") .addOtherParameter("lowercaseOperators", "true") .addOtherParameter("ps", "3") .addOtherParameter("facet", "true") .addOtherParameter("facet.field", "filters") .addOtherParameter("facet.limit", "10") .addOtherParameter("facet.method", "enum") .addOtherParameter("facet.mincount", "1") .addOtherParameter("facet.prefix", "") .addOtherParameter("facet.sort", "count"); SortConfig[] sortConfigs = new SortConfig[] { SortConfig.create("gene", Fields.RECOMMENDED_GENE_NAMES_S, ORDER.asc), SortConfig.create("protein", Fields.RECOMMENDED_NAME_S, ORDER.asc), SortConfig.create("family", Fields.FAMILY_NAMES_S, ORDER.asc), SortConfig.create("length", Fields.AA_LENGTH, ORDER.asc), SortConfig.create("ac", Fields.ID, ORDER.asc), SortConfig.create("chromosome", Fields.CHR_LOC_S, ORDER.asc), SortConfig.create("default", Fields.SCORE, ORDER.desc, 100) }; indexConfig.addSortConfig(sortConfigs); indexConfig.setDefaultSortName("default"); addConfiguration(indexConfig); // AUTOCOMPLETE Config AutocompleteConfiguration autocompleteConfig = new AutocompleteConfiguration(Configurations.AUTOCOMPLETE, indexConfig); autocompleteConfig .addOtherParameter("facet.field", "text") .addOtherParameter("stopwords", "true"); autocompleteConfig.addSortConfig(sortConfigs); addConfiguration(autocompleteConfig); indexConfig .addOtherParameter("spellcheck.dictionary", "default") .addOtherParameter("spellcheck", "on") .addOtherParameter("spellcheck.extendedResults", "true") .addOtherParameter("spellcheck.count", "10") .addOtherParameter("spellcheck.alternativeTermCount", "5") .addOtherParameter("spellcheck.maxResultsForSuggest", "5") .addOtherParameter("spellcheck.collate", "true") .addOtherParameter("spellcheck.collateExtendedResults", "true") .addOtherParameter("spellcheck.maxCollationTries", "5") .addOtherParameter("spellcheck.maxCollations", "10") .addOtherParameter("mm", "100%"); setConfigAsDefault(Configurations.SIMPLE); // ID_SEARCH Config IndexConfiguration idSearchConfig = new SearchByIdConfiguration(Configurations.ID_SEARCH); idSearchConfig.addSortConfig(SortConfig.create("default", Fields.SCORE, ORDER.desc)); idSearchConfig.addConfigSet(indexConfig.getFieldConfigSets().get(IndexParameter.FL)); idSearchConfig.setDefaultSortName("default"); addConfiguration(idSearchConfig); // PL_SEARCH Config IndexConfiguration plSearchConfig = new SearchByIdConfiguration(Configurations.PL_SEARCH); plSearchConfig.addSortConfig(SortConfig.create("default", Fields.SCORE, ORDER.desc)); plSearchConfig.addConfigSet(indexConfig.getFieldConfigSets().get(IndexParameter.FL)); plSearchConfig.setDefaultSortName("default"); plSearchConfig.addSortConfig(sortConfigs); plSearchConfig.addOtherParameter("facet", "true") .addOtherParameter("facet.field", "filters") .addOtherParameter("facet.limit", "10") .addOtherParameter("facet.method", "enum") .addOtherParameter("facet.mincount", "1") .addOtherParameter("facet.prefix", "") .addOtherParameter("facet.sort", "count"); addConfiguration(plSearchConfig); } @Override public IndexField[] getFieldValues() { return Fields.values(); } public enum Fields implements IndexField { ID("id","id", String.class), // public name for id is necessary for executeIdQuery() otherwise the id: of the query string is escaped PROTEIN_EXISTENCE("protein_existence", String.class), PE_LEVEL("pe_level","pe", Integer.class), PUBLI_CURATED_COUNT("publi_curated_count", Integer.class), PUBLI_LARGE_SCALE_COUNT("publi_large_scale_count", Integer.class), PUBLI_COMPUTED_COUNT("publi_computed_count", Integer.class), INFORMATIONAL_SCORE("informational_score", Float.class), FILTERS("filters", String.class), EC_NAME("ec_name", String.class), FUNCTION_DESC("function_desc", List.class), //List<String> CHR_LOC("chr_loc", String.class), //CHR_LOC_S("chr_loc_s", Long.class), CHR_LOC_S("chr_loc_s", Integer.class), ISOFORM_NUM("isoform_num", Integer.class), PTM_NUM("ptm_num", Integer.class), VAR_NUM("var_num", Integer.class), AA_LENGTH("aa_length", Integer.class), IDSP0("idsp0", "idsp0", String.class), // a copy of ID but having type text_split0 RECOMMENDED_AC("recommended_ac","ac", String.class), RECOMMENDED_NAME("recommended_name", String.class), RECOMMENDED_NAME_S("recommended_name_s", String.class), CD_ANTIGEN("cd_antigen", List.class), INTERNATIONAL_NAME("international_name", List.class), UNIPROT_NAME("uniprot_name", List.class), //Why is it defined as an array??? ALTERNATIVE_ACS("alternative_acs", List.class), ALTERNATIVE_NAMES("alternative_names", List.class), RECOMMENDED_GENE_NAMES("recommended_gene_names", String.class), RECOMMENDED_GENE_NAMES_S("recommended_gene_names_s", String.class), ALTERNATIVE_GENE_NAMES("alternative_gene_names", List.class), ORF_NAMES("orf_names", List.class), REGION_NAME("region_name", List.class), FAMILY_NAMES("family_names", String.class), FAMILY_NAMES_S("family_names_s", String.class), ANNOTATIONS("annotations", List.class), CV_NAMES("cv_names", List.class), CV_SYNONYMS("cv_synonyms", List.class), CV_ANCESTORS("cv_ancestors", List.class), CV_ACS("cv_acs", List.class), CV_ANCESTORS_ACS("cv_ancestors_acs", List.class), XREFS("xrefs", List.class), PUBLICATIONS("publications", List.class), CLONE_NAME("clone_name", List.class), ENSEMBL("ensembl", List.class), MICROARRAY_PROBE("microarray_probe", List.class), GENE_BAND("gene_band", List.class), PEPTIDE("peptide", List.class), ANTIBODY("antibody", List.class), INTERACTIONS("interactions", List.class), EXPRESSION("expression", List.class), //Special fields computed by SOLR TEXT("text", List.class), SCORE("score", Float.class); private String fieldName; private String publicName; private Class<?> clazz; private Fields(String fieldName) { this.fieldName = fieldName; } private Fields(String fieldName, String publicName) { this.fieldName = fieldName; this.publicName=publicName; } private Fields(String fieldName, Class<?> clazz) { this.fieldName = fieldName; this.clazz=clazz; } private Fields(String fieldName, String publicName, Class<?> clazz) { this.fieldName = fieldName; this.publicName=publicName; this.clazz=clazz; } public String getName() { return this.fieldName; } public static String[] stringValues() { Fields[] fs = values(); String[] sv = new String[fs.length]; for(int i=0; i<sv.length; i++) sv[i] = fs[i].fieldName; return sv; } @Override public String getPublicName() { return this.publicName; } @Override public boolean hasPublicName() { return this.publicName!=null && this.publicName.length()>0; } public Class<?> getClazz() { return this.clazz; } } }