public static String projectionOnTargetValuesFromCorrespondences( List<VariableCorrespondence> correspondences, String fromClause, String whereClause) { StringBuilder result = new StringBuilder(); result.append(INDENT).append("select distinct \n"); for (int i = 0; i < correspondences.size(); i++) { VariableCorrespondence correspondence = correspondences.get(i); if (correspondence.getSourcePaths() != null) { result .append(DOUBLE_INDENT) .append(GenerateSQL.attributeNameWithVariable(correspondence.getFirstSourcePath())); } else { String sourcePathName = correspondence.getSourceValue().toString(); sourcePathName = sourcePathName.replaceAll("\"", "\'"); result.append(DOUBLE_INDENT).append(sourcePathName); } result .append(" as ") .append(GenerateSQL.attributeNameInVariable(correspondence.getFirstSourcePath())); if (i != correspondences.size() - 1) result.append(",\n"); } result.append("\n"); result.append(INDENT).append(fromClause); if (!whereClause.equals("")) { result.append(INDENT).append(whereClause); } return result.toString(); }
public String convertToPostgres(Expression transformationFunctionExpression, boolean withRel) { String functionExpression = transformationFunctionExpression.getJepExpression().toStringForSql(); // first fix attribute names for (VariablePathExpression vpe : transformationFunctionExpression.getAttributePaths()) { if (functionExpression.contains(vpe.toString())) { String expressionToCheckForSigns = transformationFunctionExpression.getJepExpression().toString(); int startIndex = expressionToCheckForSigns.indexOf(vpe.toString()); int endIndex = startIndex + vpe.toString().length(); boolean castToFloat = false; // check so that the String index will not get out of bounds if (startIndex - 2 >= 0) { if (math_sign.contains(expressionToCheckForSigns.charAt(startIndex - 2))) { castToFloat = true; } // to catch the '>=' or '<=' case else if (expressionToCheckForSigns.charAt(startIndex - 2) == '=' && startIndex - 3 >= 0) { if (expressionToCheckForSigns.charAt(startIndex - 3) == '<' || expressionToCheckForSigns.charAt(startIndex - 3) == '>') { castToFloat = true; } } } if (endIndex + 2 <= expressionToCheckForSigns.length()) { if (math_sign.contains(expressionToCheckForSigns.charAt(endIndex + 1))) { castToFloat = true; } } String newAttrName; // replace them with the corresponding attribute name if (withRel) { newAttrName = GenerateSQL.attributeNameWithVariable(vpe); } else { newAttrName = GenerateSQL.attributeNameInVariable(vpe); } // if previous or next character is one of {+,-,*,/,<,>} cast it to float if (castToFloat) { functionExpression = functionExpression.replaceAll(vpe.toString(), "cast(" + newAttrName + " as float)"); } else { functionExpression = functionExpression.replaceAll(vpe.toString(), newAttrName); } } } return replaceExpression(functionExpression); }