Поиск данных

Поиск данных.

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

Как мы узнали ранее в этой главе, метод get() удобно использовать для извлечения одного объекта с известным значением ключевого слова, однако операция поиска обычно все же бывает несколько сложнее.

Для того чтобы получить определенный список объектов из хранилища объектов, нужно методу openCursor() передать первый аргумент — диапазон поиска. В рассматриваемом API есть интерфейс IDBKeyRange, включающий в себя несколько методов и свойств для объявления диапазона и ограничения списка возвращаемых объектов:

- only(value). Возвращаются только объекты, ключевое слово которых соответствует указанному значению. Например, если при поиске фильмов по году задать условие only("1972"), то из всего списка будет возвращен только фильм «The Godfather»;

- bound(lower, upper, lowerOpen, upperOpen). Для того чтобы создать настоящий диапазон, нужно указать начальное и конечное значения и определить, должны ли граничные значения включаться в список. Значение атрибута lower определяет начальную точку списка. Атрибут upper соответствует конечной точке. Атрибуты lowerOpen и upperOpen — это логические значения, указывающие, должны ли игнорироваться объекты, в точности соответствующие значениям атрибутов lower и upper. Например, bound("1972", "2010", false, true) возвращает список фильмов, выпущенных в промежутке от 1972 до 2010 года, не включая фильмы 2010 года (фильмы этого года не учитываются в списке, так как булев атрибут, описывающий конечную точку, равен true);

- lowerBound(value, open). Создает открытый диапазон, начинающийся со значения value и продолжающийся до конца списка. Например, lowerBound("1983", true) возвращает все фильмы, созданные после 1983 года (то есть фильмы 1983 года в результаты поиска не включаются);

- upperBound(value, open). Представляет собой полную противоположность предыдущего — тоже создает открытый диапазон, но при этом возвращаются объекты от начала списка до значения value. Например, upperBound("1983", false) возвращает список фильмов, созданных до 1983 года, причем фильмы 1983 года также входят в список.

Давайте подготовим новый шаблон и добавим на страницу форму поиска фильмов (листинг 11.12).

<!DOCTYPE html>

<html lang="ru">

<head>

<title>API IndexedDB</title>

<link rel="stylesheet" href="indexed. css">

<script src="indexed. js"></script>

</head>

<body>

<section id="formbox"> form name="form">

<p>Поиск фильма по году:<br><input type="text" name="year" id="year"></p>

<p><input type="button" name="find" id="find" value="Найти"></p>

</form>

</section>

<section id="databox">

Информация недоступна </section>

</body>

</html>

В новом HTML-документе есть кнопка и текстовое поле. В текстовом поле нужно ввести год, в результате будет возвращен список, соответствующий определенному в коде диапазону.

Листинг 11.13. Поиск фильмов

Function initiate(){

Databox=document. getElementById(‘databox’); var button=document. getElementById(‘find’); button. addEventListener(‘click’, findobjects, false);

If(‘webkitIndexedDB’ in window){

Window. indexedDB=window. webkitIndexedDB;

Window. IDBTransaction=window. webkitIDBTransaction;

Window. IDBKeyRange=window. webkitIDBKeyRange;

Window. IDBCursor=window. webkitIDBCursor;

}else if(‘mozIndexedDB’ in window){ window. indexedDB=window. mozIndexedDB;

}  продолжение &

Var request=indexedDB. open(‘mydatabase’); request. addEventListener(‘error’, showerror, false); request. addEventListener(‘success’, start, false);

}

Function showerror(e){

Alert(’0i^6Ka: ‘+e. code+’ ‘+e. message);

}

Function start(e){

Db=e. result || e. target. result; if(db. version==»){

Var request=db. setVersion(’1.0′);

Request. addEventListener(‘error’, showerror, false); request. addEventListener(‘success’, createdb, false);

}

}

Function createdb(){

Var objectstore=db. createObjectStore(‘movies’, {keyPath: ‘id’}); objectstore. createIndex(‘SearchYear’, ‘date’, { unique: false });

}

Function findobjects(){ databox. innerHTML=»;

Var find=document. getElementById(‘year’).value;

Var transaction=db. transaction(['movies']); var objectstore=transaction. objectStore(‘movies’); var index=objectstore. index(‘SearchYear’); var range=IDBKeyRange. only(find);

Var newcursor=index. openCursor(range); newcursor. addEventListener(‘success’, showlist, false);

}

Function showlist(e){

Var cursor=e. result || e. target. result; if(cursor){

Databox. innerHTML+=’<div>’+cursor. value. id+’ — ‘+

Cursor. value. name+’ — ‘+cursor. value. date+’</div>’; cursor. continue();

}

}

Самая важная функция в листинге 11.13 — это findobjects(). В этой функции мы создаем транзакцию только для чтения (тип READ_ONLY), ссылающуюся на хранилище объектов movies, открываем индекс SearchYear, используя в качестве ориентира свойство date, и определяем диапазон, начинающийся со значения переменной find (это год, который пользователь указал в форме). Для определения диапазона мы используем метод only(), но вы можете протестировать и другие методы, перечисленные ранее. Диапазон передается в качестве аргумента методу openCursor(). После успешного выполнения операции функция showlist() выводит на экран список фильмов, соответствующих выбранному году.

Метод only() возвращает только фильмы, в точности соответствующие значению переменной find. Для тестирования остальных методов вы можете указать конкретные значения атрибутов, например bound(find, "2011", false, true).

Метод openCursor() может одновременно принимать два атрибута. Таким образом, инструкция вроде openCursor(range, IDBCursor. PREV)

Вполне допустима — она вернет объекты из указанного диапазона, упорядочив их по убыванию (относительно того же индекса).

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *