Search in sources :

Example 21 with Node

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

the class HavingTranslationStage method perform.

@Override
public void perform(TranslatorContext context) {
    Expression expression = context.getQuery().getHavingQualifier();
    QualifierTranslator translator = context.getQualifierTranslator();
    Node qualifier = translator.translate(expression);
    if (qualifier != null) {
        context.getSelectBuilder().having(qualifier);
    }
}
Also used : Expression(org.apache.cayenne.exp.Expression) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node)

Example 22 with Node

use of org.apache.cayenne.access.sqlbuilder.sqltree.Node 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());
    }
}
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) FunctionNode(org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode) QuotingAppendable(org.apache.cayenne.access.sqlbuilder.QuotingAppendable) CayenneRuntimeException(org.apache.cayenne.CayenneRuntimeException) TextNode(org.apache.cayenne.access.sqlbuilder.sqltree.TextNode)

Example 23 with Node

use of org.apache.cayenne.access.sqlbuilder.sqltree.Node 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;
    }
}
Also used : OpExpressionNode(org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode) ColumnNode(org.apache.cayenne.access.sqlbuilder.sqltree.ColumnNode) 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) TrimmingColumnNode(org.apache.cayenne.access.sqlbuilder.sqltree.TrimmingColumnNode) OffsetFetchNextNode(org.apache.cayenne.access.sqlbuilder.sqltree.OffsetFetchNextNode) FunctionNode(org.apache.cayenne.access.sqlbuilder.sqltree.FunctionNode) QuotingAppendable(org.apache.cayenne.access.sqlbuilder.QuotingAppendable)

Example 24 with Node

use of org.apache.cayenne.access.sqlbuilder.sqltree.Node 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());
}
Also used : HavingNode(org.apache.cayenne.access.sqlbuilder.sqltree.HavingNode) OpExpressionNode(org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) OpExpressionNode(org.apache.cayenne.access.sqlbuilder.sqltree.OpExpressionNode) ValueNode(org.apache.cayenne.access.sqlbuilder.sqltree.ValueNode) ColumnNode(org.apache.cayenne.access.sqlbuilder.sqltree.ColumnNode) HavingNode(org.apache.cayenne.access.sqlbuilder.sqltree.HavingNode) ColumnNode(org.apache.cayenne.access.sqlbuilder.sqltree.ColumnNode) ValueNode(org.apache.cayenne.access.sqlbuilder.sqltree.ValueNode) Test(org.junit.Test)

Example 25 with Node

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

the class LimitOffsetStageTest method perform.

@Test
public void perform() {
    LimitOffsetStage stage = new LimitOffsetStage();
    stage.perform(context);
    Node select = context.getSelectBuilder().build();
    Node child = select.getChild(0);
    assertThat(child, instanceOf(LimitOffsetNode.class));
    LimitOffsetNode limitOffsetNode = (LimitOffsetNode) child;
    assertEquals(123, limitOffsetNode.getLimit());
    assertEquals(321, limitOffsetNode.getOffset());
}
Also used : LimitOffsetNode(org.apache.cayenne.access.sqlbuilder.sqltree.LimitOffsetNode) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) LimitOffsetNode(org.apache.cayenne.access.sqlbuilder.sqltree.LimitOffsetNode) 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