[ 
https://issues.apache.org/jira/browse/GROOVY-9159?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Daniel Sun updated GROOVY-9159:
-------------------------------
    Description: 
_{color:#d04437}(Note: The exact syntax might be altered before introduction, 
currently working on the general principle){color}_

GINQ will reuse most of standard SQL syntax, which can make the learning curve 
smooth and avoid infringing the patent of Microsoft.

All GINQ related keywords are uppercase to avoid breaking existing source code 
as possible as we can, e.g. {{FROM}}, {{WHERE}}, {{SELECT}}, etc.

h2. EBNF
h3.  TBD 
h2. Examples
h3. 1. Filtering
{code:java}
@groovy.transform.EqualsAndHashCode
class Person {
        String name
        int age
}

def persons = [new Person(name: 'Daniel', age: 35), new Person(name: 'Peter', 
age: 10), new Person(name: 'Alice', age: 22)]

def result =
        FROM persons p       // p is an alias
        WHERE p.age > 15 AND p.age <= 35
        SELECT p.name

assert ['Daniel', 'Alice'] == result

result =
        FROM persons p       // p is an alias
        WHERE p.age > 15 AND p.age <= 35
        SELECT p

assert [new Person(name: 'Daniel', age: 35), new Person(name: 'Alice', age: 
22)] == result
{code}
{code:java}
def numbers = [1, 2, 3]

def result =
        FROM numbers t       // t is an alias
        WHERE t.VALUE <= 2  // VALUE is a virtual property
        SELECT t.VALUE

assert [1, 2] == result
{code}
h3. 2. Joining
{code:java}
@groovy.transform.EqualsAndHashCode
class Person {
        String name
        int age
        City city
}

@groovy.transform.EqualsAndHashCode
class City {
        String name
}

def persons = [new Person(name: 'Daniel', age: 35, city: new City('Shanghai')), 
new Person(name: 'Peter', age: 10, city: new City('Beijing')), new Person(name: 
'Alice', age: 22, city: new City('Hangzhou'))]

def cities = [new City('Shanghai'), new City('Beijing')]

def result =
        FROM persons p, cities c
        WHERE p.city = c.VALUE
        SELECT p.name

assert ['Daniel', 'Peter'] == result

result =
        FROM persons p, cities c
        WHERE p.city.name = c.name
        SELECT p.name

assert ['Daniel', 'Peter'] == result
{code}



  was:
_{color:#d04437}(Note: The exact syntax might be altered before introduction, 
currently working on the general principle){color}_

GINQ will reuse most of standard SQL syntax, which can make the learning curve 
smooth and avoid infringing the patent of Microsoft.

All GINQ related keywords are uppercase to avoid breaking existing source code 
as possible as we can, e.g. {{FROM}}, {{WHERE}}, {{SELECT}}, etc.

*EBNF*

    TBD 

*Examples*
1. Filtering
{code:java}
@groovy.transform.EqualsAndHashCode
class Person {
        String name
        int age
}

def persons = [new Person(name: 'Daniel', age: 35), new Person(name: 'Peter', 
age: 10), new Person(name: 'Alice', age: 22)]

def result =
        FROM persons p       // p is an alias
        WHERE p.age > 15 AND p.age <= 35
        SELECT p.name

assert ['Daniel', 'Alice'] == result

result =
        FROM persons p       // p is an alias
        WHERE p.age > 15 AND p.age <= 35
        SELECT p

assert [new Person(name: 'Daniel', age: 35), new Person(name: 'Alice', age: 
22)] == result
{code}
{code:java}
def numbers = [1, 2, 3]

def result =
        FROM numbers t       // t is an alias
        WHERE t.VALUE <= 2  // VALUE is a virtual property
        SELECT t.VALUE

assert [1, 2] == result
{code}
 


> [GEP] Support LINQ, aka GINQ
> ----------------------------
>
>                 Key: GROOVY-9159
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9159
>             Project: Groovy
>          Issue Type: New Feature
>            Reporter: Daniel Sun
>            Priority: Major
>             Fix For: 4.x
>
>
> _{color:#d04437}(Note: The exact syntax might be altered before introduction, 
> currently working on the general principle){color}_
> GINQ will reuse most of standard SQL syntax, which can make the learning 
> curve smooth and avoid infringing the patent of Microsoft.
> All GINQ related keywords are uppercase to avoid breaking existing source 
> code as possible as we can, e.g. {{FROM}}, {{WHERE}}, {{SELECT}}, etc.
> h2. EBNF
> h3.  TBD 
> h2. Examples
> h3. 1. Filtering
> {code:java}
> @groovy.transform.EqualsAndHashCode
> class Person {
>       String name
>       int age
> }
> def persons = [new Person(name: 'Daniel', age: 35), new Person(name: 'Peter', 
> age: 10), new Person(name: 'Alice', age: 22)]
> def result =
>       FROM persons p       // p is an alias
>       WHERE p.age > 15 AND p.age <= 35
>       SELECT p.name
> assert ['Daniel', 'Alice'] == result
> result =
>       FROM persons p       // p is an alias
>       WHERE p.age > 15 AND p.age <= 35
>       SELECT p
> assert [new Person(name: 'Daniel', age: 35), new Person(name: 'Alice', age: 
> 22)] == result
> {code}
> {code:java}
> def numbers = [1, 2, 3]
> def result =
>       FROM numbers t       // t is an alias
>       WHERE t.VALUE <= 2  // VALUE is a virtual property
>       SELECT t.VALUE
> assert [1, 2] == result
> {code}
> h3. 2. Joining
> {code:java}
> @groovy.transform.EqualsAndHashCode
> class Person {
>       String name
>       int age
>       City city
> }
> @groovy.transform.EqualsAndHashCode
> class City {
>       String name
> }
> def persons = [new Person(name: 'Daniel', age: 35, city: new 
> City('Shanghai')), new Person(name: 'Peter', age: 10, city: new 
> City('Beijing')), new Person(name: 'Alice', age: 22, city: new 
> City('Hangzhou'))]
> def cities = [new City('Shanghai'), new City('Beijing')]
> def result =
>       FROM persons p, cities c
>       WHERE p.city = c.VALUE
>       SELECT p.name
> assert ['Daniel', 'Peter'] == result
> result =
>       FROM persons p, cities c
>       WHERE p.city.name = c.name
>       SELECT p.name
> assert ['Daniel', 'Peter'] == result
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to