YDN-DB - неверные результаты при использовании смешанных типов данных с SortedMerge

Я использую отличную YDN-DB как часть сложной веб-страницы "приборной панели", которая позволяет пользователю загружать большое количество информации, а затем искать и фильтровать данные так, как они хотят.

Данные поступают в виде 1 UNID и 6 столбцов видимых данных, которые я храню с использованием схемы YDN, например:

var schema = {
    stores: [
        {
            name: 'test', keyPath: 'unid', autoIncrement: false,
            indexes: [
                {keyPath: 'a', type: 'TEXT'},
                {keyPath: 'b', type: 'TEXT'},
                {keyPath: 'c', type: 'TEXT'},
                {keyPath: 'd', type: 'DATE'},
                {keyPath: 'e', type: 'TEXT'},
                {keyPath: 'f', type: 'TEXT'}
            ]
        }
    ]
};

Затем пользователь может поместить фильтр в любой из шести столбцов выше. Код для создания фильтров выглядит следующим образом и использует YDN KeyRange для фильтрации данных по значениям, запрошенным пользователем.

var filterArr = []
var resultArr = [];

filterArr.push(new ydn.db.IndexIterator('test', 'a', ydn.db.KeyRange.only('search value 1')));
filterArr.push(new ydn.db.IndexIterator('test', 'b', ydn.db.KeyRange.only('search value 2')));
.. [Continue adding filters for more columns if necessary etc] ..

var req = db.scan(new ydn.db.algo.SortedMerge(resultArr), filterArr);

req.then(function() {
    db.values('test', resultArr).done(function(results) {
        .. [Display code goes here] ..
    })
})

Так что для согласованных значений это работает нормально. Моя проблема, однако, заключается в том, что пользователь может указать диапазон дат для столбца D, поэтому я изменил одну из строк filterArr, как показано ниже:

filterArr.push(new ydn.db.IndexIterator('test', 'd', ydn.db.KeyRange.bound(1389571200000, 1390435200000, false, false)));

Это приводит к неверным результатам поиска. Похоже, это происходит только тогда, когда указано несколько значений filterArr. Если я отфильтрую столбец D сам по себе, он, кажется, работает.

Извините за сложный запрос и очень надеюсь на какой-то ответ. Я потратил некоторое время на отладку SortedMerge JS, и мои ограниченные знания позволяют предположить, что что-то не так с результатом каждого вызова функции ydn.db.cmp, поэтому я подумал, была ли это ошибка в БД YDN?

2 ответа

Из того, что я вижу из вашего кода, столбец "d" должен быть INTEGER, или запрос должен использовать дату, например:

ydn.db.KeyRange.bound(toDate(1389571200000),toDate(1390435200000), false, false)

РЕДАКТИРОВАТЬ:

Извините, алгоритм соединения ключей работает только для равного соединения. Диапазон не будет работать. Однако вы можете использовать один запрос диапазона, но для этого требуется шесть составных индексов [a, d], [b, d], [c, d], d, [e, d], [f, d] и объединение с помощью объединения ZigZeg. Подробно здесь http://dev.yathit.com/ydn-db/nosql-query.html Вы также можете найти требования для равного объединения.

Текущий ZigZeg быстрее, чем SortedMerge, так как в спецификации 1 IndexedDB API нет требуемых методов. Однако v2 идет с необходимыми методами, а именно openKeyCursor а также continuePrimaryKey, Результат ZigZeg отсортирован по d, тогда как SortedMerge отсортирован по первичному ключу.

Вместо того, чтобы хранить Date объект, вместо этого сохраните представление метки времени:

var timestamp = new Date().getTime();

Поскольку временная метка является целым числом, вы можете эффективно использовать диапазон ключей.

Другие вопросы по тегам