UNPKG

@iarayan/ch-orm

Version:

A Developer-First ClickHouse ORM with Powerful CLI Tools

280 lines 7 kB
import { DataTypes } from "../constants/Types"; /** * Storage for metadata about models and their columns */ export const MetadataStorage = { /** * Map of model constructors to table names */ tables: new Map(), /** * Map of model constructors to primary key column names */ primaryKeys: new Map(), /** * Map of model constructors to column definitions */ columns: new Map(), /** * Get table name for a model * @param target - Model constructor * @returns Table name or undefined if not set */ getTableName(target) { return this.tables.get(target); }, /** * Set table name for a model * @param target - Model constructor * @param name - Table name */ setTableName(target, name) { this.tables.set(target, name); }, /** * Get primary keys for a model * @param target - Model constructor * @returns Array of primary key column names */ getPrimaryKeys(target) { return this.primaryKeys.get(target) || []; }, /** * Add a primary key to a model * @param target - Model constructor * @param propertyName - Primary key property name */ addPrimaryKey(target, propertyName) { const keys = this.primaryKeys.get(target) || []; keys.push(propertyName); this.primaryKeys.set(target, keys); }, /** * Get column metadata for a model * @param target - Model constructor * @returns Map of property names to column metadata */ getColumns(target) { if (!this.columns.has(target)) { this.columns.set(target, new Map()); } return this.columns.get(target); }, /** * Add column metadata to a model * @param target - Model constructor * @param propertyName - Property name * @param metadata - Column metadata */ addColumn(target, propertyName, metadata) { const columns = this.getColumns(target); columns.set(propertyName, metadata); }, }; /** * Table decorator * @param name - Table name * @returns Class decorator */ export function Table(name) { return function (target) { MetadataStorage.setTableName(target, name); return target; }; } /** * Column decorator factory * @param options - Column options * @returns Property decorator */ export function Column(options) { return function (target, propertyKey) { const constructor = target.constructor; const propertyName = propertyKey.toString(); MetadataStorage.addColumn(constructor, propertyName, { propertyName, name: options.name || propertyName, type: options.type.toString(), primary: options.primary, nullable: options.nullable, defaultExpression: options.defaultExpression, comment: options.comment, codec: options.codec, ttl: options.ttl, }); // If the column is a primary key, add it to the primary keys list if (options.primary) { MetadataStorage.addPrimaryKey(constructor, propertyName); } }; } /** * PrimaryKey decorator * @param options - Column options (optional) * @returns Property decorator */ export function PrimaryKey(options = {}) { return Column({ ...options, primary: true, type: options.type || DataTypes.STRING, }); } /** * String column decorator * @param options - Column options (optional) * @returns Property decorator */ export function StringColumn(options = {}) { return Column({ ...options, type: DataTypes.STRING, }); } /** * UInt32 column decorator * @param options - Column options (optional) * @returns Property decorator */ export function UInt32Column(options = {}) { return Column({ ...options, type: DataTypes.UINT32, }); } /** * UInt64 column decorator * @param options - Column options (optional) * @returns Property decorator */ export function UInt64Column(options = {}) { return Column({ ...options, type: DataTypes.UINT64, }); } /** * Int32 column decorator * @param options - Column options (optional) * @returns Property decorator */ export function Int32Column(options = {}) { return Column({ ...options, type: DataTypes.INT32, }); } /** * Int64 column decorator * @param options - Column options (optional) * @returns Property decorator */ export function Int64Column(options = {}) { return Column({ ...options, type: DataTypes.INT64, }); } /** * Float32 column decorator * @param options - Column options (optional) * @returns Property decorator */ export function Float32Column(options = {}) { return Column({ ...options, type: DataTypes.FLOAT32, }); } /** * Float64 column decorator * @param options - Column options (optional) * @returns Property decorator */ export function Float64Column(options = {}) { return Column({ ...options, type: DataTypes.FLOAT64, }); } /** * Boolean column decorator * @param options - Column options (optional) * @returns Property decorator */ export function BooleanColumn(options = {}) { return Column({ ...options, type: DataTypes.BOOLEAN, }); } /** * Date column decorator * @param options - Column options (optional) * @returns Property decorator */ export function DateColumn(options = {}) { return Column({ ...options, type: DataTypes.DATE, }); } /** * DateTime column decorator * @param options - Column options (optional) * @returns Property decorator */ export function DateTimeColumn(options = {}) { return Column({ ...options, type: DataTypes.DATETIME, }); } /** * UUID column decorator * @param options - Column options (optional) * @returns Property decorator */ export function UUIDColumn(options = {}) { return Column({ ...options, type: DataTypes.UUID, }); } /** * Array column decorator * @param subType - Array element type * @param options - Column options (optional) * @returns Property decorator */ export function ArrayColumn(subType, options = {}) { return Column({ ...options, type: `${DataTypes.ARRAY}(${subType})`, }); } /** * Nullable column decorator * @param subType - Base type * @param options - Column options (optional) * @returns Property decorator */ export function NullableColumn(subType, options = {}) { return Column({ ...options, type: `${DataTypes.NULLABLE}(${subType})`, nullable: true, }); } /** * JSON column decorator * @param options - Column options (optional) * @returns Property decorator */ export function JSONColumn(options = {}) { return Column({ ...options, type: DataTypes.JSON, }); } //# sourceMappingURL=ModelDecorators.js.map