|
Collection – фреймворк для управления данными
Всем привет!:)
Хочу представить всем свою разработку (хотя уже как то представлял давно, но тема забилась оффтопом). Данный фреймворк даёт очень мощное и гибкое АПИ для управлениями данными, в принципе есть всё, чтобы использовать, как полноценную СУБД. Краткий список возможностей:
Фреймворк написан на чистом JavaScript, однако для работы с DOM он использует сторонние библиотеки (для поиска узлов), из коробки есть поддержка: jQuery, DoJo, Mootools, Prototype, QSA (надеюсь Devote не против:) ), Sizzle. Хотя расширить этот список не составит труда. Сфера применения огромна: например используя Collection можно за пару дней написать очень мощный табличный процессор, оффлайн БД для настольных приложений и т.д.. Сейчас я занимаюсь одним стартапом, где пробую свой велосипед на сервере (node.js), как основную СУБД, также Collection используется в некоторых сервисах Yandex. Имеется подробный мануал и документация на сайте проекте: http://www.collection-js.com Сама либа: http://www.collection-js.com/files/c...lection.min.js Github: https://github.com/kobezzza/Collection Чтобы понять, что же это такое, рекомендую прочитать: http://www.collection-js.com/manual/part-1.html С уважением, Андрей! ЗЫ: просьба не разводить холивар и оффтоп. |
Цитата:
Какие заметные отличия от похожего инструмента Follow.js? |
Цитата:
|
Цитата:
Да и другим, возможно, интересно :) Кстати, чувак, который это делал, рядом со мной сидит. |
Цитата:
|
Цитата:
|
Цитата:
Изначально, когда я начинал писать свой Collection, мне нужен был только общий интерфейс стандартных методов для массивов и объектов, затем меня увлекла идея написания своей СУБД на JS, которая могла бы работать как на клиенте, так и на сервере. Пример некоторого запроса на моём Collection: // создадим новую коллекцию (структура может быть любой) var db = new Collection({ users: [ {name: 'Андрей', age: 22}, {name: 'Вася', age: 25}, {name: 'Гоша', age: 19}, {name: 'Петя', age: 27}, {name: 'Стас', age: 23} ], nmb: [1, 2, 3, 4, 5] }); // запросим данные из кластера users о всех людях старше 20-ти и моложе 25-ти // затем сохраним данные в новую коллекцию в стеке (назовём test) и назначим её активной db.get('users >> :el.age > 20 && el.age < 25', '>>>test'); // теперь отсортируем по полю name db.sort('name'); Чтобы понять что за магия с символами и т.д. достаточно прочитать мануал: http://www.collection-js.com/manual/part-1.html (там 10 глав, не более 30-ти минут чтения). Я потратил на разработку сего чуда почти 3 года и последние 2 месяца трудился над мануалом и докой, хотелось бы услышать критику что ли) Ну а так, на следующем js meetup я уже обязательно про неё расскажу сам) ЗЫ: завтра я уже выйду на работу, т.к. отпуск брал только на 5 дней) |
Ну на следующем митапе я тоже собираюсь рассказать про свой адский шаблонизатор.
Вообще, идея агрегирования обработки данных мне понравилась, пугает только синтаксис запросов - далеко не самый низкий порог вхождения. Например мне не понятно почему при первом вхождении el используется двоеточие, а потом нет? |
Цитата:
чтобы найти в строке управляющую конструкцию, а затем её просто запоминаем и нет нужды указывать двоеточие дальше. А затем натолкнулся на вот эту строку: '(:el.sex == "female" && el.age > 18) || (:el.sex == "male" && el.age < 30)' А потом я наткнулся на такую строчку: ':el == <:i:>' Может я не нашел, но в учебнике напрочь отсутствует сгруппированное объяснение всех этих конструкций: ':el', '<:i:>' и принцип парсера строки(как например в доке mysql) или просьба ткнуть меня носом. Ещё у меня вопрос: collection умеет работать с типами: "дата","время"? По возрасту и прайсам всё понятно, 12 и т.д. целые числа, а по сложнее, с плавающей точкой например или дата и время? зы: смотрел быстро, мог не найти где это описано, но я не нашёл. зы2: по ссылке( Цитата:
|
Цитата:
|
На самом деле синтаксис очень простой, постараюсь в двух словах объяснить:)
Допустим у нас есть коллекция: var db = new Collection([1, 2, 3, 4, [1, 2, 3]]); Первый способ, обращение по прямой ссылке: // обратимся к первому элементу вложенного массива // функция eq выбирает элемент не по ключу, а по порядку // минус указывает, что отсчёт идёт с конца // знак > указывает родительское отношение db.get('eq(-1) > 0'); Второй способ, итеративный поиск с помощью функции callback: // выберем элементы с чётными индексами db.get(function (el, key, data, i, length, cObj, id) { return i % 2 === 0; }); Третий способ схож со вторым, т.к. здесь тоже итеративный обход, но вместо прямого указания функции, мы пишем её, строчное сокращение: // знак : обозначает, что это идёт строчное сокращение, т.е. в нашем случае оно равносильно return db.get(':i % 2 === 0'); // логично, что мы можем написать и так db.get(':i % 2 === 0 && el !== 2'); // или так, но здесь компилятор уже создаст 2 разных функции // вложенность скобок не ограниченна, можно использовать операторы логики: !, &&, || db.get('(:i % 2 === 0) && (:el !== 2)'); // также фильтр можно заранее сохранить в стеки (как и многое другое) и обращаться по ИД // функцию можно указывать в строчном или в явном виде, функция может содержать другие функции db.pushFilter('odd', ':i % 2 === 0'); // используем фильтр odd и дополнительное условие db.get('odd && (:el !== 2)'); // вызов фильтра в фильтре db.pushFilter('filter2', 'odd && (:i % 2 === 0)'); db.get('filter2'); А последний способ - это указание контекста для фильтра, формула написания такова: контекст + >> + условие. Разумеется - это лишь малая часть возможностей, но сегодня буду писать статью на Хабр, где всё ёмкостно опишу в 1-й статье, а для подробного изучения есть мануал и дока. |
Цитата:
Цитата:
db.pushVariable({ CONST1: 1, CONST2: 2 }); // выбрать все элементы, где значения элементов равны CONST1 db.get(':el === <:CONST1:>'); // или так db.get(':el === this.getVariable("CONST1")'); // или так db.get(function (el) { return el === this.getVariable('CONST1'); }); |
Цитата:
По второму вопросу: кстати нет, и это действительно упущение, спасибо за наводку!:) |
Цитата:
Как часто на диск сбрасывается? |
Цитата:
|
Спасибо за пояснение, теперь стал более понятен синтаксис. Про хранение бд, тоже интересно.
Цитата:
А в остальном, мне понравилось и буду следить за развитием проекта. |
Можно вот ещё покопать https://github.com/sergeyksv/alfred
|
Спасибо за поддержку! В 4-й версии добавлю волшебный метод query, который на вход будет принимать SQL запрос. Интепретатор уже написан, но пока содержит много багов, будут вложенные запросы, переменные, стат функции, триггеры, хранимые процедуры и т.д. За стандарт SQL взял MySQL:)
|
Есть SQLite в браузере
Какое то сравнение с ней можете сделать? Dom storage наcколько я помню ограничена 5 mb а в database storage (SQLite) ограничений не ннашел-реально храню до 100 mb |
Цитата:
Мою же библиотеку можно рассматривать с разных сторон: как мега-интерфейс для различных операций с объектами и массивами, либо абстрактно представить как СУБД. Тип использования, как и структура данных полностью на усмотрения разработчика. Ядро библиотеки не использует специфичных объектов окружения, поэтому без проблем будет работать как в браузере, на сервере или как дополнение к ОСи. Насколько я изучал, то у Indexed DB асинхронный интерфейс вызова и это может быть не удобно в некоторых случаях, а у меня интерфейс полностью синхронный, что упрощает написание кода, НО я специально предусмотрел возможность создания асинхронных надстроек, так что написать расширение не составит труда. ЗЫ: DOM storage можно расширять, а также можно без труда написать любой другой интерфейс для хранения данных. ЗЫЗЫ: почти закончил работу над обзорной статьёй и небольшим обновлением :) |
мне нравится.
только что представили либу, а уже v3.7.1 |
Разработка этой либы ведётся уже несколько лет, отсюда и версия)
Я показывал версии: 2.x и 3.0, но ввиду отсутствия доки народ ничего не понял) |
Цитата:
Локальное хранилище Преимущество вашей базы которая как я понял будет целиком в ОЗУ-очевидны-высокое быстродействие-если я все правильно понял Проект заинтересовал-буду следить-но для меня главная проблема в практическом применении ограничения в 5мб-у меня текстовые файлы по 1.5-2 мб |
Цитата:
Я подумаю над добавлением новых хранилищ в браузере. По поводу скорости: всё зависит от архитектуры самой базы. Можно сделать супер скорость, а можно супер лаги, но я специально не навязывал свою структуру, т.к. потерялась бы универсальность. |
Вышла версия 3.7.2.
Нововведения и исправления:
Для работы с датой добавлено 2 статичных метода: date и between. Формат даты должен проходить Date.parse. var db = [ {name: 'aa', date: '2012-05-03T01:36:16.856Z'}, {name: 'aa2', date: '2011-05-03T01:36:16.856Z'}, {name: 'aa3', date: '2010-05-03T01:36:16.856Z'} ]; db = new Collection(db); // получить данные в интервале // $C - это псевдоним Collection db.get(':$C.between(el.date, "2010-05-03T01:36:16.856Z", "2012-05-03T01:36:16.856Z")') Запостил в песочницу хабра статью) Как бы то ни было ссылка на статью будет добавлена на оф. сайт или же (в случае если пост не пройдёт модерацию) размещена там явно. |
Пост с хабра: http://habrahabr.ru/post/143236/
|
kobezzza,
ты хоть смени версию QSA у себя.. я смотрю у тебя там лежит 1.2.1, но в ней есть один баг вылезающий при работе с селекторами имеющими слешы в контексте поиска. В версии 1.2.2 он исправлен: https://github.com/devote/QSA |
Цитата:
|
объединение коллекций в запросе get
Не понял как эмулировать join (использовать get сразу из нескольких коллекций одного стека). Ткните пожалуйста в нужную страницу учебника.
|
Цитата:
Явный механизм связей между внешними стековыми коллекциями появится в 3.8, которую я думаю завершить на следующей недели. |
Банальный вопрос (связанный не только с данным фреймворком) - можно как-нибудь отключить вывод многочисленных предупреждений "anonymous function does not always return a value" в консоли FF по collection.js или придётся смириться? Несколько мешает отладке своих скриптов.
|
Я думаю вам нужно отключить варнинги (предупреждения) JS в настройках отладчика
|
А что с сайтом? Всё, прощай фреймворк? :) Нужна документация!
Про новую версию уж молчу. |
Цитата:
Просто пилю после работы, когда есть настроение - вот так и медленно всё. |
Наконец допилил версию 3.8! Кроме исправления различных багов в новой версии появились следующие фичи:
Сайт снова работает, однако пока выпилил раздел доки, т.к. хочу её улучшить (пока можно читать комменты в исходниках, тем более, что дока генерится по ним), также пока нету главы в учебнике по методу query, но он, как и дока появится уже в течении недели. Теперь на главной страничке сайта можно поиграться с консолью:) По поводу метода query: сейчас он поддерживает только запросы типа SELECT. Есть поддержка переменных (через AS), INNER/LEFT/RIGHT JOIN, GROUP BY, ORDER BY, WHERE, HAVING, TOP, LIMIT, INTO, стат функции SUM/AVG/COUNT и множество строковых функций (можно добавлять свои), а также выполнения сразу нескольких запросов в одном методе (через ; ). Примеры: var db = new Collection(); db.pushCollection({ users: [ {id: 1, name: 'Kobezzza', lvl: 50}, {id: 2, name: 'Onky', lvl: 55}, {id: 3, name: 'Drobila', lvl: 60}, {id: 4, name: 'Over', lvl: 70}, {id: 5, name: 'Ten', lvl: 60} ], skils: [ { sid: 1, uid: 1, value: 'moto' }, { sid: 2, uid: 2, value: 'auto' }, { sid: 3, uid: 1, value: 'dance' } ], buf: [ { bid: 1, uid: 1, b_value: 'ice' }, { bid: 2, uid: 2, b_value: 'fire' }, { bid: 3, uid: 1, b_value: 'water' } ] }); db.query('SELECT * FROM `users`'); db.query('SELECT el.name, el.lvl FROM `users`'); db.query('SELECT el.name AS nm, el.lvl AS power FROM `users`'); db.query('SELECT * FROM `users`, `skils`'); db.query('SELECT * FROM `users` INNER JOIN `skils` ON id=uid INNER JOIN `buf` ON id=uid'); db.query('\ SELECT TRIM(el.name) AS name, el.lvl, SUM(el.lvl) AS sum FROM `users`\ INNER JOIN `skils` ON id=uid\ INNER JOIN `buf` ON id=uid\ GROUP BY lvl\ HAVING sum > 55\ '); db.query('SELECT * FROM `users` WHERE el.lvl > 50 LIMIT 1, 1'); db.query('SELECT TOP 1 * FROM `users` WHERE el.lvl > 50'); db.query('SELECT * INTO `test` FROM `users` WHERE el.lvl > 50'); Буду рад услышать критику и замечания, а также отвечу на любые вопросы:) Спасибо за внимание. ЗЫ: в версии 3.9 я добавлю поддержку новых хранилищ в браузере (IndexedDB, FlashStorage и т.д., чтобы была возможность хранить большие объёмы данных, вместо 5мб LocalStorage), поддержку популярных шаблонизаторов и закончу систему модульной сборки (можно будет через сайт подключать необходимые модули, чтобы не тащить лишний код). ЗЫЗЫ: кому интересна логика работы метода query, то копать https://github.com/kobezzza/Collecti...ter/files/csql. |
kobezzza,
отличная работа. |
скрипт просто потрясный!
если не секрет, что за сборщик (builder.js) ? master/collection.min.js - это ужатый в advanced mode скрипт? похоже, сжатие ещё не идеальное :) |
Цитата:
|
Цитата:
Цитата:
Цитата:
https://github.com/Kolyaj/BuildJS , правда я его немного допил для своих нужд (в Collection этих нужд нет:)) Цитата:
|
хм ... ну, только сам автор кода знает, как его коду лучше жаться :)
Цитата:
|
Часовой пояс GMT +3, время: 22:34. |
|