Hi Per,
You can find the `leftjoin` usage here:
https://github.com/apache/groovy/blob/b046d1b2bcbbddd59ea3d6abdf5de24a671ce51a/subprojects/groovy-ginq/src/spec/test/org/apache/groovy/ginq/GinqTest.groovy#L763
Cheers,
Daniel Sun
On 2025/06/17 20:46:35 Per Nyfelt wrote:
> Hi,
>
> I ran into a a ginq "issue" today.
>
> I have two list of rows where each key is the column name (actually
> List<Row> but you can think about it as a List<Map>) collections that
> looks like this:
>
> employees: 3 obs * 5 variables
> mainSsn coSsn firstName salary startDate
> 111 Rick 623.3 2012-01-01
> 222 444 Dan 515.2 2013-09-23
> 333 555 Michelle 611.0 2014-11-15
>
> eln: 5 obs * 2 variables
> customerId lei
> 2 111
> 3 222
> 4 333
> 5 444
> 6 555
>
> I want to join employees with eln and add customerIs columns matching
> mainSsn and CoSsn. Thinking SQL, I wanted to do something like this
>
> def result =GQ {
> from tin employees
> leftjoin mcidin elnon t.mainSsn == mcid.lei leftjoin cocidin elnon t.coSsn
> == cocid.lei select t.*, mcid?.customerId as'mainCustomerId',
> cocid?.customerId as'coCustomerId' }
>
> but this is not supported in ginq and I could not find any signs of support
> for wildcards in the docs.
>
> I found that could do this:
> def result = GQ {
> from t in table
> leftjoin mcid in ssnCustomerId on t.mainSsn == mcid.lei
> leftjoin cocid in ssnCustomerId on t.coSsn == cocid.lei
> select t + mcid?.customerId+ cocid?.customerId
> }
>
> Which gives me a List of Lists but then i loose the column names. i.e.
> merged: 3 obs * 7 variables
> c1 c2 c3 c4 c5 c6 c7
> 111 444 Rick 623.3 2012-01-01 2 5
> 222 Dan 515.2 2013-09-23 3 null
> 333 555 Michelle 611.0 2014-11-15 4 6
>
> Instead i had to do this:
>
> def result =GQ {
> from tin employees
> leftjoin mcidin elnon t.mainSsn == mcid.lei leftjoin cocidin elnon t.coSsn
> == cocid.lei select t.toMap() + [mainCustomerId: mcid?.customerId] +
> [coCustomerId: cocid?.customerId]
> }
>
> (This relies on the fact that a matrix Row has a toMap() method)
>
> ginq result content:
> [{mainSsn=111, coSsn=, firstName=Rick, salary=623.3,
> startDate=2012-01-01, mainCustomerId=2, coCustomerId=null},
> {mainSsn=222, coSsn=444, firstName=Dan, salary=515.2,
> startDate=2013-09-23, mainCustomerId=3, coCustomerId=5}, {mainSsn=333,
> coSsn=555, firstName=Michelle, salary=611.0, startDate=2014-11-15,
> mainCustomerId=4, coCustomerId=6}]
>
> Which is could then easily transform back into a list of rows (actually
> a matrix but you can think of it as a List<Map>
>
> result matrix content:
> merged: 3 obs * 7 variables
> mainSsn coSsn firstName salary startDate mainCustomerId
> coCustomerId
> 111 Rick 623.3
> 2012-01-01 2 null
> 222 444 Dan 515.2
> 2013-09-23 3 5
> 333 555 Michelle 611.0 2014-11-15
> 4 6
>
> Has there been any discussions about supporting breaking up the select
> objects into parts using wildcards and deemed it not feasible to
> implement or did nobody have this problem before?
>
> Something like this could perhaps be an alternative to wildcard syntax:
>
> def result =GQ {
> from tin employees
> leftjoin mcidin elnon t.mainSsn == mcid.lei leftjoin cocidin elnon t.coSsn
> == cocid.lei select toMap(t) + [mainCustomerId:
> mcid?.customerId,coCustomerId: cocid?.customerId])
> }
>
> what do you think?
>
> Best regards,
>
> Per
>