@Override protected List<Map<String, Object>> getData( Map<String, String> parameters, int startRow, int endRow) { // creation of formats is done here because they are not thread safe final SimpleDateFormat xmlDateFormat = JsonUtils.createDateFormat(); final SimpleDateFormat xmlDateTimeFormat = JsonUtils.createDateTimeFormat(); final List<Map<String, Object>> result = new ArrayList<Map<String, Object>>(); String selectorId = parameters.get(SelectorConstants.DS_REQUEST_SELECTOR_ID_PARAMETER); if (StringUtils.isEmpty(selectorId)) { return result; } OBContext.setAdminMode(); try { Selector sel = OBDal.getInstance().get(Selector.class, selectorId); List<SelectorField> fields = OBDao.getActiveOBObjectList(sel, Selector.PROPERTY_OBUISELSELECTORFIELDLIST); // Forcing object initialization to prevent LazyInitializationException in case session is // cleared when number of records is big enough Hibernate.initialize(fields); // Parse the HQL in case that optional filters are required String HQL = parseOptionalFilters(parameters, sel, xmlDateFormat); String sortBy = parameters.get("_sortBy"); HQL += getSortClause(sortBy, sel); Query selQuery = OBDal.getInstance().getSession().createQuery(HQL); String[] queryAliases = selQuery.getReturnAliases(); if ("true".equals(parameters.get(JsonConstants.NOCOUNT_PARAMETER))) { int totalRows = 0, queryListSize = 0, clearEachLoop = 100; // Defaulted to endRow + 2 to check for more records while scrolling. totalRows = endRow + 2; ScrollableResults queryResults = selQuery.scroll(ScrollMode.FORWARD_ONLY); try { while (queryResults.next()) { queryListSize++; if (queryListSize % clearEachLoop == 0) { OBDal.getInstance().getSession().clear(); } } } finally { queryResults.close(); } if (startRow < endRow) { if (queryListSize < endRow) { totalRows = queryListSize; } parameters.put(JsonConstants.RESPONSE_TOTALROWS, String.valueOf(totalRows)); } } if (startRow > 0) { selQuery.setFirstResult(startRow); } if (endRow > startRow) { selQuery.setMaxResults(endRow - startRow + 1); } for (Object objResult : selQuery.list()) { final Map<String, Object> data = new LinkedHashMap<String, Object>(); Object[] resultList = new Object[1]; if (objResult instanceof Object[]) { resultList = (Object[]) objResult; } else { resultList[0] = objResult; } for (SelectorField field : fields) { // TODO: throw an exception if the display expression doesn't match any returned alias. for (int i = 0; i < queryAliases.length; i++) { if (queryAliases[i].equals(field.getDisplayColumnAlias())) { Object value = resultList[i]; if (value instanceof Date) { value = xmlDateFormat.format(value); } if (value instanceof Timestamp) { value = xmlDateTimeFormat.format(value); value = JsonUtils.convertToCorrectXSDFormat((String) value); } data.put(queryAliases[i], value); } } } result.add(data); } } finally { OBContext.restorePreviousMode(); } return result; }
/** * Returns the aliases of the HQL query. * * @return the aliases of the HQL query */ public String[] getReturnAliases() { return query.getReturnAliases(); }