Mercurial > pub > ImplabJs
comparison src/implab/data/StoreAdapter.js @ 0:fc2517695ee1
Initial commit, draft import of existing work
author | cin |
---|---|
date | Thu, 01 Jun 2017 13:20:03 +0300 |
parents | |
children | 93fb6c09f2e1 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:fc2517695ee1 |
---|---|
1 define([ | |
2 "dojo/_base/declare", | |
3 "core/safe", | |
4 "dojo/when", | |
5 "dojo/store/util/QueryResults" ], | |
6 | |
7 function(declare, safe, when, QueryResults) { | |
8 | |
9 "use strict"; | |
10 | |
11 /** | |
12 * Обертка вокруг произвольного хранилища, только для чтения. Используется | |
13 * для преобразования данных, например, отображения в списках элементов | |
14 * пространственных данных. | |
15 */ | |
16 return declare(null, { | |
17 /** | |
18 * @type{String} Свойство, хранящее идентификатор | |
19 */ | |
20 idProperty : null, | |
21 | |
22 _store : null, | |
23 | |
24 /** | |
25 * @param{String} opts.idProperty Имя свойства, в которое будет записан | |
26 * идентификатор, если не указан, то идентификатор будет | |
27 * взят из родительского хранилища или использоваться | |
28 * строка <code>id</code> | |
29 * @param{dojo.store} opts.store Родительское хранилище | |
30 */ | |
31 constructor : function(opts) { | |
32 safe.argumentNotNull(opts, "opts"); | |
33 safe.argumentNotNull(opts.store, "opts.store"); | |
34 | |
35 this._store = opts.store; | |
36 delete opts.store; | |
37 declare.safeMixin(this, opts); | |
38 this.idProperty = opts.idProperty || this._store.idProperty || "id"; | |
39 }, | |
40 | |
41 getParentStore : function() { | |
42 return this._store; | |
43 }, | |
44 | |
45 get : function(id) { | |
46 var me = this; | |
47 return when(me._store.get(id), function(x) { | |
48 var m = me.mapItem(x); | |
49 if (!(me.idProperty in m)) | |
50 m[me.idProperty] = id; | |
51 return m; | |
52 }); | |
53 }, | |
54 | |
55 /** | |
56 * Выполняет запрос в родительском хранилище, для этого используется | |
57 * <code>translateQuery</code> для подготовки запроса, затем, | |
58 * <code>mapItem</code> для преобразования результатов. | |
59 */ | |
60 query : function(q, options) { | |
61 var me = this, store = this._store; | |
62 return when(store.query(me.translateQuery(q), me | |
63 .translateOptions(options)), function(res) { | |
64 var total = res.total; | |
65 var mapped = res.map(function(x) { | |
66 var m = me.mapItem(x); | |
67 if (!(me.idProperty in m)) | |
68 m[me.idProperty] = store.getIdentity && | |
69 store.getIdentity(x); | |
70 return m; | |
71 }); | |
72 mapped.total = total; | |
73 var results = new QueryResults(mapped); | |
74 console.log(results); | |
75 return results; | |
76 }); | |
77 }, | |
78 | |
79 getIdentity : function(obj) { | |
80 return obj && obj[this.idProperty]; | |
81 }, | |
82 | |
83 /** | |
84 * Преобразование запроса в формат родительского хранилища. | |
85 * | |
86 * @param{Object} q Запрос в формате текущего хранилища | |
87 * @returns{Object} Запрос в формате родительского хранилища | |
88 */ | |
89 translateQuery : function(q) { | |
90 return q; | |
91 }, | |
92 | |
93 translateOptions : function(options) { | |
94 return options; | |
95 }, | |
96 | |
97 /** | |
98 * Преобразование объекта из родительского хранилища. При преобразовании | |
99 * в объекте можно задать идентификатор, иначе идентификатор будет | |
100 * автоматически получен и присвоен из родительского хранилища | |
101 * | |
102 * @param{Object} item Объект из родительского хранилища | |
103 * @returns{Object} результат преобразования | |
104 */ | |
105 mapItem : function(item) { | |
106 return item; | |
107 } | |
108 }); | |
109 | |
110 }); |