/** * 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; }
@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(); } } }