use of org.apache.cayenne.access.sqlbuilder.sqltree.Node in project cayenne by apache.
the class DeleteBuilderTest method testDelete.
@Test
public void testDelete() {
DeleteBuilder builder = new DeleteBuilder("test");
Node node = builder.build();
assertThat(node, instanceOf(DeleteNode.class));
assertSQL("DELETE FROM test", node);
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.Node in project cayenne by apache.
the class SelectBuilderTest method testSelectFromWhere.
@Test
public void testSelectFromWhere() {
SelectBuilder builder = new SelectBuilder(column("a")).from(table("b")).where(column("a").eq(value(123)));
Node node = builder.build();
assertThat(node, instanceOf(SelectNode.class));
assertSQL("SELECT a FROM b WHERE a = 123", node);
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.Node in project cayenne by apache.
the class SelectBuilderTest method testComplexQuery.
@Test
public void testComplexQuery() {
Node node = select(table("a").column("ARTIST_ID").as("a_id"), count(table("p").column("PAINTING_TITLE")).as("p_count")).distinct().from(table("ARTIST").as("a")).from(leftJoin(table("PAINTING").as("p")).on(table("a").column("ARTIST_ID").eq(table("p").column("ARTIST_ID")).and(table("p").column("ESTIMATED_PRICE").gt(value(10))))).where(table("a").column("ARTIST_NAME").eq(value("Picasso")).and(exists(select(all()).from(table("GALLERY").as("g")).where(table("g").column("GALLERY_ID").eq(table("p").column("GALLERY_ID"))))).and(value(1).eq(value(1))).or(value(false))).groupBy(table("a").column("ARTIST_ID")).having(not(count(table("p").column("PAINTING_TITLE")).gt(value(3)))).orderBy(column("p_count").desc(), column("a_id").asc()).build();
assertThat(node, instanceOf(SelectNode.class));
assertSQL("SELECT DISTINCT" + " a.ARTIST_ID a_id, COUNT( p.PAINTING_TITLE ) AS p_count" + " FROM ARTIST a" + " LEFT JOIN PAINTING p ON ( a.ARTIST_ID = p.ARTIST_ID ) AND ( p.ESTIMATED_PRICE > 10 )" + " WHERE ( ( ( a.ARTIST_NAME = 'Picasso' )" + " AND EXISTS (SELECT * FROM GALLERY g WHERE g.GALLERY_ID = p.GALLERY_ID) )" + " AND ( 1 = 1 ) ) OR false" + " GROUP BY a.ARTIST_ID" + " HAVING NOT ( COUNT( p.PAINTING_TITLE ) > 3 )" + " ORDER BY p_count DESC, a_id", node);
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.Node in project cayenne by apache.
the class SelectBuilderTest method testSelectColumns.
@Test
public void testSelectColumns() {
SelectBuilder builder = new SelectBuilder(column("a"), table("c").column("b"));
Node node = builder.build();
assertThat(node, instanceOf(SelectNode.class));
assertSQL("SELECT a, c.b", node);
assertQuotedSQL("SELECT `a`, `c`.`b`", node);
}
use of org.apache.cayenne.access.sqlbuilder.sqltree.Node in project cayenne by apache.
the class QualifierTranslator method createMultiAttributeMatch.
private Node createMultiAttributeMatch(Expression node, Expression parentNode, PathTranslationResult result) {
DbRelationship relationship = result.getDbRelationship().orElseThrow(() -> new CayenneRuntimeException("Incorrect path '%s' translation, relationship expected", result.getFinalPath()));
DbEntity targetEntity = relationship.getTargetEntity();
if (result.getDbAttributes().size() != targetEntity.getPrimaryKeys().size()) {
throw new CayenneRuntimeException("Unsupported or incorrect mapping for relationship '%s.%s': " + "target entity has different count of primary keys than count of joins.", relationship.getSourceEntityName(), relationship.getName());
}
Map<String, Object> valueSnapshot = getMultiAttributeValueSnapshot(node, parentNode);
// convert snapshot if we have attributes from source, not target
if (result.getLastAttribute().getEntity() == relationship.getSourceEntity()) {
valueSnapshot = relationship.srcFkSnapshotWithTargetSnapshot(valueSnapshot);
}
// build compound PK/FK comparison node
Node multiValueComparison = buildMultiValueComparison(result, valueSnapshot);
// replace current node with multi value comparison
Node currentNodeParent = currentNode.getParent();
currentNodeParent.replaceChild(currentNodeParent.getChildrenCount() - 1, multiValueComparison);
multiValueComparison.setParent(currentNodeParent);
currentNode = currentNodeParent;
// we should skip all related nodes as we build this part of the tree manually
expressionsToSkip.add(node);
expressionsToSkip.add(parentNode);
for (int i = 0; i < parentNode.getOperandCount(); i++) {
expressionsToSkip.add(parentNode.getOperand(i));
}
return null;
}
Aggregations