Re: Ginq: combining join and aggregate functions

Per Nyfelt <[email protected]> Sat, 12 Oct 2024 18:13:56 +0200
Newsgroups gmane.comp.lang.groovy.user
Organization Alipsa HB
Message-ID <[email protected]>
Wonderful news!

On 10/12/24 17:39, Daniel Sun wrote:
> "GROOVY-11491: Add support for join and group by in ginq" is fixed in 4.0.24 and 5.0.0-alpha-11.
>
> https://github.com/apache/groovy/commit/6371ceaeea0fee1a9760e9b81d293f487ceff429
>
> Cheers,
> Daniel Sun
>
> On 2024/10/09 04:25:31 Daniel Sun wrote:
>> I will look into the issue later.
>>
>> Could you submit a JIRA ticket to track the issue?
>>
>> Here is the similar example, but its works, I am curious about the difference between them.
>>
>> https://github.com/apache/groovy/blob/02ac82f92760357c0eb653ed2f1fa2f0a6dd65cc/subprojects/groovy-ginq/src/spec/test/org/apache/groovy/ginq/GinqTest.groovy#L4789
>>
>> Cheers,
>> Daniel Sun
>>
>> On 2024/10/05 17:16:02 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 = id
>>>         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 == s.item
>>>     select 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 == s.item
>>>     groupby w.name
>>>     select 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
>>>
>>>