Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 18 additions & 10 deletions lib/models/queryset.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ class AggregationQuerySet {
return this.operation(lookup);
}

reverse_related(RelatedModel) {
reverse_related({ Model: RelatedModel, options={} }) {
const Model = require('./model');
if(!(RelatedModel.prototype instanceof Model)) {
throw new Error(`RelatedModel must be an instance of Model. Got ${typeof RelatedModel}`);
Expand All @@ -150,26 +150,33 @@ class AggregationQuerySet {
let lookup = Operations.SelectRelatedOperation.build(RelatedModel, {
as: `${underscore_name(RelatedModel.collection_name)}s`,
localField: model_pk_key,
foreignField: `${underscore_name(this.Model.collection_name)}_id`
foreignField: `${underscore_name(this.Model.collection_name)}_id`,
...options
});

return this.operation(lookup);
}

select_related(...keys) {
// keys can be [{ key: xxx, options: xxx }]
// and key can be string (in fields) or Model
for(const k of keys) {
this.select_one_related(k);
if(typeof k === 'string') {
this.select_one_related({ key: k })
} else {
this.select_one_related(k);
}
}

return this;
}

select_one_related(key) {
select_one_related({ key, options={} }) {
const Model = require('./model');
let reversed = (key.prototype && key.prototype instanceof Model);
const reversed = (key.prototype && key.prototype instanceof Model);

if(reversed) {
return this.reverse_related(key);
return this.reverse_related({ Model: key, options });
}

// Performs some magic
Expand All @@ -180,18 +187,19 @@ class AggregationQuerySet {
throw new Error(`"${key}" is not defined in validation schema for ${this.Model.name}. Cannot select related objects`);
}

let field = this.Model.VALIDATION_SCHEMA[key];
const field = this.Model.VALIDATION_SCHEMA[key];
if(!(field instanceof Fields.ForeignKey)) {
throw new Error(`"${key}" is not a foreign key field`);
}

let foreign_model = field.Model;
let [foreign_pk_key] = Fields.pk(foreign_model.VALIDATION_SCHEMA);
const foreign_model = field.Model;
const [foreign_pk_key] = Fields.pk(foreign_model.VALIDATION_SCHEMA);

let lookup = Operations.SelectRelatedOperation.build(foreign_model, {
as: key,
localField: field.replace_key(key),
foreignField: foreign_pk_key
foreignField: foreign_pk_key,
...options
});

// Add lookup to join collections
Expand Down