private LimitType limitQuery( String limitPattern, LimitType limitType, String queryString, StringBuilder queryResult, Integer firstResult, Integer maxResults) { if (limitPattern == null) return null; int ix = limitPattern.indexOf("$S"); if (ix >= 0) { limitType.afterSql = limitPattern.indexOf("$", ix + 1) > 0; queryResult.append(limitPattern.substring(0, ix)); queryResult.append(queryString); queryResult.append(limitPattern.substring(ix + 2)); } else { ix = limitPattern.indexOf("$s"); if (ix >= 0) { limitType.afterSql = limitPattern.indexOf("$", ix + 1) > 0; int ix2 = queryString.toLowerCase().indexOf("select"); if (ix2 < 0) return null; queryResult.append(limitPattern.substring(0, ix)); queryResult.append(queryString.substring(ix2 + 6)); queryResult.append(limitPattern.substring(ix + 2)); } else { return null; } } if (limitType.alsoFirst) { ix = queryResult.indexOf("$F"); if (ix >= 0) { if (queryResult.indexOf("$m", ix) < 0 && queryResult.indexOf("$M", ix) < 0) limitType.maxBeforeFirst = true; queryResult.replace(ix, ix + 2, "?"); } else { ix = queryResult.indexOf("$f"); if (ix >= 0) { limitType.zeroBasedFirst = true; if (queryResult.indexOf("$m", ix) < 0 && queryResult.indexOf("$M", ix) < 0) limitType.maxBeforeFirst = true; queryResult.replace(ix, ix + 2, "?"); } else { return null; } } } ix = queryResult.indexOf("$M"); if (ix >= 0) { queryResult.replace(ix, ix + 2, "?"); } else { ix = queryResult.indexOf("$m"); if (ix >= 0) { limitType.rowidBasedMax = true; queryResult.replace(ix, ix + 2, "?"); } else { return null; } } return limitType; }
/** {@inheritDoc} */ @Override public LimitType limitQuery( String queryString, StringBuilder queryResult, Integer firstResult, Integer maxResults, boolean ordered) { LimitType limitType = new LimitType(); if (maxResults == null || maxResults <= 0) return null; if (firstResult != null && firstResult > 0) { limitType.alsoFirst = true; String limitPattern = (ordered) ? SqlProcessContext.getFeature(SqlFeature.LIMIT_FROM_TO_ORDERED) : SqlProcessContext.getFeature(SqlFeature.LIMIT_FROM_TO); if (limitPattern == null && ordered) limitPattern = SqlProcessContext.getFeature(SqlFeature.LIMIT_FROM_TO); limitType = limitQuery(limitPattern, limitType, queryString, queryResult, firstResult, maxResults); return limitType; } else { String limitPattern = (ordered) ? SqlProcessContext.getFeature(SqlFeature.LIMIT_TO_ORDERED) : SqlProcessContext.getFeature(SqlFeature.LIMIT_TO); if (limitPattern == null && ordered) limitPattern = SqlProcessContext.getFeature(SqlFeature.LIMIT_TO); limitType = limitQuery(limitPattern, limitType, queryString, queryResult, firstResult, maxResults); return limitType; } }