Search in sources :

Example 46 with Node

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

the class SybaseSQLTreeProcessor method onFunctionNode.

@Override
protected void onFunctionNode(Node parent, FunctionNode child, int index) {
    String functionName = child.getFunctionName();
    Node replacement = null;
    switch(functionName) {
        case "LENGTH":
            replacement = new FunctionNode("LEN", child.getAlias(), true);
            break;
        case "LOCATE":
            replacement = new FunctionNode("CHARINDEX", child.getAlias(), true);
            break;
        case "MOD":
            replacement = new OpExpressionNode("%");
            break;
        case "TRIM":
            Node rtrim = new FunctionNode("RTRIM", null, true);
            replacement = new FunctionNode("LTRIM", child.getAlias(), true);
            for (int i = 0; i < child.getChildrenCount(); i++) {
                rtrim.addChild(child.getChild(i));
            }
            replacement.addChild(rtrim);
            parent.replaceChild(index, replacement);
            return;
        case "CURRENT_DATE":
            replacement = new FunctionNode("{fn CURDATE()}", child.getAlias(), false);
            break;
        case "CURRENT_TIME":
            replacement = new FunctionNode("{fn CURTIME()}", child.getAlias(), false);
            break;
        case "CURRENT_TIMESTAMP":
            replacement = new FunctionNode("CURRENT_TIMESTAMP", child.getAlias(), false);
            break;
        case "YEAR":
        case "MONTH":
        case "WEEK":
        case "DAY_OF_YEAR":
        case "DAY":
        case "DAY_OF_MONTH":
        case "DAY_OF_WEEK":
        case "HOUR":
        case "MINUTE":
        case "SECOND":
            replacement = new FunctionNode("DATEPART", child.getAlias(), true);
            switch(functionName) {
                case "DAY_OF_MONTH":
                    functionName = "DAY";
                    break;
                case "DAY_OF_WEEK":
                    functionName = "WEEKDAY";
                    break;
                case "DAY_OF_YEAR":
                    functionName = "DAYOFYEAR";
                    break;
            }
            replacement.addChild(new TextNode(functionName));
            break;
    }
    if (replacement != null) {
        replaceChild(parent, index, replacement);
    }
}
Also used : OpExpressionNode(org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode) 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) FunctionNode(org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode) TextNode(org.apache.cayenne.access.sqlbuilder.sqltree.TextNode)

Example 47 with Node

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

the class SQLiteTreeProcessor method replaceExtractFunction.

private void replaceExtractFunction(Node parent, FunctionNode original, int index, String format) {
    Node replacement = new FunctionNode("cast", original.getAlias(), true) {

        @Override
        public void appendChildrenSeparator(QuotingAppendable buffer, int childIdx) {
            buffer.append(" as ");
        }
    };
    FunctionNode strftime = new FunctionNode("strftime", null, true);
    strftime.addChild(new TextNode(format));
    strftime.addChild(original.getChild(0));
    replacement.addChild(strftime);
    replacement.addChild(new TextNode("integer"));
    parent.replaceChild(index, replacement);
}
Also used : MysqlLimitOffsetNode(org.apache.cayenne.dba.mysql.sqltree.MysqlLimitOffsetNode) 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) FunctionNode(org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode) QuotingAppendable(org.apache.cayenne.access.sqlbuilder.QuotingAppendable) TextNode(org.apache.cayenne.access.sqlbuilder.sqltree.TextNode)

Example 48 with Node

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

the class SQLiteTreeProcessor method onFunctionNode.

@Override
protected void onFunctionNode(Node parent, FunctionNode child, int index) {
    String functionName = child.getFunctionName();
    Node replacement = null;
    switch(functionName) {
        case "LOCATE":
            replacement = new FunctionNode("INSTR", child.getAlias(), true);
            for (int i = 0; i <= 1; i++) {
                replacement.addChild(child.getChild(1 - i));
            }
            parent.replaceChild(index, replacement);
            return;
        case "DAY_OF_YEAR":
            replaceExtractFunction(parent, child, index, "'%j'");
            return;
        case "DAY_OF_WEEK":
            replaceExtractFunction(parent, child, index, "'%w'");
            return;
        case "WEEK":
            replaceExtractFunction(parent, child, index, "'%W'");
            return;
        case "YEAR":
            replaceExtractFunction(parent, child, index, "'%Y'");
            return;
        case "MONTH":
            replaceExtractFunction(parent, child, index, "'%m'");
            return;
        case "DAY":
        case "DAY_OF_MONTH":
            replaceExtractFunction(parent, child, index, "'%d'");
            return;
        case "HOUR":
            replaceExtractFunction(parent, child, index, "'%H'");
            return;
        case "MINUTE":
            replaceExtractFunction(parent, child, index, "'%M'");
            return;
        case "SECOND":
            replaceExtractFunction(parent, child, index, "'%S'");
            return;
        case "SUBSTRING":
            replacement = new FunctionNode("SUBSTR", child.getAlias(), true);
            break;
        case "CONCAT":
            replacement = new OpExpressionNode("||");
            break;
        case "MOD":
            replacement = new OpExpressionNode("%");
            break;
        case "CURRENT_DATE":
        case "CURRENT_TIMESTAMP":
        case "CURRENT_TIME":
            replacement = new FunctionNode(functionName, child.getAlias(), false);
            break;
    }
    if (replacement != null) {
        replaceChild(parent, index, replacement);
    }
}
Also used : OpExpressionNode(org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode) MysqlLimitOffsetNode(org.apache.cayenne.dba.mysql.sqltree.MysqlLimitOffsetNode) 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) FunctionNode(org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode)

Example 49 with Node

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

the class PostgreSQLTreeProcessor method onFunctionNode.

protected Optional<Node> onFunctionNode(Node parent, FunctionNode child, int index) {
    Node replacement = null;
    String functionName = child.getFunctionName();
    if (EXTRACT_FUNCTION_NAMES.contains(functionName)) {
        replacement = new PostgresExtractFunctionNode(functionName);
    } else if ("CURRENT_DATE".equals(functionName) || "CURRENT_TIME".equals(functionName) || "CURRENT_TIMESTAMP".equals(functionName)) {
        replacement = new FunctionNode(functionName, child.getAlias(), false);
    } else if ("LOCATE".equals(functionName)) {
        replacement = new PositionFunctionNode(child.getAlias());
    }
    return Optional.ofNullable(replacement);
}
Also used : PostgresExtractFunctionNode(org.apache.cayenne.dba.postgres.sqltree.PostgresExtractFunctionNode) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) FunctionNode(org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode) LimitOffsetNode(org.apache.cayenne.access.sqlbuilder.sqltree.LimitOffsetNode) PositionFunctionNode(org.apache.cayenne.dba.postgres.sqltree.PositionFunctionNode) PostgresLikeNode(org.apache.cayenne.dba.postgres.sqltree.PostgresLikeNode) ColumnNode(org.apache.cayenne.access.sqlbuilder.sqltree.ColumnNode) PostgresLimitOffsetNode(org.apache.cayenne.dba.postgres.sqltree.PostgresLimitOffsetNode) LikeNode(org.apache.cayenne.access.sqlbuilder.sqltree.LikeNode) TrimmingColumnNode(org.apache.cayenne.access.sqlbuilder.sqltree.TrimmingColumnNode) PostgresExtractFunctionNode(org.apache.cayenne.dba.postgres.sqltree.PostgresExtractFunctionNode) PostgresExtractFunctionNode(org.apache.cayenne.dba.postgres.sqltree.PostgresExtractFunctionNode) FunctionNode(org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode) PositionFunctionNode(org.apache.cayenne.dba.postgres.sqltree.PositionFunctionNode) PositionFunctionNode(org.apache.cayenne.dba.postgres.sqltree.PositionFunctionNode)

Example 50 with Node

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

the class DeleteBuilderTest method testDeleteDbEntityCatalog.

@Test
public void testDeleteDbEntityCatalog() {
    DbEntity entity = new DbEntity("test");
    entity.setCatalog("catalog");
    DeleteBuilder builder = new DeleteBuilder(entity);
    Node node = builder.build();
    assertThat(node, instanceOf(DeleteNode.class));
    assertSQL("DELETE FROM catalog.test", node);
    assertQuotedSQL("DELETE FROM `catalog`.`test`", node);
}
Also used : DeleteNode(org.apache.cayenne.access.sqlbuilder.sqltree.DeleteNode) DbEntity(org.apache.cayenne.map.DbEntity) DeleteNode(org.apache.cayenne.access.sqlbuilder.sqltree.DeleteNode) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) Test(org.junit.Test)

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