UNPKG

convex-helpers

Version:

A collection of useful code to complement the official convex package.

523 lines 43.8 kB
import type { Value } from "convex/values"; import type { DataModelFromSchemaDefinition, DocumentByInfo, DocumentByName, GenericDatabaseReader, IndexNames, IndexRange, IndexRangeBuilder, NamedIndex, NamedTableInfo, OrderedQuery, PaginationOptions, PaginationResult, Query, QueryInitializer, SchemaDefinition, SystemDataModel, TableNamesInDataModel } from "convex/server"; export type IndexKey = (Value | undefined)[]; /** * Get the ordered list of fields for a given table's index based on the schema. * * - For "by_creation_time", returns ["_creationTime", "_id"]. * - For "by_id", returns ["_id"]. * - Otherwise, looks up the named index in the schema and returns its fields * followed by ["_creationTime", "_id"]. * e.g. for an index defined like `.index("abc", ["a", "b"])`, * returns ["a", "b", "_creationTime", "_id"]. */ export declare function getIndexFields<Schema extends SchemaDefinition<any, boolean>, T extends TableNamesInDataModel<DM<Schema>>>(table: T, index?: IndexNames<NamedTableInfo<DM<Schema>, T>>, schema?: Schema): string[]; /** * A "stream" is an async iterable of query results, ordered by an index on a table. * * Use it as you would use `ctx.db`. * If using pagination in a reactive query, see the warnings on the `paginator` * function. TL;DR: you need to pass in `endCursor` to prevent holes or overlaps * between pages. * * Once you have a stream, you can use `mergeStreams` or `filterStream` to make * more streams. Then use `queryStream` to convert it into an OrderedQuery, * so you can call `.paginate()`, `.collect()`, etc. */ export declare function stream<Schema extends SchemaDefinition<any, boolean>>(db: GenericDatabaseReader<DM<Schema>>, schema: Schema): StreamDatabaseReader<Schema>; type GenericStreamItem = NonNullable<unknown>; /** * A "QueryStream" is an async iterable of query results, ordered by indexed fields. */ export declare abstract class QueryStream<T extends GenericStreamItem> implements GenericOrderedQuery<T> { abstract iterWithKeys(): AsyncIterable<[T | null, IndexKey]>; abstract narrow(indexBounds: IndexBounds): QueryStream<T>; abstract getOrder(): "asc" | "desc"; abstract getIndexFields(): string[]; abstract getEqualityIndexFilter(): Value[]; /** * Create a new stream with a TypeScript filter applied. * * This is similar to `db.query(tableName).filter(predicate)`, but it's more * general because it can call arbitrary TypeScript code, including more * database queries. * * All documents filtered out are still considered "read" from the database; * they are just excluded from the output stream. * * In contrast to `filter` from convex-helpers/server/filter, this filterWith * is applied *before* any pagination. That means if the filter excludes a lot * of documents, the `.paginate()` method will read a lot of documents until * it gets as many documents as it wants. If you run into issues with reading * too much data, you can pass `maximumRowsRead` to `paginate()`. */ filterWith(predicate: (doc: T) => Promise<boolean>): QueryStream<T>; /** * Create a new stream where each element is the result of applying the mapper * function to the elements of the original stream. * * Similar to how [1, 2, 3].map(x => x * 2) => [2, 4, 6] */ map<U extends GenericStreamItem>(mapper: (doc: T) => Promise<U | null>): QueryStream<U>; /** * Similar to flatMap on an array, but iterate over a stream, and the for each * element, iterate over the stream created by the mapper function. * * Ordered by the original stream order, then the mapped stream. Similar to * how ["a", "b"].flatMap(letter => [letter, letter]) => ["a", "a", "b", "b"] * * @param mapper A function that takes a document and returns a new stream. * @param mappedIndexFields The index fields of the streams created by mapper. * @returns A stream of documents returned by the mapper streams, * grouped by the documents in the original stream. */ flatMap<U extends GenericStreamItem>(mapper: (doc: T) => Promise<QueryStream<U>>, mappedIndexFields: string[]): QueryStream<U>; /** * Get the first item from the original stream for each distinct value of the * selected index fields. * * e.g. if the stream has an equality filter on `a`, and index fields `[a, b, c]`, * we can do `stream.distinct(["b"])` to get a stream of the first item for * each distinct value of `b`. * Similarly, you could do `stream.distinct(["a", "b"])` with the same result, * or `stream.distinct(["a", "b", "c"])` to get the original stream. * * This stream efficiently skips past items with the same value for the selected * distinct index fields. * * This can be used to perform a loose index scan. */ distinct(distinctIndexFields: string[]): QueryStream<T>; filter(_predicate: any): never; paginate(opts: PaginationOptions & { endCursor?: string | null; maximumRowsRead?: number; }): Promise<PaginationResult<T>>; collect(): Promise<T[]>; take(n: number): Promise<T[]>; unique(): Promise<T | null>; first(): Promise<T | null>; [Symbol.asyncIterator](): { next(): Promise<{ done: true; value: undefined; } | { done: boolean; value: T; }>; }; } /** * GenericOrderedQuery<DocumentByInfo<TableInfo>> is equivalent to OrderedQuery<TableInfo> */ export interface GenericOrderedQuery<T> extends AsyncIterable<T> { /** * Load a page of `n` results and obtain a {@link Cursor} for loading more. * * Note: If this is called from a reactive query function the number of * results may not match `paginationOpts.numItems`! * * `paginationOpts.numItems` is only an initial value. After the first invocation, * `paginate` will return all items in the original query range. This ensures * that all pages will remain adjacent and non-overlapping. * * @param paginationOpts - A {@link PaginationOptions} object containing the number * of items to load and the cursor to start at. * @returns A {@link PaginationResult} containing the page of results and a * cursor to continue paginating. */ paginate(paginationOpts: PaginationOptions): Promise<PaginationResult<T>>; /** * Execute the query and return all of the results as an array. * * Note: when processing a query with a lot of results, it's often better to use the `Query` as an * `AsyncIterable` instead. * * @returns - An array of all of the query's results. */ collect(): Promise<Array<T>>; /** * Execute the query and return the first `n` results. * * @param n - The number of items to take. * @returns - An array of the first `n` results of the query (or less if the * query doesn't have `n` results). */ take(n: number): Promise<Array<T>>; /** * Execute the query and return the first result if there is one. * * @returns - The first value of the query or `null` if the query returned no results. * */ first(): Promise<T | null>; /** * Execute the query and return the singular result if there is one. * * @returns - The single result returned from the query or null if none exists. * @throws Will throw an error if the query returns more than one result. */ unique(): Promise<T | null>; /** * Not supported. Use `filterWith` instead. */ filter(predicate: any): this; } export declare class StreamDatabaseReader<Schema extends SchemaDefinition<any, boolean>> implements GenericDatabaseReader<DM<Schema>> { db: GenericDatabaseReader<DM<Schema>>; schema: Schema; system: GenericDatabaseReader<SystemDataModel>["system"]; constructor(db: GenericDatabaseReader<DM<Schema>>, schema: Schema); query<TableName extends TableNamesInDataModel<DM<Schema>>>(tableName: TableName): StreamQueryInitializer<Schema, TableName>; get(_id: any): any; normalizeId(_tableName: any, _id: any): any; } type DM<Schema extends SchemaDefinition<any, boolean>> = DataModelFromSchemaDefinition<Schema>; export type IndexBounds = { lowerBound: IndexKey; lowerBoundInclusive: boolean; upperBound: IndexKey; upperBoundInclusive: boolean; }; export type QueryReflection<Schema extends SchemaDefinition<any, boolean>, T extends TableNamesInDataModel<DM<Schema>>, IndexName extends IndexNames<NamedTableInfo<DM<Schema>, T>>> = { db: GenericDatabaseReader<DataModelFromSchemaDefinition<Schema>>; schema: Schema; table: T; index: IndexName; indexFields: string[]; order: "asc" | "desc"; bounds: IndexBounds; indexRange?: (q: IndexRangeBuilder<DocumentByInfo<NamedTableInfo<DM<Schema>, T>>, NamedIndex<NamedTableInfo<DM<Schema>, T>, IndexName>>) => IndexRange; }; export declare abstract class StreamableQuery<Schema extends SchemaDefinition<any, boolean>, T extends TableNamesInDataModel<DM<Schema>>, IndexName extends IndexNames<NamedTableInfo<DM<Schema>, T>>> extends QueryStream<DocumentByInfo<NamedTableInfo<DM<Schema>, T>>> implements OrderedQuery<NamedTableInfo<DM<Schema>, T>> { abstract reflect(): QueryReflection<Schema, T, IndexName>; } export declare class StreamQueryInitializer<Schema extends SchemaDefinition<any, boolean>, T extends TableNamesInDataModel<DM<Schema>>> extends StreamableQuery<Schema, T, "by_creation_time"> implements QueryInitializer<NamedTableInfo<DM<Schema>, T>> { parent: StreamDatabaseReader<Schema>; table: T; constructor(parent: StreamDatabaseReader<Schema>, table: T); fullTableScan(): StreamQuery<Schema, T, "by_creation_time">; withIndex<IndexName extends IndexNames<NamedTableInfo<DM<Schema>, T>>>(indexName: IndexName, indexRange?: (q: IndexRangeBuilder<DocumentByInfo<NamedTableInfo<DM<Schema>, T>>, NamedIndex<NamedTableInfo<DM<Schema>, T>, IndexName>>) => IndexRange): StreamQuery<Schema, T, IndexName>; withSearchIndex(_indexName: any, _searchFilter: any): any; inner(): StreamQuery<Schema, T, "by_creation_time">; order(order: "asc" | "desc"): OrderedStreamQuery<Schema, T, "by_creation_time">; reflect(): { db: GenericDatabaseReader<Schema["strictTableNameTypes"] extends infer T_1 ? T_1 extends Schema["strictTableNameTypes"] ? T_1 extends true ? { [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never>; schema: Schema; table: T; index: "by_creation_time"; indexFields: string[]; order: "asc" | "desc"; bounds: { lowerBound: IndexKey; lowerBoundInclusive: boolean; upperBound: IndexKey; upperBoundInclusive: boolean; }; indexRange: ((q: IndexRangeBuilder<DocumentByInfo<NamedTableInfo<Schema["strictTableNameTypes"] extends infer T_2 ? T_2 extends Schema["strictTableNameTypes"] ? T_2 extends true ? { [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>>, NamedIndex<NamedTableInfo<Schema["strictTableNameTypes"] extends infer T_3 ? T_3 extends Schema["strictTableNameTypes"] ? T_3 extends true ? { [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>, "by_creation_time">, 0>) => IndexRange) | undefined; }; iterWithKeys(): AsyncIterable<[DocumentByName<Schema["strictTableNameTypes"] extends infer T_1 ? T_1 extends Schema["strictTableNameTypes"] ? T_1 extends true ? { [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T> | null, IndexKey]>; getOrder(): "asc" | "desc"; getEqualityIndexFilter(): Value[]; getIndexFields(): string[]; narrow(indexBounds: IndexBounds): QueryStream<DocumentByName<Schema["strictTableNameTypes"] extends infer T_1 ? T_1 extends Schema["strictTableNameTypes"] ? T_1 extends true ? { [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>>; } export declare class StreamQuery<Schema extends SchemaDefinition<any, boolean>, T extends TableNamesInDataModel<DM<Schema>>, IndexName extends IndexNames<NamedTableInfo<DM<Schema>, T>>> extends StreamableQuery<Schema, T, IndexName> implements Query<NamedTableInfo<DM<Schema>, T>> { parent: StreamQueryInitializer<Schema, T>; index: IndexName; q: ReflectIndexRange; indexRange: ((q: IndexRangeBuilder<DocumentByInfo<NamedTableInfo<DM<Schema>, T>>, NamedIndex<NamedTableInfo<DM<Schema>, T>, IndexName>>) => IndexRange) | undefined; constructor(parent: StreamQueryInitializer<Schema, T>, index: IndexName, q: ReflectIndexRange, indexRange: ((q: IndexRangeBuilder<DocumentByInfo<NamedTableInfo<DM<Schema>, T>>, NamedIndex<NamedTableInfo<DM<Schema>, T>, IndexName>>) => IndexRange) | undefined); order(order: "asc" | "desc"): OrderedStreamQuery<Schema, T, IndexName>; inner(): OrderedStreamQuery<Schema, T, IndexName>; reflect(): { db: GenericDatabaseReader<Schema["strictTableNameTypes"] extends infer T_1 ? T_1 extends Schema["strictTableNameTypes"] ? T_1 extends true ? { [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never>; schema: Schema; table: T; index: IndexName; indexFields: string[]; order: "asc" | "desc"; bounds: { lowerBound: IndexKey; lowerBoundInclusive: boolean; upperBound: IndexKey; upperBoundInclusive: boolean; }; indexRange: ((q: IndexRangeBuilder<DocumentByInfo<NamedTableInfo<DM<Schema>, T>>, NamedIndex<NamedTableInfo<DM<Schema>, T>, IndexName>>) => IndexRange) | undefined; }; iterWithKeys(): AsyncIterable<[DocumentByName<Schema["strictTableNameTypes"] extends infer T_1 ? T_1 extends Schema["strictTableNameTypes"] ? T_1 extends true ? { [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T> | null, IndexKey]>; getOrder(): "asc" | "desc"; getEqualityIndexFilter(): Value[]; getIndexFields(): string[]; narrow(indexBounds: IndexBounds): QueryStream<DocumentByName<Schema["strictTableNameTypes"] extends infer T_1 ? T_1 extends Schema["strictTableNameTypes"] ? T_1 extends true ? { [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>>; } export declare class OrderedStreamQuery<Schema extends SchemaDefinition<any, boolean>, T extends TableNamesInDataModel<DM<Schema>>, IndexName extends IndexNames<NamedTableInfo<DM<Schema>, T>>> extends StreamableQuery<Schema, T, IndexName> implements OrderedQuery<NamedTableInfo<DM<Schema>, T>> { parent: StreamQuery<Schema, T, IndexName>; order: "asc" | "desc"; constructor(parent: StreamQuery<Schema, T, IndexName>, order: "asc" | "desc"); reflect(): { db: GenericDatabaseReader<Schema["strictTableNameTypes"] extends infer T_1 ? T_1 extends Schema["strictTableNameTypes"] ? T_1 extends true ? { [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never>; schema: Schema; table: T; index: IndexName; indexFields: string[]; order: "asc" | "desc"; bounds: { lowerBound: IndexKey; lowerBoundInclusive: boolean; upperBound: IndexKey; upperBoundInclusive: boolean; }; indexRange: ((q: IndexRangeBuilder<DocumentByInfo<NamedTableInfo<Schema["strictTableNameTypes"] extends infer T_2 ? T_2 extends Schema["strictTableNameTypes"] ? T_2 extends true ? { [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>>, NamedIndex<NamedTableInfo<Schema["strictTableNameTypes"] extends infer T_3 ? T_3 extends Schema["strictTableNameTypes"] ? T_3 extends true ? { [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>, IndexName>, 0>) => IndexRange) | undefined; }; /** * inner() is as if you had used ctx.db to construct the query. */ inner(): OrderedQuery<NamedTableInfo<DM<Schema>, T>>; iterWithKeys(): AsyncIterable<[ DocumentByName<DM<Schema>, T> | null, IndexKey ]>; getOrder(): "asc" | "desc"; getEqualityIndexFilter(): Value[]; getIndexFields(): string[]; narrow(indexBounds: IndexBounds): QueryStream<DocumentByName<Schema["strictTableNameTypes"] extends infer T_1 ? T_1 extends Schema["strictTableNameTypes"] ? T_1 extends true ? { [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition<infer DocumentType extends import("convex/values").Validator<any, any, any>, infer Indexes extends import("convex/server").GenericTableIndexes, infer SearchIndexes extends import("convex/server").GenericTableSearchIndexes, infer VectorIndexes extends import("convex/server").GenericTableVectorIndexes> ? { document: import("convex/server").Expand<import("convex/server").IdField<TableName> & import("convex/server").Expand<import("convex/server").SystemFields & DocumentType["type"]>>; fieldPaths: keyof import("convex/server").IdField<TableName_1> | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand<Indexes & import("convex/server").SystemIndexes>; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>>; } /** * Create a stream of documents using the given index and bounds. */ export declare function streamIndexRange<Schema extends SchemaDefinition<any, boolean>, T extends TableNamesInDataModel<DM<Schema>>, IndexName extends IndexNames<NamedTableInfo<DM<Schema>, T>>>(db: GenericDatabaseReader<DM<Schema>>, schema: Schema, table: T, index: IndexName, bounds: IndexBounds, order: "asc" | "desc"): QueryStream<DocumentByName<DM<Schema>, T>>; declare class ReflectIndexRange { #private; indexFields: string[]; lowerBoundIndexKey: IndexKey | undefined; lowerBoundInclusive: boolean; upperBoundIndexKey: IndexKey | undefined; upperBoundInclusive: boolean; equalityIndexFilter: Value[]; constructor(indexFields: string[]); eq(field: string, value: Value): this; lt(field: string, value: Value): this; lte(field: string, value: Value): this; gt(field: string, value: Value): this; gte(field: string, value: Value): this; } /** * Merge multiple streams, provided in any order, into a single stream. * * The streams will be merged into a stream of documents ordered by the index keys, * i.e. by "author" (then by the implicit "_creationTime"). * * e.g. ```ts * mergedStream([ * stream(db, schema).query("messages").withIndex("by_author", q => q.eq("author", "user3")), * stream(db, schema).query("messages").withIndex("by_author", q => q.eq("author", "user1")), * stream(db, schema).query("messages").withIndex("by_author", q => q.eq("author", "user2")), * ], ["author"]) * ``` * * returns a stream of messages for user1, then user2, then user3. * * You can also use `orderByIndexFields` to change the indexed fields before merging, which changes the order of the merged stream. * This only works if the streams are already ordered by `orderByIndexFields`, * which happens if each does a .eq(field, value) on all index fields before `orderByIndexFields`. * * e.g. if the "by_author" index is defined as being ordered by ["author", "_creationTime"], * and each query does an equality lookup on "author", each individual query before merging is in fact ordered by "_creationTime". * * e.g. ```ts * mergedStream([ * stream(db, schema).query("messages").withIndex("by_author", q => q.eq("author", "user3")), * stream(db, schema).query("messages").withIndex("by_author", q => q.eq("author", "user1")), * stream(db, schema).query("messages").withIndex("by_author", q => q.eq("author", "user2")), * ], ["_creationTime"]) * ``` * * This returns a stream of messages from all three users, sorted by creation time. */ export declare function mergedStream<T extends GenericStreamItem>(streams: QueryStream<T>[], orderByIndexFields: string[]): QueryStream<T>; export declare class MergedStream<T extends GenericStreamItem> extends QueryStream<T> { #private; constructor(streams: QueryStream<T>[], orderByIndexFields: string[]); iterWithKeys(): { [Symbol.asyncIterator](): { next(): Promise<{ done: boolean; value: any; }>; }; }; getOrder(): "asc" | "desc"; getEqualityIndexFilter(): Value[]; getIndexFields(): string[]; narrow(indexBounds: IndexBounds): MergedStream<T>; } export declare class SingletonStream<T extends GenericStreamItem> extends QueryStream<T> { #private; constructor(value: T | null, order: "asc" | "desc" | undefined, indexFields: string[], indexKey: IndexKey, equalityIndexFilter: Value[]); iterWithKeys(): AsyncIterable<[T | null, IndexKey]>; getOrder(): "asc" | "desc"; getIndexFields(): string[]; getEqualityIndexFilter(): Value[]; narrow(indexBounds: IndexBounds): QueryStream<T>; } /** * This is a completely empty stream that yields no values, and in particular * does not count towards maximumRowsRead. * Compare to SingletonStream(null, ...), which yields no values but does count * towards maximumRowsRead. */ export declare class EmptyStream<T extends GenericStreamItem> extends QueryStream<T> { #private; constructor(order: "asc" | "desc", indexFields: string[]); iterWithKeys(): AsyncIterable<[T | null, IndexKey]>; getOrder(): "asc" | "desc"; getIndexFields(): string[]; getEqualityIndexFilter(): Value[]; narrow(_indexBounds: IndexBounds): this; } export {}; //# sourceMappingURL=stream.d.ts.map