+
+ @Override
+ protected FTSRestRequest getLastFTSRequest()
+ {
+ return lastTdbRequest;
+ }
+
+ /**
+ * generate a query for PDBFTS to retrieve structure metadata
+ *
+ * @param ftsRestRequest
+ * @param upResponse
+ * @return
+ */
+
+ public List<String> buildPDBFTSQueryFor(FTSRestResponse upResponse)
+ {
+ List<String> ftsQueries = new ArrayList<String>();
+ Set<String> pdbIds = new HashSet<String>();
+ int idx_modelId = getLastFTSRequest().getFieldIndex("Model id");
+ int idx_provider = getLastFTSRequest().getFieldIndex("Provider");
+ for (FTSData row : upResponse.getSearchSummary())
+ {
+ String id = (String) row.getSummaryData()[idx_modelId];
+ String provider = (String) row.getSummaryData()[idx_provider];
+ if ("PDBe".equalsIgnoreCase(provider))
+ {
+ pdbIds.add(id);
+ }
+ }
+ 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;
+ }
+
+ /**
+ * query PDBe for structure metadata
+ *
+ * @param pdbquery
+ * @param upResponse
+ * @return FTSRestResponse via PDBStructureChooserQuerySource
+ */
+ public List<FTSRestResponse> fetchStructuresMetaDataFor(
+ PDBStructureChooserQuerySource pdbquery,
+ FTSRestResponse upResponse) throws Exception
+ {
+ List<String> pdb_Queries = buildPDBFTSQueryFor(upResponse);
+ if (pdb_Queries.size() == 0)
+ {
+ return null;
+ }
+ List<FTSRestResponse> results = new ArrayList<FTSRestResponse>();
+
+ 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);
+ if (resultList.getNumberOfItemsFound() == 0)
+ {
+ Console.info("Unexpectedly returned no results for pdbe query: "
+ + pdb_Query);
+ }
+ results.add(resultList);
+ lastPdbRequest = pdbRequest;
+ } catch (Exception ex)
+ {
+ Console.error("PDBFTSQuery failed", ex);
+ }
+
+ }
+
+ return results;
+ }
+
+ public FTSRestResponse joinResponses(FTSRestResponse upResponse,
+ List<FTSRestResponse> pdbResponses)
+ {
+ boolean hasPdbResp = lastPdbRequest != null;
+
+ int idx_provider = getLastFTSRequest().getFieldIndex("Provider");
+ // join on
+ int idx_modelId = getLastFTSRequest().getFieldIndex("Model id");
+ int pdbIdx = hasPdbResp ? lastPdbRequest.getFieldIndex("PDB Id") : -1;
+ int pdbTitle_idx = hasPdbResp ? lastPdbRequest.getFieldIndex("Title")
+ : -1;
+ int tdbTitle_idx = getLastFTSRequest().getFieldIndex("Title");
+
+ for (final FTSData row : upResponse.getSearchSummary())
+ {
+ String id = (String) row.getSummaryData()[idx_modelId];
+ String provider = (String) row.getSummaryData()[idx_provider];
+ if ("PDBe".equalsIgnoreCase(provider))
+ {
+ if (!hasPdbResp)
+ {
+ jalview.bin.Console.outPrintln(
+ "Warning: seems like we couldn't get to the PDBe search interface.");
+ }
+ else
+ {
+ for (final FTSRestResponse pdbResponse : pdbResponses)
+ {
+ for (final FTSData pdbrow : pdbResponse.getSearchSummary())
+ {
+ String pdbid = (String) pdbrow.getSummaryData()[pdbIdx];
+ if (id.equalsIgnoreCase(pdbid))
+ {
+ row.getSummaryData()[tdbTitle_idx] = pdbrow
+ .getSummaryData()[pdbTitle_idx];
+ }
+ }
+ }
+ }
+
+ }
+ else
+ {
+ row.getSummaryData()[tdbTitle_idx] = "Model from TDB";
+ }
+ }
+ return upResponse;
+ }
+
+ public TDB_FTSData getFTSDataFor(JTable restable, int selectedRow,
+ Collection<FTSData> discoveredStructuresSet)
+ {
+ int idColumnIndex = restable.getColumn("Model id").getModelIndex();
+
+ String modelId = (String) restable.getValueAt(selectedRow,
+ idColumnIndex);
+ for (FTSData row : discoveredStructuresSet)
+ {
+ if (row instanceof TDB_FTSData
+ && ((TDB_FTSData) row).getModelId().equals(modelId))
+ {
+ return ((TDB_FTSData) row);
+ }
+ }
+ return null;
+ }
+