Yes, nested is slightly cleaner but doing aggregation functions on items not 
part of the groupby is common in sql and would make ginq more intuitive to use 
imho. i.e.
Instead of

def qSum = GQ {
   from n in (
       from s in sales
       join w in warehouse on w.id<http://w.id/> == s.item
       select w.name<http://w.name/>, w.price)
   groupby n.name<http://n.name/>
   select n.name<http://n.name/>, sum(n.price) as price
}

which would be equal to the sql
select n.name, sum(n.price) as price from (
  select w.name, w.price
  from sales s
  join warehouse w on w.id= s.item
) n
group by n.name

I think it would make sense to support
def qSum = GQ {
    from s in sales
    join w in warehouse on w.id<http://w.id/> == s.item
   groupby n.name<http://n.name/>
   select n.name<http://n.name/>, sum(n.price) as price
}

which would equal the sql
select w.name, sum(w.price) as price from
from sales s
join warehouse w on w.id = s.item
groupby w.name<http://n.name/>

I submitted a feature request for this here: 
https://issues.apache.org/jira/projects/GROOVY/issues/GROOVY-11491

From: Mario Garcia <mario.g...@gmail.com>
Reply to: "users@groovy.apache.org" <users@groovy.apache.org>
Date: Monday, 7 October 2024 at 12:45
To: "users@groovy.apache.org" <users@groovy.apache.org>
Subject: Re: Ginq: combining join and aggregate functions


You don't often get email from mario.g...@gmail.com. Learn why this is 
important<https://aka.ms/LearnAboutSenderIdentification>

I guess you can create a nested statement and do it all at once

def qSum = GQ {
   from n in (
       from s in sales
       join w in warehouse on w.id<http://w.id/> == s.item
       select w.name<http://w.name/>, w.price)
   groupby n.name<http://n.name/>
   select n.name<http://n.name/>, sum(n.price) as price
}



El dom, 6 oct 2024 a las 10:26, Per Nyfelt 
(<p...@alipsa.se<mailto:p...@alipsa.se>>) escribió:

I figured out a workaround i.e. to do it in two steps:

def q = GQ {

  from s in sales

  join w in warehouse on w.id == s.item

  select w.name, w.price

}

assert  [['Orange', 11.0], ['Orange', 11.0], ['Banana', 4.0]] == q.toList()



def q2 = GQ {

  from w in q

  groupby w.name

  orderby w.name in desc

  select w.name, sum(w.price)

}

assert [['Orange', 22.0], ['Banana', 4.0]] == q2.toList()



I submitted a feature request in Jira to support use of join, groupby and 
aggregate functions together.



Regards,

Per
On 10/5/24 19:16, Per Nyfelt wrote:
Hi, I am trying to learn Ginq and are having problems with joining an 
aggregation functions.

The following example illustrates the issue:

import java.time.LocalDate

class Warehouse {
    int id
    String name
    Double price
    int stock

    Warehouse(int id, String name, Double price, int stock) {
      this.id<http://this.id/> = id
      this.name<http://this.name/> = name
      this.price = price
      this.stock = stock
    }
  }

  class Sales {
    LocalDate date
    int item

    Sales(LocalDate date, int item) {
      this.date = date
      this.item = item
    }
  }


List<Warehouse> warehouse = [
    new Warehouse(1, 'Orange', 11, 2),
    new Warehouse(2, 'Apple', 6, 3),
    new Warehouse(3, 'Banana', 4, 1),
    new Warehouse(4, 'Mango', 29, 10)
]
List<Sales> sales = [
    new Sales(LocalDate.of(2024, 5, 1), 1),
    new Sales(LocalDate.of(2024, 5, 2), 1),
    new Sales(LocalDate.of(2024, 5, 3), 3)
]
def q = GQ {
  from s in sales
  join w in warehouse on w.id<http://w.id/> == s.item
  select w.name<http://w.name/>, w.price
}
// so far so good, the following works:
assert  [['Orange', 11.0], ['Orange', 11.0], ['Banana', 4.0]] == q.toList()

// now try to summarize by name
def qSum = GQ {
  from s in sales
  join w in warehouse on w.id<http://w.id/> == s.item
  groupby w.name<http://w.name/>
  select w.name<http://w.name/>, sum(w.price)
}
// Fails with Exception evaluating property 'price' for groovy.lang.Tuple2,
// Reason: groovy.lang.MissingPropertyException: No such property: price for 
class: Sales
assert  [['Orange', 22.0], ['Banana', 4.0]] == qSum.toList()

So for some reason ginq thinks it will find the price property in the Sales 
class instead of in the Warehouse class so w.price here is not understood. What 
is the right way to write it?

Regards,

Per

Reply via email to