cs-element
Version:
Advanced reactive data management library with state machines, blueprints, persistence, compression, networking, and multithreading support
264 lines • 11.4 kB
TypeScript
/**
* Интерфейсы для системы Live queries (реактивных запросов)
*/
import { CSElement } from '../core/CSElement';
import { ICSElement } from './interfaces';
export interface QueryOptions {
/** Максимальное количество результатов */
limit?: number;
/** Смещение для пагинации */
offset?: number;
/** Включать дочерние элементы */
includeChildren?: boolean;
/** Максимальная глубина поиска */
maxDepth?: number;
/** Сортировка результатов */
sort?: 'name' | 'index' | 'depth' | 'createdAt';
/** Порядок сортировки */
order?: 'asc' | 'desc';
/** Кэширование результатов */
cache?: boolean;
/** Время жизни кэша (мс) */
cacheTTL?: number;
/** Корневой элемент для поиска */
root?: ICSElement;
/** Глубокий поиск (для некоторых движков) */
deep?: boolean;
}
export interface QueryResult<T = any> {
/** Найденные элементы */
items: T[];
/** Общее количество найденных элементов */
total: number;
/** Время выполнения запроса */
executionTime: number;
/** Использовался ли кэш */
fromCache: boolean;
/** Метаданные запроса */
metadata?: {
selector: string;
options: QueryOptions;
timestamp: number;
};
}
export type LiveQueryCallback<T = any> = (results: T[], query: LiveQuery<T>) => void;
export type LiveQueryErrorCallback = (error: Error, query: LiveQuery) => void;
export type LiveQueryFilter<T = any> = (item: T) => boolean;
export type LiveQueryTransform<T = any, R = any> = (item: T) => R;
export type LiveQuerySort<T = any> = (a: T, b: T) => number;
export interface LiveQueryConfig {
/** Автоматический запуск при создании */
autoStart?: boolean;
/** Дебаунс для обновлений (мс) */
debounce?: number;
/** Максимальное количество результатов */
limit?: number;
/** Кэширование результатов */
cache?: boolean;
/** Время жизни кэша (мс) */
cacheTTL?: number;
/** Глубокое наблюдение за изменениями */
deep?: boolean;
/** Пакетная обработка обновлений */
batch?: boolean;
}
export interface LiveQuery<T = any> {
/** Уникальный ID запроса */
id: string;
/** Селектор запроса */
selector: string;
/** Опции запроса */
options: QueryOptions;
/** Конфигурация live query */
config: LiveQueryConfig;
/** Текущие результаты */
results: T[];
/** Активен ли запрос */
active: boolean;
/** Время последнего обновления */
lastUpdated: number;
/** Количество обновлений */
updateCount: number;
/** Наблюдаемые элементы */
watchedElements: Set<string>;
/** Фильтры */
filters: LiveQueryFilter<T>[];
/** Трансформации */
transforms: LiveQueryTransform<T, any>[];
/** Сортировка */
sort?: LiveQuerySort<T>;
/** Callback для результатов */
onResults?: LiveQueryCallback<T>;
/** Callback для ошибок */
onError?: LiveQueryErrorCallback;
}
export interface LiveQueryManager {
/** Создать live query */
createLiveQuery<T = any>(selector: string, options?: QueryOptions, config?: LiveQueryConfig): LiveQuery<T>;
/** Запустить live query */
start(queryId: string): void;
/** Остановить live query */
stop(queryId: string): void;
/** Получить live query по ID */
getLiveQuery(queryId: string): LiveQuery | undefined;
/** Получить все live queries */
getAllLiveQueries(): LiveQuery[];
/** Удалить live query */
removeLiveQuery(queryId: string): boolean;
/** Обновить результаты запроса */
updateQuery(queryId: string): void;
/** Обновить все активные запросы */
updateAllQueries(): void;
/** Добавить фильтр к запросу */
addFilter<T>(queryId: string, filter: LiveQueryFilter<T>): void;
/** Удалить фильтр из запроса */
removeFilter(queryId: string, filterIndex: number): void;
/** Добавить трансформацию к запросу */
addTransform<T, R>(queryId: string, transform: LiveQueryTransform<T, R>): void;
/** Установить сортировку для запроса */
setSort<T>(queryId: string, sort: LiveQuerySort<T>): void;
/** Подписаться на результаты запроса */
subscribe<T>(queryId: string, callback: LiveQueryCallback<T>): string;
/** Отписаться от результатов запроса */
unsubscribe(queryId: string, subscriptionId: string): boolean;
/** Получить статистику live queries */
getStats(): LiveQueryStats;
/** Очистить все live queries */
clear(): void;
/** Уведомить об изменении элемента */
notifyElementChange(element: CSElement, changeType: 'create' | 'update' | 'delete'): void;
/** Уведомить об изменении данных элемента */
notifyDataChange(element: CSElement, key: string, newValue: any, oldValue: any): void;
/** Подписаться на события */
on(event: string, callback: LiveQueryEventCallback): this;
/** Отписаться от событий */
off(event: string, callback: LiveQueryEventCallback): this;
}
export interface LiveQueryStats {
/** Общее количество live queries */
totalQueries: number;
/** Количество активных queries */
activeQueries: number;
/** Общее количество обновлений */
totalUpdates: number;
/** Среднее время выполнения запроса */
averageQueryTime: number;
/** Использование памяти */
memoryUsage: number;
/** Количество наблюдаемых элементов */
watchedElements: number;
/** Статистика по селекторам */
selectorStats: Map<string, SelectorStats>;
}
export interface SelectorStats {
/** Селектор */
selector: string;
/** Количество запросов с этим селектором */
queryCount: number;
/** Среднее количество результатов */
averageResults: number;
/** Время последнего использования */
lastUsed: number;
/** Общее время выполнения */
totalExecutionTime: number;
}
export interface LiveQuerySubscription {
/** ID подписки */
id: string;
/** ID запроса */
queryId: string;
/** Callback */
callback: LiveQueryCallback;
/** Активна ли подписка */
active: boolean;
/** Время создания */
createdAt: number;
}
export interface LiveQueryEvent {
/** Тип события */
type: 'query-created' | 'query-started' | 'query-stopped' | 'query-updated' | 'query-removed' | 'results-changed';
/** ID запроса */
queryId: string;
/** Данные события */
data?: any;
/** Временная метка */
timestamp: number;
}
export type LiveQueryEventCallback = (event: LiveQueryEvent) => void;
export interface LiveQueryBuilder<T = any> {
/** Установить селектор */
selector(selector: string): LiveQueryBuilder<T>;
/** Установить опции запроса */
options(options: QueryOptions): LiveQueryBuilder<T>;
/** Установить конфигурацию */
config(config: LiveQueryConfig): LiveQueryBuilder<T>;
/** Добавить фильтр */
filter(filter: LiveQueryFilter<T>): LiveQueryBuilder<T>;
/** Добавить трансформацию */
transform<R>(transform: LiveQueryTransform<T, R>): LiveQueryBuilder<R>;
/** Установить сортировку */
sort(sort: LiveQuerySort<T>): LiveQueryBuilder<T>;
/** Установить лимит */
limit(limit: number): LiveQueryBuilder<T>;
/** Установить дебаунс */
debounce(ms: number): LiveQueryBuilder<T>;
/** Включить кэширование */
cache(ttl?: number): LiveQueryBuilder<T>;
/** Подписаться на результаты */
subscribe(callback: LiveQueryCallback<T>): LiveQueryBuilder<T>;
/** Подписаться на ошибки */
onError(callback: LiveQueryErrorCallback): LiveQueryBuilder<T>;
/** Создать и запустить запрос */
start(): LiveQuery<T>;
/** Создать запрос без запуска */
build(): LiveQuery<T>;
}
export interface LiveQueryOptimizer {
/** Оптимизировать запрос */
optimizeQuery(query: LiveQuery): LiveQuery;
/** Объединить похожие запросы */
mergeQueries(queries: LiveQuery[]): LiveQuery[];
/** Предложить индексы для оптимизации */
suggestIndexes(queries: LiveQuery[]): string[];
/** Анализировать производительность */
analyzePerformance(query: LiveQuery): QueryPerformanceAnalysis;
}
export interface QueryPerformanceAnalysis {
/** ID запроса */
queryId: string;
/** Время выполнения */
executionTime: number;
/** Количество проверенных элементов */
elementsScanned: number;
/** Количество результатов */
resultsCount: number;
/** Эффективность (результаты/проверенные) */
efficiency: number;
/** Рекомендации по оптимизации */
recommendations: string[];
/** Предлагаемые индексы */
suggestedIndexes: string[];
}
export interface LiveQueryIndex {
/** Имя индекса */
name: string;
/** Поля для индексации */
fields: string[];
/** Тип индекса */
type: 'btree' | 'hash' | 'text' | 'compound';
/** Индексированные значения */
values: Map<string, Set<string>>;
/** Статистика использования */
stats: IndexStats;
}
export interface IndexStats {
/** Количество использований */
usageCount: number;
/** Время последнего использования */
lastUsed: number;
/** Размер индекса */
size: number;
/** Эффективность индекса */
efficiency: number;
}
//# sourceMappingURL=live-query-interfaces.d.ts.map