[ 
https://issues.apache.org/jira/browse/GROOVY-8258?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16090835#comment-16090835
 ] 

Daniel Sun commented on GROOVY-8258:
------------------------------------

> But in terms of merging into the main branches, we could merge a PR that was 
> improving the underlying APIs to make them stream-aware (without any DSL)
Agreed.

Paul, maybe I did not express the proposal clearly. The DSL should consist of 
not only syntactic sugar layer but also the backend, so it will be a big work ;)
We can design DSL and implement the underlying APIs at first and then implement 
the DSL, in other words, the API design is driven by the DSL. e.g. In the 
following sample code, we can find we need linq, from, of, join, on, where, 
orderBy, limit, offset, select methods, which will appear in our underlying 
APIs.

{code:java}
linq { // return an Iterator<Map<String, Object>>
    from c of categories
    join a of articles on a.categoryName == c.name // join
    where c.name == 'Groovy'
    orderBy a.voteCount desc // order by
    limit 100 offset 50 // pagination
    select { // create a map, its keys: articleName, voteNum, categoryName
        articleName = a.name
        a.voteCount 
        categoryName = c.name
    }
}
{code}


> Create a LINQ-like DSL
> ----------------------
>
>                 Key: GROOVY-8258
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8258
>             Project: Groovy
>          Issue Type: Improvement
>            Reporter: Daniel Sun
>
> *Pojos:*
> {code:java}
> class Category {
>    String name
>    List<Article> articles
> }
> class Article {
>   String name
>   Integer voteCount
>   String categoryName
> }
> {code}
> *Example1:*
> {code:java}
> linq { // return an Iterator<Map<String, Object>>
>     from c of categories
>     join a of articles on a.categoryName == c.name // join
>     where c.name == 'Groovy'
>     orderBy a.voteCount desc // order by
>     limit 100 offset 50 // pagination
>     select { // create a map, its keys: articleName, voteNum, categoryName
>         articleName = a.name
>         a.voteCount 
>         categoryName = c.name
>     }
> }
> {code}
> *Example2:*
> {code:java}
> linq { // return an Iterator<Map<String, Object>>
>     from c of categories
>     join a of {
>         from tempA of articles
>         where tempA.voteCount > 10
>         select tempA
>     } on a.categoryName == c.name // join
>     where c.name == 'Groovy'
>     orderBy a.voteCount desc // order by
>     limit 100 offset 50 // pagination
>     select { // create a map, its keys: articleName, voteNum, categoryName
>         articleName = a.name
>         a.voteCount 
>         categoryName = c.name
>     }
> }
> {code}
> *Example3:*
> {code:java}
> linq { // return an Iterator<Article>
>     from c of categories
>     from a of c.articles  // another join
>     where c.name == 'Groovy'
>     orderBy a.voteCount desc // order by
>     select Article { // create an Article instance
>         a.name
>         a.voteCount 
>         categoryName = c.name
>     }
> }
> {code}
> *TO BE CONTINUED...*



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to