Skip to content

content_manager.cpp

GitHub Actions edited this page Jan 2, 2026 · 1 revision
# content_manager.cpp

**Stand:** 5. Dezember 2025  
**Version:** 1.0.0  
**Kategorie:** Src

---


Path: `src/content/content_manager.cpp`

**Purpose:** Implementiert `ContentManager` für Content‑Ingest, Chunking, optionale ZSTD‑Kompression, Metadatenverwaltung und Integration mit Vector/Graph Indizes.

**Kerntypen:**
- `ContentMeta` — Metadaten eines Content‑Objekts (mime_type, size_bytes, compressed, chunk_count, embedding_dim, timestamps, hashes).
- `ChunkMeta` — Metadaten eines Chunks (seq_num, chunk_type, embedding, content_id).
- `ContentManager` — bietet Import/Get/Delete/Search APIs.

**Wichtige API‑Funktionen (Übersicht):**
- `importContent(spec, blob)` — Ingest eines Content‑Objekts.
- `getContentMeta(content_id)` — lädt `ContentMeta`.
- `getContentBlob(content_id)` — liefert entpackten Blob (falls komprimiert, Dekompression intern).
- `getContentChunks(content_id)` — liefert Chunk‑Liste (`ChunkMeta`).
- `getChunk(chunk_id)` — lädt einzelnes Chunk‑Meta.
- `searchContent(query_text, k, filters)` — vektorbasierte Suche via TextProcessor→Embedding.
- `searchWithExpansion(query_text, k, expansion_hops, filters)` — erweitert per Graph BFS/Dijkstra.
- `deleteContent(content_id)` — löscht Blob, Chunks, Metadaten und Index‑Einträge.
- `getStats()` — einfache Statistiken (counts, approximate storage size).

**Speicher‑Keys / Konventionen:**
- `content:<id>` → ContentMeta JSON
- `content_blob:<id>` → Blob (roh oder ZSTD)
- `chunk:<id>` → ChunkMeta JSON
- `content_chunks:<id>` → JSON Liste der chunk ids
- `content_hash:<sha256>` → lookup für Duplikaterkennung

**Import‑Ablauf (`importContent`):**
1. `spec` JSON parsen (metadaten, chunks, edges optional).
2. Generiere IDs falls notwendig (UUID fallback).
3. Entscheide Kompression über Heuristik + `config:content` (z.B. skip small mime types, size threshold ~4KB).
4. Wenn komprimiert → ZSTD (nur wenn `THEMIS_HAS_ZSTD` verfügbar), sonst roher Blob.
5. Speichere Blob unter `content_blob:<id>` und Meta unter `content:<id>`.
6. Für jeden Chunk: speichere `chunk:<id>`, optional Embedding → `vector_index_->addEntity(...)` in `chunks:` namespace.
7. Optional: Kanten in `graph_index_` anlegen.

**Kompressions‑Heuristik (aktuell):**
- MIME‑Whitelist / Blacklist: gewisse textliche MIMEs komprimieren, bereits komprimierte MIMEs (z. B. `image/*`, `video/*`) werden ausgelassen.
- Größenheuristik: Standardfall komprimieren wenn > ~4096 Bytes (siehe Quellcode: `return size > 4096;`).
- Build‑Zeit: Wenn ZSTD nicht vorhanden ist (kein `THEMIS_HAS_ZSTD`) → Fallback auf rohen Blob.

**Deduplication:**
- SHA256 des Inhalts wird berechnet und in `content_hash:<hex>` abgelegt; ein Treffer kann Import überspringen oder referenzieren.

**Suche & Expansion:**
- `searchContent` nutzt einen `TextProcessor` (falls registriert) zur Erstellung einer Query‑Embedding und ruft `vector_index_->searchKnn` auf.
- `searchWithExpansion` kombiniert Vector‑Scores mit Graph‑Expansion (BFS) und optionalen Dijkstra‑Kosten; Parameter `alpha/beta/gamma` steuern Gewichtung und Hop‑Penalty.

**Fehlerbehandlung / Fallbacks:**
- Alle `storage_->put`/`get` Rückgaben werden geprüft; fehlgeschlagene Stores geben `Status::Error` zurück.
- Dekompressionsfehler führen zu Rückgabe des rohen Bytestrings (Fallback).

**Beispiel `spec` (Import JSON):**
```json
{
	"id": "", // optional
	"mime_type": "text/plain",
	"title": "Beispiel",
	"chunks": [ { "seq_num": 0, "id": "", "embedding": [0.1, 0.2, ...] } ],
	"edges": [ { "from": "obj:1", "to": "obj:2", "weight": 1.0 } ]
}

Pseudocode‑Beispiel (Ingest → Suche):

ContentManager cm(storage, vector_index, graph_index);
json spec = ...; std::string blob = readFile("file.txt");
auto st = cm.importContent(spec, blob);
auto meta = cm.getContentMeta(st.id);
auto results = cm.searchContent("Suchtext", 10, json::object());

Wichtige Ergänzungen / TODOs:

  • E2E Tests: ingest → getBlob → searchContent → deleteContent (inkl. Kompressionsvarianten).
  • Concurrency: dokumentieren, welche atomic/transactional Guarantees Storage bietet und ob externes Locking empfohlen wird (race beim Setzen von embedding_dim).
  • Explizite Beispiele für config:content Settings.

ThemisDB Dokumentation

Version: 1.3.0 | Stand: Dezember 2025


📋 Schnellstart


🏗️ Architektur


🗄️ Basismodell


💾 Storage & MVCC


📇 Indexe & Statistiken


🔍 Query & AQL


💰 Caching


📦 Content Pipeline


🔎 Suche


⚡ Performance & Benchmarks


🏢 Enterprise Features


✅ Qualitätssicherung


🧮 Vektor & GNN


🌍 Geo Features


🛡️ Sicherheit & Governance

Authentication

Schlüsselverwaltung

Verschlüsselung

TLS & Certificates

PKI & Signatures

PII Detection

Vault & HSM

Audit & Compliance

Security Audits

Gap Analysis


🚀 Deployment & Betrieb

Docker

Observability

Change Data Capture

Operations


💻 Entwicklung

API Implementations

Changefeed

Security Development

Development Overviews


📄 Publikation & Ablage


🔧 Admin-Tools


🔌 APIs


📚 Client SDKs


📊 Implementierungs-Zusammenfassungen


📅 Planung & Reports


📖 Dokumentation


📝 Release Notes


📖 Styleguide & Glossar


🗺️ Roadmap & Changelog


💾 Source Code Documentation

Main Programs

Source Code Module


🗄️ Archive


🤝 Community & Support


Vollständige Dokumentation: https://makr-code.github.io/ThemisDB/

Clone this wiki locally