use of org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode in project cayenne by apache.
the class FrontBaseSQLTreeProcessor method onFunctionNode.
@Override
protected void onFunctionNode(Node parent, FunctionNode child, int index) {
switch(child.getFunctionName()) {
case "CONCAT":
replaceChild(parent, index, new OpExpressionNode("||"));
break;
case "LOCATE":
// POSITION (substr IN str)
replaceChild(parent, index, new FunctionNode("POSITION", child.getAlias()) {
@Override
public void appendChildrenSeparator(QuotingAppendable buffer, int childIdx) {
buffer.append(" IN ");
}
});
break;
case "LENGTH":
replaceChild(parent, index, new FunctionNode("CHAR_LENGTH", child.getAlias()));
break;
case "SUBSTRING":
// SUBSTRING (str FROM offset FOR length)
replaceChild(parent, index, new FunctionNode("SUBSTRING", child.getAlias()) {
@Override
public void appendChildrenSeparator(QuotingAppendable buffer, int childIdx) {
if (childIdx == 0) {
buffer.append(" FROM ");
} else if (childIdx == 1) {
buffer.append(" FOR ");
}
}
});
break;
case "YEAR":
case "MONTH":
case "DAY":
case "DAY_OF_MONTH":
case "HOUR":
case "MINUTE":
case "SECOND":
Node functionReplacement = new ExtractFunctionNode(child.getAlias());
String functionName = child.getFunctionName();
if ("DAY_OF_MONTH".equals(functionName)) {
functionName = "DAY";
}
functionReplacement.addChild(new TextNode(functionName));
replaceChild(parent, index, functionReplacement);
break;
case "DAY_OF_WEEK":
case "DAY_OF_YEAR":
case "WEEK":
throw new CayenneRuntimeException("Function %s() is unsupported in FrontBase.", child.getFunctionName());
}
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode in project cayenne by apache.
the class IngressSQLTreeProcessor method onFunctionNode.
@Override
protected void onFunctionNode(Node parent, FunctionNode child, int index) {
switch(child.getFunctionName()) {
case "CONCAT":
replaceChild(parent, index, new OpExpressionNode("+"));
return;
case "LOCATE":
Node child0 = child.getChild(0);
child.replaceChild(0, child.getChild(1));
child.replaceChild(1, child0);
return;
case "SUBSTRING":
Node replacement = new FunctionNode("SUBSTRING", child.getAlias(), true) {
@Override
public void appendChildrenSeparator(QuotingAppendable buffer, int childIdx) {
// 0, CAST(1 AS INTEGER), CAST(2 AS INTEGER)
if (childIdx == 1 || childIdx == 2) {
buffer.append(" AS INTEGER)");
}
if (childIdx == 0 || childIdx == 1) {
buffer.append(", CAST(");
}
}
@Override
public void appendChildrenEnd(QuotingAppendable buffer) {
buffer.append(" AS INTEGER)");
super.appendChildrenEnd(buffer);
}
};
replaceChild(parent, index, replacement);
return;
case "TRIM":
replaceChild(parent, index, new FunctionNode("RTRIM(LTRIM", child.getAlias(), true) {
@Override
public void appendChildrenEnd(QuotingAppendable buffer) {
buffer.append(')');
super.appendChildrenEnd(buffer);
}
});
return;
case "DAY_OF_WEEK":
case "DAY_OF_MONTH":
case "DAY_OF_YEAR":
// ingres variants are without '_'
replaceChild(parent, index, new FunctionNode(child.getFunctionName().replace("_", ""), child.getAlias(), true));
return;
}
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode in project cayenne by apache.
the class HavingTranslationStageTest method perform.
@Test
public void perform() {
HavingTranslationStage stage = new HavingTranslationStage();
stage.perform(context);
Node select = context.getSelectBuilder().build();
// Content of "select" node:
//
// Having
// |
// OpExpression
// / \
// Column Value
assertEquals(1, select.getChildrenCount());
assertThat(select.getChild(0), instanceOf(HavingNode.class));
Node op = select.getChild(0).getChild(0);
assertThat(op, instanceOf(OpExpressionNode.class));
assertEquals(">=", ((OpExpressionNode) op).getOp());
assertEquals(2, op.getChildrenCount());
assertThat(op.getChild(0), instanceOf(ColumnNode.class));
assertThat(op.getChild(1), instanceOf(ValueNode.class));
ColumnNode columnNode = (ColumnNode) op.getChild(0);
ValueNode valueNode = (ValueNode) op.getChild(1);
assertEquals("path", columnNode.getColumn());
assertEquals(10, valueNode.getValue());
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode in project cayenne by apache.
the class OracleSQLTreeProcessor method onFunctionNode.
@Override
protected void onFunctionNode(Node parent, FunctionNode child, int index) {
String functionName = child.getFunctionName();
Node functionReplacement = null;
switch(functionName) {
case "LOCATE":
functionReplacement = new FunctionNode("INSTR", child.getAlias(), true);
for (int i = 0; i <= 1; i++) {
functionReplacement.addChild(child.getChild(1 - i));
}
parent.replaceChild(index, functionReplacement);
return;
case "DAY_OF_YEAR":
case "DAY_OF_WEEK":
case "WEEK":
functionReplacement = new FunctionNode("TO_CHAR", child.getAlias(), true);
functionReplacement.addChild(child.getChild(0));
if ("DAY_OF_YEAR".equals(functionName)) {
functionName = "'DDD'";
} else if ("DAY_OF_WEEK".equals(functionName)) {
functionName = "'D'";
} else {
functionName = "'IW'";
}
functionReplacement.addChild(new TextNode(functionName));
parent.replaceChild(index, functionReplacement);
return;
case "SUBSTRING":
functionReplacement = new FunctionNode("SUBSTR", child.getAlias(), true);
break;
case "CONCAT":
functionReplacement = new OpExpressionNode("||");
break;
case "CURRENT_TIMESTAMP":
case "CURRENT_DATE":
functionReplacement = new FunctionNode(functionName, child.getAlias(), false);
break;
case "CURRENT_TIME":
functionReplacement = new FunctionNode("{fn CURTIME()}", child.getAlias(), false);
break;
case "YEAR":
case "MONTH":
case "DAY":
case "DAY_OF_MONTH":
case "HOUR":
case "MINUTE":
case "SECOND":
functionReplacement = new FunctionNode("EXTRACT", child.getAlias(), true) {
@Override
public void appendChildrenSeparator(QuotingAppendable buffer, int childIdx) {
buffer.append(' ');
}
};
if ("DAY_OF_MONTH".equals(functionName)) {
functionName = "DAY";
}
functionReplacement.addChild(new TextNode(functionName + " FROM "));
break;
}
if (functionReplacement != null) {
replaceChild(parent, index, functionReplacement);
}
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode in project cayenne by apache.
the class FirebirdSQLTreeProcessor method onFunctionNode.
@Override
protected void onFunctionNode(Node parent, FunctionNode child, int index) {
switch(child.getFunctionName()) {
case "LENGTH":
replaceChild(parent, index, new FunctionNode("CHAR_LENGTH", child.getAlias()));
break;
case "LOCATE":
replaceChild(parent, index, new FunctionNode("POSITION", child.getAlias()));
break;
case "CONCAT":
replaceChild(parent, index, new OpExpressionNode("||"));
break;
case "SUBSTRING":
replaceChild(parent, index, new FirebirdSubstringFunctionNode(child.getAlias()));
break;
case "YEAR":
case "MONTH":
case "DAY":
case "DAY_OF_MONTH":
case "DAY_OF_WEEK":
case "DAY_OF_YEAR":
case "WEEK":
case "HOUR":
case "MINUTE":
case "SECOND":
Node functionReplacement = new FunctionNode("EXTRACT", child.getAlias(), true) {
@Override
public void appendChildrenSeparator(QuotingAppendable buffer, int childIdx) {
buffer.append(' ');
}
};
String partName = child.getFunctionName();
if ("DAY_OF_MONTH".equals(partName)) {
partName = "DAY";
} else if ("DAY_OF_WEEK".equals(partName)) {
partName = "WEEKDAY";
} else if ("DAY_OF_YEAR".equals(partName)) {
partName = "YEARDAY";
}
functionReplacement.addChild(new TextNode(partName + " FROM "));
replaceChild(parent, index, functionReplacement);
break;
}
}
Aggregations