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, T extends TableNamesInDataModel>>(table: T, index?: IndexNames, 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>(db: GenericDatabaseReader>, schema: Schema): StreamDatabaseReader; type GenericStreamItem = NonNullable; type StreamIterable = AsyncIterable<[T | null, IndexKey, number], undefined>; /** * A "QueryStream" is an async iterable of query results, ordered by indexed fields. */ export declare abstract class QueryStream implements GenericOrderedQuery { /** * Iterate over documents with their index keys and bandwidth consumed. * @param trackBandwidth - If true, tracks bytes read using getDocumentSize. Defaults to false for efficiency. * @returns AsyncIterable of [document | null, indexKey, bytesRead] * - document: The document or null if filtered out * - indexKey: The index key for cursor positioning * - bytesRead: Bytes consumed to produce this result (0 if trackBandwidth is false) */ abstract iterWithKeys(trackBandwidth?: boolean): StreamIterable; abstract narrow(indexBounds: IndexBounds): QueryStream; 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): QueryStream; /** * 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(mapper: (doc: T) => Promise): QueryStream; /** * 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(mapper: (doc: T) => Promise>, mappedIndexFields: string[]): QueryStream; /** * 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; filter(_predicate: any): never; paginate(opts: PaginationOptions & { endCursor?: string | null; maximumRowsRead?: number; maximumBytesRead?: number; }): Promise>; collect(): Promise; take(n: number): Promise; unique(): Promise; first(): Promise; [Symbol.asyncIterator](): AsyncIterator; } /** * GenericOrderedQuery> is equivalent to OrderedQuery */ export interface GenericOrderedQuery extends AsyncIterable { /** * 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>; /** * 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>; /** * 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>; /** * 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; /** * 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; /** * Not supported. Use `filterWith` instead. */ filter(predicate: any): this; } export declare class StreamDatabaseReader> implements GenericDatabaseReader> { db: GenericDatabaseReader>; schema: Schema; system: GenericDatabaseReader["system"]; constructor(db: GenericDatabaseReader>, schema: Schema); query>>(tableName: TableName): StreamQueryInitializer; get(_id: any): any; normalizeId(_tableName: any, _id: any): any; } type DM> = DataModelFromSchemaDefinition; export type IndexBounds = { lowerBound: IndexKey; lowerBoundInclusive: boolean; upperBound: IndexKey; upperBoundInclusive: boolean; }; export type QueryReflection, T extends TableNamesInDataModel>, IndexName extends IndexNames, T>>> = { db: GenericDatabaseReader>; schema: Schema; table: T; index: IndexName; indexFields: string[]; order: "asc" | "desc"; bounds: IndexBounds; indexRange?: (q: IndexRangeBuilder, T>>, NamedIndex, T>, IndexName>>) => IndexRange; }; export declare abstract class StreamableQuery, T extends TableNamesInDataModel>, IndexName extends IndexNames, T>>> extends QueryStream, T>>> implements OrderedQuery, T>> { abstract reflect(): QueryReflection; } export declare class StreamQueryInitializer, T extends TableNamesInDataModel>> extends StreamableQuery implements QueryInitializer, T>> { parent: StreamDatabaseReader; table: T; constructor(parent: StreamDatabaseReader, table: T); fullTableScan(): StreamQuery; withIndex, T>>>(indexName: IndexName, indexRange?: (q: IndexRangeBuilder, T>>, NamedIndex, T>, IndexName>>) => IndexRange): StreamQuery; withSearchIndex(_indexName: any, _searchFilter: any): any; inner(): StreamQuery; order(order: "asc" | "desc"): OrderedStreamQuery; reflect(): { db: GenericDatabaseReader, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; 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, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>>, NamedIndex, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>, "by_creation_time">, 0>) => IndexRange) | undefined; }; iterWithKeys(trackBandwidth?: boolean): StreamIterable, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>>; getOrder(): "asc" | "desc"; getEqualityIndexFilter(): Value[]; getIndexFields(): string[]; narrow(indexBounds: IndexBounds): QueryStream, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>>; } export declare class StreamQuery, T extends TableNamesInDataModel>, IndexName extends IndexNames, T>>> extends StreamableQuery implements Query, T>> { parent: StreamQueryInitializer; index: IndexName; q: ReflectIndexRange; indexRange: ((q: IndexRangeBuilder, T>>, NamedIndex, T>, IndexName>>) => IndexRange) | undefined; constructor(parent: StreamQueryInitializer, index: IndexName, q: ReflectIndexRange, indexRange: ((q: IndexRangeBuilder, T>>, NamedIndex, T>, IndexName>>) => IndexRange) | undefined); order(order: "asc" | "desc"): OrderedStreamQuery; inner(): OrderedStreamQuery; reflect(): { db: GenericDatabaseReader, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; 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, T>>, NamedIndex, T>, IndexName>>) => IndexRange) | undefined; }; iterWithKeys(trackBandwidth?: boolean): StreamIterable, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>>; getOrder(): "asc" | "desc"; getEqualityIndexFilter(): Value[]; getIndexFields(): string[]; narrow(indexBounds: IndexBounds): QueryStream, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>>; } export declare class OrderedStreamQuery, T extends TableNamesInDataModel>, IndexName extends IndexNames, T>>> extends StreamableQuery implements OrderedQuery, T>> { parent: StreamQuery; order: "asc" | "desc"; constructor(parent: StreamQuery, order: "asc" | "desc"); reflect(): { db: GenericDatabaseReader, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; 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, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } & import("convex/server").AnyDataModel> : never : never, T>>, NamedIndex, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; 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, T>>; iterWithKeys(trackBandwidth?: boolean): StreamIterable, T>>; getOrder(): "asc" | "desc"; getEqualityIndexFilter(): Value[]; getIndexFields(): string[]; narrow(indexBounds: IndexBounds): QueryStream, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; searchIndexes: SearchIndexes; vectorIndexes: VectorIndexes; } : never; } : import("convex/server").Expand<{ [TableName in keyof Schema["tables"] & string]: Schema["tables"][TableName] extends import("convex/server").TableDefinition, 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").Expand>; fieldPaths: keyof import("convex/server").IdField | ("_creationTime" | DocumentType["fieldPaths"]); indexes: import("convex/server").Expand; 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, T extends TableNamesInDataModel>, IndexName extends IndexNames, T>>>(db: GenericDatabaseReader>, schema: Schema, table: T, index: IndexName, bounds: IndexBounds, order: "asc" | "desc"): QueryStream, 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(streams: QueryStream[], orderByIndexFields: string[]): QueryStream; export declare class MergedStream extends QueryStream { #private; constructor(streams: QueryStream[], orderByIndexFields: string[]); iterWithKeys(trackBandwidth?: boolean): StreamIterable; getOrder(): "asc" | "desc"; getEqualityIndexFilter(): Value[]; getIndexFields(): string[]; narrow(indexBounds: IndexBounds): MergedStream; } export declare class SingletonStream extends QueryStream { #private; constructor(value: T | null, order: "asc" | "desc" | undefined, indexFields: string[], indexKey: IndexKey, equalityIndexFilter: Value[], bandwidth?: number); iterWithKeys(_trackBandwidth?: boolean): StreamIterable; getOrder(): "asc" | "desc"; getIndexFields(): string[]; getEqualityIndexFilter(): Value[]; narrow(indexBounds: IndexBounds): QueryStream; } /** * 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 extends QueryStream { #private; constructor(order: "asc" | "desc", indexFields: string[]); iterWithKeys(_trackBandwidth?: boolean): StreamIterable; getOrder(): "asc" | "desc"; getIndexFields(): string[]; getEqualityIndexFilter(): Value[]; narrow(_indexBounds: IndexBounds): this; } export {}; //# sourceMappingURL=stream.d.ts.map