import type { ResolvedBinarySchema, ResolvedNumberSchema, ResolvedStringSchema } from '../../../schema/index.js';
import type { IndexNames, IndexSchema } from '../../../table/actions/indexes.js';
import type { Table } from '../../../table/index.js';
import type { GlobalIndex as GlobalSecondaryIndex, Key, KeyType, KeyTypeValue, KeyValue, LocalIndex as LocalSecondaryIndex } from '../../../table/types/index.js';
export type Query
= PrimaryIndexQuery | SecondaryIndexQueries;
export type PrimaryIndexQuery = {
index?: undefined;
partition: KeyValue;
range?: QueryRange>;
};
/**
* @debt refactor "Factorize with Condition types"
*/
type BeginsWithOperator = 'beginsWith';
type BetweenOperator = 'between';
type RangeOperator = 'gt' | 'gte' | 'lt' | 'lte';
type EqualityOperator = 'eq';
export type QueryOperator = EqualityOperator | RangeOperator | BeginsWithOperator | BetweenOperator;
type KeyRange = (RangeOperator extends infer COMPARISON_OPERATOR ? COMPARISON_OPERATOR extends RangeOperator ? {
[KEY in COMPARISON_OPERATOR]: KEY_VALUE;
} : never : never) | {
[KEY in BetweenOperator]: [KEY_VALUE, KEY_VALUE];
} | {
[KEY in EqualityOperator]: KEY_VALUE;
};
type QueryTypeRange = (KEY_TYPE extends 'string' ? {
[OPERATOR in BeginsWithOperator]: KeyTypeValue;
} | KeyRange> : never) | (KEY_TYPE extends 'number' ? KeyRange> : never) | (KEY_TYPE extends 'binary' ? KeyRange> : never);
export type QueryRange = QueryTypeRange;
export type SecondaryIndexQueries = {
[INDEX_NAME in IndexNames]: SecondaryIndexQuery;
}[IndexNames];
export type SecondaryIndexQuery = IndexNames, INDEX_SCHEMA extends IndexSchema = IndexSchema> = (INDEX_SCHEMA extends LocalSecondaryIndex ? LocalSecondaryIndexQuery : never) | (INDEX_SCHEMA extends GlobalSecondaryIndex ? GlobalSecondaryIndexQuery : never);
export type LocalSecondaryIndexQuery = {
index: INDEX_NAME;
partition: KeyValue;
range?: QueryRange;
};
export type GlobalSecondaryIndexQuery = {
index: INDEX_NAME;
partition: (INDEX_SCHEMA extends {
readonly partitionKey: Key;
} ? KeyValue : never) | (INDEX_SCHEMA extends {
readonly partitionKeys: readonly Key[];
} ? KeyValueRec : never);
range?: (INDEX_SCHEMA extends {
readonly sortKey?: Key;
} ? QueryRange> : never) | (INDEX_SCHEMA extends {
readonly sortKeys?: readonly Key[];
} ? QueryRangeRec> : never);
};
type KeyValueRec = KEYS extends [
infer KEYS_HEAD,
...infer KEYS_TAIL
] ? KEYS_TAIL extends readonly Key[] ? KEYS_HEAD extends Key ? KeyValueRec]> : never : never : number extends KEYS['length'] ? KeyValue[] : KEY_VALUES;
type QueryRangeRec = KEYS extends [infer KEYS_HEAD, ...infer KEYS_TAIL] ? KEYS_TAIL extends readonly Key[] ? KEYS_HEAD extends Key ? QueryRangeRec
], QUERY_RANGES | [...PREV_KEY_VALUES, KeyValue | QueryRange]> : never : never : number extends KEYS['length'] ? (KeyValue | QueryRange)[] : QUERY_RANGES;
export {};