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 {};