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];
}
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);
}
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);
}
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);
}
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;
}
Aggregations