О моём языке запросов 💬
Я тут несколько раз переосмыслил идею своего языка — и он радикально поменялся! 🔄
История моего dsl, от MDQL до MQL
- На подобие GrafQL
- Замена синтаксиса
- Замена синтаксиса 2
- Абсолютная замена 🚀
Эта версия описана в этом посте блога и имеет сходство с GraphQL 👥
Поменял синтаксис GraphQL на JSON из-за его универсальности 📦 Вот что должно было быть (примерно):
{
"meta": {
"request_goal": "Get character data",
"agent_name": "Gemini",
"request_method": "select"
},
"query_block": {
"file_path": {
"folder_name": "Characters",
"file_name": "Kowalski, the bloody reaper"
},
"sections_to_retrieve": [
{
"YAML": {
"name": "get_text"
}
},
{
"Bio": {
"Character": "get_text"
}
},
{
"Abilities": {
"list_elements": [1, 3]
}
}
]
}
}
Поменял синтаксис JSON на YAML из-за более лаконичного вида: он менее громоздкий и сохраняет функциональность ✨ Вот что должно было быть (примерно):
meta:
request_goal: Get character data
agent_name: Gemini
request_method: select
query_block:
file_path:
folder_name: Characters
file_name: Kowalski, the bloody reaper
sections_to_retrieve:
- YAML:
name: get_text
- Bio:
Character: get_text
- Abilities:
list_elements: [1, 3]
От чего-то отдалённо похожего на GraphQL (если закрыть оба глаза 🙈) я пришёл к SQL.
Агент указывал полный путь до нужного места, от корня до текста в каком-нибудь вложенном заголовке.
А сейчас максимально SQL-подобный синтаксис: вместо указания пути просто перечисление заголовков, из которых нужно брать текст.
Проще говоря, схема была упрощена до минимума и стала соответствовать ключевой идее проекта ✅
Вот что сейчас:
-- Получить текст из двух разделов персонажа 👤
SELECT text
FROM "Описание", "История"
FILE "Персонажи/character";
-- Получить первые 3 события с полями 📅
SELECT title, tags, text
FROM "События"
FILE "События/events"
LIMIT 3;
-- Получить предметы с тегом "черный ворон" и состоянием голода 🦅
SELECT items
FROM "События"
FILE "События/events"
WHERE tags INCLUDE "черный ворон"
AND state INCLUDE "голод > 50";