kogral/schemas/surrealdb/blocks.surql
Jesús Pérez 9ea04852a8
Some checks failed
Rust CI / Security Audit (push) Has been cancelled
Rust CI / Check + Test + Lint (nightly) (push) Has been cancelled
Rust CI / Check + Test + Lint (stable) (push) Has been cancelled
Nickel Type Check / Nickel Type Checking (push) Has been cancelled
chore: add schemas and just recipes
2026-01-23 16:12:50 +00:00

140 lines
4.8 KiB
Plaintext

-- SurrealDB Schema for Logseq Blocks Support
-- This schema extends the KOGRAL system to support block-level storage and querying
-- Define namespace and database
-- USE NS kogral;
-- USE DB default;
-- ============================================================================
-- BLOCK TABLE
-- ============================================================================
DEFINE TABLE block SCHEMAFULL;
-- Fields
DEFINE FIELD node_id ON block TYPE record(node) ASSERT $value != NONE;
DEFINE FIELD block_id ON block TYPE string ASSERT $value != NONE;
DEFINE FIELD content ON block TYPE string;
DEFINE FIELD parent_id ON block TYPE option<string>;
DEFINE FIELD created ON block TYPE datetime;
DEFINE FIELD modified ON block TYPE datetime;
-- Properties (flexible object for block metadata)
DEFINE FIELD properties ON block TYPE object;
DEFINE FIELD properties.tags ON block TYPE array;
DEFINE FIELD properties.status ON block TYPE option<string>;
DEFINE FIELD properties.custom ON block TYPE option<object>;
DEFINE FIELD properties.block_refs ON block TYPE array;
DEFINE FIELD properties.page_refs ON block TYPE array;
-- ============================================================================
-- INDEXES
-- ============================================================================
-- Index on node_id for fast lookup of all blocks in a node
DEFINE INDEX block_node_idx ON block COLUMNS node_id;
-- Index on block_id for direct block lookup
DEFINE INDEX block_id_idx ON block COLUMNS block_id UNIQUE;
-- Index on tags for tag-based queries (find all #card blocks)
DEFINE INDEX block_tags_idx ON block COLUMNS properties.tags;
-- Index on status for TODO/DONE queries
DEFINE INDEX block_status_idx ON block COLUMNS properties.status;
-- Index on parent_id for hierarchical queries
DEFINE INDEX block_parent_idx ON block COLUMNS parent_id;
-- Full-text search index on content
DEFINE INDEX block_content_search ON block COLUMNS content SEARCH ANALYZER simple BM25;
-- ============================================================================
-- QUERIES (Examples)
-- ============================================================================
-- Find all blocks with a specific tag
-- SELECT * FROM block WHERE $tag IN properties.tags;
-- Find all TODO blocks
-- SELECT * FROM block WHERE properties.status = "TODO";
-- Find all blocks in a specific node
-- SELECT * FROM block WHERE node_id = $node_record_id;
-- Find blocks with custom property
-- SELECT * FROM block WHERE properties.custom[$key] = $value;
-- Full-text search in block content
-- SELECT * FROM block WHERE content @@ $search_term;
-- Get block hierarchy (parent and all children)
-- SELECT *,
-- (SELECT * FROM block WHERE parent_id = $parent.block_id) AS children
-- FROM block WHERE block_id = $parent_block_id;
-- ============================================================================
-- RELATIONSHIPS
-- ============================================================================
-- Block belongs to a Node
DEFINE FIELD node_id ON block TYPE record(node);
-- Example: Get all blocks for a node with their content
-- SELECT * FROM block WHERE node_id = $node_id ORDER BY created ASC;
-- Example: Count blocks by tag across all nodes
-- SELECT
-- array::flatten(properties.tags) AS tag,
-- count() AS count
-- FROM block
-- GROUP BY tag
-- ORDER BY count DESC;
-- Example: Get all flashcards (#card) across the knowledge base
-- SELECT
-- node_id.title AS node_title,
-- content,
-- properties
-- FROM block
-- WHERE "card" IN properties.tags;
-- ============================================================================
-- MIGRATION QUERIES
-- ============================================================================
-- Populate blocks table from existing nodes (run once)
-- This would be executed by the sync mechanism or migration script
-- Example migration pseudocode:
-- FOR node IN (SELECT * FROM node) {
-- LET parsed_blocks = parse_markdown(node.content);
-- FOR block IN parsed_blocks {
-- CREATE block CONTENT {
-- node_id: node.id,
-- block_id: block.id,
-- content: block.content,
-- parent_id: block.parent_id,
-- created: block.created,
-- modified: block.modified,
-- properties: {
-- tags: block.properties.tags,
-- status: block.properties.status,
-- custom: block.properties.custom,
-- block_refs: block.properties.block_refs,
-- page_refs: block.properties.page_refs
-- }
-- };
-- }
-- }
-- ============================================================================
-- CLEANUP QUERIES
-- ============================================================================
-- Delete all blocks for a specific node
-- DELETE block WHERE node_id = $node_record_id;
-- Delete orphaned blocks (node no longer exists)
-- DELETE block WHERE node_id NOT IN (SELECT id FROM node);