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