| 
	
		
 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, время: 16:29. | 
		
  |