GithubHelp home page GithubHelp logo

sophiadb's Introduction

Реляционная система управления базами данных SophiaDB

[work in progress]

Учебная СУБД по русскому изданию книги Эдварда Сьоре «Проектирование и реализация систем управления базами данных» (английская версия). В книге СУБД называется SimpleDB и написана на Яве. Код Софии следует исходникам из книги, поэтому не всегда получается сделать идиоматичный код на Го.

Код на Яве на Гитхабе отличается от книжного.

SophiaDB распространяется по лицензии MIT


Во встроенном драйвере для Го лежит пример использования Софии через гошный database/sql.

sophiadb's People

Contributors

dependabot[bot] avatar unhandled-exception avatar

Stargazers

 avatar

Watchers

 avatar  avatar

sophiadb's Issues

Добавить в выражение для индекса параметр типа индекса create index idx1 on table1 (field1, …) [using btree|hash]

Попутно можно ругаться, если нам передали несколько полей в индексе — в книге поддерживается только одно поле в индексе.

  • Доавить в парсер для create index разбор выражения using
  • Выдавать ошибку в парсере, еслинам передали несколько полей

B-Tree индекс (12.5)

  • 12.5.6. Реализация страниц B-дерева
    • BTPage класс
    • BTPage тесты
    • BTreeLeaf
    • BTreeDir
  • 12.5.7. Реализация индекса на основе B-дерева
  • Проверить создание b-tree через create index using btree

Плейсхолдеры во встроенном драйвере без регулярки

Делаем простой токенайзер, выдающий три типа лексем: text, positional, named. Не ищем positional и named в строках и комментариях. Строки, комментарии и вайтспейсы выдаём в поток в виде text-лексем.

  • Токенайзер
    • Лексемы: error, eof, text, named, positionsl
    • Строки в одинарных и двойных кавычках как text
    • Вайтспейсы и переводы строк как text, чтобы передать базе оригинальный запрос
    • Выкидываем комментарии
  • В applyFilter токенизируем запрос вместо регулярки

Планировщик запросов

Глава 10 книги «Планирование». Планы делаем в #45

  • Planner с заглушками для QueryPlanner и CommandsPlanner
  • Планеры с валидаторами метаданных
    • QueryPlanner
      • CreatePlan
      • Тесты на CreatePlan без пролем валидации запросов
      • Можно жить без валидаторов — имена таблиц и полей мы проверяем при создании планов или сканировании
    • CommandsPlanner
      • ExecuteInsert
      • ExecuteDelete (остались тесты)
      • ExecuteUpdate
      • ExecuteCreateTable
      • ExecuteCreateIndex
      • ExecuteCreateView
  • Тесты на Planner
    • CreateQueryPlan
    • ExecuteCommand
    • ExecuteInsert
    • ExecuteDelete
    • ExecuteUpdate
    • ExecuteCreateTable
    • ExecuteCreateIndex
    • ExecuteCreateView

Отдельный тикет? Добавить в выражение для индекса параметр типа индекса create index idx1 on table1 (field1, ...) [using btree|hash]. В парсере временно выдавать ошибку, если нам передали несколько полей?

Образы сканирования. Project Scan

Оператор project принимает два аргумента: входную таблицу и набор имен полей. Выходная таблица включает все записи из входной таблицы, но ее схема содержит только указанные поля.

  • Конструктор NewProjectScan и заглушка для интерфейса Scan
  • В интерфейсе scan.Scan заменить метод Layout на Schema (лэяут не у каждого образа есть, а схема есть)
  • Методы
  • Тесты
  • Для SelectScan дописать тесты, проверяющие, что о оборачиваемый образ не поддерживает UpdateScan

Поиск по hash-индексу в базе

Из главы 12 берем реализацию статического хеш индекса — по файлу на каждый бакет индекса. Добавляем поддержку индексов в планировщик.

  • HashIndex (12.3.2)
  • Тесты на Constant.Hash
  • IndexSelectPlan/IndexSelectScan (12.6.1)
  • IndexJoinPlan/IndexJoinScan (12.6.2)
  • IndexUpdatePlanner (12.7)

Завести тикеты из доп-заданий:

Добавить в pkg/db реализацию интерфейсов embedded-драйвера для database/sql

В 11 главе книжки описывается овис-интерфейс. Нам нужен интерфейс для database/sql. Делаем современные методы с контекстом.

https://pkg.go.dev/database/sql/driver

  • Интерфейс database/sql/driver
    • Соединение с БД
    • Exec
    • Query
    • Тесты на транзакции
    • Тесты на несколько соединений
    • Параметры в dsn
  • Плейсхолдеры и named-параметры (отдельным тикетом)

Использовать IndexSelectScan для executeDelete и executeUpdate, если есть индекс по полю из where (12.20)

Методы executeDelete и executeUpdate в планировщике обновлений в SimpleDB используют образ сканирования для оператора селекции (SelectScan), чтобы найти требуемые записи. Однако образ можно по- строить и с поддержкой индекса (IndexSelectScan), если подходящий индекс существует.

Образы сканирования. SelectScan

Глава 8. Обработка запросов

  • Интерфейсы Scan, UpdateScan, Predicate, Term
  • Оставить в scan только функции-итераторы
  • SelectScan
    • Структура
    • Тесты на SelectScan
  • Constants
    • Структура
    • Тесты
  • Terms
    • Структура
    • Тесты
  • AndPredicate
    • Структура
    • Тесты
  • Expressions
    • Структура
    • Тесты

PR #34

В executeCreateIndex автоматически строить индекс (12.24)

Одна из проблем, связанных с методом executeCreateIndex планиров- щика обновлений, заключается в том, что он создает пустой индекс, даже если индексируемая таблица содержит записи. Переделайте ме- тод так, чтобы он автоматически вставлял индексные записи для всех существующих записей в индексируемой таблице.

Синтаксический анализатор. Парсер

  • Модуль и интерфейс Парсера
  • Операторы
    • Select
    • Insert
    • Delete
    • Update
    • Create table
    • Create index
    • Create view
  • Парсер с тестами
  • Дописать тесты на лексер
  • Добавить проверку, что после парсинга в строке не осталось токенов
  • Сделать методы parseTables, parseValues и т.п. частью типов TablesList, ValuesList и т.п.

Написать свой токенайзер вместо github.com/bzick/tokenizer

Токенайзер из github.com/bzick/tokenizer для нас избыточен. Берем идею лексера из доклада Пайка — https://www.youtube.com/watch?v=HxaD_trXwRE&t=1567 и код из https://cs.opensource.google/go/go/+/master:src/text/template/parse/lex.go и делаем свой простой лексер

  • Делаем токенайзер по заветам Пайка
  • Заменяем bzick/tokenizer в лексере на свой
  • Переделать врапер ошибок
  • Причесать код и комментарии

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.