import type { Data } from "../../util/data.js";
import type { Identifier, Item } from "../../util/item.js";
import type { Query } from "../../util/query.js";
import type { Collection } from "../collection/Collection.js";
import type { DBProvider } from "../provider/DBProvider.js";
import type { MemoryDBProvider } from "../provider/MemoryDBProvider.js";
import type { ItemStore } from "../store/ItemStore.js";
import type { QueryStore } from "../store/QueryStore.js";
import { CollectionCache } from "./CollectionCache.js";
/**
 * Cache of `CollectionCache` objects for multiple collections.
 * - Use `get(collection)` to retrieve or create the `CollectionCache` for a given collection,
 *   then `getItem(id)` / `getQuery(query)` on that to get a specific store.
 */
export declare class DBCache<I extends Identifier = Identifier, T extends Data = Data> implements AsyncDisposable {
    private readonly _collections;
    readonly provider: DBProvider<I, T>;
    readonly memory: MemoryDBProvider<I, T> | undefined;
    constructor(provider: DBProvider<I, T>);
    private _get;
    /** Get (or create) the `CollectionCache` for the given collection. */
    get<II extends I, TT extends T>(collection: Collection<string, II, TT>): CollectionCache<II, TT>;
    /** Get (or create) an `ItemStore` for a collection/id in one hop. */
    getItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, id: II): ItemStore<II, TT>;
    /** Get (or create) a `QueryStore` for a collection/query in one hop. */
    getQuery<II extends I, TT extends T>(collection: Collection<string, II, TT>, query: Query<Item<II, TT>>): QueryStore<II, TT>;
    /** Refresh a specific item store for a collection. */
    refreshItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, id: II, maxAge?: number): Promise<void>;
    /** Refresh every cached item store for a collection. */
    refreshItems<II extends I, TT extends T>(collection: Collection<string, II, TT>, maxAge?: number): Promise<void>;
    /** Refresh a specific query store for a collection. */
    refreshQuery<II extends I, TT extends T>(collection: Collection<string, II, TT>, query: Query<Item<II, TT>>, maxAge?: number): Promise<void>;
    /** Refresh every cached query store for a collection. */
    refreshQueries<II extends I, TT extends T>(collection: Collection<string, II, TT>, maxAge?: number): Promise<void>;
    /** Refresh every cached store (items and queries) for a collection. */
    refreshAll<II extends I, TT extends T>(collection: Collection<string, II, TT>, maxAge?: number): Promise<void>;
    [Symbol.asyncDispose](): Promise<void>;
}
