1 |
|
2 |
|
3 |
|
4 | 'use strict';
|
5 |
|
6 | module.exports = class QueryHelper {
|
7 |
|
8 | static getAttr (model, name) {
|
9 | return model instanceof ActiveRecord ? model.get(name) : model[name];
|
10 | }
|
11 |
|
12 | static indexObjects (docs, key) {
|
13 | const result = {};
|
14 | for (const doc of docs) {
|
15 | result[typeof key === 'function' ? key(doc) : doc[key]] = doc;
|
16 | }
|
17 | return result;
|
18 | }
|
19 |
|
20 | static indexModels (models, key) {
|
21 | const result = {};
|
22 | for (const model of models) {
|
23 | result[typeof key === 'function' ? key(model) : model.get(key)] = model;
|
24 | }
|
25 | return result;
|
26 | }
|
27 |
|
28 | static normalizeRelations (model, data) {
|
29 | const result = {};
|
30 | let tail, relation;
|
31 | for (let name of Object.keys(data)) {
|
32 | const value = data[name];
|
33 | const pos = name.indexOf('.');
|
34 | if (pos > 0) {
|
35 | tail = name.substring(pos + 1);
|
36 | name = name.substring(0, pos);
|
37 | }
|
38 | if (Object.prototype.hasOwnProperty.call(result, name)) {
|
39 | relation = result[name];
|
40 | } else {
|
41 | relation = model.getRelation(name);
|
42 | if (!relation) {
|
43 | continue;
|
44 | }
|
45 | relation.primaryModel = null;
|
46 | result[name] = relation;
|
47 | }
|
48 | if (tail) {
|
49 | relation.with({[tail]: value});
|
50 | } else if (typeof value === 'function') {
|
51 | value(relation);
|
52 | }
|
53 | }
|
54 | return result;
|
55 | }
|
56 |
|
57 | static unlinkInternal (ref, link, model, key) {
|
58 | if (Array.isArray(ref)) {
|
59 | const index = ArrayHelper.indexOf(link, ref);
|
60 | if (index !== - 1) {
|
61 | ref.splice(index, 1);
|
62 | }
|
63 | } else {
|
64 | model.set(key, null);
|
65 | }
|
66 | return model.forceSave();
|
67 | }
|
68 | };
|
69 |
|
70 | const ArrayHelper = require('./ArrayHelper');
|
71 | const ActiveRecord = require('../db/ActiveRecord'); |
\ | No newline at end of file |