JAL-3829 provide both PDBe queries and 3D-Beacons queries in the filter combo box
[jalview.git] / src / jalview / gui / structurechooser / ThreeDBStructureChooserQuerySource.java
index 2c6afe8..d64d643 100644 (file)
@@ -36,6 +36,8 @@ public class ThreeDBStructureChooserQuerySource
         extends StructureChooserQuerySource
 {
 
+  private static final String FILTER_TDBEACONS_COVERAGE = "3d_beacons_coverage";
+
   private static int MAX_QLENGTH = 7820;
 
   protected FTSRestRequest lastTdbRequest;
@@ -51,7 +53,7 @@ public class ThreeDBStructureChooserQuerySource
             PreferenceSource.STRUCTURE_CHOOSER,
             TDBeaconsFTSRestClient.getInstance());
 
-  }
+  }  
 
   /**
    * Builds a query string for a given sequences using its DBRef entries 3d
@@ -153,6 +155,7 @@ public class ThreeDBStructureChooserQuerySource
           FilterOption selectedFilterOpt, boolean b) throws Exception
   {
     FTSRestResponse resultList;
+    if (tdBeaconsFilter(selectedFilterOpt.getValue())) {
     FTSRestRequest tdbRequest = getTDBeaconsRequest(seq, wantedFields);
     resultList = tdbRestClient.executeRequest(tdbRequest);
 
@@ -163,6 +166,13 @@ public class ThreeDBStructureChooserQuerySource
     FTSRestResponse joinedResp = joinResponses(resultList,
             pdbResponse);
     return resultList;
+    } 
+    // use the PDBFTS directly
+    resultList = getPDBQuerySource().fetchStructuresMetaData(seq, wantedFields, selectedFilterOpt, b);
+    lastTdbRequest = getPDBQuerySource().lastPdbRequest;
+    lastPdbRequest = lastTdbRequest; // both queries the same - indicates we rank using PDBe
+    return resultList;
+    
   }
 
   PDBStructureChooserQuerySource pdbQuerySource=null;
@@ -195,26 +205,23 @@ public class ThreeDBStructureChooserQuerySource
   @Override
   public List<FilterOption> getAvailableFilterOptions(String VIEWS_FILTER)
   {
-    List<FilterOption> filters = new ArrayList<FilterOption>();
-    filters.add(
-            new FilterOption(MessageManager.getString("label.best_quality"),
-                    "overall_quality", VIEWS_FILTER, false));
-    filters.add(new FilterOption(
-            MessageManager.getString("label.best_resolution"), "resolution",
-            VIEWS_FILTER, false));
-    filters.add(new FilterOption(
-            MessageManager.getString("label.most_protein_chain"),
-            "number_of_protein_chains", VIEWS_FILTER, false));
-    filters.add(new FilterOption(
-            MessageManager.getString("label.most_bound_molecules"),
-            "number_of_bound_molecules", VIEWS_FILTER, false));
-    filters.add(new FilterOption(
-            MessageManager.getString("label.most_polymer_residues"),
-            "number_of_polymer_residues", VIEWS_FILTER, true));
-
+    List<FilterOption> filters = getPDBQuerySource().getAvailableFilterOptions(VIEWS_FILTER);
+    
+    filters.add(0,
+            new FilterOption("3D-Beacons Coverage",
+                    FILTER_TDBEACONS_COVERAGE, VIEWS_FILTER, true, this));
     return filters;
   }
+  private boolean tdBeaconsFilter(String fieldToFilterBy)
+  {
+    return FILTER_TDBEACONS_COVERAGE.equals(fieldToFilterBy);
+  }
 
+  @Override
+  public boolean needsRefetch(FilterOption selectedFilterOpt)
+  {
+    return tdBeaconsFilter(selectedFilterOpt.getValue()) && lastPdbRequest!=lastTdbRequest;
+  }
   /**
    * FTSRestClient specific query builder to pick top ranked entry from a
    * fetchStructuresMetaData query
@@ -235,20 +242,26 @@ public class ThreeDBStructureChooserQuerySource
           Collection<FTSDataColumnI> wantedFields, String fieldToFilterBy,
           boolean b) throws Exception
   {
+    if (tdBeaconsFilter(fieldToFilterBy))
+    {
+      TDBResultAnalyser analyser = new TDBResultAnalyser(seq,
+              collectedResults, lastTdbRequest);
 
-    TDBResultAnalyser analyser= new TDBResultAnalyser(seq,collectedResults, lastTdbRequest);
-    
-    
-    FTSRestResponse resultList = new FTSRestResponse();
+      FTSRestResponse resultList = new FTSRestResponse();
 
-    List<FTSData> filteredResponse = analyser.getFilteredResponse();
-    
-    List<FTSData> selectedStructures = analyser.selectStructures(filteredResponse);
-    resultList.setNumberOfItemsFound(selectedStructures.size());
-    resultList.setSearchSummary(selectedStructures);
-    return resultList;
+      List<FTSData> filteredResponse = analyser.getFilteredResponse();
+
+      List<FTSData> selectedStructures = analyser
+              .selectStructures(filteredResponse);
+      resultList.setNumberOfItemsFound(selectedStructures.size());
+      resultList.setSearchSummary(selectedStructures);
+      return resultList;
+    }
+    // Fall back to PDBe rankings
+    return getPDBQuerySource().selectFirstRankedQuery(seq, collectedResults, wantedFields, fieldToFilterBy, b);
   }
 
+
   @Override
   public PDBEntry[] collectSelectedRows(JTable restable, int[] selectedRows,
           List<SequenceI> selectedSeqsToView)