@codai/cbd
Version:
Codai Better Database - High-Performance Vector Memory System with HPKV-inspired architecture and MCP server
184 lines • 5.35 kB
JavaScript
/**
* CBD Universal Data Model
* Foundation for multi-paradigm database support
*
* Phase 1: Core unified data model supporting all database paradigms
*/
import { z } from 'zod';
/**
* Schema validation using Zod for runtime type safety
*/
export const UniversalRecordSchema = z.object({
id: z.object({
id: z.string(),
version: z.number(),
createdAt: z.date(),
updatedAt: z.date(),
sqlTable: z.string().optional(),
docCollection: z.string().optional(),
graphType: z.enum(['node', 'edge']).optional(),
vectorDimensions: z.number().optional(),
timeSeriesMetric: z.string().optional(),
keyValueNamespace: z.string().optional(),
}),
data: z.union([
z.object({ type: z.literal('relational'), schema: z.string(), table: z.string(), columns: z.record(z.any()) }),
z.object({ type: z.literal('document'), collection: z.string(), document: z.record(z.any()) }),
z.object({ type: z.literal('graph'), properties: z.record(z.any()) }),
z.object({ type: z.literal('vector'), dimensions: z.number(), vector: z.array(z.number()) }),
z.object({ type: z.literal('timeseries'), metric: z.string(), timestamp: z.date(), value: z.any() }),
z.object({ type: z.literal('keyvalue'), key: z.string(), value: z.any() }),
]),
indexes: z.record(z.any()),
metadata: z.object({
createdBy: z.string(),
createdAt: z.date(),
updatedBy: z.string(),
updatedAt: z.date(),
accessCount: z.number(),
lastAccessed: z.date(),
}),
version: z.number(),
});
/**
* Factory functions for creating data containers
*/
export class DataContainerFactory {
static createRelational(schema, table, columns) {
return {
type: 'relational',
schema,
table,
columns
};
}
static createDocument(collection, document) {
return {
type: 'document',
collection,
document
};
}
static createVector(dimensions, vector, metadata) {
const result = {
type: 'vector',
dimensions,
vector: new Float32Array(vector)
};
if (metadata !== undefined) {
result.metadata = metadata;
}
return result;
}
static createTimeSeries(metric, value, tags) {
const result = {
type: 'timeseries',
metric,
timestamp: new Date(),
value
};
if (tags !== undefined) {
result.tags = tags;
}
return result;
}
static createKeyValue(key, value, namespace) {
const result = {
type: 'keyvalue',
key,
value
};
if (namespace !== undefined) {
result.namespace = namespace;
}
return result;
}
static createGraphNode(labels, properties) {
return {
type: 'graph',
labels,
properties
};
}
static createGraphEdge(sourceNodeId, targetNodeId, edgeType, properties = {}) {
return {
type: 'graph',
edgeType,
sourceNodeId,
targetNodeId,
properties,
directed: true
};
}
}
/**
* Universal record utilities
*/
export class UniversalRecordUtils {
/**
* Generate a new universal record ID
*/
static generateId(paradigm, identifier) {
const now = new Date();
const baseId = {
id: `${paradigm}_${identifier}_${now.getTime()}`,
version: 1,
createdAt: now,
updatedAt: now
};
// Set paradigm-specific fields
switch (paradigm) {
case 'sql':
baseId.sqlTable = identifier;
break;
case 'document':
baseId.docCollection = identifier;
break;
case 'vector':
baseId.vectorDimensions = parseInt(identifier) || 1536;
break;
case 'timeseries':
baseId.timeSeriesMetric = identifier;
break;
case 'keyvalue':
baseId.keyValueNamespace = identifier;
break;
}
return baseId;
}
/**
* Validate a universal record
*/
static validate(record) {
try {
UniversalRecordSchema.parse(record);
return { valid: true, errors: [] };
}
catch (error) {
return {
valid: false,
errors: error.errors?.map((e) => `${e.path.join('.')}: ${e.message}`) || [error.message]
};
}
}
/**
* Create metadata with defaults
*/
static createMetadata(createdBy, tenantId) {
const now = new Date();
const result = {
createdBy,
createdAt: now,
updatedBy: createdBy,
updatedAt: now,
accessCount: 0,
lastAccessed: now,
classification: 'internal'
};
if (tenantId !== undefined) {
result.tenantId = tenantId;
}
return result;
}
}
//# sourceMappingURL=UniversalDataModel.js.map