pqb 0.67.0 → 0.67.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +191 -175
- package/dist/index.js +78 -56
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +78 -56
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -2696,11 +2696,172 @@ interface AggregateOptions<T extends PickQuerySelectableResultRelationsWindows>
|
|
|
2696
2696
|
over?: Over<T>;
|
|
2697
2697
|
}
|
|
2698
2698
|
type Over<T extends PickQuerySelectableResultWindows> = keyof T['windows'] | WindowArgDeclaration<T>;
|
|
2699
|
-
|
|
2700
|
-
|
|
2699
|
+
interface ColumnsShape {
|
|
2700
|
+
[K: string]: Column;
|
|
2701
|
+
}
|
|
2702
|
+
declare namespace ColumnsShape {
|
|
2703
|
+
export type DefaultSelectKeys<S extends Column.QueryColumnsInit> = { [K in keyof S]: S[K]['data']['explicitSelect'] extends true | undefined ? never : K }[keyof S];
|
|
2704
|
+
export type DefaultOutput<Set extends Column.QueryColumnsInit> = { [K in DefaultSelectKeys<Set>]: Set[K]['outputType'] };
|
|
2705
|
+
export type Input<Shape extends Column.QueryColumnsInit, AppReadOnly = { [K in keyof Shape]: Shape[K]['data']['appReadOnly'] extends true ? K : never }[keyof Shape], Optional extends keyof Shape = { [K in keyof Shape]: Shape[K]['data']['optional'] extends true ? K : never }[keyof Shape]> = { [K in Exclude<keyof Shape, AppReadOnly | Optional>]: Shape[K]['inputType'] } & { [K in Exclude<Optional, AppReadOnly>]?: Shape[K]['inputType'] };
|
|
2706
|
+
export type InputPartial<Shape extends Column.QueryColumnsInit> = { [K in keyof Shape]?: Shape[K]['inputType'] };
|
|
2707
|
+
export type Output<Shape extends Column.QueryColumns> = { [K in keyof Shape]: Shape[K]['outputType'] };
|
|
2708
|
+
export type DefaultSelectOutput<Shape extends Column.QueryColumnsInit> = { [K in { [K in keyof Shape]: Shape[K]['data']['explicitSelect'] extends true | undefined ? never : K }[keyof Shape]]: Shape[K]['outputType'] };
|
|
2709
|
+
export interface MapToObjectColumn<Shape extends Column.QueryColumns> {
|
|
2710
|
+
dataType: 'object';
|
|
2711
|
+
type: { [K in keyof Shape]: Shape[K]['type'] };
|
|
2712
|
+
outputType: ShallowSimplify<ObjectOutput<Shape>>;
|
|
2713
|
+
queryType: { [K in keyof Shape]: Shape[K]['queryType'] };
|
|
2714
|
+
operators: OperatorsAny;
|
|
2715
|
+
}
|
|
2716
|
+
export interface MapToNullableObjectColumn<Shape extends Column.QueryColumns> {
|
|
2717
|
+
dataType: 'object';
|
|
2718
|
+
type: { [K in keyof Shape]: Shape[K]['type'] };
|
|
2719
|
+
outputType: ShallowSimplify<ObjectOutput<Shape>> | undefined;
|
|
2720
|
+
queryType: { [K in keyof Shape]: Shape[K]['queryType'] } | null;
|
|
2721
|
+
operators: OperatorsAny;
|
|
2722
|
+
}
|
|
2723
|
+
export interface MapToPluckColumn<Shape extends Column.QueryColumns> {
|
|
2724
|
+
dataType: 'array';
|
|
2725
|
+
type: Shape['pluck']['type'][];
|
|
2726
|
+
outputType: Shape['pluck']['outputType'][];
|
|
2727
|
+
queryType: Shape['pluck']['queryType'][];
|
|
2728
|
+
operators: OperatorsAny;
|
|
2729
|
+
}
|
|
2730
|
+
export interface MapToObjectArrayColumn<Shape extends Column.QueryColumns> {
|
|
2731
|
+
dataType: 'array';
|
|
2732
|
+
type: { [K in keyof Shape]: Shape[K]['type'] }[];
|
|
2733
|
+
outputType: ShallowSimplify<ObjectOutput<Shape>>[];
|
|
2734
|
+
queryType: { [K in keyof Shape]: Shape[K]['queryType'] }[];
|
|
2735
|
+
operators: OperatorsAny;
|
|
2736
|
+
}
|
|
2737
|
+
type ObjectOutput<Shape extends Column.QueryColumns> = { [K in keyof Shape]: Shape[K]['outputType'] };
|
|
2738
|
+
export {};
|
|
2739
|
+
}
|
|
2740
|
+
interface SelectSelf extends PickQuerySelectable, PickQueryHasSelect, PickQueryDefaultSelect, PickQueryShape, PickQueryRelations, PickQueryResult, PickQueryReturnType, PickQueryWithData {}
|
|
2741
|
+
type SelectArgs<T extends SelectSelf> = ('*' | keyof T['__selectable'])[];
|
|
2742
|
+
interface SubQueryAddition<T extends PickQueryWithData> extends IsSubQuery {
|
|
2743
|
+
withData: T['withData'];
|
|
2744
|
+
}
|
|
2745
|
+
type SelectAsFnArg<T extends PickQueryRelationsWithData> = EmptyObject extends T['relations'] ? T : { [K in keyof T['relations'] | keyof T]: K extends keyof T['relations'] ? T['relations'][K]['maybeSingle'] & SubQueryAddition<T> : K extends keyof T ? T[K] : never };
|
|
2746
|
+
interface SelectAsArg<T extends SelectSelf> {
|
|
2747
|
+
[K: string]: keyof T['__selectable'] | Expression | ((q: SelectAsFnArg<T>) => unknown);
|
|
2748
|
+
}
|
|
2749
|
+
type SelectAsFnReturnType = {
|
|
2750
|
+
result: Column.QueryColumns;
|
|
2751
|
+
returnType: Exclude<QueryReturnType, 'rows'>;
|
|
2752
|
+
} | Expression;
|
|
2753
|
+
interface SelectAsCheckReturnTypes {
|
|
2754
|
+
[K: string]: PropertyKey | Expression | ((q: never) => SelectAsFnReturnType);
|
|
2755
|
+
}
|
|
2756
|
+
type SelectReturnType<T extends PickQueryReturnType> = T['returnType'] extends 'valueOrThrow' ? 'oneOrThrow' : T extends 'value' ? 'one' : T['returnType'] extends 'pluck' ? 'all' : T['returnType'];
|
|
2757
|
+
type SelectResult<T extends SelectSelf, Columns extends PropertyKey[]> = { [K in keyof T]: K extends '__hasSelect' ? true : K extends 'result' ? { [K in '*' extends Columns[number] ? Exclude<Columns[number], '*'> | T['__defaultSelect'] : Columns[number] as T['__selectable'][K]['as']]: T['__selectable'][K]['column'] } & (T['__hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown) : K extends 'returnType' ? SelectReturnType<T> : K extends 'then' ? QueryThenByReturnType<SelectReturnType<T>, { [K in '*' extends Columns[number] ? Exclude<Columns[number], '*'> | T['__defaultSelect'] : Columns[number] as T['__selectable'][K]['as']]: T['__selectable'][K]['column'] } & (T['__hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown)> : T[K] };
|
|
2758
|
+
type SelectResultObj<T extends SelectSelf, Obj> = Obj extends SelectAsCheckReturnTypes ? { [K in keyof T]: K extends '__hasSelect' ? true : K extends '__selectable' ? T['__selectable'] & SelectAsSelectable<Obj> : K extends 'result' ? { [K in T['__hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? keyof Obj | keyof T['result'] : keyof Obj]: K extends keyof Obj ? SelectAsValueResult<T, Obj[K]> : K extends keyof T['result'] ? T['result'][K] : never } : K extends 'returnType' ? SelectReturnType<T> : K extends 'then' ? QueryThenByReturnType<SelectReturnType<T>, { [K in T['__hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? keyof Obj | keyof T['result'] : keyof Obj]: K extends keyof Obj ? SelectAsValueResult<T, Obj[K]> : K extends keyof T['result'] ? T['result'][K] : never }> : T[K] } : `Invalid return type of ${{ [K in keyof Obj]: Obj[K] extends ((...args: any[]) => any) ? ReturnType<Obj[K]> extends SelectAsFnReturnType ? never : K : never }[keyof Obj] & string}`;
|
|
2759
|
+
type SelectResultColumnsAndObj<T extends SelectSelf, Columns extends PropertyKey[], Obj> = { [K in keyof T]: K extends '__hasSelect' ? true : K extends '__selectable' ? T['__selectable'] & SelectAsSelectable<Obj> : K extends 'result' ? // Combine previously selected items, all columns if * was provided,
|
|
2760
|
+
{ [K in ('*' extends Columns[number] ? Exclude<Columns[number], '*'> | T['__defaultSelect'] : Columns[number]) | keyof Obj as K extends Columns[number] ? T['__selectable'][K]['as'] : K]: K extends keyof Obj ? SelectAsValueResult<T, Obj[K]> : T['__selectable'][K]['column'] } & (T['__hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown) : K extends 'returnType' ? SelectReturnType<T> : K extends 'then' ? QueryThenByReturnType<SelectReturnType<T>, { [K in ('*' extends Columns[number] ? Exclude<Columns[number], '*'> | T['__defaultSelect'] : Columns[number]) | keyof Obj as K extends Columns[number] ? T['__selectable'][K]['as'] : K]: K extends keyof Obj ? SelectAsValueResult<T, Obj[K]> : T['__selectable'][K]['column'] } & (T['__hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown)> : T[K] };
|
|
2761
|
+
interface AllowedRelationOneQueryForSelectable extends IsSubQuery {
|
|
2762
|
+
result: Column.QueryColumns;
|
|
2763
|
+
returnType: 'value' | 'valueOrThrow' | 'one' | 'oneOrThrow';
|
|
2764
|
+
}
|
|
2765
|
+
type SelectAsSelectable<Obj> = UnionToIntersection<{ [K in keyof Obj]: Obj[K] extends ((q: never) => infer R extends AllowedRelationOneQueryForSelectable) ? { [C in R['returnType'] extends 'value' | 'valueOrThrow' ? K : keyof R['result'] as R['returnType'] extends 'value' | 'valueOrThrow' ? K : `${K & string}.${C & string}`]: {
|
|
2766
|
+
as: C;
|
|
2767
|
+
column: R['returnType'] extends 'value' | 'valueOrThrow' ? R['result']['value'] : R['result'][C & keyof R['result']];
|
|
2768
|
+
} } : never }[keyof Obj]>;
|
|
2769
|
+
type SelectAsValueResult<T extends SelectSelf, Arg> = Arg extends keyof T['__selectable'] ? T['__selectable'][Arg]['column'] : Arg extends Expression ? Arg['result']['value'] : Arg extends ((q: never) => IsQuery) ? SelectSubQueryResult<ReturnType<Arg>> : Arg extends ((q: never) => Expression) ? ReturnType<Arg>['result']['value'] : Arg extends ((q: never) => IsQuery | Expression) ? SelectSubQueryResult<Exclude<ReturnType<Arg>, Expression>> | Exclude<ReturnType<Arg>, IsQuery>['result']['value'] : never;
|
|
2770
|
+
type SelectSubQueryResult<Arg extends SelectSelf> = Arg['returnType'] extends undefined | 'all' ? ColumnsShape.MapToObjectArrayColumn<Arg['result']> : Arg['returnType'] extends 'value' | 'valueOrThrow' ? Arg['result']['value'] : Arg['returnType'] extends 'pluck' ? ColumnsShape.MapToPluckColumn<Arg['result']> : Arg['returnType'] extends 'one' ? ColumnsShape.MapToNullableObjectColumn<Arg['result']> : ColumnsShape.MapToObjectColumn<Arg['result']>;
|
|
2771
|
+
declare function _querySelect<T extends SelectSelf, Columns extends SelectArgs<T>>(q: T, columns: Columns): SelectResult<T, Columns>;
|
|
2772
|
+
declare function _querySelect<T extends SelectSelf, Obj extends SelectAsArg<T>>(q: T, obj: Obj): SelectResultObj<T, Obj>;
|
|
2773
|
+
declare function _querySelect<T extends SelectSelf, Columns extends SelectArgs<T>, Obj extends SelectAsArg<T>>(q: T, args: [...columns: Columns, obj: Obj]): SelectResultColumnsAndObj<T, Columns, Obj>;
|
|
2774
|
+
declare class Select {
|
|
2775
|
+
/**
|
|
2776
|
+
* Takes a list of columns to be selected, and by default, the query builder will select all columns of the table.
|
|
2777
|
+
*
|
|
2778
|
+
* The last argument can be an object. Keys of the object are column aliases, value can be a column name, sub-query, or raw SQL expression.
|
|
2779
|
+
*
|
|
2780
|
+
* ```ts
|
|
2781
|
+
* import { sql } from './baseTable'
|
|
2782
|
+
*
|
|
2783
|
+
* // select columns of the table:
|
|
2784
|
+
* db.table.select('id', 'name', { idAlias: 'id' });
|
|
2785
|
+
*
|
|
2786
|
+
* // accepts columns with table names:
|
|
2787
|
+
* db.table.select('user.id', 'user.name', { nameAlias: 'user.name' });
|
|
2788
|
+
*
|
|
2789
|
+
* // table name may refer to the current table or a joined table:
|
|
2790
|
+
* db.table
|
|
2791
|
+
* .join(db.message, 'authorId', 'user.id')
|
|
2792
|
+
* .select('user.name', 'message.text', { textAlias: 'message.text' });
|
|
2793
|
+
*
|
|
2794
|
+
* // select value from the sub-query,
|
|
2795
|
+
* // this sub-query should return a single record and a single column:
|
|
2796
|
+
* db.table.select({
|
|
2797
|
+
* subQueryResult: Otherdb.table.select('column').take(),
|
|
2798
|
+
* });
|
|
2799
|
+
*
|
|
2800
|
+
* // select raw SQL value, specify the returning type via <generic> syntax:
|
|
2801
|
+
* db.table.select({
|
|
2802
|
+
* raw: sql<number>`1 + 2`,
|
|
2803
|
+
* });
|
|
2804
|
+
*
|
|
2805
|
+
* // select raw SQL value, the resulting type can be set by providing a column type in such way:
|
|
2806
|
+
* db.table.select({
|
|
2807
|
+
* raw: sql`1 + 2`.type((t) => t.integer()),
|
|
2808
|
+
* });
|
|
2809
|
+
*
|
|
2810
|
+
* // same raw SQL query as above, but the sql is returned from a callback
|
|
2811
|
+
* db.table.select({
|
|
2812
|
+
* raw: () => sql`1 + 2`.type((t) => t.integer()),
|
|
2813
|
+
* });
|
|
2814
|
+
* ```
|
|
2815
|
+
*
|
|
2816
|
+
* When you use the ORM and defined relations, `select` can also accept callbacks with related table queries:
|
|
2817
|
+
*
|
|
2818
|
+
* ```ts
|
|
2819
|
+
* await db.author.select({
|
|
2820
|
+
* allBooks: (q) => q.books,
|
|
2821
|
+
* firstBook: (q) => q.books.order({ createdAt: 'ASC' }).take(),
|
|
2822
|
+
* booksCount: (q) => q.books.count(),
|
|
2823
|
+
* });
|
|
2824
|
+
* ```
|
|
2825
|
+
*
|
|
2826
|
+
* When you're selecting a relation that's connected via `belongsTo` or `hasOne`, it becomes available to use in `order` or in `where`:
|
|
2827
|
+
*
|
|
2828
|
+
* ```ts
|
|
2829
|
+
* // select books with their authors included, order by author name and filter by author column:
|
|
2830
|
+
* await db.books
|
|
2831
|
+
* .select({
|
|
2832
|
+
* author: (q) => q.author,
|
|
2833
|
+
* })
|
|
2834
|
+
* .order('author.name')
|
|
2835
|
+
* .where({ 'author.isPopular': true });
|
|
2836
|
+
* ```
|
|
2837
|
+
*/
|
|
2838
|
+
select<T extends SelectSelf, Columns extends SelectArgs<T>>(this: T, ...args: Columns): SelectResult<T, Columns>;
|
|
2839
|
+
select<T extends SelectSelf, Obj extends SelectAsArg<T>>(this: T, obj: Obj): SelectResultObj<T, Obj>;
|
|
2840
|
+
select<T extends SelectSelf, Columns extends SelectArgs<T>, Obj extends SelectAsArg<T>>(this: T, ...args: [...columns: Columns, obj: Obj]): SelectResultColumnsAndObj<T, Columns, Obj>;
|
|
2841
|
+
/**
|
|
2842
|
+
* When querying the table or creating records, all columns are selected by default,
|
|
2843
|
+
* but updating and deleting queries are returning affected row counts by default.
|
|
2844
|
+
*
|
|
2845
|
+
* Use `selectAll` to select all columns. If the `.select` method was applied before it will be discarded.
|
|
2846
|
+
*
|
|
2847
|
+
* ```ts
|
|
2848
|
+
* const selectFull = await db.table
|
|
2849
|
+
* .select('id', 'name') // discarded by `selectAll`
|
|
2850
|
+
* .selectAll();
|
|
2851
|
+
*
|
|
2852
|
+
* const updatedFull = await db.table.selectAll().where(conditions).update(data);
|
|
2853
|
+
*
|
|
2854
|
+
* const deletedFull = await db.table.selectAll().where(conditions).delete();
|
|
2855
|
+
* ```
|
|
2856
|
+
*/
|
|
2857
|
+
selectAll<T extends SelectSelf>(this: T): SelectResult<T, ['*']>;
|
|
2858
|
+
}
|
|
2859
|
+
interface QueryGetSelf extends PickQuerySelectable, PickQueryRelationsWithData {}
|
|
2860
|
+
type GetArg<T extends QueryGetSelf> = GetStringArg<T> | Expression | ((q: SelectAsFnArg<T>) => Expression | Query.Pick.SingleValueResult);
|
|
2701
2861
|
type GetStringArg<T extends PickQuerySelectable> = keyof T['__selectable'] & string;
|
|
2702
|
-
type
|
|
2703
|
-
type
|
|
2862
|
+
type ResolveGetArgColumn<Arg> = Arg extends Expression ? Arg['result']['value'] : Arg extends ((q: never) => infer R) ? R extends Expression ? R['result']['value'] : R extends Query.Pick.SingleValueResult ? R['result']['value'] : never : never;
|
|
2863
|
+
type GetResult<T extends QueryGetSelf, Arg extends GetArg<T>> = Arg extends string ? SetQueryReturnsValueOrThrow<T, Arg> : SetQueryReturnsColumnOrThrow<T, ResolveGetArgColumn<Arg>>;
|
|
2864
|
+
type GetResultOptional<T extends QueryGetSelf, Arg extends GetArg<T>> = Arg extends string ? SetQueryReturnsValueOptional<T, Arg> : SetQueryReturnsColumnOptional<T, ResolveGetArgColumn<Arg>>;
|
|
2704
2865
|
type HeadlineSearchArg<T extends PickQueryTsQuery> = Exclude<T['__tsQuery'], undefined>;
|
|
2705
2866
|
interface HeadlineParams<T extends PickQuerySelectable> {
|
|
2706
2867
|
text?: SelectableOrExpressionOfType<T, Column.Pick.QueryColumnOfType<string>>;
|
|
@@ -5927,166 +6088,6 @@ declare class QueryTransaction {
|
|
|
5927
6088
|
*/
|
|
5928
6089
|
recoverable<T>(this: T): T;
|
|
5929
6090
|
}
|
|
5930
|
-
interface ColumnsShape {
|
|
5931
|
-
[K: string]: Column;
|
|
5932
|
-
}
|
|
5933
|
-
declare namespace ColumnsShape {
|
|
5934
|
-
export type DefaultSelectKeys<S extends Column.QueryColumnsInit> = { [K in keyof S]: S[K]['data']['explicitSelect'] extends true | undefined ? never : K }[keyof S];
|
|
5935
|
-
export type DefaultOutput<Set extends Column.QueryColumnsInit> = { [K in DefaultSelectKeys<Set>]: Set[K]['outputType'] };
|
|
5936
|
-
export type Input<Shape extends Column.QueryColumnsInit, AppReadOnly = { [K in keyof Shape]: Shape[K]['data']['appReadOnly'] extends true ? K : never }[keyof Shape], Optional extends keyof Shape = { [K in keyof Shape]: Shape[K]['data']['optional'] extends true ? K : never }[keyof Shape]> = { [K in Exclude<keyof Shape, AppReadOnly | Optional>]: Shape[K]['inputType'] } & { [K in Exclude<Optional, AppReadOnly>]?: Shape[K]['inputType'] };
|
|
5937
|
-
export type InputPartial<Shape extends Column.QueryColumnsInit> = { [K in keyof Shape]?: Shape[K]['inputType'] };
|
|
5938
|
-
export type Output<Shape extends Column.QueryColumns> = { [K in keyof Shape]: Shape[K]['outputType'] };
|
|
5939
|
-
export type DefaultSelectOutput<Shape extends Column.QueryColumnsInit> = { [K in { [K in keyof Shape]: Shape[K]['data']['explicitSelect'] extends true | undefined ? never : K }[keyof Shape]]: Shape[K]['outputType'] };
|
|
5940
|
-
export interface MapToObjectColumn<Shape extends Column.QueryColumns> {
|
|
5941
|
-
dataType: 'object';
|
|
5942
|
-
type: { [K in keyof Shape]: Shape[K]['type'] };
|
|
5943
|
-
outputType: ShallowSimplify<ObjectOutput<Shape>>;
|
|
5944
|
-
queryType: { [K in keyof Shape]: Shape[K]['queryType'] };
|
|
5945
|
-
operators: OperatorsAny;
|
|
5946
|
-
}
|
|
5947
|
-
export interface MapToNullableObjectColumn<Shape extends Column.QueryColumns> {
|
|
5948
|
-
dataType: 'object';
|
|
5949
|
-
type: { [K in keyof Shape]: Shape[K]['type'] };
|
|
5950
|
-
outputType: ShallowSimplify<ObjectOutput<Shape>> | undefined;
|
|
5951
|
-
queryType: { [K in keyof Shape]: Shape[K]['queryType'] } | null;
|
|
5952
|
-
operators: OperatorsAny;
|
|
5953
|
-
}
|
|
5954
|
-
export interface MapToPluckColumn<Shape extends Column.QueryColumns> {
|
|
5955
|
-
dataType: 'array';
|
|
5956
|
-
type: Shape['pluck']['type'][];
|
|
5957
|
-
outputType: Shape['pluck']['outputType'][];
|
|
5958
|
-
queryType: Shape['pluck']['queryType'][];
|
|
5959
|
-
operators: OperatorsAny;
|
|
5960
|
-
}
|
|
5961
|
-
export interface MapToObjectArrayColumn<Shape extends Column.QueryColumns> {
|
|
5962
|
-
dataType: 'array';
|
|
5963
|
-
type: { [K in keyof Shape]: Shape[K]['type'] }[];
|
|
5964
|
-
outputType: ShallowSimplify<ObjectOutput<Shape>>[];
|
|
5965
|
-
queryType: { [K in keyof Shape]: Shape[K]['queryType'] }[];
|
|
5966
|
-
operators: OperatorsAny;
|
|
5967
|
-
}
|
|
5968
|
-
type ObjectOutput<Shape extends Column.QueryColumns> = { [K in keyof Shape]: Shape[K]['outputType'] };
|
|
5969
|
-
export {};
|
|
5970
|
-
}
|
|
5971
|
-
interface SelectSelf extends PickQuerySelectable, PickQueryHasSelect, PickQueryDefaultSelect, PickQueryShape, PickQueryRelations, PickQueryResult, PickQueryReturnType, PickQueryWithData {}
|
|
5972
|
-
type SelectArgs<T extends SelectSelf> = ('*' | keyof T['__selectable'])[];
|
|
5973
|
-
interface SubQueryAddition<T extends PickQueryWithData> extends IsSubQuery {
|
|
5974
|
-
withData: T['withData'];
|
|
5975
|
-
}
|
|
5976
|
-
type SelectAsFnArg<T extends PickQueryRelationsWithData> = EmptyObject extends T['relations'] ? T : { [K in keyof T['relations'] | keyof T]: K extends keyof T['relations'] ? T['relations'][K]['maybeSingle'] & SubQueryAddition<T> : K extends keyof T ? T[K] : never };
|
|
5977
|
-
interface SelectAsArg<T extends SelectSelf> {
|
|
5978
|
-
[K: string]: keyof T['__selectable'] | Expression | ((q: SelectAsFnArg<T>) => unknown);
|
|
5979
|
-
}
|
|
5980
|
-
type SelectAsFnReturnType = {
|
|
5981
|
-
result: Column.QueryColumns;
|
|
5982
|
-
returnType: Exclude<QueryReturnType, 'rows'>;
|
|
5983
|
-
} | Expression;
|
|
5984
|
-
interface SelectAsCheckReturnTypes {
|
|
5985
|
-
[K: string]: PropertyKey | Expression | ((q: never) => SelectAsFnReturnType);
|
|
5986
|
-
}
|
|
5987
|
-
type SelectReturnType<T extends PickQueryReturnType> = T['returnType'] extends 'valueOrThrow' ? 'oneOrThrow' : T extends 'value' ? 'one' : T['returnType'] extends 'pluck' ? 'all' : T['returnType'];
|
|
5988
|
-
type SelectResult<T extends SelectSelf, Columns extends PropertyKey[]> = { [K in keyof T]: K extends '__hasSelect' ? true : K extends 'result' ? { [K in '*' extends Columns[number] ? Exclude<Columns[number], '*'> | T['__defaultSelect'] : Columns[number] as T['__selectable'][K]['as']]: T['__selectable'][K]['column'] } & (T['__hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown) : K extends 'returnType' ? SelectReturnType<T> : K extends 'then' ? QueryThenByReturnType<SelectReturnType<T>, { [K in '*' extends Columns[number] ? Exclude<Columns[number], '*'> | T['__defaultSelect'] : Columns[number] as T['__selectable'][K]['as']]: T['__selectable'][K]['column'] } & (T['__hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown)> : T[K] };
|
|
5989
|
-
type SelectResultObj<T extends SelectSelf, Obj> = Obj extends SelectAsCheckReturnTypes ? { [K in keyof T]: K extends '__hasSelect' ? true : K extends '__selectable' ? T['__selectable'] & SelectAsSelectable<Obj> : K extends 'result' ? { [K in T['__hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? keyof Obj | keyof T['result'] : keyof Obj]: K extends keyof Obj ? SelectAsValueResult<T, Obj[K]> : K extends keyof T['result'] ? T['result'][K] : never } : K extends 'returnType' ? SelectReturnType<T> : K extends 'then' ? QueryThenByReturnType<SelectReturnType<T>, { [K in T['__hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? keyof Obj | keyof T['result'] : keyof Obj]: K extends keyof Obj ? SelectAsValueResult<T, Obj[K]> : K extends keyof T['result'] ? T['result'][K] : never }> : T[K] } : `Invalid return type of ${{ [K in keyof Obj]: Obj[K] extends ((...args: any[]) => any) ? ReturnType<Obj[K]> extends SelectAsFnReturnType ? never : K : never }[keyof Obj] & string}`;
|
|
5990
|
-
type SelectResultColumnsAndObj<T extends SelectSelf, Columns extends PropertyKey[], Obj> = { [K in keyof T]: K extends '__hasSelect' ? true : K extends '__selectable' ? T['__selectable'] & SelectAsSelectable<Obj> : K extends 'result' ? // Combine previously selected items, all columns if * was provided,
|
|
5991
|
-
{ [K in ('*' extends Columns[number] ? Exclude<Columns[number], '*'> | T['__defaultSelect'] : Columns[number]) | keyof Obj as K extends Columns[number] ? T['__selectable'][K]['as'] : K]: K extends keyof Obj ? SelectAsValueResult<T, Obj[K]> : T['__selectable'][K]['column'] } & (T['__hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown) : K extends 'returnType' ? SelectReturnType<T> : K extends 'then' ? QueryThenByReturnType<SelectReturnType<T>, { [K in ('*' extends Columns[number] ? Exclude<Columns[number], '*'> | T['__defaultSelect'] : Columns[number]) | keyof Obj as K extends Columns[number] ? T['__selectable'][K]['as'] : K]: K extends keyof Obj ? SelectAsValueResult<T, Obj[K]> : T['__selectable'][K]['column'] } & (T['__hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown)> : T[K] };
|
|
5992
|
-
interface AllowedRelationOneQueryForSelectable extends IsSubQuery {
|
|
5993
|
-
result: Column.QueryColumns;
|
|
5994
|
-
returnType: 'value' | 'valueOrThrow' | 'one' | 'oneOrThrow';
|
|
5995
|
-
}
|
|
5996
|
-
type SelectAsSelectable<Obj> = UnionToIntersection<{ [K in keyof Obj]: Obj[K] extends ((q: never) => infer R extends AllowedRelationOneQueryForSelectable) ? { [C in R['returnType'] extends 'value' | 'valueOrThrow' ? K : keyof R['result'] as R['returnType'] extends 'value' | 'valueOrThrow' ? K : `${K & string}.${C & string}`]: {
|
|
5997
|
-
as: C;
|
|
5998
|
-
column: R['returnType'] extends 'value' | 'valueOrThrow' ? R['result']['value'] : R['result'][C & keyof R['result']];
|
|
5999
|
-
} } : never }[keyof Obj]>;
|
|
6000
|
-
type SelectAsValueResult<T extends SelectSelf, Arg> = Arg extends keyof T['__selectable'] ? T['__selectable'][Arg]['column'] : Arg extends Expression ? Arg['result']['value'] : Arg extends ((q: never) => IsQuery) ? SelectSubQueryResult<ReturnType<Arg>> : Arg extends ((q: never) => Expression) ? ReturnType<Arg>['result']['value'] : Arg extends ((q: never) => IsQuery | Expression) ? SelectSubQueryResult<Exclude<ReturnType<Arg>, Expression>> | Exclude<ReturnType<Arg>, IsQuery>['result']['value'] : never;
|
|
6001
|
-
type SelectSubQueryResult<Arg extends SelectSelf> = Arg['returnType'] extends undefined | 'all' ? ColumnsShape.MapToObjectArrayColumn<Arg['result']> : Arg['returnType'] extends 'value' | 'valueOrThrow' ? Arg['result']['value'] : Arg['returnType'] extends 'pluck' ? ColumnsShape.MapToPluckColumn<Arg['result']> : Arg['returnType'] extends 'one' ? ColumnsShape.MapToNullableObjectColumn<Arg['result']> : ColumnsShape.MapToObjectColumn<Arg['result']>;
|
|
6002
|
-
declare function _querySelect<T extends SelectSelf, Columns extends SelectArgs<T>>(q: T, columns: Columns): SelectResult<T, Columns>;
|
|
6003
|
-
declare function _querySelect<T extends SelectSelf, Obj extends SelectAsArg<T>>(q: T, obj: Obj): SelectResultObj<T, Obj>;
|
|
6004
|
-
declare function _querySelect<T extends SelectSelf, Columns extends SelectArgs<T>, Obj extends SelectAsArg<T>>(q: T, args: [...columns: Columns, obj: Obj]): SelectResultColumnsAndObj<T, Columns, Obj>;
|
|
6005
|
-
declare class Select {
|
|
6006
|
-
/**
|
|
6007
|
-
* Takes a list of columns to be selected, and by default, the query builder will select all columns of the table.
|
|
6008
|
-
*
|
|
6009
|
-
* The last argument can be an object. Keys of the object are column aliases, value can be a column name, sub-query, or raw SQL expression.
|
|
6010
|
-
*
|
|
6011
|
-
* ```ts
|
|
6012
|
-
* import { sql } from './baseTable'
|
|
6013
|
-
*
|
|
6014
|
-
* // select columns of the table:
|
|
6015
|
-
* db.table.select('id', 'name', { idAlias: 'id' });
|
|
6016
|
-
*
|
|
6017
|
-
* // accepts columns with table names:
|
|
6018
|
-
* db.table.select('user.id', 'user.name', { nameAlias: 'user.name' });
|
|
6019
|
-
*
|
|
6020
|
-
* // table name may refer to the current table or a joined table:
|
|
6021
|
-
* db.table
|
|
6022
|
-
* .join(db.message, 'authorId', 'user.id')
|
|
6023
|
-
* .select('user.name', 'message.text', { textAlias: 'message.text' });
|
|
6024
|
-
*
|
|
6025
|
-
* // select value from the sub-query,
|
|
6026
|
-
* // this sub-query should return a single record and a single column:
|
|
6027
|
-
* db.table.select({
|
|
6028
|
-
* subQueryResult: Otherdb.table.select('column').take(),
|
|
6029
|
-
* });
|
|
6030
|
-
*
|
|
6031
|
-
* // select raw SQL value, specify the returning type via <generic> syntax:
|
|
6032
|
-
* db.table.select({
|
|
6033
|
-
* raw: sql<number>`1 + 2`,
|
|
6034
|
-
* });
|
|
6035
|
-
*
|
|
6036
|
-
* // select raw SQL value, the resulting type can be set by providing a column type in such way:
|
|
6037
|
-
* db.table.select({
|
|
6038
|
-
* raw: sql`1 + 2`.type((t) => t.integer()),
|
|
6039
|
-
* });
|
|
6040
|
-
*
|
|
6041
|
-
* // same raw SQL query as above, but the sql is returned from a callback
|
|
6042
|
-
* db.table.select({
|
|
6043
|
-
* raw: () => sql`1 + 2`.type((t) => t.integer()),
|
|
6044
|
-
* });
|
|
6045
|
-
* ```
|
|
6046
|
-
*
|
|
6047
|
-
* When you use the ORM and defined relations, `select` can also accept callbacks with related table queries:
|
|
6048
|
-
*
|
|
6049
|
-
* ```ts
|
|
6050
|
-
* await db.author.select({
|
|
6051
|
-
* allBooks: (q) => q.books,
|
|
6052
|
-
* firstBook: (q) => q.books.order({ createdAt: 'ASC' }).take(),
|
|
6053
|
-
* booksCount: (q) => q.books.count(),
|
|
6054
|
-
* });
|
|
6055
|
-
* ```
|
|
6056
|
-
*
|
|
6057
|
-
* When you're selecting a relation that's connected via `belongsTo` or `hasOne`, it becomes available to use in `order` or in `where`:
|
|
6058
|
-
*
|
|
6059
|
-
* ```ts
|
|
6060
|
-
* // select books with their authors included, order by author name and filter by author column:
|
|
6061
|
-
* await db.books
|
|
6062
|
-
* .select({
|
|
6063
|
-
* author: (q) => q.author,
|
|
6064
|
-
* })
|
|
6065
|
-
* .order('author.name')
|
|
6066
|
-
* .where({ 'author.isPopular': true });
|
|
6067
|
-
* ```
|
|
6068
|
-
*/
|
|
6069
|
-
select<T extends SelectSelf, Columns extends SelectArgs<T>>(this: T, ...args: Columns): SelectResult<T, Columns>;
|
|
6070
|
-
select<T extends SelectSelf, Obj extends SelectAsArg<T>>(this: T, obj: Obj): SelectResultObj<T, Obj>;
|
|
6071
|
-
select<T extends SelectSelf, Columns extends SelectArgs<T>, Obj extends SelectAsArg<T>>(this: T, ...args: [...columns: Columns, obj: Obj]): SelectResultColumnsAndObj<T, Columns, Obj>;
|
|
6072
|
-
/**
|
|
6073
|
-
* When querying the table or creating records, all columns are selected by default,
|
|
6074
|
-
* but updating and deleting queries are returning affected row counts by default.
|
|
6075
|
-
*
|
|
6076
|
-
* Use `selectAll` to select all columns. If the `.select` method was applied before it will be discarded.
|
|
6077
|
-
*
|
|
6078
|
-
* ```ts
|
|
6079
|
-
* const selectFull = await db.table
|
|
6080
|
-
* .select('id', 'name') // discarded by `selectAll`
|
|
6081
|
-
* .selectAll();
|
|
6082
|
-
*
|
|
6083
|
-
* const updatedFull = await db.table.selectAll().where(conditions).update(data);
|
|
6084
|
-
*
|
|
6085
|
-
* const deletedFull = await db.table.selectAll().where(conditions).delete();
|
|
6086
|
-
* ```
|
|
6087
|
-
*/
|
|
6088
|
-
selectAll<T extends SelectSelf>(this: T): SelectResult<T, ['*']>;
|
|
6089
|
-
}
|
|
6090
6091
|
type SelectItem = string | SelectAs | Expression | undefined;
|
|
6091
6092
|
interface SelectAs {
|
|
6092
6093
|
selectAs: SelectAsValue;
|
|
@@ -9481,6 +9482,23 @@ declare class QueryGet {
|
|
|
9481
9482
|
*/
|
|
9482
9483
|
getOptional<T extends QueryGetSelf, Arg extends GetArg<T>>(this: T, arg: Arg): GetResultOptional<T, Arg>;
|
|
9483
9484
|
}
|
|
9485
|
+
interface QueryPluckSelf extends PickQuerySelectable, PickQueryRelationsWithData {}
|
|
9486
|
+
type PluckArg<T extends QueryPluckSelf> = SelectableOrExpression<T> | ((q: SelectAsFnArg<T>) => Expression | Query.Pick.SingleValueResult);
|
|
9487
|
+
type PluckResult<T extends QueryPluckSelf, S extends PluckArg<T>> = S extends ((q: never) => infer R) ? R extends Expression ? SetQueryReturnsPluck<T, R> : R extends Query.Pick.SingleValueResult ? { [K in keyof T]: K extends '__hasSelect' ? true : K extends 'result' ? {
|
|
9488
|
+
pluck: R['result']['value'];
|
|
9489
|
+
} : K extends 'returnType' ? 'pluck' : K extends 'then' ? QueryThen<R['result']['value']['outputType'][]> : T[K] } : never : S extends SelectableOrExpression<T> ? SetQueryReturnsPluck<T, S> : never;
|
|
9490
|
+
declare class QueryPluck {
|
|
9491
|
+
/**
|
|
9492
|
+
* `.pluck` returns a single array of a single selected column values:
|
|
9493
|
+
*
|
|
9494
|
+
* ```ts
|
|
9495
|
+
* const ids = await db.table.select('id').pluck();
|
|
9496
|
+
* // ids are an array of all users' id like [1, 2, 3]
|
|
9497
|
+
* ```
|
|
9498
|
+
* @param select - column name or a raw SQL
|
|
9499
|
+
*/
|
|
9500
|
+
pluck<T extends QueryPluckSelf, S extends PluckArg<T>>(this: T, select: S): PluckResult<T, S>;
|
|
9501
|
+
}
|
|
9484
9502
|
interface MergeQueryArg extends PickQueryTable, PickQuerySelectable, PickQueryResult, PickQueryReturnType, PickQueryWithData, PickQueryWindows, PickQueryThen, PickQueryHasSelect, PickQueryHasWhere {}
|
|
9485
9503
|
type MergeQuery<T extends MergeQueryArg, Q extends MergeQueryArg> = { [K in keyof T]: K extends '__hasWhere' | '__hasSelect' ? T[K] & Q[K] : K extends '__selectable' | 'windows' | 'withData' ? Q[K] & Omit<T[K], keyof Q[K]> : K extends 'result' ? MergeQueryResult<T, Q> : K extends 'returnType' ? Q['returnType'] extends undefined ? T['returnType'] : Q['returnType'] : K extends 'then' ? Q['returnType'] extends undefined ? QueryThenByQuery<T, MergeQueryResult<T, Q>> : Q['returnType'] extends 'all' | 'one' | 'oneOrThrow' | 'rows' ? QueryThenByQuery<Q, MergeQueryResult<T, Q>> : Q['__hasSelect'] extends true ? Q['then'] : T['__hasSelect'] extends true ? T['then'] : Q['then'] : T[K] };
|
|
9486
9504
|
type MergeQueryResult<T extends PickQueryHasSelectResult, Q extends PickQueryHasSelectResult> = T['__hasSelect'] extends true ? Q['__hasSelect'] extends true ? Omit<T['result'], keyof Q['result']> & Q['result'] : T['result'] : Q['result'];
|
|
@@ -9750,7 +9768,7 @@ interface NarrowPluckTypeResult<T extends PickQueryResultReturnType, Narrow> ext
|
|
|
9750
9768
|
}
|
|
9751
9769
|
type QueryIfResult<T extends PickQueryResultReturnType, R extends PickQueryResult> = { [K in keyof T]: K extends 'result' ? { [K in keyof T['result'] | keyof R['result']]: K extends keyof T['result'] ? K extends keyof R['result'] ? R['result'][K] | T['result'][K] : T['result'][K] : Column.Modifiers.QueryColumnToOptional<R['result'][K]> } : K extends 'then' ? QueryIfResultThen<T, R> : T[K] };
|
|
9752
9770
|
type QueryIfResultThen<T extends PickQueryResultReturnType, R extends PickQueryResult> = T['returnType'] extends undefined | 'all' ? QueryThenShallowSimplifyArr<{ [K in keyof T['result']]: K extends keyof R['result'] ? T['result'][K]['outputType'] | R['result'][K]['outputType'] : T['result'][K]['outputType'] } & { [K in keyof R['result'] as K extends keyof T['result'] ? never : K]?: R['result'][K]['outputType'] }> : T['returnType'] extends 'one' ? QueryThenShallowSimplifyOptional<{ [K in keyof T['result']]: K extends keyof R['result'] ? T['result'][K]['outputType'] | R['result'][K]['outputType'] : T['result'][K]['outputType'] } & { [K in keyof R['result'] as K extends keyof T['result'] ? never : K]?: R['result'][K]['outputType'] }> : T['returnType'] extends 'oneOrThrow' ? QueryThenShallowSimplify<{ [K in keyof T['result']]: K extends keyof R['result'] ? T['result'][K]['outputType'] | R['result'][K]['outputType'] : T['result'][K]['outputType'] } & { [K in keyof R['result'] as K extends keyof T['result'] ? never : K]?: R['result'][K]['outputType'] }> : T['returnType'] extends 'value' ? QueryThen<T['result']['value']['outputType'] | R['result']['value']['outputType'] | undefined> : T['returnType'] extends 'valueOrThrow' ? QueryThen<T['result']['value']['outputType'] | R['result']['value']['outputType']> : T['returnType'] extends 'rows' ? QueryThen<(T['result'][keyof T['result']]['outputType'] | R['result'][keyof R['result']]['outputType'])[][]> : T['returnType'] extends 'pluck' ? QueryThen<(T['result']['pluck']['outputType'] | R['result']['pluck']['outputType'])[]> : QueryThen<void>;
|
|
9753
|
-
interface QueryMethods<ColumnTypes> extends QueryClone, QueryAsMethods, AggregateMethods, QueryDistinct, Select, FromMethods, QueryJoin, QueryLimitOffset, CteQuery, Union, QueryJsonMethods, QueryCreate, QueryCreateFrom, QueryUpdate, QueryDelete, QueryStorage, QueryTransaction, QueryTruncate, For, Where, SearchMethods, Clear, Having, QueryCatchers, QueryLog, QueryOrder, QueryWithSchema, QueryHooks, QueryUpsert, QueryOrCreate, QueryGet, MergeQueryMethods, QuerySql<ColumnTypes>, QueryTransform, QueryMap, QueryScope, SoftDeleteMethods, QueryExpressions, QueryWrap, QueryWindow {}
|
|
9771
|
+
interface QueryMethods<ColumnTypes> extends QueryClone, QueryAsMethods, AggregateMethods, QueryDistinct, Select, FromMethods, QueryJoin, QueryLimitOffset, CteQuery, Union, QueryJsonMethods, QueryCreate, QueryCreateFrom, QueryUpdate, QueryDelete, QueryStorage, QueryTransaction, QueryTruncate, For, Where, SearchMethods, Clear, Having, QueryCatchers, QueryLog, QueryOrder, QueryWithSchema, QueryHooks, QueryUpsert, QueryOrCreate, QueryGet, QueryPluck, MergeQueryMethods, QuerySql<ColumnTypes>, QueryTransform, QueryMap, QueryScope, SoftDeleteMethods, QueryExpressions, QueryWrap, QueryWindow {}
|
|
9754
9772
|
declare class QueryMethods<ColumnTypes> {
|
|
9755
9773
|
/**
|
|
9756
9774
|
* `.all` is a default behavior, that returns an array of objects:
|
|
@@ -9805,16 +9823,6 @@ declare class QueryMethods<ColumnTypes> {
|
|
|
9805
9823
|
* ```
|
|
9806
9824
|
*/
|
|
9807
9825
|
rows<T extends PickQueryResult>(this: T): SetQueryReturnsRows<T>;
|
|
9808
|
-
/**
|
|
9809
|
-
* `.pluck` returns a single array of a single selected column values:
|
|
9810
|
-
*
|
|
9811
|
-
* ```ts
|
|
9812
|
-
* const ids = await db.table.select('id').pluck();
|
|
9813
|
-
* // ids are an array of all users' id like [1, 2, 3]
|
|
9814
|
-
* ```
|
|
9815
|
-
* @param select - column name or a raw SQL
|
|
9816
|
-
*/
|
|
9817
|
-
pluck<T extends PickQuerySelectable, S extends SelectableOrExpression<T>>(this: T, select: S): SetQueryReturnsPluck<T, S>;
|
|
9818
9826
|
/**
|
|
9819
9827
|
* `.exec` won't parse the response at all, and returns undefined:
|
|
9820
9828
|
*
|
|
@@ -10279,6 +10287,14 @@ declare namespace Query {
|
|
|
10279
10287
|
type Arg<T extends Order.ArgThis> = Order.Arg<T>;
|
|
10280
10288
|
type Args<T extends Order.ArgThis> = Order.Args<T>;
|
|
10281
10289
|
}
|
|
10290
|
+
namespace Pick {
|
|
10291
|
+
interface SingleValueResult {
|
|
10292
|
+
result: {
|
|
10293
|
+
value: Column.Pick.OutputType;
|
|
10294
|
+
};
|
|
10295
|
+
returnType: 'value' | 'valueOrThrow';
|
|
10296
|
+
}
|
|
10297
|
+
}
|
|
10282
10298
|
}
|
|
10283
10299
|
type SelectableOfType<T extends PickQuerySelectable, Type> = { [K in keyof T['__selectable']]: T['__selectable'][K]['column']['type'] extends Type | null ? K : never }[keyof T['__selectable']];
|
|
10284
10300
|
type SelectableOrExpressionOfType<T extends PickQuerySelectable, C extends Column.Pick.Type> = SelectableOfType<T, C['type']> | Expression<Column.Pick.QueryColumnOfType<C['type'] | null>>;
|
package/dist/index.js
CHANGED
|
@@ -6763,17 +6763,27 @@ const _get = (query, returnType, arg) => {
|
|
|
6763
6763
|
if (q.returning) q.returning = void 0;
|
|
6764
6764
|
q.returnType = returnType;
|
|
6765
6765
|
let type;
|
|
6766
|
-
|
|
6767
|
-
|
|
6768
|
-
|
|
6766
|
+
let value = arg;
|
|
6767
|
+
if (typeof value === "function") {
|
|
6768
|
+
const item = processSelectAsArg(query, getQueryAs(query), "value", value);
|
|
6769
|
+
if (item !== false) value = item;
|
|
6770
|
+
}
|
|
6771
|
+
if (typeof value === "string") {
|
|
6772
|
+
const joinedAs = q.valuesJoinedAs?.[value];
|
|
6773
|
+
type = joinedAs ? q.joinedShapes?.[joinedAs]?.value : _getSelectableColumn(query, value);
|
|
6769
6774
|
q.getColumn = type;
|
|
6770
|
-
const selected = setParserForSelectedString(query, joinedAs ? joinedAs + "." +
|
|
6775
|
+
const selected = setParserForSelectedString(query, joinedAs ? joinedAs + "." + value : value, getQueryAs(query), getValueKey);
|
|
6771
6776
|
q.select = selected ? [q.expr = new SelectItemExpression(query, selected, type)] : void 0;
|
|
6772
|
-
} else {
|
|
6773
|
-
type =
|
|
6777
|
+
} else if (isExpression(value)) {
|
|
6778
|
+
type = value.result.value;
|
|
6774
6779
|
q.getColumn = type;
|
|
6775
|
-
addParserForRawExpression(query, getValueKey,
|
|
6776
|
-
q.select = [q.expr =
|
|
6780
|
+
addParserForRawExpression(query, getValueKey, value);
|
|
6781
|
+
q.select = [q.expr = value];
|
|
6782
|
+
} else {
|
|
6783
|
+
const selected = value;
|
|
6784
|
+
q.getColumn = selected.q.getColumn;
|
|
6785
|
+
if (q.getColumn) addColumnParserToQuery(q, getValueKey, q.getColumn);
|
|
6786
|
+
q.select = selected ? [{ selectAs: { value: selected } }] : void 0;
|
|
6777
6787
|
}
|
|
6778
6788
|
return setQueryOperators(query, type?.operators || Operators.any);
|
|
6779
6789
|
};
|
|
@@ -10888,44 +10898,49 @@ const collectNestedSelectBatches = (batches, rows, path, last) => {
|
|
|
10888
10898
|
};
|
|
10889
10899
|
const emptyArrSQL = new RawSql("'[]'");
|
|
10890
10900
|
const processSelectArg = (q, as, arg, columnAs) => {
|
|
10891
|
-
const query = q;
|
|
10892
10901
|
if (typeof arg === "string") return setParserForSelectedString(q, arg, as, columnAs);
|
|
10893
10902
|
const selectAs = {};
|
|
10894
10903
|
for (const key in arg) {
|
|
10895
|
-
|
|
10896
|
-
|
|
10897
|
-
|
|
10898
|
-
|
|
10899
|
-
|
|
10900
|
-
|
|
10901
|
-
|
|
10902
|
-
|
|
10903
|
-
|
|
10904
|
-
|
|
10905
|
-
|
|
10906
|
-
|
|
10907
|
-
|
|
10908
|
-
|
|
10909
|
-
|
|
10910
|
-
|
|
10911
|
-
|
|
10912
|
-
|
|
10913
|
-
|
|
10914
|
-
|
|
10915
|
-
|
|
10916
|
-
|
|
10917
|
-
|
|
10918
|
-
|
|
10919
|
-
|
|
10920
|
-
|
|
10921
|
-
|
|
10922
|
-
|
|
10923
|
-
value
|
|
10904
|
+
const item = processSelectAsArg(q, as, key, arg[key]);
|
|
10905
|
+
if (item === false) return false;
|
|
10906
|
+
selectAs[key] = item;
|
|
10907
|
+
}
|
|
10908
|
+
return { selectAs };
|
|
10909
|
+
};
|
|
10910
|
+
const processSelectAsArg = (q, as, key, arg) => {
|
|
10911
|
+
const query = q;
|
|
10912
|
+
let value = arg;
|
|
10913
|
+
let joinQuery;
|
|
10914
|
+
if (typeof value === "function") {
|
|
10915
|
+
value = resolveSubQueryCallback(q, value);
|
|
10916
|
+
if (isQueryNone(value)) {
|
|
10917
|
+
if (value.q.innerJoinLateral) return false;
|
|
10918
|
+
}
|
|
10919
|
+
if (!isExpression(value)) {
|
|
10920
|
+
if (isRelationQuery(value) && value.q.subQuery !== 1) {
|
|
10921
|
+
joinQuery = true;
|
|
10922
|
+
setSelectRelation(query.q);
|
|
10923
|
+
value = value.joinQuery(value, q);
|
|
10924
|
+
let subQuery;
|
|
10925
|
+
const { returnType, innerJoinLateral } = value.q;
|
|
10926
|
+
if (!returnType || returnType === "all") {
|
|
10927
|
+
subQuery = value.json(false);
|
|
10928
|
+
if (!innerJoinLateral) value.q.coalesceValue = emptyArrSQL;
|
|
10929
|
+
} else if (returnType === "pluck") {
|
|
10930
|
+
subQuery = value.q.select ? value.wrap(cloneQueryBaseUnscoped(value)).jsonAgg(value.q.select[0]) : value.json(false);
|
|
10931
|
+
value.q.coalesceValue = emptyArrSQL;
|
|
10932
|
+
} else if (returnType === "value" || returnType === "valueOrThrow") if (value.q.select) {
|
|
10933
|
+
if (typeof value.q.select[0] === "string") value.q.select[0] = { selectAs: { r: value.q.select[0] } };
|
|
10934
|
+
subQuery = value;
|
|
10935
|
+
} else subQuery = value.json(false);
|
|
10936
|
+
else subQuery = value;
|
|
10937
|
+
const as = _joinLateral(q, innerJoinLateral || query.q.returnType === "valueOrThrow" ? "JOIN" : "LEFT JOIN", subQuery, key, innerJoinLateral && returnType !== "one" && returnType !== "oneOrThrow");
|
|
10938
|
+
if (as) value.q.joinedForSelect = _copyQueryAliasToQuery(value, q, as);
|
|
10924
10939
|
}
|
|
10940
|
+
value = prepareSubQueryForSql(q, value);
|
|
10925
10941
|
}
|
|
10926
|
-
selectAs[key] = addParserForSelectItem(q, as, key, value, key, joinQuery);
|
|
10927
10942
|
}
|
|
10928
|
-
return
|
|
10943
|
+
return addParserForSelectItem(query, as, key, value, key, joinQuery);
|
|
10929
10944
|
};
|
|
10930
10945
|
const setParserForSelectedString = (query, arg, as, columnAs, columnAlias) => {
|
|
10931
10946
|
const { q } = query;
|
|
@@ -12831,6 +12846,28 @@ var Having = class {
|
|
|
12831
12846
|
return pushQueryValueImmutable(_clone(this), "having", args);
|
|
12832
12847
|
}
|
|
12833
12848
|
};
|
|
12849
|
+
var QueryPluck = class {
|
|
12850
|
+
/**
|
|
12851
|
+
* `.pluck` returns a single array of a single selected column values:
|
|
12852
|
+
*
|
|
12853
|
+
* ```ts
|
|
12854
|
+
* const ids = await db.table.select('id').pluck();
|
|
12855
|
+
* // ids are an array of all users' id like [1, 2, 3]
|
|
12856
|
+
* ```
|
|
12857
|
+
* @param select - column name or a raw SQL
|
|
12858
|
+
*/
|
|
12859
|
+
pluck(select) {
|
|
12860
|
+
const q = _clone(this);
|
|
12861
|
+
q.q.returnType = "pluck";
|
|
12862
|
+
let selected;
|
|
12863
|
+
if (typeof select === "function") {
|
|
12864
|
+
const item = processSelectAsArg(q, q.q.as || q.table, "pluck", select);
|
|
12865
|
+
if (item !== false) selected = isExpression(item) ? item : { selectAs: { pluck: item } };
|
|
12866
|
+
} else selected = addParserForSelectItem(q, q.q.as || q.table, "pluck", select);
|
|
12867
|
+
q.q.select = selected ? [selected] : void 0;
|
|
12868
|
+
return q;
|
|
12869
|
+
}
|
|
12870
|
+
};
|
|
12834
12871
|
var QueryMap = class {
|
|
12835
12872
|
/**
|
|
12836
12873
|
* Use `map` to transform individual records of a query result.
|
|
@@ -13185,22 +13222,6 @@ var QueryMethods = class {
|
|
|
13185
13222
|
return _queryRows(_clone(this));
|
|
13186
13223
|
}
|
|
13187
13224
|
/**
|
|
13188
|
-
* `.pluck` returns a single array of a single selected column values:
|
|
13189
|
-
*
|
|
13190
|
-
* ```ts
|
|
13191
|
-
* const ids = await db.table.select('id').pluck();
|
|
13192
|
-
* // ids are an array of all users' id like [1, 2, 3]
|
|
13193
|
-
* ```
|
|
13194
|
-
* @param select - column name or a raw SQL
|
|
13195
|
-
*/
|
|
13196
|
-
pluck(select) {
|
|
13197
|
-
const q = _clone(this);
|
|
13198
|
-
q.q.returnType = "pluck";
|
|
13199
|
-
const selected = addParserForSelectItem(q, q.q.as || q.table, "pluck", select);
|
|
13200
|
-
q.q.select = selected ? [selected] : void 0;
|
|
13201
|
-
return q;
|
|
13202
|
-
}
|
|
13203
|
-
/**
|
|
13204
13225
|
* `.exec` won't parse the response at all, and returns undefined:
|
|
13205
13226
|
*
|
|
13206
13227
|
* ```ts
|
|
@@ -13655,6 +13676,7 @@ applyMixins(QueryMethods, [
|
|
|
13655
13676
|
QueryOrCreate,
|
|
13656
13677
|
QueryHooks,
|
|
13657
13678
|
QueryGet,
|
|
13679
|
+
QueryPluck,
|
|
13658
13680
|
MergeQueryMethods,
|
|
13659
13681
|
QuerySql,
|
|
13660
13682
|
QueryTransform,
|