Skip to main content

SQL to LNH allows to generate LNH structures and functions from SQL queries.

Project description

SQL to LNH

Проект предназначен для конвертацию выражений SQL в выражения языка C++, совместимые с библиотекой LNH L0.

Цели проекта

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

Возможности в текущей версии

  • Парсинг SQL выражений CREATE TABLE:
    • Ключ можно задать с использованием ключевых слов PRIMARY KEY при описании столбца или выражения PRIMARY KEY (col1, col2) при описании всей таблицы
    • Поддерживаются поля типов INT{N}, TINYINT, SMALLINT, MEDIUMINT, INT, INTEGER, BIGINTEGER, а также BOOLEAN. Размеры полей возможно задать только в байтах
  • Преобразование выражений CREATE TABLE в шаблонный код на C:
    • Размер поля определяется параметром keyval_size
    • Имеется поддержка расширения структуры путём частичного дублирования ключа, как в btwc-dijkstra-xrt
    • Значения группируются "наивным" алгоритмом: выбираются в порядке их объявления, и если места в группе для значения не хватает, то формируется новая группа, в которую помещается новое значение
  • Задание алгоритмов поиска данных и обхода структур через выражения SELECT
    • Поддерживается поиск только по одной таблице
    • Поддерживаются псевдонимы таблиц и столбцов, LIMIT, ORDER BY, WHERE
    • Поддерживаются поименованные параметры подстановки типа :foo, $bar
    • Поддержка функций агрегации не подтверждена
  • Создание функций вставки из выражений INSERT INTO
    • Необходимо перечислить все столбцы для вставки

Установка

Установить можно с помощью команды:

pip install sql_to_lnh

Использование

CLI

С пакетом предоставляется CLI-утилита для тестирования. Запустите в терминале командой sql_to_lnh. На вход предоставляется выражение SQL, имя объекта, на выходе генерируется необходимый фрагмент C++ кода. Пример:

Введите SQL-выражение
>>> CREATE TABLE users(
>>>  idx     INT4 NOT NULL,
>>>  user    INT4 NOT NULL,
>>>  role    INT4 NOT NULL,
>>>  time    INT4 NOT NULL,
>>>  PRIMARY KEY (idx, user)
>>>  )
>>>
Имя объекта (Enter для имени по-умолчанию):
USERS
Результат трансляции:
struct Users {
  int struct_number;
  constexpr Users(int struct_number) : struct_number(struct_number) {}
  STRUCT(Key0) {
    unsigned int idx: 32;
    unsigned int user: 32;
  };
  STRUCT(Val0) {
    unsigned int role: 32;
    unsigned int time: 32;
  };
  #ifdef __riscv64__
  DEFINE_DEFAULT_KEYVAL(Key0, Val0)
  #endif
};

constexpr Users USERS(1);

Введите SQL-выражение
>>>

cog

С пакетом распространяется утилита для кодогенерации cog. Cog позволяет включать в файлы с исходным кодом комментарии, которые содержат код на python, исполнять код из комментариев и результат работы печатать в исходный файл.

Чтобы создать модуль с объявлениями, который можно использовать в проекте для LNH, создайте файл с комментариями для cog (к примеру, codegen.h). В комментариях cog необходимо:

  1. Инициализировать модуль:
/*[[[cog
from sql_to_lnh.CogPrinter import CogPrinter

codegen = CogPrinter('sql_to_lnh.db')
]]]*/
//[[[end]]]
  1. Вызвать модуль кодогенерации с выражением SQL и именем структуры (опционально):
/*[[[cog
users_SQL = """
CREATE TABLE users(
  idx		    INT4 NOT NULL,
  user       INT4 NOT NULL,
  role       INT4 NOT NULL,
  time    INT4 NOT NULL,
  PRIMARY KEY (idx, user)
  )"""
codegen.translate(users_SQL, 'USERS')
]]]*/
//[[[end]]]
  1. Закрыть модуль кодогенерации:
/*[[[cog
codegen.close()
]]]*/
//[[[end]]]
  1. Вызвать cog командой cog -r [ИМЯ ФАЙЛА]. В результате будет получен файл:
/*[[[cog
from sql_to_lnh.CogPrinter import CogPrinter

codegen = CogPrinter('sql_to_lnh.db')
]]]*/

#ifndef GITERS_H_
#define GITERS_H_


#include <stdlib.h>
#include <stdint.h>
#include <cmath>
#include <cassert>
#ifdef __riscv64__
#include "map.h"
#endif
#include "compose_keys.hxx"

#define DEBUG

#ifdef __riscv64__
template<typename K, typename V>
struct Handle {
        bool ret_val;
        K k{get_result_key<K>()};
        V v{get_result_value<V>()};
        [[gnu::always_inline]] Handle(bool ret_val) : ret_val(ret_val) {
        }

        [[gnu::always_inline]] operator bool() const {
                return ret_val;
        }

        [[gnu::always_inline]] K key() const {
                return k;
        }

        [[gnu::always_inline]] V value() const {
                return v;
        }
};
#endif

//[[[end]]]

/*[[[cog
users_SQL = """
CREATE TABLE users(
  idx		    INT4 NOT NULL,
  user       INT4 NOT NULL,
  role       INT4 NOT NULL,
  time    INT4 NOT NULL,
  PRIMARY KEY (idx, user)
  )"""
codegen.translate(users_SQL, 'USERS')
]]]*/
struct Users {
  int struct_number;
  constexpr Users(int struct_number) : struct_number(struct_number) {}
  STRUCT(Key0) {
    unsigned int idx: 32;
    unsigned int user: 32;
  };
  STRUCT(Val0) {
    unsigned int role: 32;
    unsigned int time: 32;
  };
  #ifdef __riscv64__
  DEFINE_DEFAULT_KEYVAL(Key0, Val0)
  #endif
};

constexpr Users USERS(1);

//[[[end]]]

/*[[[cog
codegen.close()
]]]*/

#endif

//[[[end]]]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sql_to_lnh-1.0.1.tar.gz (105.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sql_to_lnh-1.0.1-py3-none-any.whl (106.7 kB view details)

Uploaded Python 3

File details

Details for the file sql_to_lnh-1.0.1.tar.gz.

File metadata

  • Download URL: sql_to_lnh-1.0.1.tar.gz
  • Upload date:
  • Size: 105.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.10.12

File hashes

Hashes for sql_to_lnh-1.0.1.tar.gz
Algorithm Hash digest
SHA256 cd7fa4a97da5f3fec4c00bab47e813e21ad8d883f9b51072798548ef56f97714
MD5 5026020279006bc01fce63b16aaf80b0
BLAKE2b-256 5fcf565cb9632b83ce621ffbf808f04d932f354a3384b5188bb37ede22814756

See more details on using hashes here.

File details

Details for the file sql_to_lnh-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: sql_to_lnh-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 106.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.10.12

File hashes

Hashes for sql_to_lnh-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6f0a003373fac28b19efd542bc5101d49f3dbead5850b0277dac90611b0ab491
MD5 0a14b7fe56a208c75ec9fcec6315efb6
BLAKE2b-256 b87ccbebca0614ec4d914c76857b916db41f394df5a902e7eff6841586fa19ff

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page