public void remove() {
   // FIXME abort the subsearches.
   // FIXME in fact this shouldn't be necessary, the TaskAbortException should be propagated
   // upwards???
   // FIXME really we'd want to convert it into a failed status so we could show that one failed,
   // and still show partial results
   if (subsearches != null) {
     for (Execution<Set<TermEntry>> sub : subsearches) {
       if (sub instanceof Search) ((Search) sub).remove();
     }
   }
   removeSearch(this);
 }
 private static synchronized void removeSearch(Search search) {
   allsearches.remove(search.subject);
   searchhashes.remove(search.hashCode());
 }
 private static synchronized void storeSearch(Search search) {
   allsearches.put(search.getSubject(), search);
   searchhashes.put(search.hashCode(), search);
 }