@@ -117,6 +117,7 @@ class KnormRelations {
117
117
super ( model ) ;
118
118
// TODO: only initialize parsedRows when needed
119
119
this . parsedRows = new Map ( ) ;
120
+ // TODO: move this to base model default options
120
121
this . options . ensureUniqueField = true ;
121
122
this . config . references = model . config . references ;
122
123
this . config . referenceFunctions = model . config . referenceFunctions ;
@@ -127,56 +128,14 @@ class KnormRelations {
127
128
joins = [ joins ] ;
128
129
}
129
130
131
+ // TODO: use appendOption
130
132
this . options . joins = this . options . joins || [ ] ;
131
133
132
134
joins . forEach ( join => {
133
135
if ( join . prototype instanceof Model ) {
134
136
join = join . query ;
135
137
}
136
138
137
- const joinReferences = Object . assign ( { } , join . config . references ) ;
138
- const thisReferences = Object . assign ( { } , this . config . references ) ;
139
-
140
- Object . entries ( join . config . referenceFunctions ) . forEach (
141
- ( [ fieldName , referenceFunction ] ) => {
142
- const field = join . config . fields [ fieldName ] ;
143
- addReferenceByFunction ( joinReferences , referenceFunction , field ) ;
144
- }
145
- ) ;
146
-
147
- Object . entries ( this . config . referenceFunctions ) . forEach (
148
- ( [ fieldName , referenceFunction ] ) => {
149
- const field = this . config . fields [ fieldName ] ;
150
- addReferenceByFunction ( thisReferences , referenceFunction , field ) ;
151
- }
152
- ) ;
153
-
154
- if (
155
- ! thisReferences [ join . model . name ] &&
156
- ! joinReferences [ this . model . name ]
157
- ) {
158
- throw new Query . QueryError (
159
- `${ this . model . name } : there are no references to \`${
160
- join . model . name
161
- } \``
162
- ) ;
163
- }
164
-
165
- const isReverseJoin = ! ! thisReferences [ join . model . name ] ;
166
- const mergedReferences = Object . assign (
167
- { } ,
168
- thisReferences [ join . model . name ] ,
169
- joinReferences [ this . model . name ]
170
- ) ;
171
- const mergedReferencesReversed = mapReferencesByReferencedField (
172
- mergedReferences ,
173
- isReverseJoin ? join . model : this . model
174
- ) ;
175
-
176
- join . config . isReverseJoin = isReverseJoin ;
177
- join . config . mergedReferences = mergedReferences ;
178
- join . config . mergedReferencesReversed = mergedReferencesReversed ;
179
-
180
139
join . options . joinType = type ;
181
140
join . setOptions ( options ) ;
182
141
@@ -206,18 +165,57 @@ class KnormRelations {
206
165
}
207
166
208
167
prepareOn ( ) {
168
+ const join = this ;
169
+ const parent = this . parent ;
170
+ const joinReferences = Object . assign ( { } , join . config . references ) ;
171
+ const parentReferences = Object . assign ( { } , parent . config . references ) ;
172
+
173
+ Object . entries ( join . config . referenceFunctions ) . forEach (
174
+ ( [ fieldName , referenceFunction ] ) => {
175
+ const field = join . config . fields [ fieldName ] ;
176
+ addReferenceByFunction ( joinReferences , referenceFunction , field ) ;
177
+ }
178
+ ) ;
179
+
180
+ Object . entries ( parent . config . referenceFunctions ) . forEach (
181
+ ( [ fieldName , referenceFunction ] ) => {
182
+ const field = parent . config . fields [ fieldName ] ;
183
+ addReferenceByFunction ( parentReferences , referenceFunction , field ) ;
184
+ }
185
+ ) ;
186
+
187
+ if (
188
+ ! parentReferences [ join . model . name ] &&
189
+ ! joinReferences [ parent . model . name ]
190
+ ) {
191
+ throw new Query . QueryError (
192
+ `${ parent . model . name } : there are no references to \`${
193
+ join . model . name
194
+ } \``
195
+ ) ;
196
+ }
197
+
198
+ const isReverseJoin = ! ! parentReferences [ join . model . name ] ;
199
+ const toModel = isReverseJoin ? join . model : parent . model ;
200
+ const mergedReferences = Object . assign (
201
+ { } ,
202
+ parentReferences [ join . model . name ] ,
203
+ joinReferences [ parent . model . name ]
204
+ ) ;
205
+ const mergedReferencesReversed = mapReferencesByReferencedField (
206
+ mergedReferences ,
207
+ toModel
208
+ ) ;
209
209
let references = [ ] ;
210
210
211
211
if ( this . options . on ) {
212
212
this . options . on . forEach ( field => {
213
213
if ( field instanceof Field ) {
214
- if ( field . model === this . parent . model ) {
215
- if ( this . config . mergedReferences [ field . name ] ) {
216
- references . push ( this . config . mergedReferences [ field . name ] ) ;
214
+ if ( field . model === parent . model ) {
215
+ if ( mergedReferences [ field . name ] ) {
216
+ references . push ( mergedReferences [ field . name ] ) ;
217
217
} else {
218
- references . push (
219
- ...this . config . mergedReferencesReversed [ field . name ]
220
- ) ;
218
+ references . push ( ...mergedReferencesReversed [ field . name ] ) ;
221
219
}
222
220
return ;
223
221
}
@@ -226,37 +224,34 @@ class KnormRelations {
226
224
field = field . name ;
227
225
}
228
226
229
- if ( this . config . mergedReferencesReversed [ field ] ) {
230
- references . push ( ...this . config . mergedReferencesReversed [ field ] ) ;
227
+ if ( mergedReferencesReversed [ field ] ) {
228
+ references . push ( ...mergedReferencesReversed [ field ] ) ;
231
229
} else {
232
- references . push ( this . config . mergedReferences [ field ] ) ;
230
+ references . push ( mergedReferences [ field ] ) ;
233
231
}
234
232
} ) ;
235
233
} else {
236
- references = Object . values ( this . config . mergedReferences ) ;
234
+ references = Object . values ( mergedReferences ) ;
237
235
}
238
236
239
- const isReverseJoin = this . config . isReverseJoin ;
240
-
241
237
return references . reduce ( ( columns , field ) => {
242
238
const fromColumn = field . column ;
243
239
const references = isArray ( field . references )
244
240
? field . references
245
241
: [ field . references ] ;
246
242
247
243
references . forEach ( reference => {
248
- const toModel = isReverseJoin ? this . model : this . parent . model ;
249
244
if ( reference . model . name === toModel . name ) {
250
245
const toColumn = reference . column ;
251
246
let from ;
252
247
let to ;
253
248
254
- if ( this . config . isReverseJoin ) {
255
- from = this . formatColumn ( toColumn ) ;
256
- to = this . parent . formatColumn ( fromColumn ) ;
249
+ if ( isReverseJoin ) {
250
+ from = join . formatColumn ( toColumn ) ;
251
+ to = parent . formatColumn ( fromColumn ) ;
257
252
} else {
258
- from = this . formatColumn ( fromColumn ) ;
259
- to = this . parent . formatColumn ( toColumn ) ;
253
+ from = join . formatColumn ( fromColumn ) ;
254
+ to = parent . formatColumn ( toColumn ) ;
260
255
}
261
256
262
257
columns [ from ] = to ;
0 commit comments