1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
trait Mapper[T <: Mapper[T]]
trait KeyedMapper[KeyType, T <: KeyedMapper[KeyType, T]] extends Mapper[T]
trait KeyedMetaMapper[KeyType, T <: KeyedMapper[KeyType, T]]
trait MappedForeignKey[KeyType, Owner <: Mapper[Owner], Other <: KeyedMapper[KeyType, Other]]
trait IdPK
class TestSubject extends KeyedMapper[Long, TestSubject] with IdPK
class TestRun extends KeyedMapper[Long, TestRun] with IdPK {
object testSubject extends MappedForeignKey[Long, TestRun, TestSubject]
}
object TestRun extends TestRun with KeyedMetaMapper[Long, TestRun]
class MetaTestSubject extends TestSubject with KeyedMetaMapper[Long, TestSubject]
object TestSubject extends MetaTestSubject
object Main {
def oneToOneJoin[PType <: KeyedMapper[Long, PType] with IdPK,
CType <: KeyedMapper[Long, CType] with IdPK,
CMetaType <: CType with KeyedMetaMapper[Long, CType],
FKType <: MappedForeignKey[Long, PType, CType]]
(parents: List[PType], metaMapper: CMetaType, keyGetter: (PType) => FKType ):
Map[Long, CType] = Map.empty
def callIt: Unit = {
oneToOneJoin[TestRun, TestSubject, MetaTestSubject,
MappedForeignKey[Long, TestRun, TestSubject]](
List(), TestSubject, (tr: TestRun) => tr.testSubject)
}
}
|