@iarayan/ch-orm
Version:
A Developer-First ClickHouse ORM with Powerful CLI Tools
280 lines • 7 kB
JavaScript
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