diff src/djol/VectorStore.js @ 34:27e8e9e38e07 default tip

Слияние
author nickolay
date Wed, 05 Jun 2019 20:44:15 +0300
parents 8af8e840dd49 1dc2fd263b90
children
line wrap: on
line diff
--- a/src/djol/VectorStore.js	Wed Jun 05 17:44:17 2019 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,289 +0,0 @@
-define(
-    [
-        "dojo/_base/declare",
-        "dojo/_base/array",
-        "implab/safe",
-        "implab/Uuid",
-        "ol",
-        "ol3/listen",
-        "./VectorStoreQuery",
-        "dojo/store/util/QueryResults"
-    ],
-    function (declare, array, safe, UUID, ol, listen, VectorStoreQuery, QueryResults) {
-        function createPaginator(opts) {
-            return (opts.count || opts.start) &&
-                function (results) {
-                    var total = results.length;
-                    results = results.slice(opts.start || 0, (opts.start || 0) +
-                        (opts.count || Infinity));
-                    results.total = total;
-
-                    return results;
-                };
-        }
-
-        /**
-         * Обертка вокруг векторного источника данных ol.source.Vector,
-         * реализует dojo/store а также notify, что делает возможным наблюдение
-         * за хранилищем при помощи dojo/store/Observable.
-         * 
-         * @disposable
-         */
-        return declare(
-            null, {
-                _source: null, // ol3.source.Vector
-
-                _projection: null,
-
-                _subscriptions: null,
-
-                constructor: function (opts) {
-                    safe.argumentNotNull(opts, "opts");
-                    safe.argumentOfType(
-                        opts.source,
-                        ol.source.Vector,
-                        "opts.source");
-
-                    var me = this;
-
-                    me._source = opts.source;
-                    if (opts.projection)
-                        me._projection = ol.proj.get(opts.projection);
-                },
-
-                getSource: function () {
-                    return this._source;
-                },
-
-                getProjection: function() {
-                    return this._projection;
-                },
-
-                get: function (id) {
-                    return this._source.getFeatureById(id);
-                },
-
-                /**
-                 * @param{Object|Function} q предикат для выбора объекта
-                 * @param{Object} opts параметры выполнения (start,count,sort)
-                 * @return{Function} filter(data) filter.matches
-                 *                   filter.matches.predicate
-                 *                   filter.matches.extent filter.sort
-                 *                   filter.sort.compare
-                 */
-                queryEngine: function (q, opts) {
-                    opts = opts || {};
-
-                    // строим функцию для фильтрации
-                    var filter;
-                    if (q instanceof Function) {
-                        // если передали уже готовую функцию, испольуем ее
-                        filter = new VectorStoreQuery(q, q.extent);
-                    } else {
-                        // если передали объект
-                        var extent;
-                        // вытаскиваем из него extent
-                        if (q && 'extent' in q) {
-                            extent = q.extent;
-                            delete q.extent;
-                        }
-
-                        // строим новую функцию фильтрации
-                        filter = new VectorStoreQuery(q, extent);
-                    }
-
-                    // строим функцию сортировки
-                    var sort = opts.sort && this.sortEngine(opts.sort);
-
-                    var paginate = createPaginator(opts);
-
-                    // строим функцию выполнения запроса
-                    var execute = function (data) {
-                        var results = array.filter(data, filter);
-
-                        if (sort)
-                            sort(results);
-
-                        if (paginate)
-                            results = paginate(results);
-                        return results;
-                    };
-
-                    execute.matches = filter;
-                    execute.sort = sort;
-                    execute.paginate = paginate;
-                    return execute;
-                },
-
-                sortEngine: function (options) {
-                    var cmp = function (a, b) {
-                        for (var sort, i = 0;
-                            (sort = options[i]); i++) {
-                            var aValue = a.get(sort.attribute);
-                            var bValue = b.get(sort.attribute);
-                            if (aValue != bValue) {
-                                return Boolean(sort.descending) == aValue > bValue ? -1 : 1;
-                            }
-                        }
-                        return 0;
-                    };
-
-                    var execute = function (data) {
-                        return data.sort(cmp);
-                    };
-
-                    execute.compare = cmp;
-                    return execute;
-                },
-
-                /**
-                 * Запрашивает объекты со слоя
-                 * 
-                 * @param{object|VectorStoreQuery|Function} query
-                 * 
-                 * <pre>
-                 * {
-                 *     extent : ol3.Extent,
-                 * }
-                 * </pre>
-                 */
-                query: function (q, options) {
-                    var me = this;
-                    var filter = this.queryEngine(q, options);
-
-                    if (this.notify && !this.hasOwnProperty("_subscriptions")) {
-                        me._subscriptions = [];
-
-                        var sc = function (evt, handler) {
-                            me._subscriptions.push(listen(me._source, evt, safe.delegate(me, handler)));
-                        }
-
-                        sc("addfeature", "_onAdd");
-                        sc("changefeature", "_onUpdate");
-                        sc("removefeature", "_onRemove");
-                    }
-
-                    var predicate, data, extent = filter.matches &&
-                        filter.matches.extent;
-                    // если это запрос с указанием области
-                    if (extent) {
-                        predicate = filter.matches.predicate;
-
-                        data = this._source.getFeaturesInExtent(extent);
-
-                        if (predicate)
-                            data = array.filter(data, predicate);
-
-                        if (filter.sort)
-                            filter.sort(data);
-
-                        if (filter.paginate)
-                            data = filter.paginate(data);
-                    } else {
-                        // любой другой запрос
-                        data = filter(this._source.getFeatures());
-                    }
-
-                    return new QueryResults(data);
-                },
-
-                put: function (obj, options) {
-                    safe.argumentOfType(obj, ol.Feature, "obj");
-                    if (!options)
-                        options = {};
-
-                    if (options.id)
-                        obj.setId(options.id);
-
-                    var id = obj.getId() || new UUID();
-
-                    var prev = this.get(id);
-
-                    if ('overwrite' in options) {
-                        // overwrite=true указан, но перезаписывать нечего
-                        if (!prev && options.overwrite)
-                            throw new Error("The specified feature with id '" +
-                                id + "' doesn't exist in the store");
-
-                        // overwrite=false указан, но объект уже существует
-                        if (prev && !options.overwrite)
-                            throw new Error("The specified feature with id '" +
-                                id + "' already exists in the store");
-                    }
-
-                    // ok
-                    if (prev) {
-                        var data = obj.getProperties();
-                        prev.setProperties(data);
-                    } else {
-                        this._source.addFeature(obj);
-                    }
-
-                    return id;
-                },
-
-                add: function (obj, options) {
-                    safe.argumentOfType(obj, ol.Feature, "obj");
-
-                    if (!options)
-                        options = {};
-
-                    if (options.id)
-                        obj.setId(options.id);
-
-                    var id = obj.getId() || new UUID();
-
-                    var prev = this.get(id);
-
-                    if (prev)
-                        throw new Error("The specified feature with id '" + id +
-                            "' already exists in the store");
-
-                    this._source.addFeature(obj);
-                },
-
-                remove: function (id) {
-                    var me = this;
-
-                    var ft = me.get(id);
-                    if (ft)
-                        me._source.removeFeature(ft);
-                },
-
-                getIdentity: function (obj) {
-                    if (safe.isNull(obj))
-                        return undefined;
-                    if (!(obj instanceof ol.Feature))
-                        throw new Error("A feature is expected");
-
-                    return obj.getId();
-                },
-
-                _onAdd: function (ev) {
-                    this.notify(ev.feature);
-                },
-
-                _onRemove: function (ev) {
-                    var id = ev.feature.getId();
-                    if (!safe.isNull(id))
-                        this.notify(undefined, id);
-                },
-
-                _onUpdate: function (ev) {
-                    var id = ev.feature.getId();
-                    if (!safe.isNull(id))
-                        this.notify(ev.feature, id);
-                },
-
-                dispose: function () {
-                    var me = this;
-                    if (me._subscriptions)
-                        me._subscriptions.forEach(function (sc) {
-                            sc.remove();
-                        });
-
-                    me._source = null;
-                    me._subscriptions = null;
-                }
-            });
-    });
\ No newline at end of file