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 });