/** * Create a new WebResults object. * * @param pathQuery used to get the paths of the columns * @param results the underlying Results object * @param im intermine API * @param pathToQueryNode the mapping between Paths (in the columnPaths argument) and the * QueryNodes in the results object * @param pathToBagQueryResult a Map containing results from LOOKUP operations */ public WebResults( InterMineAPI im, PathQuery pathQuery, Results results, Map<String, QuerySelectable> pathToQueryNode, Map<String, BagQueryResult> pathToBagQueryResult) { this.im = im; this.osResults = results; this.flatResults = new ResultsFlatOuterJoinsImpl(((List) osResults), osResults.getQuery()); model = im.getModel(); this.columnPaths = new ArrayList<Path>(); try { for (String pathString : pathQuery.getView()) { this.columnPaths.add(pathQuery.makePath(pathString)); } } catch (PathException e) { throw new RuntimeException("Error creating WebResults because PathQuery is invalid", e); } classKeys = im.getClassKeys(); this.pathToQueryNode = new HashMap<String, QuerySelectable>(); if (pathToQueryNode != null) { this.pathToQueryNode.putAll(pathToQueryNode); } this.pathToBagQueryResult = new HashMap<String, BagQueryResult>(); if (pathToBagQueryResult != null) { this.pathToBagQueryResult.putAll(pathToBagQueryResult); } this.pathQuery = pathQuery; pathToIndex = getPathToIndex(); redirector = im.getLinkRedirector(); addColumnsInternal(columnPaths); }
/** * Calls ObjectStore.releaseGoFaster() if this object wraps a Results object from an * ObjectStoreInterMineImpl. * * @throws ObjectStoreException if ObjectStoreInterMineImpl.releaseGoFaster() throws the exception */ public synchronized void releaseGoFaster() throws ObjectStoreException { goingFaster--; if (goingFaster == 0) { ObjectStore os = osResults.getObjectStore(); if (os instanceof ObjectStoreInterMineImpl) { ((ObjectStoreInterMineImpl) os).releaseGoFaster(osResults.getQuery()); } } }
/** * Calls ObjectStore.goFaster() if this object wraps a Results object from an * ObjectStoreInterMineImpl. * * @throws ObjectStoreException if ObjectStoreInterMineImpl.goFaster() throws the exception */ public synchronized void goFaster() throws ObjectStoreException { goingFaster++; if (goingFaster == 1) { osResults = changeResultBatchSize(osResults, BIG_BATCH_SIZE); ObjectStore os = osResults.getObjectStore(); if (os instanceof ObjectStoreInterMineImpl) { ((ObjectStoreInterMineImpl) os).goFaster(osResults.getQuery()); } } }
/** * Create and ObjectStore query from a PathQuery and execute it, returning results in a format * appropriate for displaying a web table. * * @param pathQuery the query to execute * @param pathToBagQueryResult will be populated with results from bag queries used in any LOOKUP * constraints * @return results in a format appropriate for display in a web page table * @throws ObjectStoreException if problem running query */ public WebResults execute(PathQuery pathQuery, Map<String, BagQueryResult> pathToBagQueryResult) throws ObjectStoreException { Map<String, QuerySelectable> pathToQueryNode = new HashMap<String, QuerySelectable>(); Query q = makeQuery(pathQuery, pathToBagQueryResult, pathToQueryNode); Results results = os.execute(q, Constants.BATCH_SIZE, true, true, false); Query realQ = results.getQuery(); if (realQ == q) { queryToPathToQueryNode.put(q, pathToQueryNode); } else { pathToQueryNode = queryToPathToQueryNode.get(realQ); } WebResults webResults = new WebResults(im, pathQuery, results, pathToQueryNode, pathToBagQueryResult); return webResults; }
/** * Make a copy of a Results object, but with a different batch size. * * @param oldResults the original Results objects * @param newBatchSize the new batch size * @return a new Results object with a new batch size */ private Results changeResultBatchSize(Results oldResults, int newBatchSize) { Results newResults = oldResults.getObjectStore().execute(oldResults.getQuery(), newBatchSize, true, true, true); return newResults; }