// // Copyright 2025 DXOS.org // // @import-as-namespace import { type QueryAST } from '@dxos/echo-protocol'; export interface Order { // TODO(dmaretskyi): See new effect-schema approach to variance. '~Order': { value: T }; ast: QueryAST.Order; } export type Any = Order; class OrderClass implements Order { private static 'variance': Order['~Order'] = {} as Order['~Order']; static is(value: unknown): value is Order { return typeof value === 'object' && value !== null && '~Order' in value; } constructor(public readonly ast: QueryAST.Order) {} '~Order' = OrderClass.variance; } export const natural: Order = new OrderClass({ kind: 'natural' }); export const property = (property: keyof T & string, direction: QueryAST.OrderDirection): Order => new OrderClass({ kind: 'property', property, direction, }); /** * Order by relevance rank (for FTS/vector search results). * Higher rank = better match. Default direction is 'desc' (best matches first). */ export const rank = (direction: QueryAST.OrderDirection = 'desc'): Order => new OrderClass({ kind: 'rank', direction, }); /** * Order by the system `updatedAt` timestamp (last re-indexed). Default direction is 'desc' * (most-recently-updated first). Mirrors {@link Filter.updated}. */ export const updated = (direction: QueryAST.OrderDirection = 'desc'): Order => new OrderClass({ kind: 'timestamp', field: 'updatedAt', direction, }); /** * Order by the system `createdAt` timestamp (first indexed). Default direction is 'desc' * (most-recently-created first). Mirrors {@link Filter.created}. */ export const created = (direction: QueryAST.OrderDirection = 'desc'): Order => new OrderClass({ kind: 'timestamp', field: 'createdAt', direction, });