import { type Knex } from "knex"; import { type QueryResult } from "pg"; import { type DatabaseForeignKeys, type DatabaseSchemaExtend } from "../types/types"; import { type Puri } from "./puri"; import { type PuriSubsetFn } from "./puri-subset.types"; type FulltextKey = "__fulltext__"; type VirtualKey = "__virtual__"; type LeftJoinedKey = "__leftJoined__"; type HasDefault = "__hasDefault__"; type GeneratedKey = "__generated__"; type VectorKey = "__vector__"; type VirtualQueryKey = "__virtual_query__"; type InternalTypeKeys = FulltextKey | VirtualKey | LeftJoinedKey | HasDefault | GeneratedKey | VectorKey | VirtualQueryKey; type VectorColumnKeys = T extends { [K in VectorKey]: readonly (infer V)[]; } ? V & string : never; export type VectorColumns> = { [TAlias in keyof TTables]: `${TAlias & string}.${VectorColumnKeys}`; }[keyof TTables] | (IsSingleKey extends true ? VectorColumnKeys : never); export type TableName = keyof TSchema & string; export type IdType = TSchema[TTable] extends { id: infer I; } ? I : number; type VirtualKeys = T extends { [K in VirtualKey]: readonly (infer V)[]; } ? V & string : never; type StripVirtual = Omit>; export type LeftJoinedMarker = { [K in LeftJoinedKey]: true; }; export type ColumnKeys = Exclude, InternalTypeKeys> & string; export type PuriTable = Omit, VirtualKey>; export type OmitInternalTypeKeys = Omit; export type AvailableColumns> = { [TAlias in keyof TTables]: `${TAlias & string}.${ColumnKeys}`; }[keyof TTables] | (IsSingleKey extends true ? ColumnKeys : never); type NumericColumnKeys = { [K in keyof T]: T[K] extends number | bigint | null | undefined ? K : never; }[keyof T] & string; export type NumericColumns> = { [TAlias in keyof TTables]: `${TAlias & string}.${NumericColumnKeys}`; }[keyof TTables] | (IsSingleKey extends true ? NumericColumnKeys : never); export type ResultAvailableColumns, TResult = any> = AvailableColumns | `${keyof TResult & string}`; export type SelectValue> = AvailableColumns | SqlExpression<"string" | "number" | "boolean" | "date" | "string[]">; export type NestedSelectObject> = { [key: string]: SelectValue | NestedSelectObject; }; export type SelectObject> = NestedSelectObject; type IsNestedObject = T extends string ? false : T extends SqlExpression ? false : T extends Record ? true : false; export type IsNullableColumn = Path extends `${infer TAlias}.${infer TColumn}` ? TAlias extends keyof TTables ? TColumn extends keyof TTables[TAlias] ? null extends TTables[TAlias][TColumn] ? true : false : false : false : false; export type LeftJoinMarkerFor = IsNullableColumn extends true ? LeftJoinedMarker : {}; type IsNullableJoinedTable = TableKey extends keyof TTables ? TTables[TableKey] extends LeftJoinedMarker ? true : false : false; type JoinPath = Prefix extends "" ? Key : `${Prefix}__${Key}`; export type ParseSelectObject, TSelect extends SelectObject> = ParseSelectObjectWithPath; type ParseSelectObjectWithPath, TSelect extends SelectObject, Prefix extends string> = Expand<{ [K in keyof TSelect]: TSelect[K] extends SqlExpression ? R extends "string" ? string : R extends "number" ? number : R extends "boolean" ? boolean : R extends "date" ? Date : R extends "string[]" ? string[] : never : IsNestedObject extends true ? TSelect[K] extends NestedSelectObject ? IsNullableJoinedTable> extends true ? Expand>> | null : Expand>> : never : ExtractColumnType; }>; type ParseSelectObjectInner, TSelect extends SelectObject, Prefix extends string> = Expand<{ [K in keyof TSelect]: TSelect[K] extends SqlExpression ? R extends "string" ? string : R extends "number" ? number : R extends "boolean" ? boolean : R extends "date" ? Date : R extends "string[]" ? string[] : never : IsNestedObject extends true ? TSelect[K] extends NestedSelectObject ? IsNullableJoinedTable> extends true ? Expand>> | null : Expand>> : never : ExtractColumnTypeRaw; }>; export type ExtractColumnType, Path extends string> = Path extends `${infer TAlias}.${infer TColumn}` ? TAlias extends keyof TTables ? TColumn extends keyof TTables[TAlias] ? TTables[TAlias] extends LeftJoinedMarker ? TTables[TAlias][TColumn] | null : TTables[TAlias][TColumn] : never : never : IsSingleKey extends true ? Path extends keyof TTables[keyof TTables] ? TTables[keyof TTables][Path] : never : never; type ExtractColumnTypeRaw, Path extends string> = Path extends `${infer TAlias}.${infer TColumn}` ? TAlias extends keyof TTables ? TColumn extends keyof TTables[TAlias] ? TTables[TAlias][TColumn] : never : never : IsSingleKey extends true ? Path extends keyof TTables[keyof TTables] ? TTables[keyof TTables][Path] : never : never; export type WhereCondition> = { [key in AvailableColumns]?: ExtractColumnType; }; export type FulltextColumns> = { [TAlias in keyof TTables]: TTables[TAlias] extends { [K in FulltextKey]: readonly (infer Col)[]; } ? Col extends string ? `${TAlias & string}.${Col}` : never : never; }[keyof TTables]; export type ComparisonOperator = "=" | ">" | ">=" | "<" | "<=" | "<>" | "!="; export type WhereOperator = ComparisonOperator | "like" | "not like" | "ilike" | "not ilike"; export declare const FUZZY_OPERATORS: readonly ["<%", "%", "<<%"]; export type FuzzyOperator = (typeof FUZZY_OPERATORS)[number]; export type SqlExpression = { _type: "sql_expression"; _return: T; _sql: string; _params: Knex.RawBinding[]; }; export type Expand = T extends any[] ? { [K in keyof T[0]]: T[0][K]; }[] : T extends object ? { [K in keyof T]: T[K]; } : T; type IsSingleKey> = keyof TTables extends infer K ? K extends keyof TTables ? keyof TTables extends K ? true : false : false : false; export type SingleTableValue> = IsSingleKey extends true ? TTables[keyof TTables] : never; type HasDefaultKeys = T extends { __hasDefault__: readonly (infer K)[]; } ? Extract> : never; type GeneratedKeys = T extends { __generated__: readonly (infer K)[]; } ? Extract> : never; export type InsertData = Omit, InternalTypeKeys | HasDefaultKeys | GeneratedKeys> & { [K in HasDefaultKeys]?: PuriTable[K]; }; export type InsertResult = Pick; export type ExtractTTables> = T extends Puri ? TTables : never; export type UnionExtractedTTables> = { [K in SubsetKey]: ExtractTTables>; }[SubsetKey]; export type OnConflictTarget = string | string[]; export type OnConflictAction> = "nothing" | { update: AvailableColumns[] | WhereCondition; }; export type ForeignKeyColumns> = TTable extends keyof DatabaseForeignKeys ? DatabaseForeignKeys[TTable] : never; type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; export type SelectAllResult> = UnionToIntersection<{ [K in keyof TTables]: TTables[K] extends infer T ? T extends LeftJoinedMarker ? Partial> : OmitInternalTypeKeys : never; }[keyof TTables]>; type TsQueryParser = "to_tsquery" | "plainto_tsquery" | "phraseto_tsquery" | "websearch_to_tsquery"; export type TsQueryConfig = "simple" | "english"; export type TsQueryOptions = { parser?: TsQueryParser; config?: TsQueryConfig; }; export type TsHighlightOptions = { /** 쿼리 변환 함수 (기본값: "websearch_to_tsquery") */ parser?: TsQueryParser; /** 텍스트 검색 설정 (기본값: "simple") */ config?: TsQueryConfig; /** 최대 단어 수 (기본값: 35) */ maxWords?: number; /** 최소 단어 수 (기본값: 15) */ minWords?: number; /** 헤드라인 시작/끝에서 제거할 짧은 단어 길이 (기본값: 3) */ shortWord?: number; /** true면 전체 문서를 헤드라인으로 사용 (기본값: false) */ highlightAll?: boolean; /** 표시할 최대 텍스트 조각 수 (기본값: 0, 조각 미사용) */ maxFragments?: number; /** 쿼리 단어 시작 구분자 (기본값: "") */ startSel?: string; /** 쿼리 단어 끝 구분자 (기본값: "") */ stopSel?: string; /** 조각 구분자 (기본값: " ... ") */ fragmentDelimiter?: string; }; export type TsRankOptions = { parser?: TsQueryParser; config?: TsQueryConfig; /** 가중치 배열 [D, C, B, A] (기본값: [0.1, 0.2, 0.4, 1.0]) */ weights?: [number, number, number, number]; /** * 정규화 옵션 * 0: 문서 길이 무시 (기본값) * 1: 1 + log(문서 길이)로 나눔 * 2: 문서 길이로 나눔 * 4: 평균 조화 거리로 나눔 (ts_rank_cd만) * 8: 고유 단어 수로 나눔 * 16: 1 + log(고유 단어 수)로 나눔 * 32: rank/(rank+1) -> 0~1 사이의 값으로 스케일링 * * 비트마스크를 사용하여 옵션을 조합할 수 있음 * 예: 8 | 32 -> 고유 단어 수로 나누고 0~1 스케일링 */ normalization?: number; }; export {}; //# sourceMappingURL=puri.types.d.ts.map