diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/implab/data/StoreAdapter.js	Thu Jun 01 13:20:03 2017 +0300
@@ -0,0 +1,110 @@
+define([
+    "dojo/_base/declare",
+    "core/safe",
+    "dojo/when",
+    "dojo/store/util/QueryResults" ],
+
+function(declare, safe, when, QueryResults) {
+
+    "use strict";
+
+    /**
+     * Обертка вокруг произвольного хранилища, только для чтения. Используется
+     * для преобразования данных, например, отображения в списках элементов
+     * пространственных данных.
+     */
+    return declare(null, {
+        /**
+         * @type{String} Свойство, хранящее идентификатор
+         */
+        idProperty : null,
+
+        _store : null,
+
+        /**
+         * @param{String} opts.idProperty Имя свойства, в которое будет записан
+         *                идентификатор, если не указан, то идентификатор будет
+         *                взят из родительского хранилища или использоваться
+         *                строка <code>id</code>
+         * @param{dojo.store} opts.store Родительское хранилище
+         */
+        constructor : function(opts) {
+            safe.argumentNotNull(opts, "opts");
+            safe.argumentNotNull(opts.store, "opts.store");            
+
+            this._store = opts.store;
+            delete opts.store;
+            declare.safeMixin(this, opts);
+            this.idProperty = opts.idProperty || this._store.idProperty || "id";
+        },
+
+        getParentStore : function() {
+            return this._store;
+        },
+
+        get : function(id) {
+            var me = this;
+            return when(me._store.get(id), function(x) {
+                var m = me.mapItem(x);
+                if (!(me.idProperty in m))
+                    m[me.idProperty] = id;
+                return m;
+            });
+        },
+
+        /**
+         * Выполняет запрос в родительском хранилище, для этого используется
+         * <code>translateQuery</code> для подготовки запроса, затем,
+         * <code>mapItem</code> для преобразования результатов.
+         */
+        query : function(q, options) {
+            var me = this, store = this._store;
+            return when(store.query(me.translateQuery(q), me
+                .translateOptions(options)), function(res) {
+                var total = res.total;
+                var mapped = res.map(function(x) {
+                    var m = me.mapItem(x);
+                    if (!(me.idProperty in m))
+                        m[me.idProperty] = store.getIdentity &&
+                            store.getIdentity(x);
+                    return m;
+                });
+                mapped.total = total;
+                var results = new QueryResults(mapped);
+                console.log(results);
+                return results;
+            });
+        },
+
+        getIdentity : function(obj) {
+            return obj && obj[this.idProperty];
+        },
+
+        /**
+         * Преобразование запроса в формат родительского хранилища.
+         * 
+         * @param{Object} q Запрос в формате текущего хранилища
+         * @returns{Object} Запрос в формате родительского хранилища
+         */
+        translateQuery : function(q) {
+            return q;
+        },
+
+        translateOptions : function(options) {
+            return options;
+        },
+
+        /**
+         * Преобразование объекта из родительского хранилища. При преобразовании
+         * в объекте можно задать идентификатор, иначе идентификатор будет
+         * автоматически получен и присвоен из родительского хранилища
+         * 
+         * @param{Object} item Объект из родительского хранилища
+         * @returns{Object} результат преобразования
+         */
+        mapItem : function(item) {
+            return item;
+        }
+    });
+
+});
\ No newline at end of file