Search in sources :

Example 41 with Node

use of org.apache.cayenne.access.sqlbuilder.sqltree.Node in project cayenne by apache.

the class TableTreeQualifierStage method perform.

@Override
public void perform(TranslatorContext context) {
    context.getTableTree().visit(node -> {
        Expression dbQualifier = node.getEntity().getQualifier();
        if (dbQualifier != null) {
            String pathToRoot = node.getAttributePath().getPath();
            dbQualifier = dbQualifier.transform(input -> {
                if (input instanceof ASTPath) {
                    String path = ((ASTPath) input).getPath();
                    if (!pathToRoot.isEmpty()) {
                        path = pathToRoot + '.' + path;
                    }
                    return new ASTDbPath(path);
                }
                return input;
            });
            Node rootQualifier = context.getQualifierNode();
            Node translatedQualifier = context.getQualifierTranslator().translate(dbQualifier);
            if (rootQualifier != null) {
                NodeBuilder expressionNodeBuilder = exp(node(rootQualifier)).and(node(translatedQualifier));
                context.setQualifierNode(expressionNodeBuilder.build());
            } else {
                context.setQualifierNode(translatedQualifier);
            }
        }
    });
    if (context.getQualifierNode() != null) {
        context.getSelectBuilder().where(context.getQualifierNode());
    }
}
Also used : ASTDbPath(org.apache.cayenne.exp.parser.ASTDbPath) SQLBuilder.node(org.apache.cayenne.access.sqlbuilder.SQLBuilder.node) NodeBuilder(org.apache.cayenne.access.sqlbuilder.NodeBuilder) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) Expression(org.apache.cayenne.exp.Expression) SQLBuilder.exp(org.apache.cayenne.access.sqlbuilder.SQLBuilder.exp) ASTPath(org.apache.cayenne.exp.parser.ASTPath) ASTDbPath(org.apache.cayenne.exp.parser.ASTDbPath) Expression(org.apache.cayenne.exp.Expression) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) ASTPath(org.apache.cayenne.exp.parser.ASTPath) NodeBuilder(org.apache.cayenne.access.sqlbuilder.NodeBuilder)

Example 42 with Node

use of org.apache.cayenne.access.sqlbuilder.sqltree.Node 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());
}
Also used : ExpressionNodeBuilder(org.apache.cayenne.access.sqlbuilder.ExpressionNodeBuilder) TextNode(org.apache.cayenne.access.sqlbuilder.sqltree.TextNode) FirebirdSubstringFunctionNode(org.apache.cayenne.dba.firebird.sqltree.FirebirdSubstringFunctionNode) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) FunctionNode(org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode) OpExpressionNode(org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode) LimitOffsetNode(org.apache.cayenne.access.sqlbuilder.sqltree.LimitOffsetNode) FirebirdLimitNode(org.apache.cayenne.dba.firebird.sqltree.FirebirdLimitNode) InNode(org.apache.cayenne.access.sqlbuilder.sqltree.InNode) ValueNode(org.apache.cayenne.access.sqlbuilder.sqltree.ValueNode) ArrayList(java.util.ArrayList) ValueNode(org.apache.cayenne.access.sqlbuilder.sqltree.ValueNode)

Example 43 with Node

use of org.apache.cayenne.access.sqlbuilder.sqltree.Node 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;
    }
}
Also used : OpExpressionNode(org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode) TextNode(org.apache.cayenne.access.sqlbuilder.sqltree.TextNode) FirebirdSubstringFunctionNode(org.apache.cayenne.dba.firebird.sqltree.FirebirdSubstringFunctionNode) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) FunctionNode(org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode) OpExpressionNode(org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode) LimitOffsetNode(org.apache.cayenne.access.sqlbuilder.sqltree.LimitOffsetNode) FirebirdLimitNode(org.apache.cayenne.dba.firebird.sqltree.FirebirdLimitNode) InNode(org.apache.cayenne.access.sqlbuilder.sqltree.InNode) ValueNode(org.apache.cayenne.access.sqlbuilder.sqltree.ValueNode) FirebirdSubstringFunctionNode(org.apache.cayenne.dba.firebird.sqltree.FirebirdSubstringFunctionNode) FunctionNode(org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode) QuotingAppendable(org.apache.cayenne.access.sqlbuilder.QuotingAppendable) TextNode(org.apache.cayenne.access.sqlbuilder.sqltree.TextNode) FirebirdSubstringFunctionNode(org.apache.cayenne.dba.firebird.sqltree.FirebirdSubstringFunctionNode)

Example 44 with Node

use of org.apache.cayenne.access.sqlbuilder.sqltree.Node in project cayenne by apache.

the class JoinNodeBuilder method build.

@Override
public Node build() {
    Node node = new JoinNode(joinType);
    node.addChild(table.build());
    node.addChild(joinExp.build());
    return node;
}
Also used : JoinNode(org.apache.cayenne.access.sqlbuilder.sqltree.JoinNode) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) JoinNode(org.apache.cayenne.access.sqlbuilder.sqltree.JoinNode)

Example 45 with Node

use of org.apache.cayenne.access.sqlbuilder.sqltree.Node in project cayenne by apache.

the class SybaseSQLTreeProcessor method onLimitOffsetNode.

@Override
protected void onLimitOffsetNode(Node parent, LimitOffsetNode child, int index) {
    // SQLServer uses "SELECT DISTINCT TOP N" or "SELECT TOP N" instead of LIMIT
    // Offset will be calculated in-memory
    replaceChild(parent, index, new EmptyNode(), false);
    if (child.getLimit() > 0) {
        int limit = child.getLimit() + child.getOffset();
        // we have root actually as input for processor, but it's better to keep processor stateless
        // root shouldn't be far from limit's parent (likely it will be parent itself)
        Node root = getRoot(parent);
        int idx = 0;
        if (root.getChild(0).getType() == NodeType.DISTINCT) {
            idx = 1;
        }
        root.addChild(idx, new TopNode(limit));
    }
}
Also used : EmptyNode(org.apache.cayenne.access.sqlbuilder.sqltree.EmptyNode) TopNode(org.apache.cayenne.access.sqlbuilder.sqltree.TopNode) TextNode(org.apache.cayenne.access.sqlbuilder.sqltree.TextNode) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) FunctionNode(org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode) OpExpressionNode(org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode) LimitOffsetNode(org.apache.cayenne.access.sqlbuilder.sqltree.LimitOffsetNode) TopNode(org.apache.cayenne.access.sqlbuilder.sqltree.TopNode) EmptyNode(org.apache.cayenne.access.sqlbuilder.sqltree.EmptyNode)

Aggregations

Node (org.apache.cayenne.access.sqlbuilder.sqltree.Node)67 Test (org.junit.Test)32 ColumnNode (org.apache.cayenne.access.sqlbuilder.sqltree.ColumnNode)15 OpExpressionNode (org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode)15 FunctionNode (org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode)14 LimitOffsetNode (org.apache.cayenne.access.sqlbuilder.sqltree.LimitOffsetNode)13 TextNode (org.apache.cayenne.access.sqlbuilder.sqltree.TextNode)11 EmptyNode (org.apache.cayenne.access.sqlbuilder.sqltree.EmptyNode)9 ValueNode (org.apache.cayenne.access.sqlbuilder.sqltree.ValueNode)9 DbEntity (org.apache.cayenne.map.DbEntity)9 SelectNode (org.apache.cayenne.access.sqlbuilder.sqltree.SelectNode)8 InsertNode (org.apache.cayenne.access.sqlbuilder.sqltree.InsertNode)6 TrimmingColumnNode (org.apache.cayenne.access.sqlbuilder.sqltree.TrimmingColumnNode)6 QuotingAppendable (org.apache.cayenne.access.sqlbuilder.QuotingAppendable)5 UpdateNode (org.apache.cayenne.access.sqlbuilder.sqltree.UpdateNode)5 DeleteNode (org.apache.cayenne.access.sqlbuilder.sqltree.DeleteNode)4 InNode (org.apache.cayenne.access.sqlbuilder.sqltree.InNode)4 MysqlLimitOffsetNode (org.apache.cayenne.dba.mysql.sqltree.MysqlLimitOffsetNode)4 Expression (org.apache.cayenne.exp.Expression)4 SimpleNode (org.apache.cayenne.exp.parser.SimpleNode)4