Skip to content
This repository was archived by the owner on Sep 27, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions src/ru/fizteh/fivt/storage/structured/ColumnFormatException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ru.fizteh.fivt.storage.structured;

/**
* Бросается при попытке извлечь из колонки {@link Storeable} значение не соответствующего типа,
* либо подставить в колонку значение несоответствующего типа.
*/
public class ColumnFormatException extends IllegalArgumentException {

public ColumnFormatException() {
}

public ColumnFormatException(String s) {
super(s);
}

public ColumnFormatException(String message, Throwable cause) {
super(message, cause);
}

public ColumnFormatException(Throwable cause) {
super(cause);
}
}
26 changes: 26 additions & 0 deletions src/ru/fizteh/fivt/storage/structured/Index.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package ru.fizteh.fivt.storage.structured;

/**
* Представляет базу для интерфейс для работы с таблицей, содержащей ключи-значения.
* Используется также для доступа к поисковому индексу.
*/
public interface Index {
/**
* Возвращает название таблицы или индекса.
*
* @return Название таблицы.
*/
String getName();

/**
* Получает значение по указанному ключу.
*
* @param key Ключ для поиска значения. Не может быть null.
* Для индексов по не-строковым полям аргумент представляет собой сериализованное значение колонки.
* Его потребуется распарсить.
* @return Значение. Если не найдено, возвращает null.
*
* @throws IllegalArgumentException Если значение параметра key является null.
*/
Storeable get(String key);
}
30 changes: 30 additions & 0 deletions src/ru/fizteh/fivt/storage/structured/IndexProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package ru.fizteh.fivt.storage.structured;

/**
* Дополнительный интерфейс к {@link ru.fizteh.fivt.storage.structured.TableProvider}, позволяющий создавать индексы на
* основе имеющейся таблицы.
*/
public interface IndexProvider extends TableProvider {
/**
*
* Возвращает индекс с таким именем, если он существует.
*
* @param name Имя индекса. Не должно быть null.
* @return Объект индекса
* @throws IllegalArgumentException Если имя индекса невалидно.
*/
Index getIndex(String name) throws IllegalArgumentException;

/**
* Создает индекс.
*
* @param table Таблица, для которой нужно создать индекс.
* @param column Номер колонки.
* @param name Имя для будущего индекса.
* @return Свежесозданный индекс. null, если индекс уже был создан.
* @throws IllegalArgumentException Если таблица невалидна, указана неверная колонка или имя индекса,
* а также, если сущность с таким именем уже существует.
* @throws IllegalStateException Если индекс содержит невалидные элементы.
*/
Index createIndex(Table table, int column, String name) throws IllegalArgumentException, IllegalStateException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ru.fizteh.fivt.storage.structured;

import java.io.Closeable;

/**
* Расширенный интерфейс {@link TableProvider}, с предоставлением метода {@link #close()}.
*/
public interface RemoteTableProvider extends TableProvider, Closeable {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ru.fizteh.fivt.storage.structured;

import java.io.IOException;

/**
* Представляет интерфейс для подключения к удаленному хранилищу.
*
* Предполагается, что реализация интерфейса клиента будет иметь публичный конструктор без параметров.
*/
public interface RemoteTableProviderFactory {
/**
* Возвращает {@link RemoteTableProvider} для работы с удаленных хранилищем.
*
* @param hostname Имя узла, на котором работает TCP-сервер хранилища.
* @param port Порт, на котором работает TCP-сервер хранилища.
* @return Remote-{@link RemoteTableProvider}, который подключен к TCP-серверу хранилища по заданному адресу.
*
* @throws IllegalArgumentException В случае некорректных входных параметров.
* @throws java.io.IOException В случае ошибок ввода/вывода.
*/
RemoteTableProvider connect(String hostname, int port) throws IOException;
}
96 changes: 96 additions & 0 deletions src/ru/fizteh/fivt/storage/structured/Storeable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package ru.fizteh.fivt.storage.structured;

/**
* Список фиксированной структуры, строка таблицы {@link Table}.
*
* Нумерация колонок с нуля. Позиция в списке соответствует колонке таблицы под тем же номером.
*
* С помощью {@link TableProvider} может быть сериализован или десериализован.
*
* Для получения объекта из нужной колонки воспользуйтесь соответствующим геттером.
* Для установки объекта а колонку воспользуйтесь {@link #setColumnAt(int, Object)} .
*/
public interface Storeable {

/**
* Установить значение в колонку
* @param columnIndex - индекс колонки в таблице, начиная с нуля
* @param value - значение, которое нужно установить.
* Может быть null.
* Тип значения должен соответствовать декларированному типу колонки.
* @throws ColumnFormatException - Тип значения не соответствует типу колонки.
* @throws IndexOutOfBoundsException - Неверный индекс колонки.
*/
void setColumnAt(int columnIndex, Object value) throws ColumnFormatException, IndexOutOfBoundsException;

/**
* Возвращает значение из данной колонки, не приводя его к конкретному типу.
* @param columnIndex - индекс колонки в таблице, начиная с нуля
* @return - значение в этой колонке, без приведения типа. Может быть null.
* @throws IndexOutOfBoundsException - Неверный индекс колонки.
*/
Object getColumnAt(int columnIndex) throws IndexOutOfBoundsException;

/**
* Возвращает значение из данной колонки, приведя его к Integer.
* @param columnIndex - индекс колонки в таблице, начиная с нуля
* @return - значение в этой колонке, приведенное к Integer. Может быть null.
* @throws ColumnFormatException - Запрошенный тип не соответствует типу колонки.
* @throws IndexOutOfBoundsException - Неверный индекс колонки.
*/
Integer getIntAt(int columnIndex) throws ColumnFormatException, IndexOutOfBoundsException;

/**
* Возвращает значение из данной колонки, приведя его к Long.
* @param columnIndex - индекс колонки в таблице, начиная с нуля
* @return - значение в этой колонке, приведенное к Long. Может быть null.
* @throws ColumnFormatException - Запрошенный тип не соответствует типу колонки.
* @throws IndexOutOfBoundsException - Неверный индекс колонки.
*/
Long getLongAt(int columnIndex) throws ColumnFormatException, IndexOutOfBoundsException;

/**
* Возвращает значение из данной колонки, приведя его к Byte.
* @param columnIndex - индекс колонки в таблице, начиная с нуля
* @return - значение в этой колонке, приведенное к Byte. Может быть null.
* @throws ColumnFormatException - Запрошенный тип не соответствует типу колонки.
* @throws IndexOutOfBoundsException - Неверный индекс колонки.
*/
Byte getByteAt(int columnIndex) throws ColumnFormatException, IndexOutOfBoundsException;

/**
* Возвращает значение из данной колонки, приведя его к Float.
* @param columnIndex - индекс колонки в таблице, начиная с нуля
* @return - значение в этой колонке, приведенное к Float. Может быть null.
* @throws ColumnFormatException - Запрошенный тип не соответствует типу колонки.
* @throws IndexOutOfBoundsException - Неверный индекс колонки.
*/
Float getFloatAt(int columnIndex) throws ColumnFormatException, IndexOutOfBoundsException;

/**
* Возвращает значение из данной колонки, приведя его к Double.
* @param columnIndex - индекс колонки в таблице, начиная с нуля
* @return - значение в этой колонке, приведенное к Double. Может быть null.
* @throws ColumnFormatException - Запрошенный тип не соответствует типу колонки.
* @throws IndexOutOfBoundsException - Неверный индекс колонки.
*/
Double getDoubleAt(int columnIndex) throws ColumnFormatException, IndexOutOfBoundsException;

/**
* Возвращает значение из данной колонки, приведя его к Boolean.
* @param columnIndex - индекс колонки в таблице, начиная с нуля
* @return - значение в этой колонке, приведенное к Boolean. Может быть null.
* @throws ColumnFormatException - Запрошенный тип не соответствует типу колонки.
* @throws IndexOutOfBoundsException - Неверный индекс колонки.
*/
Boolean getBooleanAt(int columnIndex) throws ColumnFormatException, IndexOutOfBoundsException;

/**
* Возвращает значение из данной колонки, приведя его к String.
* @param columnIndex - индекс колонки в таблице, начиная с нуля
* @return - значение в этой колонке, приведенное к String. Может быть null.
* @throws ColumnFormatException - Запрошенный тип не соответствует типу колонки.
* @throws IndexOutOfBoundsException - Неверный индекс колонки.
*/
String getStringAt(int columnIndex) throws ColumnFormatException, IndexOutOfBoundsException;
}
92 changes: 92 additions & 0 deletions src/ru/fizteh/fivt/storage/structured/Table.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package ru.fizteh.fivt.storage.structured;

import java.io.IOException;
import java.util.List;

/**
* Представляет интерфейс для работы с таблицей, содержащей ключи-значения. Ключи должны быть уникальными.
*
* Транзакционность: изменения фиксируются или откатываются с помощью методов {@link #commit()} или {@link #rollback()},
* соответственно. Предполагается, что между вызовами этих методов никаких операций ввода-вывода не происходит.
*
* Данный интерфейс не является потокобезопасным.
*/
public interface Table extends Index {

/**
* Устанавливает значение по указанному ключу.
*
* @param key Ключ для нового значения. Не может быть null.
* @param value Новое значение. Не может быть null.
* @return Значение, которое было записано по этому ключу ранее. Если ранее значения не было записано,
* возвращает null.
*
* @throws IllegalArgumentException Если значение параметров key или value является null.
* @throws ColumnFormatException - при попытке передать Storeable с колонками другого типа.
*/
Storeable put(String key, Storeable value) throws ColumnFormatException;

/**
* Удаляет значение по указанному ключу.
*
* @param key Ключ для поиска значения. Не может быть null.
* @return Предыдущее значение. Если не найдено, возвращает null.
*
* @throws IllegalArgumentException Если значение параметра key является null.
*/
Storeable remove(String key);

/**
* Возвращает количество ключей в таблице. Возвращает размер текущей версии, с учётом незафиксированных изменений.
*
* @return Количество ключей в таблице.
*/
int size();

/**
* Выводит список ключей таблицы, с учётом незафиксированных изменений.
*
* @return Список ключей.
*/
List<String> list();

/**
* Выполняет фиксацию изменений.
*
* @return Число записанных изменений.
*
* @throws java.io.IOException если произошла ошибка ввода/вывода. Целостность таблицы не гарантируется.
*/
int commit() throws IOException;

/**
* Выполняет откат изменений с момента последней фиксации.
*
* @return Число откаченных изменений.
*/
int rollback();

/**
* Возвращает количество изменений, ожидающих фиксации.
*
* @return Количество изменений, ожидающих фиксации.
*/
int getNumberOfUncommittedChanges();

/**
* Возвращает количество колонок в таблице.
*
* @return Количество колонок в таблице.
*/
int getColumnsCount();

/**
* Возвращает тип значений в колонке.
*
* @param columnIndex Индекс колонки. Начинается с нуля.
* @return Класс, представляющий тип значения.
*
* @throws IndexOutOfBoundsException - неверный индекс колонки
*/
Class<?> getColumnType(int columnIndex) throws IndexOutOfBoundsException;
}
Loading