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

Reply via email to