use of org.apache.cayenne.access.sqlbuilder.sqltree.Node in project cayenne by apache.
the class UpdateBuilderTest method testUpdateWithWhere.
@Test
public void testUpdateWithWhere() {
UpdateBuilder builder = new UpdateBuilder("test");
builder.set(column("col1").eq(value(1))).where(column("id").eq(value(123L)));
Node node = builder.build();
assertThat(node, instanceOf(UpdateNode.class));
assertSQL("UPDATE test SET col1 = 1 WHERE id = 123", node);
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.Node in project cayenne by apache.
the class UpdateBuilderTest method testUpdateDbEntityCatalogAndSchema.
@Test
public void testUpdateDbEntityCatalogAndSchema() {
DbEntity entity = new DbEntity("test");
entity.setSchema("schema");
entity.setCatalog("catalog");
UpdateBuilder builder = new UpdateBuilder(entity);
Node node = builder.build();
assertThat(node, instanceOf(UpdateNode.class));
assertSQL("UPDATE catalog.schema.test", node);
assertQuotedSQL("UPDATE `catalog`.`schema`.`test`", node);
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.Node 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.Node in project cayenne by apache.
the class OracleSQLTreeProcessor method onInNode.
@Override
protected void onInNode(Node parent, InNode child, int index) {
boolean not = child.isNot();
Node arg = child.getChild(0);
Node childNode = child.getChild(1);
if (childNode.getType() != NodeType.VALUE) {
return;
}
ValueNode valueNode = (ValueNode) childNode;
Object value = valueNode.getValue();
if (!value.getClass().isArray()) {
return;
}
List<Node> newChildren = new ArrayList<>();
// need to slice for batches of 1000 values
if (value instanceof Object[]) {
for (Object[] slice : ArrayUtil.sliceArray((Object[]) value, ORACLE_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof int[]) {
for (int[] slice : ArrayUtil.sliceArray((int[]) value, ORACLE_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof long[]) {
for (long[] slice : ArrayUtil.sliceArray((long[]) value, ORACLE_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof float[]) {
for (float[] slice : ArrayUtil.sliceArray((float[]) value, ORACLE_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof double[]) {
for (double[] slice : ArrayUtil.sliceArray((double[]) value, ORACLE_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof short[]) {
for (short[] slice : ArrayUtil.sliceArray((short[]) value, ORACLE_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof char[]) {
for (char[] slice : ArrayUtil.sliceArray((char[]) value, ORACLE_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof boolean[]) {
for (boolean[] slice : ArrayUtil.sliceArray((boolean[]) value, ORACLE_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof byte[]) {
for (byte[] slice : ArrayUtil.sliceArray((byte[]) value, ORACLE_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
}
ExpressionNodeBuilder exp = exp(node(newChildren.get(0)));
for (int i = 1; i < newChildren.size(); i++) {
if (not) {
exp = exp.and(node(newChildren.get(i)));
} else {
exp = exp.or(node(newChildren.get(i)));
}
}
parent.replaceChild(index, exp.build());
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.Node in project cayenne by apache.
the class BaseColumnExtractor method addDbAttribute.
protected void addDbAttribute(String prefix, String labelPrefix, DbAttribute dba) {
String alias = context.getTableTree().aliasForPath(prefix);
String dataRowKey = labelPrefix != null ? labelPrefix + '.' + dba.getName() : dba.getName();
Node columnNode = table(alias).column(dba).build();
context.addResultNode(columnNode, dataRowKey).setDbAttribute(dba);
}
Aggregations