use of com.developmentontheedge.sql.model.SimpleNode in project be5 by DevelopmentOnTheEdge.
the class GenericDbmsTransformer method transformFunction.
protected void transformFunction(AstFunNode node) {
String name = node.getFunction().getName().toLowerCase();
if (node.getFunction() instanceof DbSpecificFunction && !((DbSpecificFunction) node.getFunction()).isApplicable(getDbms()) && !node.withinDbmsTransform()) {
throw new IllegalStateException("Function/operator '" + node.getFunction().getName() + "' is unsupported for " + getDbms());
}
if (DbSpecificFunction.needsTransformation(getDbms()).test(node.getFunction()))
expandDbFunction(node, getDbms());
if ("concat".equals(name) || ("||".equals(name) && node.jjtGetNumChildren() > 1))
transformConcat(node);
else if ("coalesce".equals(name))
transformCoalesce(node);
else if ("substr".equals(name))
transformSubstr(node);
else if ("length".equals(name))
transformLength(node);
else if ("chr".equals(name))
transformChr(node);
else if ("if".equals(name))
transformIf(node);
else if ("date_format".equals(name) || ("to_char".equals(name) && node.jjtGetNumChildren() == 2)) {
SimpleNode child = node.child(1);
if (child instanceof AstStringConstant) {
String formatString = ((AstStringConstant) child).getValue();
DateFormat df = DateFormat.byFormatString(formatString);
if (df == null)
throw new IllegalArgumentException("Unknown date format: " + formatString);
transformDateFormat(node, df);
} else
throw new IllegalArgumentException("Date format is not a String");
} else if ("to_char".equals(name) && node.jjtGetNumChildren() == 1 || "to_number".equals(name) || "to_key".equals(name))
transformCastOracle(node);
else if ("lpad".equals(name))
transformLpad(node);
else if ("trunc".equals(name))
transformTrunc(node);
else if ("now".equals(name))
transformNow(node);
else if ("to_date".equals(name))
transformToDate(node);
else if ("year".equals(name) || "month".equals(name) || "day".equals(name))
transformYearMonthDay(node);
else {
DateFormat df = DateFormat.byFunction(name);
if (df != null)
transformDateFormat(node, df);
}
if ("date_trunc".equals(name)) {
String datePart = ((AstStringConstant) node.child(0)).getValue();
if (datePart.equalsIgnoreCase("'month'") || datePart.equalsIgnoreCase("'year'"))
transformDateTrunc(node);
}
if ("instr".equals(name))
transformInstr(node);
if ("add_months".equals(name) || "add_days".equals(name) || "add_millis".equals(name))
transformDateAdd(node);
if ("last_day".equals(name))
transformLastDay(node);
if ("seconddiff".equals(name))
transformDateTimeDiff(node, "SECOND");
if ("minutediff".equals(name))
transformDateTimeDiff(node, "MINUTE");
if ("hourdiff".equals(name))
transformDateTimeDiff(node, "HOUR");
if ("daydiff".equals(name))
transformDateTimeDiff(node, "DAY");
if ("monthdiff".equals(name))
transformDateTimeDiff(node, "MONTH");
if ("yeardiff".equals(name))
transformDateTimeDiff(node, "YEAR");
if ("timestampdiff".equals(name)) {
SimpleNode child = node.child(0);
String datePart = child instanceof AstFieldReference ? ((AstIdentifierConstant) child.child(0)).getValue() : "";
transformDateTimeDiff(node, datePart);
}
if ("mod".equals(name) || "%".equals(name))
transformMod(node);
if ("least".equals(name) || "greatest".equals(name))
transformLeastGreatest(node);
if ("&".equals(name))
transformBitAnd(node);
if ("|".equals(name))
transformBitOr(node);
if ("right".equals(name))
transformRight(node);
if ("left".equals(name))
transformLeft(node);
if ("decode".equals(name))
transformDecode(node);
if ("string_agg".equals(name))
transformStringAgg(node);
if ("regexp_like".equals(name) || "~".equals(name))
transformRegexpLike(node);
if ("translate".equals(name))
transformTranslate(node);
if ("levenshtein".equals(name))
transformLevenshtein(node);
}
use of com.developmentontheedge.sql.model.SimpleNode in project be5 by DevelopmentOnTheEdge.
the class ContextApplier method applyParameterTag.
private void applyParameterTag(SimpleNode newTree, int i, String key, Function<String, String> varResolver) {
String value;
SimpleNode replacement;
AstBeParameterTag paramNode = (AstBeParameterTag) newTree.child(i);
String multiple = paramNode.getMultiple();
boolean tableRefAddend = newTree instanceof AstTableRef && i == 1;
if (multiple == null) {
value = context.getParameter(paramNode.getName());
Map<String, String> propertyMap = getSubQueryPropertyMap(key, varResolver);
if (value == null && propertyMap.containsKey(paramNode.getName())) {
value = propertyMap.get(paramNode.getName());
}
replacement = applyParameters(paramNode, value, tableRefAddend);
} else {
if (newTree instanceof AstInValueList) {
List<String> values = context.getListParameter(paramNode.getName());
paramNode.replaceWith(StreamEx.of(values).map(val -> applyParameters(paramNode, val, tableRefAddend)).toArray(SimpleNode[]::new));
return;
}
if (!(newTree instanceof AstInPredicate))
throw new IllegalArgumentException("Parameter Multiple can only be put inside InPredicate");
AstInValueList list = new AstInValueList(SqlParserTreeConstants.JJTINVALUELIST);
List<String> values = context.getListParameter(paramNode.getName());
if (values != null) {
for (String val : values) {
list.addChild(applyParameters(paramNode, val, tableRefAddend));
}
}
replacement = list;
}
replacement.inheritFrom(paramNode);
if (tableRefAddend) {
AstTableRef tableRef = (AstTableRef) newTree;
tableRef.setTable(tableRef.getTable() + replacement.format());
tableRef.removeChild(i);
} else {
newTree.jjtAddChild(replacement, i);
}
}
use of com.developmentontheedge.sql.model.SimpleNode in project be5 by DevelopmentOnTheEdge.
the class ContextApplier method checkExpression.
private void checkExpression(SimpleNode newTree, String key, Function<String, String> varResolver) {
for (int i = 0; i < newTree.jjtGetNumChildren(); i++) {
SimpleNode child = newTree.child(i);
checkExpression(child, key, varResolver);
if (child instanceof AstBeCondition)
i = applyConditions(newTree, i);
if (child instanceof AstBeParameterTag)
applyParameterTag(newTree, i, key, varResolver);
else if (child instanceof AstBePlaceHolder)
applyPlaceHolder((AstBePlaceHolder) child);
else if (child instanceof AstBeSessionTag)
applySessionTag((AstBeSessionTag) child);
else if (child instanceof AstBeSqlSubQuery)
applySubQuery((AstBeSqlSubQuery) child);
else if (child instanceof AstBeSqlAuto)
applyAutoQuery((AstBeSqlAuto) child);
else if (child instanceof AstBeConditionChain) {
applyConditionChain((AstBeConditionChain) child);
i--;
} else if (child instanceof AstBeSql)
applySqlTag((AstBeSql) child);
else if (child instanceof AstBeDictionary)
applyDictionary((AstBeDictionary) child);
}
}
use of com.developmentontheedge.sql.model.SimpleNode in project be5 by DevelopmentOnTheEdge.
the class ContextApplier method applyParameters.
private SimpleNode applyParameters(AstBeParameterTag paramNode, String value, boolean tableRefAddend) {
String defValue = paramNode.getDefValue() != null ? paramNode.getDefValue() : "";
String prefix = paramNode.getPrefix() != null ? paramNode.getPrefix() : "";
String postfix = paramNode.getPostfix() != null ? paramNode.getPostfix() : "";
String regex = paramNode.getRegex();
String repl = paramNode.getReplacement();
String changeCase = paramNode.getCase();
String type = paramNode.getType();
boolean safeStr = "yes".equals(paramNode.getSafeStr()) && !tableRefAddend;
if (value == null)
value = "";
if (value.equals(""))
value = defValue;
if (regex != null && repl != null)
value = value.replaceAll(regex, repl);
if ("upper".equals(changeCase))
value = value.toUpperCase();
if ("lower".equals(changeCase))
value = value.toLowerCase();
if ("capitalize".equals(changeCase)) {
value = value.toLowerCase();
if (value.length() > 0)
value = value.substring(0, 1).toUpperCase() + value.substring(1);
}
value = prefix + value + postfix;
SimpleNode constant;
if (paramNode.jjtGetParent() instanceof AstStringConstant) {
constant = new AstStringPart(value);
} else if (type != null) {
if (SqlTypeUtils.isNumber(type)) {
if (!value.equals("")) {
constant = AstNumericConstant.of((Number) SqlTypeUtils.parseValue(value, type));
} else {
constant = new AstIdentifierConstant(value);
}
} else {
constant = new AstStringConstant(value);
}
} else if (!safeStr) {
constant = new AstIdentifierConstant(value);
} else if (paramNode.jjtGetParent() instanceof AstOrderingElement) {
constant = new AstIdentifierConstant(value, false);
} else {
constant = new AstStringConstant(value);
}
return constant;
}
Aggregations