You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by "Nikita Timofeev (JIRA)" <ji...@apache.org> on 2019/01/09 12:11:00 UTC
[jira] [Closed] (CAY-2466) New internal API to build SQL
[ https://issues.apache.org/jira/browse/CAY-2466?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Nikita Timofeev closed CAY-2466.
--------------------------------
Resolution: Fixed
https://github.com/apache/cayenne/commit/89439015fc7e3fd88e8a4846bea953b43f003717
> New internal API to build SQL
> -----------------------------
>
> Key: CAY-2466
> URL: https://issues.apache.org/jira/browse/CAY-2466
> Project: Cayenne
> Issue Type: Task
> Components: Core Library, Database integration
> Reporter: Nikita Timofeev
> Assignee: Nikita Timofeev
> Priority: Major
> Fix For: 4.2.M1
>
>
> As a part of CAY-2465 we need a better way to construct a SQL strings, than a simple in-place string concatenation.
> It can build a SQL tree that can be modified later for specific DB dialect and easily processed into a final SQL.
> At first it will be used as part of new {{SelectTranslator}} but other usages (including some public API) should be kept in mind.
> In my prototype I came to something like this:
> {code}
> // import static org.apache.cayenne.access.sqlbuilder.SQLBuilder.*;
> Node slqNode = 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())
> .build();
> SQLGenerationVisitor visitor = new SQLGenerationVisitor();
> slqNode.visit(visitor);
> String sql = visitor.getSQLString();
> {code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)