X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2Fstructurechooser%2FThreeDBStructureChooserQuerySource.java;fp=src%2Fjalview%2Fgui%2Fstructurechooser%2FThreeDBStructureChooserQuerySource.java;h=8b4258f9ab07328a67a5ea9a5a7e2994a42c3423;hb=0b165691fd3a7bb1d22438350157691a5d0bc2f9;hp=9e4ee21ec8915b7f730baebe36be6a8912c80a3f;hpb=09cfb28075a2a8be93a978981c59fa2f1c936199;p=jalview.git diff --git a/src/jalview/gui/structurechooser/ThreeDBStructureChooserQuerySource.java b/src/jalview/gui/structurechooser/ThreeDBStructureChooserQuerySource.java index 9e4ee21..8b4258f 100644 --- a/src/jalview/gui/structurechooser/ThreeDBStructureChooserQuerySource.java +++ b/src/jalview/gui/structurechooser/ThreeDBStructureChooserQuerySource.java @@ -92,6 +92,7 @@ public class ThreeDBStructureChooserQuerySource * @return the built query string */ + @Override public String buildQuery(SequenceI seq) { List refs = seq.getDBRefs(); @@ -181,6 +182,7 @@ public class ThreeDBStructureChooserQuerySource * @return * @throws Exception */ + @Override public FTSRestResponse fetchStructuresMetaData(SequenceI seq, Collection wantedFields, FilterOption selectedFilterOpt, boolean b) throws Exception @@ -195,7 +197,7 @@ public class ThreeDBStructureChooserQuerySource lastTdbRequest = tdbRequest; if (resultList != null) { // Query the PDB and add additional metadata - FTSRestResponse pdbResponse = fetchStructuresMetaDataFor( + List pdbResponse = fetchStructuresMetaDataFor( getPDBQuerySource(), resultList); resultList = joinResponses(resultList, pdbResponse); @@ -266,7 +268,7 @@ public class ThreeDBStructureChooserQuerySource { // tdb returns custom object TDB_FTSData row = (TDB_FTSData) _row; - String provider = (String) row.getProvider(); + String provider = row.getProvider(); FilterOption providerOpt = new FilterOption( "3DB Provider - " + provider, FILTER_SOURCE_PREFIX + provider, VIEWS_FILTER, false, this); @@ -345,6 +347,7 @@ public class ThreeDBStructureChooserQuerySource * @return * @throws Exception */ + @Override public FTSRestResponse selectFirstRankedQuery(SequenceI seq, Collection collectedResults, Collection wantedFields, String fieldToFilterBy, @@ -472,8 +475,9 @@ public class ThreeDBStructureChooserQuerySource * @return */ - public String buildPDBFTSQueryFor(FTSRestResponse upResponse) + public List buildPDBFTSQueryFor(FTSRestResponse upResponse) { + List ftsQueries = new ArrayList(); Set pdbIds = new HashSet(); int idx_modelId = getLastFTSRequest().getFieldIndex("Model id"); int idx_provider = getLastFTSRequest().getFieldIndex("Provider"); @@ -486,7 +490,25 @@ public class ThreeDBStructureChooserQuerySource pdbIds.add(id); } } - return String.join(" OR ", pdbIds).toString(); + StringBuilder sb = new StringBuilder(); + for (String pdbId : pdbIds) + { + if (sb.length() > 2500) + { + ftsQueries.add(sb.toString()); + sb.setLength(0); + } + if (sb.length() > 0) + { + sb.append(" OR "); + } + sb.append(pdbId); + } + if (sb.length() > 0) + { + ftsQueries.add(sb.toString()); + } + return ftsQueries; } /** @@ -496,34 +518,48 @@ public class ThreeDBStructureChooserQuerySource * @param upResponse * @return FTSRestResponse via PDBStructureChooserQuerySource */ - public FTSRestResponse fetchStructuresMetaDataFor( + public List fetchStructuresMetaDataFor( PDBStructureChooserQuerySource pdbquery, FTSRestResponse upResponse) throws Exception { - - String pdb_Query = buildPDBFTSQueryFor(upResponse); - if (pdb_Query.length() == 0) + List pdb_Queries = buildPDBFTSQueryFor(upResponse); + if (pdb_Queries.size() == 0) { return null; } - FTSRestResponse resultList; - FTSRestRequest pdbRequest = new FTSRestRequest(); - pdbRequest.setAllowEmptySeq(false); - pdbRequest.setResponseSize(500); - pdbRequest.setFieldToSearchBy("("); - // pdbRequest.setFieldToSortBy("pdb_id"); - pdbRequest.setWantedFields( - pdbquery.getDocFieldPrefs().getStructureSummaryFields()); - pdbRequest.setSearchTerm(pdb_Query + ")"); + List results = new ArrayList(); - resultList = pdbquery.executePDBFTSRestRequest(pdbRequest); + for (String pdb_Query : pdb_Queries) + { + FTSRestResponse resultList; + FTSRestRequest pdbRequest = new FTSRestRequest(); + pdbRequest.setAllowEmptySeq(false); + pdbRequest.setResponseSize(500); + pdbRequest.setFieldToSearchBy("("); + // pdbRequest.setFieldToSortBy("pdb_id"); + pdbRequest.setWantedFields( + pdbquery.getDocFieldPrefs().getStructureSummaryFields()); + pdbRequest.setSearchTerm(pdb_Query + ")"); + + // handle exceptions like server errors here - means the threedbeacons + // discovery isn't broken by issues to do with the PDBe SOLR api + try + { + resultList = pdbquery.executePDBFTSRestRequest(pdbRequest); + results.add(resultList); + lastPdbRequest = pdbRequest; + } catch (Exception ex) + { + Console.error("PDBFTSQuery failed", ex); + } - lastPdbRequest = pdbRequest; - return resultList; + } + + return results; } public FTSRestResponse joinResponses(FTSRestResponse upResponse, - FTSRestResponse pdbResponse) + List pdbResponses) { boolean hasPdbResp = lastPdbRequest != null; @@ -548,13 +584,16 @@ public class ThreeDBStructureChooserQuerySource } else { - for (final FTSData pdbrow : pdbResponse.getSearchSummary()) + for (final FTSRestResponse pdbResponse : pdbResponses) { - String pdbid = (String) pdbrow.getSummaryData()[pdbIdx]; - if (id.equalsIgnoreCase(pdbid)) + for (final FTSData pdbrow : pdbResponse.getSearchSummary()) { - row.getSummaryData()[tdbTitle_idx] = pdbrow - .getSummaryData()[pdbTitle_idx]; + String pdbid = (String) pdbrow.getSummaryData()[pdbIdx]; + if (id.equalsIgnoreCase(pdbid)) + { + row.getSummaryData()[tdbTitle_idx] = pdbrow + .getSummaryData()[pdbTitle_idx]; + } } } }