pqb 0.1.2 → 0.1.4
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 +9 -6
- package/dist/index.esm.js +36 -38
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +36 -38
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/queryMethods/queryMethods.test.ts +14 -2
- package/src/queryMethods/queryMethods.ts +4 -4
- package/src/queryMethods/select.ts +14 -12
- package/src/sql/select.ts +44 -42
package/dist/index.d.ts
CHANGED
|
@@ -1037,10 +1037,13 @@ declare class QueryGet {
|
|
|
1037
1037
|
declare type SelectArg<T extends QueryBase> = keyof T['selectable'] | (T['relations'] extends Record<string, Relation> ? keyof T['relations'] : never) | RelationQueryBase | SelectAsArg<T>;
|
|
1038
1038
|
declare type SelectAsArg<T extends QueryBase> = Record<string, keyof T['selectable'] | Query | RawExpression>;
|
|
1039
1039
|
declare type SelectResult<T extends Query, Args extends SelectArg<T>[], SelectAsArgs = SimpleSpread<FilterTuple<Args, SelectAsArg<QueryBase>>>> = AddQuerySelect<T, {
|
|
1040
|
-
[Arg in Args[number] as Arg extends keyof T['selectable'] ? T['selectable'][Arg]['as'] : Arg extends keyof T['relations'] ? Arg : Arg extends RelationQueryBase ? Arg['tableAlias'] extends string ? Arg['tableAlias'] : never : never]: Arg extends keyof T['selectable'] ? T['selectable'][Arg]['column'] : Arg extends RelationQueryBase ?
|
|
1040
|
+
[Arg in Args[number] as Arg extends keyof T['selectable'] ? T['selectable'][Arg]['as'] : Arg extends keyof T['relations'] ? Arg : Arg extends RelationQueryBase ? Arg['tableAlias'] extends string ? Arg['tableAlias'] : never : never]: Arg extends keyof T['selectable'] ? T['selectable'][Arg]['column'] : Arg extends RelationQueryBase ? SelectSubQueryResult<Arg> : T['relations'] extends Record<string, Relation> ? Arg extends keyof T['relations'] ? T['relations'][Arg]['returns'] extends 'many' ? ArrayOfColumnsObjects<T['relations'][Arg]['model']['result']> : T['relations'][Arg]['options']['required'] extends true ? ColumnsObject<T['relations'][Arg]['model']['result']> : NullableColumn<ColumnsObject<T['relations'][Arg]['model']['result']>> : never : never;
|
|
1041
1041
|
} & {
|
|
1042
|
-
[K in keyof SelectAsArgs]: SelectAsArgs[K] extends keyof T['selectable'] ? T['selectable'][SelectAsArgs[K]]['column'] : SelectAsArgs[K] extends RawExpression ? SelectAsArgs[K]['__column'] : SelectAsArgs[K] extends Query ?
|
|
1042
|
+
[K in keyof SelectAsArgs]: SelectAsArgs[K] extends keyof T['selectable'] ? T['selectable'][SelectAsArgs[K]]['column'] : SelectAsArgs[K] extends RawExpression ? SelectAsArgs[K]['__column'] : SelectAsArgs[K] extends Query ? SelectSubQueryResult<SelectAsArgs[K]> : never;
|
|
1043
1043
|
}>;
|
|
1044
|
+
declare type SelectSubQueryResult<Arg extends Query & {
|
|
1045
|
+
[isRequiredRelationKey]?: boolean;
|
|
1046
|
+
}> = Arg['returnType'] extends 'all' ? ArrayOfColumnsObjects<Arg['result']> : Arg['returnType'] extends 'valueOrThrow' ? Arg['result']['value'] : Arg['returnType'] extends 'pluck' ? PluckResultColumnType<Arg['result']['pluck']> : Arg[isRequiredRelationKey] extends true ? ColumnsObject<Arg['result']> : NullableColumn<ColumnsObject<Arg['result']>>;
|
|
1044
1047
|
declare const addParserForRawExpression: (q: Query, key: string | getValueKey, raw: RawExpression) => void;
|
|
1045
1048
|
declare const addParserForSelectItem: <T extends Query>(q: T, as: string | getValueKey | undefined, key: string, item: Query | RawExpression<ColumnType<unknown, Operators, unknown>> | keyof T["selectable"]) => void;
|
|
1046
1049
|
declare const addParserToQuery: (query: QueryData, key: string | getValueKey, parser: ColumnParser) => void;
|
|
@@ -1456,10 +1459,10 @@ declare class QueryMethods {
|
|
|
1456
1459
|
_wrap<T extends Query, Q extends Query, As extends string = 't'>(this: T, query: Q, as?: As): SetQueryTableAlias<Q, As>;
|
|
1457
1460
|
order<T extends Query>(this: T, ...args: OrderArg<T>[]): T;
|
|
1458
1461
|
_order<T extends Query>(this: T, ...args: OrderArg<T>[]): T;
|
|
1459
|
-
limit<T extends Query>(this: T, arg: number): T;
|
|
1460
|
-
_limit<T extends Query>(this: T, arg: number): T;
|
|
1461
|
-
offset<T extends Query>(this: T, arg: number): T;
|
|
1462
|
-
_offset<T extends Query>(this: T, arg: number): T;
|
|
1462
|
+
limit<T extends Query>(this: T, arg: number | undefined): T;
|
|
1463
|
+
_limit<T extends Query>(this: T, arg: number | undefined): T;
|
|
1464
|
+
offset<T extends Query>(this: T, arg: number | undefined): T;
|
|
1465
|
+
_offset<T extends Query>(this: T, arg: number | undefined): T;
|
|
1463
1466
|
exists<T extends Query>(this: T): SetQueryReturnsValueOptional<T, NumberColumn>;
|
|
1464
1467
|
_exists<T extends Query>(this: T): SetQueryReturnsValueOptional<T, NumberColumn>;
|
|
1465
1468
|
truncate<T extends Query>(this: T, options?: {
|
package/dist/index.esm.js
CHANGED
|
@@ -2515,43 +2515,10 @@ const selectToSql = (model, query, values, quotedAs) => {
|
|
|
2515
2515
|
item === "*" ? ((_a2 = query.join) == null ? void 0 : _a2.length) ? `${quotedAs}.*` : "*" : quoteFullColumn(item, quotedAs)
|
|
2516
2516
|
);
|
|
2517
2517
|
} else if ((_b = item.query) == null ? void 0 : _b[relationQueryKey]) {
|
|
2518
|
-
|
|
2519
|
-
const as =
|
|
2518
|
+
const relationQuery = item.clone();
|
|
2519
|
+
const as = getQueryAs(relationQuery);
|
|
2520
2520
|
relationQuery._as(relationQuery.query[relationQueryKey]);
|
|
2521
|
-
|
|
2522
|
-
switch (returnType) {
|
|
2523
|
-
case "all":
|
|
2524
|
-
case "one":
|
|
2525
|
-
case "oneOrThrow":
|
|
2526
|
-
relationQuery = relationQuery._json();
|
|
2527
|
-
break;
|
|
2528
|
-
case "pluck": {
|
|
2529
|
-
const { select } = relationQuery.query;
|
|
2530
|
-
const first = select == null ? void 0 : select[0];
|
|
2531
|
-
if (!select || !first) {
|
|
2532
|
-
throw new PormInternalError(`Nothing was selected for pluck`);
|
|
2533
|
-
}
|
|
2534
|
-
select.length = 0;
|
|
2535
|
-
select[0] = { selectAs: { c: first } };
|
|
2536
|
-
relationQuery = relationQuery._wrap(
|
|
2537
|
-
relationQuery.__model.clone()
|
|
2538
|
-
);
|
|
2539
|
-
relationQuery._getOptional(
|
|
2540
|
-
raw(`COALESCE(json_agg("c"), '[]')`)
|
|
2541
|
-
);
|
|
2542
|
-
delete relationQuery.query.take;
|
|
2543
|
-
break;
|
|
2544
|
-
}
|
|
2545
|
-
case "rows":
|
|
2546
|
-
case "value":
|
|
2547
|
-
case "valueOrThrow":
|
|
2548
|
-
case "rowCount":
|
|
2549
|
-
case "void":
|
|
2550
|
-
break;
|
|
2551
|
-
default:
|
|
2552
|
-
throw new UnhandledTypeError(returnType);
|
|
2553
|
-
}
|
|
2554
|
-
list.push(`(${relationQuery.toSql(values).text}) AS ${as}`);
|
|
2521
|
+
pushSubQuerySql(relationQuery, as, values, list);
|
|
2555
2522
|
} else {
|
|
2556
2523
|
if ("selectAs" in item) {
|
|
2557
2524
|
const obj = item.selectAs;
|
|
@@ -2561,8 +2528,7 @@ const selectToSql = (model, query, values, quotedAs) => {
|
|
|
2561
2528
|
if (isRaw(value)) {
|
|
2562
2529
|
list.push(`${getRaw(value, values)} AS ${q(as)}`);
|
|
2563
2530
|
} else {
|
|
2564
|
-
|
|
2565
|
-
list.push(`(${sql.text}) AS ${q(as)}`);
|
|
2531
|
+
pushSubQuerySql(value, as, values, list);
|
|
2566
2532
|
}
|
|
2567
2533
|
} else {
|
|
2568
2534
|
list.push(
|
|
@@ -2595,6 +2561,38 @@ const selectToSql = (model, query, values, quotedAs) => {
|
|
|
2595
2561
|
return ((_a = query.join) == null ? void 0 : _a.length) ? `${quotedAs}.*` : "*";
|
|
2596
2562
|
}
|
|
2597
2563
|
};
|
|
2564
|
+
const pushSubQuerySql = (query, as, values, list) => {
|
|
2565
|
+
const { returnType } = query.query;
|
|
2566
|
+
switch (returnType) {
|
|
2567
|
+
case "all":
|
|
2568
|
+
case "one":
|
|
2569
|
+
case "oneOrThrow":
|
|
2570
|
+
query = query._json();
|
|
2571
|
+
break;
|
|
2572
|
+
case "pluck": {
|
|
2573
|
+
const { select } = query.query;
|
|
2574
|
+
const first = select == null ? void 0 : select[0];
|
|
2575
|
+
if (!select || !first) {
|
|
2576
|
+
throw new PormInternalError(`Nothing was selected for pluck`);
|
|
2577
|
+
}
|
|
2578
|
+
select.length = 0;
|
|
2579
|
+
select[0] = { selectAs: { c: first } };
|
|
2580
|
+
query = query._wrap(query.__model.clone());
|
|
2581
|
+
query._getOptional(raw(`COALESCE(json_agg("c"), '[]')`));
|
|
2582
|
+
delete query.query.take;
|
|
2583
|
+
break;
|
|
2584
|
+
}
|
|
2585
|
+
case "rows":
|
|
2586
|
+
case "value":
|
|
2587
|
+
case "valueOrThrow":
|
|
2588
|
+
case "rowCount":
|
|
2589
|
+
case "void":
|
|
2590
|
+
break;
|
|
2591
|
+
default:
|
|
2592
|
+
throw new UnhandledTypeError(returnType);
|
|
2593
|
+
}
|
|
2594
|
+
list.push(`(${query.toSql(values).text}) AS ${q(as)}`);
|
|
2595
|
+
};
|
|
2598
2596
|
|
|
2599
2597
|
const aggregateOptionNames = [
|
|
2600
2598
|
"distinct",
|