static member inline unnest< ^T1> (t1:Tuple< ^T1>, tn) = (t1,tn)
static member inline unnest ((t1,t2),tn) = (t1,t2,tn)
static member inline unnest ((t1,t2,t3),tn) = (t1,t2,t3,tn)
static member inline unnest ((t1,t2,t3,t4),tn) = (t1,t2,t3,t4,tn)
static member inline unnest ((t1,t2,t3,t4,t5),tn) = (t1,t2,t3,t4,t5,tn)
static member inline unnest ((t1,t2,t3,t4,t5,t6),tn) = (t1,t2,t3,t5,t6,tn)
let testAppend = TuplesHelpers.append((1),2)
let testAppend2 = TuplesHelpers.append((1,2),3)
let inline ilJoin< ^I1, ^L, ^I2, ^TP, ^TPH, ^TPN when
^I1: (member Iid : int) and
^I2: (member Iid : int) and
^L: (member Iid : int) and
^L: (member Otheriid : int) and
^TPH: (static member unnest: ^TP -> ^TPN)
>( intup: IQueryable< ^TP>, tupSel: (^TP -> ^I1), lq:IQueryable< ^L>, i2q:IQueryable< ^I2>,jt:ILJoinType) =
let iidFromI = fun (i: ^I1) -> (^I1: (member Iid : int) i)
let i1FromTup = fun (tp:^TP) tupSel tp
let i2iid = fun (i: ^I2) -> (^I2: (member Iid : int) i)
let liid = fun (l: ^L) -> (^L: (member Iid : int) l)
let loid = fun (l: ^L) -> (^L: (member Otheriid : int) l)
let unnest = fun ((tp:^TP,n:^I2) as tn) -> (^TPH: (static member unnest: ^TP -> ^TPN) tn)
let part1 = ilq.Join(lq, i1iid, i1l, fun i1 l -> TupleHelpers.append(i1,l))
part1.Join(i2q, fun (i1,l) -> i2l l, l2iid, fun _ i2 -> i2)
let runJoin (qs:Queryables) =
join (losl in qs.Losl) on (i.Iid = losl.Otheriid)
join (iosl in qs.Iosl) on (losl.Iid = iosl.Iid)
join (lop in qs.Lop) on (losl.Iid = lop.Otheriid)
join (iop in qs.Iop) on (lop.Iid = iop.Iid)
let runJoin2 (qs:Queryables) =
let iosl = ilJoin (itgu,qs.Losl,qs.Iosl,I2Iid)
let iop = ilJoin (iosl,qs.Lop,qs.Iop,I2Iid)
join (l in lq) on (i.Iid = l.Iid)