Search in sources :

Example 16 with Node

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

the class ResultNodeDescriptor method getDbAttribute.

public DbAttribute getDbAttribute() {
    if (this.dbAttribute != null) {
        return this.dbAttribute;
    }
    DbAttribute[] dbAttribute = { null };
    node.visit(new SimpleNodeTreeVisitor() {

        @Override
        public boolean onNodeStart(Node node) {
            if (node.getType() == NodeType.COLUMN) {
                dbAttribute[0] = ((ColumnNode) node).getAttribute();
                return false;
            }
            return true;
        }
    });
    return this.dbAttribute = dbAttribute[0];
}
Also used : ColumnNode(org.apache.cayenne.access.sqlbuilder.sqltree.ColumnNode) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) DbAttribute(org.apache.cayenne.map.DbAttribute) ColumnNode(org.apache.cayenne.access.sqlbuilder.sqltree.ColumnNode) SimpleNodeTreeVisitor(org.apache.cayenne.access.sqlbuilder.sqltree.SimpleNodeTreeVisitor)

Example 17 with Node

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

the class OrderingStage method processOrdering.

private void processOrdering(QualifierTranslator qualifierTranslator, TranslatorContext context, Ordering ordering) {
    Expression exp = ordering.getSortSpec();
    Node translatedNode = qualifierTranslator.translate(exp);
    NodeBuilder nodeBuilder = node(translatedNode);
    if (ordering.isCaseInsensitive()) {
        nodeBuilder = function("UPPER", nodeBuilder);
    }
    // If query is DISTINCT then we need to add all ORDER BY clauses as result columns
    if (!context.isDistinctSuppression()) {
        // TODO: need to check duplicates?
        // need UPPER() function here too, as some DB expect exactly the same expression in select and in ordering
        ResultNodeDescriptor descriptor = context.addResultNode(nodeBuilder.build().deepCopy());
        if (exp instanceof ASTAggregateFunctionCall) {
            descriptor.setAggregate(true);
        }
    }
    OrderingNodeBuilder orderingNodeBuilder = order(nodeBuilder);
    if (ordering.isDescending()) {
        orderingNodeBuilder.desc();
    }
    context.getSelectBuilder().orderBy(orderingNodeBuilder);
}
Also used : Expression(org.apache.cayenne.exp.Expression) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) ASTAggregateFunctionCall(org.apache.cayenne.exp.parser.ASTAggregateFunctionCall) NodeBuilder(org.apache.cayenne.access.sqlbuilder.NodeBuilder) OrderingNodeBuilder(org.apache.cayenne.access.sqlbuilder.OrderingNodeBuilder) OrderingNodeBuilder(org.apache.cayenne.access.sqlbuilder.OrderingNodeBuilder)

Example 18 with Node

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

the class CustomColumnSetExtractor method extractEmbeddedObject.

private void extractEmbeddedObject(String prefix, Property<?> property) {
    Object o = property.getExpression().evaluate(context.getMetadata().getObjEntity());
    if (!(o instanceof EmbeddedAttribute)) {
        throw new CayenneRuntimeException("EmbeddedAttribute expected, %s found", o);
    }
    EmbeddedAttribute attribute = (EmbeddedAttribute) o;
    EmbeddedResult result = new EmbeddedResult(attribute.getEmbeddable(), attribute.getAttributes().size());
    attribute.getAttributes().forEach(attr -> {
        Node sqlNode = context.getQualifierTranslator().translate(ExpressionFactory.dbPathExp(attr.getDbAttributePath()));
        context.addResultNode(sqlNode, true, null, null);
        result.addAttribute(attr);
    });
    context.getSqlResult().addEmbeddedResult(result);
}
Also used : EmbeddedResult(org.apache.cayenne.map.EmbeddedResult) Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) CayenneRuntimeException(org.apache.cayenne.CayenneRuntimeException) EmbeddedAttribute(org.apache.cayenne.map.EmbeddedAttribute) EmbeddableObject(org.apache.cayenne.EmbeddableObject)

Example 19 with Node

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

the class CustomColumnSetExtractor method extractSimpleProperty.

private void extractSimpleProperty(Property<?> property) {
    Node sqlNode = context.getQualifierTranslator().translate(property);
    context.addResultNode(sqlNode, true, property, property.getAlias());
    String name = property.getName() == null ? property.getExpression().expName() : property.getName();
    context.getSqlResult().addColumnResult(name);
}
Also used : Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node)

Example 20 with Node

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

the class DescriptorColumnExtractor method processTranslationResult.

private ResultNodeDescriptor processTranslationResult(PathTranslationResult result, int i) {
    String path = result.getAttributePaths().get(i);
    String alias = context.getTableTree().aliasForPath(path);
    DbAttribute attribute = result.getDbAttributes().get(i);
    String columnUniqueName = alias + '.' + attribute.getName();
    if (columnTracker.add(columnUniqueName)) {
        String columnLabelPrefix = path;
        if (columnLabelPrefix.length() > 2) {
            if (columnLabelPrefix.startsWith(PREFETCH_PREFIX)) {
                columnLabelPrefix = columnLabelPrefix.substring(2);
            }
        }
        String attributeName = columnLabelPrefix.isEmpty() ? attribute.getName() : columnLabelPrefix + '.' + attribute.getName();
        Node columnNode = table(alias).column(attribute).build();
        return context.addResultNode(columnNode, attributeName).setDbAttribute(attribute);
    }
    return null;
}
Also used : Node(org.apache.cayenne.access.sqlbuilder.sqltree.Node) DbAttribute(org.apache.cayenne.map.DbAttribute)

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