import { type Knex } from "knex"; import { type TableSpec } from "../entity/entity-manager"; import { type ClearStatements } from "./puri-subset.types"; import { type AvailableColumns, type ColumnKeys, type ComparisonOperator, type Expand, type ExtractColumnType, type FulltextColumns, type FuzzyOperator, type InsertData, type InsertResult, type LeftJoinedMarker, type LeftJoinMarkerFor, type NumericColumns, type OnConflictAction, type ParseSelectObject, type ResultAvailableColumns, type SelectAllResult, type SelectObject, type SingleTableValue, type SqlExpression, type TsHighlightOptions, type TsQueryConfig, type TsQueryOptions, type TsRankOptions, type VectorColumns, type WhereCondition, type WhereOperator } from "./puri.types"; export declare class Puri, TResult> { knex: Knex; private knexQuery; private tableSpec; constructor(knex: Knex, tableName: string); constructor(knex: Knex, tableSource: Record>); safeGetTableSpec(tableName: string): TableSpec | null; static count(column?: string): SqlExpression<"number">; static sum(column: string): SqlExpression<"number">; static avg(column: string): SqlExpression<"number">; static max(column: string): SqlExpression<"number">; static min(column: string): SqlExpression<"number">; static concat(...args: string[]): SqlExpression<"string">; static upper(column: string): SqlExpression<"string">; static lower(column: string): SqlExpression<"string">; static wordSimilarity(column: string | SqlExpression<"string">, query: string): SqlExpression<"number">; static similarity(column: string | SqlExpression<"string">, query: string): SqlExpression<"number">; static strictWordSimilarity(column: string | SqlExpression<"string">, query: string): SqlExpression<"number">; static rawString(sql: string, params?: Knex.RawBinding[]): SqlExpression<"string">; static rawStringArray(sql: string, params?: Knex.RawBinding[]): SqlExpression<"string[]">; static rawNumber(sql: string, params?: Knex.RawBinding[]): SqlExpression<"number">; static rawBoolean(sql: string, params?: Knex.RawBinding[]): SqlExpression<"boolean">; static rawDate(sql: string, params?: Knex.RawBinding[]): SqlExpression<"date">; /** * FTS 검색어 하이라이팅 * * @example * .select({ * title: Puri.highlight("posts.title", search), * content: Puri.highlight("posts.content", search, { * startSel: "", * stopSel: "", * maxFragments: 3, * }), * }) */ static tsHighlight(column: string, query: string, _options?: TsHighlightOptions): SqlExpression<"string">; static tsRank(column: string | SqlExpression<"tsvector">, query: string, options?: TsRankOptions): SqlExpression<"number">; static tsRankCd(column: string | SqlExpression<"tsvector">, query: string, options?: TsRankOptions): SqlExpression<"number">; static toTsVector(column: string, config?: string): SqlExpression<"tsvector">; static _tsRank(type: "ts_rank" | "ts_rank_cd", column: string | SqlExpression<"tsvector">, query: string, options?: TsRankOptions): SqlExpression<"number">; /** * PGroonga FullText 인덱스 검색 점수 * * @example * .select({ * score: Puri.score(), * }) */ static score(): SqlExpression<"number">; /** * PGroonga FullText 인덱스 검색 하이라이팅 * * @example * .select({ * title: Puri.highlight("posts.title", search), * }) */ static highlight(column: string, query: string | string[]): SqlExpression<"string">; static highlight(columns: string[], query: string | string[]): SqlExpression<"string[]">; select>(selectObj: TSelect): Puri>; /** * 중첩 객체를 flat 객체로 변환 * 예: { parent: { id: "parent.id", name: "parent.name" } } * → { parent__id: "parent.id", parent__name: "parent.name" } */ private flattenSelect; appendSelect>(selectObj: TSelect): Puri>; selectAll(): Puri>; distinct>(...columns: TColumns[]): this; clear(statement: ClearStatements): this; clearJoin(alias: string): this; join(tableSpec: { [K in TJoinAlias]: Puri; }, left: AvailableColumns, right: `${TJoinAlias}.${ColumnKeys}`): Puri, // 서브쿼리의 TResult TResult>; join(tableSpec: { [K in TJoinAlias]: TJoinTable; }, left: AvailableColumns, right: `${TJoinAlias}.${ColumnKeys}`): Puri, // TTables 확장! TResult>; join(tableName: TJoinTable, left: AvailableColumns, right: `${TJoinTable & string}.${ColumnKeys}`): Puri, // 테이블명이 키 TResult>; join(tableSpec: { [K in TJoinAlias]: Puri; }, callback: (j: JoinClauseGroup>) => void): Puri, TResult>; join(tableSpec: { [K in TJoinAlias]: TJoinTable; }, callback: (j: JoinClauseGroup>) => void): Puri, TResult>; join(tableName: TJoinTable, callback: (j: JoinClauseGroup>) => void): Puri, TResult>; leftJoin(tableSpec: { [K in TJoinAlias]: Puri; }, left: AvailableColumns, right: `${TJoinAlias}.${ColumnKeys}`): Puri, TResult>; leftJoin>(tableSpec: { [K in TJoinAlias]: TJoinTable; }, left: TLeft, right: `${TJoinAlias}.${ColumnKeys}`): Puri>, TResult>; leftJoin>(tableName: TJoinTable, left: TLeft, right: `${TJoinTable & string}.${ColumnKeys}`): Puri>, TResult>; leftJoin(tableSpec: { [K in TJoinAlias]: Puri; }, callback: (j: JoinClauseGroup>) => void): Puri, TResult>; leftJoin(tableSpec: { [K in TJoinAlias]: TJoinTable; }, callback: (j: JoinClauseGroup>) => void): Puri, TResult>; leftJoin(tableName: TJoinTable, callback: (j: JoinClauseGroup>) => void): Puri, TResult>; __commonJoin(joinType: "join" | "leftJoin", tableNameOrSpec: any, ...args: any[]): this; where(conditions: WhereCondition): this; where>(column: TColumn, value: ExtractColumnType): this; where>(column: TColumn, operator: WhereOperator, value: ExtractColumnType): this; where(column: TColumn, operator: WhereOperator, value: any): this; whereIn>(column: TColumn, values: ExtractColumnType[]): Puri; whereNotIn>(column: TColumn, values: ExtractColumnType[]): Puri; whereMatch>(column: TColumn, value: string): this; /** * PGroonga FullText 인덱스 검색 * - 사용할 PGroonga 인덱스와 동일한 컬럼 구성으로 검색해야 인덱스가 사용됩니다. * * 단일 컬럼 검색: * ```sql * WHERE name &@~ 'search' * ``` * * 복합 컬럼 검색: * ```sql * WHERE ARRAY[name::text, description::text] &@~ 'search' * ``` */ whereSearch>(column: TColumn | TColumn[], value: string, options?: { weights?: number[]; }): this; whereTsSearch | SqlExpression<"string">>(column: TColumn, value: string, options?: TsQueryOptions | TsQueryConfig): this; whereFuzzy | SqlExpression<"string">>(column: TColumn, value: string, options?: { operator?: FuzzyOperator; }): this; whereRaw(sql: string, bindings?: readonly Knex.RawBinding[]): this; whereGroup(callback: (g: WhereGroup) => void): this; orWhereGroup(callback: (g: WhereGroup) => void): this; orderBy>(column: TColumn | SqlExpression<"number"> | SqlExpression<"string">, direction: "asc" | "desc"): this; /** * 벡터 유사도 검색 설정 * * - SELECT에 similarity 컬럼 추가 * - WHERE col IS NOT NULL 추가 * - threshold가 있으면 WHERE 조건 추가 * - 기존 ORDER BY를 clear하고 원시 연산자로 정렬 (HNSW 인덱스 최적화) * * @param column 벡터 컬럼 경로 * @param embedding 쿼리 임베딩 벡터 * @param options method, threshold, as 등 옵션 * * @example * ```typescript * // cosine similarity (기본값) * qb.vectorSimilarity("columnName", queryVector, { * method: "cosine", * threshold: 0.5 * }); * * // L2 distance * qb.vectorSimilarity("columnName", queryVector, { * method: "l2", * threshold: 1.5 // 거리가 1.5 이하인 결과만 * }); * * // Inner product * qb.vectorSimilarity("columnName", queryVector, { * method: "inner_product", * threshold: 0.7 * }); * ``` */ vectorSimilarity(column: VectorColumns, embedding: number[], options?: { method?: "cosine" | "l2" | "inner_product"; threshold?: number; distinctOn?: AvailableColumns; }): Puri; limit(count: number): this; offset(count: number): this; groupBy>(...columns: TColumns[]): this; having(condition: string): this; having>(column: TColumn, operator: ComparisonOperator, value: any): this; then[], TResult2 = never>(onfulfilled?: ((value: Expand[]) => TResult1 | PromiseLike) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | null): Promise; catch(onrejected?: ((reason: any) => TResult2 | PromiseLike) | null): Promise; finally(onfinally?: (() => void) | null): Promise; first(): ResolvedPuri, never>; pluck>(column: TColumn): ResolvedPuri[], never>; insert(data: InsertData>): ResolvedPuri>; insert(data: InsertData>[]): ResolvedPuri>; update(rawData: WhereCondition): ResolvedPuri>; /** * JSON 컬럼에 대해 stringify 처리를 수행하는 내부 메서드입니다. * object 또는 object 배열을 받고, JSON 컬럼이 있으면 직렬화하여 반환합니다. * 직접 값을 변경하므로 side effect가 있습니다. */ private refineJsonColumns; increment>(column: TColumn, value: number): ResolvedPuri>; decrement>(column: TColumn, value: number): ResolvedPuri>; delete(): ResolvedPuri>; toQuery(): string; debug(): this; clone(): Puri; formatSQL(unformatted: string): string; raw(sql: string): Knex.Raw; rawQuery(): Knex.QueryBuilder; } export declare class WhereGroup> { private builder; constructor(builder: Knex.QueryBuilder); where(conditions: WhereCondition): this; where>(column: TColumn, value: ExtractColumnType): this; where>(column: TColumn, operator: WhereOperator, value: ExtractColumnType): this; whereIn>(column: TColumn, values: ExtractColumnType[]): this; whereNotIn>(column: TColumn, values: ExtractColumnType[]): this; orWhere(conditions: WhereCondition): this; orWhere>(column: TColumn, value: ExtractColumnType): this; orWhere>(column: TColumn, operator: WhereOperator, value: ExtractColumnType): this; orWhereIn>(column: TColumn, values: ExtractColumnType[]): this; orWhereNotIn>(column: TColumn, values: ExtractColumnType[]): this; whereMatch>(column: TColumn, value: string): this; orWhereMatch>(column: TColumn, value: string): this; whereSearch>(column: TColumn | TColumn[], value: string, options?: { weights?: number[]; }): this; orWhereSearch>(column: TColumn | TColumn[], value: string, options?: { weights?: number[]; }): this; whereTsSearch | SqlExpression<"string">>(column: TColumn, value: string, options?: TsQueryOptions | TsQueryConfig): this; orWhereTsSearch | SqlExpression<"string">>(column: TColumn, value: string, options?: TsQueryOptions | TsQueryConfig): this; whereFuzzy | SqlExpression<"string">>(column: TColumn, value: string, options?: { operator?: FuzzyOperator; }): this; orWhereFuzzy | SqlExpression<"string">>(column: TColumn, value: string, options?: { operator?: FuzzyOperator; }): this; whereGroup(callback: (g: WhereGroup) => void): this; orWhereGroup(callback: (g: WhereGroup) => void): this; } export declare class JoinClauseGroup, TRight extends Record> { private callback; constructor(callback: Knex.JoinClause); on(left: AvailableColumns, right: AvailableColumns): this; on(left: AvailableColumns, right: AvailableColumns): this; on(left: AvailableColumns, right: ExtractColumnType & string>): this; on(left: AvailableColumns, right: ExtractColumnType & string>): this; on(left: AvailableColumns, operator: ComparisonOperator, right: AvailableColumns): this; on(left: AvailableColumns, operator: ComparisonOperator, right: AvailableColumns): this; on(left: AvailableColumns, operator: ComparisonOperator, right: ExtractColumnType & string>): this; on(left: AvailableColumns, operator: ComparisonOperator, right: ExtractColumnType & string>): this; on(callback: (nested: JoinClauseGroup) => void): this; on(callback: (nested: JoinClauseGroup) => void): this; orOn(left: AvailableColumns, right: AvailableColumns): this; orOn(left: AvailableColumns, right: AvailableColumns): this; orOn(left: AvailableColumns, right: ExtractColumnType & string>): this; orOn(left: AvailableColumns, right: ExtractColumnType & string>): this; orOn(left: AvailableColumns, operator: ComparisonOperator, right: AvailableColumns): this; orOn(left: AvailableColumns, operator: ComparisonOperator, right: AvailableColumns): this; orOn(left: AvailableColumns, operator: ComparisonOperator, right: ExtractColumnType & string>): this; orOn(left: AvailableColumns, operator: ComparisonOperator, right: ExtractColumnType & string>): this; orOn(callback: (nested: JoinClauseGroup) => void): this; orOn(callback: (nested: JoinClauseGroup) => void): this; onVal(column: AvailableColumns, value: any): this; onVal(column: AvailableColumns, value: any): this; onVal(column: AvailableColumns, operator: ComparisonOperator, value: any): this; onVal(column: AvailableColumns, operator: ComparisonOperator, value: any): this; andOnVal(column: AvailableColumns, value: any): this; andOnVal(column: AvailableColumns, value: any): this; andOnVal(column: AvailableColumns, operator: ComparisonOperator, value: any): this; andOnVal(column: AvailableColumns, operator: ComparisonOperator, value: any): this; orOnVal(column: AvailableColumns, value: any): this; orOnVal(column: AvailableColumns, value: any): this; orOnVal(column: AvailableColumns, operator: ComparisonOperator, value: any): this; orOnVal(column: AvailableColumns, operator: ComparisonOperator, value: any): this; } export declare class ResolvedPuri implements Promise { knexQuery: Knex.QueryBuilder; private knex; constructor(knexQuery: Knex.QueryBuilder, knex: Knex); [Symbol.toStringTag]: string; toQuery(): string; debug(): this; then(onfulfilled?: ((value: TResolved) => TResult1 | PromiseLike) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | null): Promise; catch(onrejected?: ((reason: any) => TResult2 | PromiseLike) | null): Promise; finally(onfinally?: (() => void) | null): Promise; onConflict>(columns: string | string[], action?: OnConflictAction): this; returning(column: "*"): ResolvedPuri; returning>(column: TColumn): ResolvedPuri[], never>; returning>(columns: TColumn[]): ResolvedPuri[], never>; } //# sourceMappingURL=puri.d.ts.map