public List<String> toPrefix(String in) { List<String> tokens = buildTokens(alignINClause(in)); List<String> output = new ArrayList<String>(); List<String> stack = new ArrayList<String>(); for (String token : tokens) { if (isOperand(token)) { if (token.equals(")")) { while (openParanthesesFound(stack)) { output.add(stack.remove(stack.size() - 1)); } if (stack.size() > 0) { // temporarily fix for issue #189 stack.remove(stack.size() - 1); } } else { while (openParanthesesFound(stack) && !hasHigherPrecedence(token, stack.get(stack.size() - 1))) { output.add(stack.remove(stack.size() - 1)); } stack.add(token); } } else { output.add(token); } } while (stack.size() > 0) { output.add(stack.remove(stack.size() - 1)); } return output; }
private String alignINClause(String in) { String paramIn = in; final int indexLowerIn = paramIn.indexOf(IN_LOWER); final int indexLowerInWithParentheses = paramIn.indexOf(IN_LOWER_P); final int indexUpperIn = paramIn.indexOf(IN_UPPER); final int indexUpperInWithParentheses = paramIn.indexOf(IN_UPPER_P); // find first occurrence of in clause. final int indexIn = findMinIfNot(indexUpperInWithParentheses, findMinIfNot(indexUpperIn, findMinIfNot(indexLowerIn, indexLowerInWithParentheses, NO_INDEX), NO_INDEX), NO_INDEX ); if (indexIn > NO_INDEX && (indexIn == indexLowerInWithParentheses || indexIn == indexUpperInWithParentheses)) { // 3 is the size of param in ending with a parentheses. // add SPLIT_EXPRESSION paramIn = paramIn.substring(0, indexIn + 3) + SPLIT_EXPRESSION + paramIn.substring(indexIn + 3); } String sql = paramIn; if (indexIn != NO_INDEX) { final int indexOpen = paramIn.indexOf('(', indexIn); final int indexClose = paramIn.indexOf(')', indexOpen); String sub = paramIn.substring(indexOpen, indexClose + 1); sub = sub.replaceAll(" ", ""); sql = paramIn.substring(0, indexOpen) + sub + alignINClause(paramIn.substring(indexClose + 1)); } return sql; }
private List<String> buildTokens(String in) { List<String> tokens = split(in); if (tokens.contains("between") || tokens.contains("BETWEEN")) { boolean found = true; boolean dirty = false; betweens: while (found) { for (int i = 0; i < tokens.size(); i++) { if ("between".equalsIgnoreCase(tokens.get(i))) { tokens.set(i, "betweenAnd"); tokens.remove(i + 2); dirty = true; continue betweens; } } found = false; } if (dirty) { for (int i = 0; i < tokens.size(); i++) { if ("betweenAnd".equals(tokens.get(i))) { tokens.set(i, "between"); } } } } return tokens; }
paramSql = newSql.toString(); Parser parser = new Parser(); List<String> sqlTokens = parser.toPrefix(paramSql); List<Object> tokens = new ArrayList<Object>(sqlTokens); if (tokens.size() == 0) { for (int i = 0; i < tokens.size(); i++) { Object tokenObj = tokens.get(i); if (tokenObj instanceof String && parser.isOperand((String) tokenObj)) { String token = (String) tokenObj; if ("=".equals(token) || "==".equals(token)) {
paramSql = newSql.toString(); Parser parser = new Parser(); List<String> sqlTokens = parser.toPrefix(paramSql); List<Object> tokens = new ArrayList<Object>(sqlTokens); if (tokens.size() == 0) { for (int i = 0; i < tokens.size(); i++) { Object tokenObj = tokens.get(i); if (tokenObj instanceof String && parser.isOperand((String) tokenObj)) { String token = (String) tokenObj; if ("=".equals(token) || "==".equals(token)) {
public List<String> toPrefix(String in) { List<String> tokens = buildTokens(alignINClause(in)); List<String> output = new ArrayList<String>(); List<String> stack = new ArrayList<String>(); for (String token : tokens) { if (isOperand(token)) { if (token.equals(")")) { while (openParanthesesFound(stack)) { output.add(stack.remove(stack.size() - 1)); } if (stack.size() > 0) { // temporarily fix for issue #189 stack.remove(stack.size() - 1); } } else { while (openParanthesesFound(stack) && !hasHigherPrecedence(token, stack.get(stack.size() - 1))) { output.add(stack.remove(stack.size() - 1)); } stack.add(token); } } else { output.add(token); } } while (stack.size() > 0) { output.add(stack.remove(stack.size() - 1)); } return output; }
private String alignINClause(String in) { String paramIn = in; final int indexLowerIn = paramIn.indexOf(IN_LOWER); final int indexLowerInWithParentheses = paramIn.indexOf(IN_LOWER_P); final int indexUpperIn = paramIn.indexOf(IN_UPPER); final int indexUpperInWithParentheses = paramIn.indexOf(IN_UPPER_P); // find first occurrence of in clause. final int indexIn = findMinIfNot(indexUpperInWithParentheses, findMinIfNot(indexUpperIn, findMinIfNot(indexLowerIn, indexLowerInWithParentheses, NO_INDEX), NO_INDEX), NO_INDEX ); if (indexIn > NO_INDEX && (indexIn == indexLowerInWithParentheses || indexIn == indexUpperInWithParentheses)) { // 3 is the size of param in ending with a parentheses. // add SPLIT_EXPRESSION paramIn = paramIn.substring(0, indexIn + 3) + SPLIT_EXPRESSION + paramIn.substring(indexIn + 3); } String sql = paramIn; if (indexIn != NO_INDEX) { final int indexOpen = paramIn.indexOf('(', indexIn); final int indexClose = paramIn.indexOf(')', indexOpen); String sub = paramIn.substring(indexOpen, indexClose + 1); sub = sub.replaceAll(" ", ""); sql = paramIn.substring(0, indexOpen) + sub + alignINClause(paramIn.substring(indexClose + 1)); } return sql; }
private List<String> buildTokens(String in) { List<String> tokens = split(in); if (tokens.contains("between") || tokens.contains("BETWEEN")) { boolean found = true; boolean dirty = false; betweens: while (found) { for (int i = 0; i < tokens.size(); i++) { if ("between".equalsIgnoreCase(tokens.get(i))) { tokens.set(i, "betweenAnd"); tokens.remove(i + 2); dirty = true; continue betweens; } } found = false; } if (dirty) { for (int i = 0; i < tokens.size(); i++) { if ("betweenAnd".equals(tokens.get(i))) { tokens.set(i, "between"); } } } } return tokens; }