Проект структурирован следующим образом:
Для пакетов для исходного файла проекта расположены следующим рациональным:
Чтобы подтолкнуть выбор в правильном положении в нашем логическом плане, мы внедрили союз -структуру данных для атрибутов группы с тем же условием диапазона. Условие отбора, которое содержит равное место, большее, незначительное выражение между одним соотношением и числом или между двумя атрибутами того же отношения, будет отменено после условия соединения. Необладание и другие полезные для отбора будут подтолкнут к оператору JOIN.
Мы создали класс под названием SelectionOptimizer, чтобы обрабатывать, какой метод выбора использовать. Сначала мы проверяем доступность индексации для всех атрибутов одного отношения, связанных с выбором. Если для этих атрибутов нет надлежащей индексации, мы бы выбрали метод простого сканирования. Если на этих атрибутах есть варианты индексации, мы бы сравнили стоимость их затрат и выберите такую с самой низкой стоимостью.
У нас были некоторые проблемы, в которых участвуют метод динамического программирования, чтобы выбрать лучший порядок соединения. Компрометированное решение, которое мы реализовали, заключается в выборе порядка соединения на основе каждого размера таблицы.
Наша логика состоит в том, чтобы использовать сортировку Merg Join, если это применимо. Если SMJ не применим, мы решили использовать вложенную блочную циклу соединения.
Верхняя запись программы на клиенте.
Интерпретатор отвечает за чтение входного файла и передачи в оценщик запроса и, наконец, выводит результат в файл.
Мы классифицируем условия по предложению «Где» в: 1. Сравнение между константами. 2. В столе выберите условие. 3. СОСТОЯНИЕ СОЕДИНЕННОГО СООБЩЕНИЯ.
В начале анализа все условия извлекаются путем рекурсивного разрыва и выражений. Затем для каждой таблицы мы записываем: 1) его условия выбора и 2) условие его соединения со всеми предыдущими таблицами. Таким образом, мы могли бы перемещаться вдоль таблиц и сосредоточиться только на соответствующих условиях, когда новая таблица должна быть соединена с текущим левым подмозримом. И, конечно, постоянные условия обрабатываются до всего.
Мы реализовали Sortoperator в соответствии с инструкциями. Если определенные упорядоченные элементы не прогнозируются (например, выберите SA из S Order от SB), и требуется различные, у нас есть другой оператор, использующий хэшсет для поддержания порядка.
Мы предоставляем класс Bplustree, и его конструктор способен построить сериализованный индексный файл на одном атрибуте перциды из данных данных. Он также обеспечивает функциональность десериализации индекса деревьев, когда пользователю необходимо использовать оператор индексного сканирования во время выполнения. Это сократит время поиска кортежей.
Мы реализовали оператор индекса для выбора индекса с использованием индекса B+ дерева. Он оценивает экспрессию, содержит атрибут индекса и вызовет десерилизацию, чтобы получить первый удовлетворенный ввод данных из листового узла дерева B+. После этого он будет линейно принести кортежи, если файл кластеризован, другой мудрый, он будет постоянно приносить следующий удовлетворен вводом данных из Deserializer.
В нашем предыдущем дизайне мы дали нашему оператору логического выбора важным ограничением того, что ребенок оператора логического выбора должен быть оператором сканирования. Поэтому, когда мы используем шаблон посетителей для создания нашего физического плана, нам нужно только перейти к оператору отбора. И когда посетитель перейти к оператору выбора, логика может решить, что ребенок оператора отбора должен быть оператором полного сканирования или оператором индекса.
Как мы сохранили информацию из файла конфигурации в каталог. Во -первых, если каталог базы данных показывает, что индексный запрос включен, мы должны проверить наличие индекса по этому запросу.
У нас есть метод, который называется hasidxattr , который проверяет, применяется ли индекс к условию выбора. То есть, если условие отбора для этой таблицы больше, чем , больше, чем равное , равно , меньше, чем , меньше, чем на индексированном аттриуте, то мы готовы построить оператора индексного сканирования в качестве ребенка. Затем мы рассчитываем низкоквалифицированные и высокие, зависящие от всех условий выбора, а затем строим оператор.
Если hasidxattr возвращает False, мы должны построить обычный оператор полного сканирования.
Наконец мы возвращаемся на уровень аппера.
Мы используем две стратегии тестирования
Для базового теста мы вручную строим операторов и сбрасываем кортежи, чтобы доказать, что оператор может работать в отношении модели итератора.
Тест сквозного-это тест, который принимает весь переводчик в качестве тестирования. Тестовый пример будет принимать файл запроса ввода, а затем выполнить запрос, наконец -то распечатайте результат в целевой файл.
Чтобы лучше провести тестирование, мы записали сценарий Bash, который выпускает результат базы данных MySQL в качестве ожидаемого вывода. Следовательно, нам очень легко создать относительно сложные тестовые примеры.
Кроме того, мы создали DIFF класса UTIL для сравнения двух файлов, которые автоматически будут судить о правильности вывода.