use of org.apache.cayenne.access.sqlbuilder.sqltree.InNode 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.InNode in project cayenne by apache.
the class OracleSQLTreeProcessor method newSliceNode.
private InNode newSliceNode(InNode child, Node arg, ValueNode valueNode, Object slice) {
InNode nextNode = new InNode(child.isNot());
nextNode.addChild(arg.deepCopy());
nextNode.addChild(new ValueNode(slice, valueNode.isArray(), valueNode.getAttribute()));
return nextNode;
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.InNode in project cayenne by apache.
the class FirebirdSQLTreeProcessor method onInNode.
@Override
protected void onInNode(Node parent, InNode child, int index) {
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 1500 values
if (value instanceof Object[]) {
for (Object[] slice : ArrayUtil.sliceArray((Object[]) value, FIREBIRD_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof int[]) {
for (int[] slice : ArrayUtil.sliceArray((int[]) value, FIREBIRD_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof long[]) {
for (long[] slice : ArrayUtil.sliceArray((long[]) value, FIREBIRD_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof float[]) {
for (float[] slice : ArrayUtil.sliceArray((float[]) value, FIREBIRD_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof double[]) {
for (double[] slice : ArrayUtil.sliceArray((double[]) value, FIREBIRD_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof short[]) {
for (short[] slice : ArrayUtil.sliceArray((short[]) value, FIREBIRD_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof char[]) {
for (char[] slice : ArrayUtil.sliceArray((char[]) value, FIREBIRD_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof boolean[]) {
for (boolean[] slice : ArrayUtil.sliceArray((boolean[]) value, FIREBIRD_IN_BATCH_SIZE)) {
newChildren.add(newSliceNode(child, arg, valueNode, slice));
}
} else if (value instanceof byte[]) {
for (byte[] slice : ArrayUtil.sliceArray((byte[]) value, FIREBIRD_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++) {
exp = exp.or(node(newChildren.get(i)));
}
parent.replaceChild(index, exp.build());
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.InNode in project cayenne by apache.
the class FirebirdSQLTreeProcessor method newSliceNode.
private InNode newSliceNode(InNode child, Node arg, ValueNode valueNode, Object slice) {
InNode nextNode = new InNode(child.isNot());
nextNode.addChild(arg.deepCopy());
nextNode.addChild(new ValueNode(slice, valueNode.isArray(), valueNode.getAttribute()));
return nextNode;
}
Aggregations