Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Collection – фреймворк для управления данными (https://javascript.ru/forum/project/27848-collection-%E2%80%93-frejjmvork-dlya-upravleniya-dannymi.html)

kobezzza 28.04.2012 09:29

На самом деле синтаксис очень простой, постараюсь в двух словах объяснить:)

Допустим у нас есть коллекция:
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-й статье, а для подробного изучения есть мануал и дока.

kobezzza 28.04.2012 09:39

Цитата:

Сообщение от Kolyaj (Сообщение 171716)
А как это на сервере работает? Всё в памяти хранится?

Сама БД крутится в оперативе, хранится в файлах на жёстком диске, принцип позаимствовал у нашего метража)

Цитата:

Сообщение от Gozar (Сообщение 171714)
А потом я наткнулся на такую строчку:
':el == <:i:>'

про :el - описал выше, а <:i:> - это короткий вызов переменной из стека. Дело в том, что для многих параметров Collection есть своё хранилище (стек), чтобы можно было инкапсулировать все данные внутри экземпляра и есть стек переменных, куда мы можем пихать всё, что угодно, например:

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

kobezzza 28.04.2012 09:43

Цитата:

Сообщение от Gozar (Сообщение 171714)
Может я не нашел, но в учебнике напрочь отсутствует сгруппированное объяснение всех этих конструкций: ':el', '<:i:>'
и принцип парсера строки(как например в доке mysql) или просьба ткнуть меня носом.

Ещё у меня вопрос:
collection умеет работать с типами: "дата","время"?

В главах 1, 2 и 9, хотя действительно, может логично сделать про это отдельную главу.

По второму вопросу: кстати нет, и это действительно упущение, спасибо за наводку!:)

Kolyaj 28.04.2012 09:44

Цитата:

Сообщение от kobezzza
Сама БД крутится в оперативе, хранится в файлах на жёстком диске

А если большая будет? Она же будет большая, иначе какая это БД.
Как часто на диск сбрасывается?

kobezzza 28.04.2012 09:46

Цитата:

Сообщение от Kolyaj (Сообщение 171722)
А если большая будет? Она же будет большая, иначе какая это БД.
Как часто на диск сбрасывается?

Ну этот вариант точно не подходит на все случаи жизни, а только в конкретных, сам механизм сохранения пока в процессе, смотрю как делают всякие там MongoDB и т.д. :)

Gozar 28.04.2012 09:58

Спасибо за пояснение, теперь стал более понятен синтаксис. Про хранение бд, тоже интересно.
Цитата:

Сообщение от kobezzza
буду писать статью на Хабр, где всё ёмкостно опишу в 1-й статье, а для подробного изучения есть мануал и дока.

Я бы хотел видеть объяснение на твоем сайте, на Хабре всё потеряется со временем. jQuery мануал же не на Хабре храниться :) Я врядли вспомню где на хабре видел статью с описанием, а вот твой сайт найду быстрее и возможно очень много людей сделает точно также как я.

А в остальном, мне понравилось и буду следить за развитием проекта.

Kolyaj 28.04.2012 09:59

Можно вот ещё покопать https://github.com/sergeyksv/alfred

kobezzza 28.04.2012 10:04

Спасибо за поддержку! В 4-й версии добавлю волшебный метод query, который на вход будет принимать SQL запрос. Интепретатор уже написан, но пока содержит много багов, будут вложенные запросы, переменные, стат функции, триггеры, хранимые процедуры и т.д. За стандарт SQL взял MySQL:)

vadim5june 02.05.2012 15:32

Есть SQLite в браузере
Какое то сравнение с ней можете сделать?
Dom storage наcколько я помню ограничена 5 mb
а в database storage (SQLite) ограничений не ннашел-реально храню до 100 mb

kobezzza 02.05.2012 17:58

Цитата:

Сообщение от vadim5june (Сообщение 172393)
Есть SQLite в браузере
Какое то сравнение с ней можете сделать?
Dom storage наcколько я помню ограничена 5 mb
а в database storage (SQLite) ограничений не ннашел-реально храню до 100 mb

Ну во первых от SQL Lite отказались в пользу Indexed DB, потом это чудо есть только в новых браузерах и с JS оно взаимодействует с помощью специального внешнего АПИ, т.е. это часть окружения JS, а именно браузера.

Мою же библиотеку можно рассматривать с разных сторон: как мега-интерфейс для различных операций с объектами и массивами, либо абстрактно представить как СУБД. Тип использования, как и структура данных полностью на усмотрения разработчика. Ядро библиотеки не использует специфичных объектов окружения, поэтому без проблем будет работать как в браузере, на сервере или как дополнение к ОСи.

Насколько я изучал, то у Indexed DB асинхронный интерфейс вызова и это может быть не удобно в некоторых случаях, а у меня интерфейс полностью синхронный, что упрощает написание кода, НО я специально предусмотрел возможность создания асинхронных надстроек, так что написать расширение не составит труда.

ЗЫ: DOM storage можно расширять, а также можно без труда написать любой другой интерфейс для хранения данных.
ЗЫЗЫ: почти закончил работу над обзорной статьёй и небольшим обновлением :)


Часовой пояс GMT +3, время: 07:43.