예제 #1
0
  /**
   * Return the query specified in the request, shorn of all duplicate classes in the view. Note, it
   * is the users responsibility to ensure that there are only SequenceFeatures in the view.
   *
   * @return A query.
   */
  protected PathQuery getQuery() {
    String xml = getRequiredParameter(XML_PARAM);
    PathQueryBuilder builder = getQueryBuilder(xml);
    PathQuery pq = builder.getQuery();

    List<String> newView = new ArrayList<String>();
    Set<ClassDescriptor> seenTypes = new HashSet<ClassDescriptor>();

    for (String viewPath : pq.getView()) {
      Path p;
      try {
        p = new Path(pq.getModel(), viewPath);
      } catch (PathException e) {
        throw new BadRequestException("Query is invalid", e);
      }
      ClassDescriptor cd = p.getLastClassDescriptor();
      if (!seenTypes.contains(cd)) {
        newView.add(viewPath);
      }
      seenTypes.add(cd);
    }
    if (!newView.equals(pq.getView())) {
      pq.clearView();
      pq.addViews(newView);
    }

    return pq;
  }
예제 #2
0
  @Override
  protected void execute() throws Exception {

    Profile profile = getPermission().getProfile();
    PathQueryExecutor executor = this.im.getPathQueryExecutor(profile);
    // For FASTA/BED/GFF only set Gene.id in the view in im-tables system
    PathQuery pathQuery = getQuery();
    checkPathQuery(pathQuery);

    // Bring back original views for extra fields to be included in data export
    // NB: Functional but bad practice?
    // view in http request will look like: view=Gene.name&view=Gene.length...
    // Support the standard mechanism for accepting multiple parameter values
    List<String> views = getPathQueryViews(request.getParameterValues(VIEW_PARAM));
    if (views != null) {
      try {
        pathQuery.addViews(views);
      } catch (IllegalArgumentException e) {
        throw new BadRequestException("Bad value for view parameter", e);
      }
      // Remove duplicates in views
      ArrayList<String> al = new ArrayList<String>();
      al.clear();
      al.addAll(new LinkedHashSet<String>(pathQuery.getView()));
      pathQuery.clearView();
      pathQuery.addViews(al);
    }

    Exporter exporter = getExporter(pathQuery);

    ExportResultsIterator iter = null;
    try {
      iter = executor.execute(pathQuery, 0, WebServiceRequestParser.DEFAULT_LIMIT);
      iter.goFaster();
      exporter.export(iter);
    } finally {
      if (iter != null) {
        iter.releaseGoFaster();
      }
    }
  }