[
https://issues.apache.org/jira/browse/GROOVY-8258?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17209845#comment-17209845
]
Daniel Sun commented on GROOVY-8258:
------------------------------------
* I am in holiday, but today is the last day of my holiday...
* The DSL will be stable enough and will not have breaking changes over time,
but I can not make sure the backend will be as stable as the DSL, so the DSL is
strongly recommended:
https://github.com/apache/groovy/blob/GROOVY-8258/subprojects/groovy-linq/src/test/groovy/org/apache/groovy/linq/GinqTest.groovy
* If you prefer fluent API from the backend, here are some examples(WARNING:
the API may be changed in the future):
https://github.com/apache/groovy/blob/GROOVY-8258/subprojects/groovy-linq/src/test/groovy/org/apache/groovy/linq/provider/collection/QueryableCollectionTest.groovy
* I want to make GINQ as light as it could be, Java stream API is good enough
to achieve the main goal(i.e. querying collections, XML, JSON, YAML, etc. with
SQL-like syntax). As for querying DB, I think it's too heavy for a language and
GORM/Hibernate works very well, so I am not going to make GINQ support DB at
the beginning.
* It seems that we need a customed type checker for GINQ, but it is not in my
TODO list
> [GEP] Create a LINQ-like DSL
> ----------------------------
>
> Key: GROOVY-8258
> URL: https://issues.apache.org/jira/browse/GROOVY-8258
> Project: Groovy
> Issue Type: New Feature
> Reporter: Daniel Sun
> Assignee: Daniel Sun
> Priority: Major
> Fix For: 4.x
>
>
> h2. *Ⅰ. Introduction*
> GINQ DSL is an alternative solution of GINQ, it is a simplified version of
> GINQ(GROOVY-9159) and will be implemented as a module "groovy-linq".
> GINQ DSL is wrapped with:
> {code:java}
> GINQ {
> // GINQ code
> }
> {code}
> h2. *Ⅱ. Sample code related to GROOVY-9159*
> h3. 1. Filtering
> h4. 1.1
> {code:java}
> from p in persons
> where p.age > 15 && p.age <= 35
> select p.name
> {code}
> h4. 1.2
> {code:java}
> from p in persons
> where p.age > 15 && p.age <= 35
> select p
> {code}
> h4. 1.3
> {code:java}
> from t in numbers
> where t <= 2
> select t
> {code}
> h3. 2. Joining
> h4. 2.1
> {code:java}
> from p in persons
> innerjoin c in cities
> on p.city.name == c.name
> select p.name, c.name
> {code}
> h4. 2.2
> {code:java}
> from p in persons
> innerjoin c in cities
> on p.city == c
> select p.name
> {code}
> h4. 2.3
> {code:java}
> from p in persons
> leftjoin c in cities
> on p.city.name == c.name // same with left outer join
> select p.name, c.name
> {code}
> h4. 2.4
> {code:java}
> from p in persons
> rightjoin c in cities
> on p.city.name == c.name // same with right outer join
> select p.name, c.name
> {code}
> h3. 3. Projection
> h4. 3.1
> {code:java}
> from p in persons
> select p.name
> {code}
> h4. 3.2
> {code:java}
> from p in persons
> select p.name, p.age
> {code}
> h4. 3.3
> {code:java}
> from p in persons
> select [name: p.name, age: p.age]
> {code}
> h4. 3.4
> {code:java}
> from p in persons
> select new Person(name: p.name, age: p.age)
> {code}
> h4. 3.5
> {code:java}
> from p in persons
> select p
> {code}
> h3. 4. Grouping
> h4. 4.1
> {code:java}
> from p in persons
> groupby p.gender
> select p.gender, max(p.age)
> {code}
> h3. 5. Having
> h4. 5.1
> {code:java}
> from p in persons
> groupby p.gender
> having p.gender == 'Male'
> select p.gender, max(p.age)
> {code}
> h3. 6. Sorting
> h4. 6.1
> {code:java}
> from p in persons
> orderby p.age
> select p.name
> {code}
> h4. 6.2
> {code:java}
> from p in persons
> orderby p.age desc
> select p.name
> {code}
> h4. 6.3
> {code:java}
> from p in persons
> orderby p.age desc
> thenby p.name asc // asc is optional
> select p.name
> {code}
> h3. 7. Pagination
> h4. 7.1
> {code:java}
> from n in numbers
> limit 2, 5
> select n
> {code}
> h4. 7.2
> {code:java}
> from n in numbers
> limit 5
> select n
> {code}
> h3. 8. Nested Queries
> h4. 8.1
> {code:java}
> from v in (
> from n in numbers
> where n <= 5
> select n
> )
> limit 2, 5
> select v
> {code}
> h3. 9. WITH-Clause
> h4. 9.1
> {code:java}
> with v as (
> from n in numbers
> where n <= 5
> select n
> )
> from v
> limit 2, 5
> select v
> {code}
> h3. 10. Union
> h4. 10.1
> {code:java}
> from n in numbers1
> select n
> unionall
> from n in numbers2
> select n
> {code}
> h4. 10.2
> {code:java}
> from n in numbers1
> select n
> union
> from n in numbers2
> select n
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)