drizzle-orm 0.10.46 → 0.11.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/README.md +50 -58
- package/{src/builders → builders}/aggregators/abstractAggregator.d.ts +0 -0
- package/{src/builders → builders}/aggregators/abstractAggregator.js +1 -1
- package/{src/builders → builders}/aggregators/deleteAggregator.d.ts +0 -0
- package/{src/builders → builders}/aggregators/deleteAggregator.js +0 -0
- package/{src/builders → builders}/aggregators/insertAggregator.d.ts +0 -0
- package/{src/builders → builders}/aggregators/insertAggregator.js +0 -0
- package/{src/builders → builders}/aggregators/selectAggregator.d.ts +2 -8
- package/builders/aggregators/selectAggregator.js +110 -0
- package/builders/aggregators/selectAggregatorV1.d.ts +39 -0
- package/{src/builders/aggregators/selectAggregator.js → builders/aggregators/selectAggregatorV1.js} +3 -3
- package/{src/builders → builders}/aggregators/updateAggregator.d.ts +0 -0
- package/{src/builders → builders}/aggregators/updateAggregator.js +0 -0
- package/{src/builders → builders}/highLvlBuilders/abstractRequestBuilder.d.ts +2 -3
- package/{src/builders → builders}/highLvlBuilders/abstractRequestBuilder.js +0 -0
- package/{src/builders → builders}/highLvlBuilders/deleteRequestBuilder.d.ts +0 -0
- package/{src/builders → builders}/highLvlBuilders/deleteRequestBuilder.js +0 -0
- package/{src/builders → builders}/highLvlBuilders/insertRequestBuilder.d.ts +0 -0
- package/{src/builders → builders}/highLvlBuilders/insertRequestBuilder.js +0 -0
- package/builders/highLvlBuilders/joins/joinBuilderResponse.d.ts +8 -0
- package/builders/highLvlBuilders/joins/joinBuilderResponse.js +16 -0
- package/builders/highLvlBuilders/joins/proxies/joinProxies.d.ts +16 -0
- package/builders/highLvlBuilders/joins/proxies/joinProxies.js +47 -0
- package/builders/highLvlBuilders/joins/selectJoinBuilder.d.ts +44 -0
- package/builders/highLvlBuilders/joins/selectJoinBuilder.js +113 -0
- package/{src/builders → builders}/highLvlBuilders/order.d.ts +0 -0
- package/{src/builders → builders}/highLvlBuilders/order.js +0 -0
- package/builders/highLvlBuilders/selectRequestBuilder.d.ts +63 -0
- package/{src/builders → builders}/highLvlBuilders/selectRequestBuilder.js +45 -6
- package/{src/builders → builders}/highLvlBuilders/updateRequestBuilder.d.ts +0 -0
- package/{src/builders → builders}/highLvlBuilders/updateRequestBuilder.js +0 -0
- package/{src/builders → builders}/index.d.ts +3 -0
- package/{src/builders → builders}/index.js +15 -1
- package/{src/builders → builders}/joinBuilders/builders/abstractJoinBuilder.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/builders/abstractJoinBuilder.js +1 -1
- package/{src/builders → builders}/joinBuilders/builders/selectWithFiveJoins.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/builders/selectWithFiveJoins.js +0 -0
- package/{src/builders → builders}/joinBuilders/builders/selectWithFourJoins.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/builders/selectWithFourJoins.js +0 -0
- package/{src/builders → builders}/joinBuilders/builders/selectWithJoin.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/builders/selectWithJoin.js +0 -0
- package/{src/builders → builders}/joinBuilders/builders/selectWithThreeJoins.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/builders/selectWithThreeJoins.js +0 -0
- package/{src/builders → builders}/joinBuilders/builders/selectWithTwoJoins.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/builders/selectWithTwoJoins.js +0 -0
- package/{src/builders → builders}/joinBuilders/join.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/join.js +0 -0
- package/{src/builders → builders}/joinBuilders/joinWith.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/joinWith.js +0 -0
- package/{src/builders → builders}/joinBuilders/responses/selectResponseFiveJoins.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/responses/selectResponseFiveJoins.js +0 -0
- package/{src/builders → builders}/joinBuilders/responses/selectResponseFourJoins.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/responses/selectResponseFourJoins.js +0 -0
- package/{src/builders → builders}/joinBuilders/responses/selectResponseThreeJoins.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/responses/selectResponseThreeJoins.js +0 -0
- package/{src/builders → builders}/joinBuilders/responses/selectResponseTwoJoins.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/responses/selectResponseTwoJoins.js +0 -0
- package/{src/builders → builders}/joinBuilders/responses/selectResponseWithJoin.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/responses/selectResponseWithJoin.js +0 -0
- package/{src/builders → builders}/joinBuilders/static.d.ts +0 -0
- package/{src/builders → builders}/joinBuilders/static.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/alter.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/alter.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/create.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/create.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/delets/delete.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/delets/delete.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/delets/deleteFilter.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/delets/deleteFilter.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/delets/deleteFrom.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/delets/deleteFrom.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/inserts/insert.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/inserts/insert.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/inserts/insertInto.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/inserts/insertInto.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/inserts/onConflictInsert.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/inserts/onConflictInsert.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/inserts/valuesInsert.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/inserts/valuesInsert.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/selects/select.d.ts +4 -1
- package/builders/lowLvlBuilders/selects/select.js +42 -0
- package/{src/builders → builders}/lowLvlBuilders/selects/selectFrom.d.ts +25 -8
- package/builders/lowLvlBuilders/selects/selectFrom.js +78 -0
- package/{src/builders → builders}/lowLvlBuilders/selects/selectJoined.d.ts +22 -6
- package/builders/lowLvlBuilders/selects/selectJoined.js +71 -0
- package/{src/builders → builders}/lowLvlBuilders/selects/whereSelect.d.ts +13 -0
- package/{src/builders → builders}/lowLvlBuilders/selects/whereSelect.js +24 -0
- package/{src/builders → builders}/lowLvlBuilders/updates/update.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/updates/update.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/updates/updateIn.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/updates/updateIn.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/updates/whereSelect.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/updates/whereSelect.js +0 -0
- package/{src/builders → builders}/lowLvlBuilders/updates/whereSet.d.ts +0 -0
- package/{src/builders → builders}/lowLvlBuilders/updates/whereSet.js +0 -0
- package/{src/builders → builders}/requestBuilders/updates/combine.d.ts +0 -0
- package/{src/builders → builders}/requestBuilders/updates/combine.js +0 -0
- package/{src/builders → builders}/requestBuilders/updates/increment.d.ts +0 -0
- package/{src/builders → builders}/requestBuilders/updates/increment.js +0 -0
- package/{src/builders → builders}/requestBuilders/updates/setObjects.d.ts +0 -0
- package/{src/builders → builders}/requestBuilders/updates/setObjects.js +0 -0
- package/{src/builders → builders}/requestBuilders/updates/static.d.ts +0 -0
- package/{src/builders → builders}/requestBuilders/updates/static.js +0 -0
- package/{src/builders → builders}/requestBuilders/updates/updates.d.ts +0 -0
- package/{src/builders → builders}/requestBuilders/updates/updates.js +0 -0
- package/{src/builders → builders}/requestBuilders/where/and.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/and.js +19 -2
- package/{src/builders → builders}/requestBuilders/where/const.d.ts +8 -4
- package/{src/builders → builders}/requestBuilders/where/const.js +11 -1
- package/{src/builders → builders}/requestBuilders/where/constArray.d.ts +8 -4
- package/{src/builders → builders}/requestBuilders/where/constArray.js +26 -1
- package/{src/builders → builders}/requestBuilders/where/eqWhere.d.ts +11 -1
- package/{src/builders → builders}/requestBuilders/where/eqWhere.js +8 -3
- package/{src/builders → builders}/requestBuilders/where/greater.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/greater.js +8 -3
- package/{src/builders → builders}/requestBuilders/where/greaterEq.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/greaterEq.js +8 -3
- package/{src/builders → builders}/requestBuilders/where/in.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/in.js +8 -3
- package/{src/builders → builders}/requestBuilders/where/isNotNull.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/isNotNull.js +6 -2
- package/{src/builders → builders}/requestBuilders/where/isNull.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/isNull.js +6 -2
- package/{src/builders → builders}/requestBuilders/where/less.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/less.js +8 -3
- package/{src/builders → builders}/requestBuilders/where/lessEq.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/lessEq.js +8 -3
- package/{src/builders → builders}/requestBuilders/where/like.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/like.js +8 -3
- package/{src/builders → builders}/requestBuilders/where/notEqWhere.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/notEqWhere.js +8 -3
- package/{src/builders → builders}/requestBuilders/where/or.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/or.js +19 -2
- package/{src/builders → builders}/requestBuilders/where/rawWhere.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/rawWhere.js +2 -1
- package/{src/builders → builders}/requestBuilders/where/static.d.ts +5 -1
- package/{src/builders → builders}/requestBuilders/where/static.js +9 -2
- package/{src/docs/cases/simple_delete.d.ts → builders/requestBuilders/where/static.spec.d.ts} +0 -0
- package/{tests/lowLevelbuilders/updates/updates.test.js → builders/requestBuilders/where/static.spec.js} +27 -18
- package/{src/builders → builders}/requestBuilders/where/var.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/var.js +5 -1
- package/{src/builders → builders}/requestBuilders/where/where.d.ts +8 -1
- package/{src/builders → builders}/requestBuilders/where/where.js +0 -0
- package/{src/builders → builders}/transaction/transaction.d.ts +0 -0
- package/{src/builders → builders}/transaction/transaction.js +0 -0
- package/{src/columns → columns}/column.d.ts +0 -0
- package/{src/columns → columns}/column.js +0 -0
- package/{src/columns → columns}/index.d.ts +0 -0
- package/{src/columns → columns}/index.js +0 -0
- package/{src/columns → columns}/types/columnType.d.ts +0 -0
- package/{src/columns → columns}/types/columnType.js +0 -0
- package/{src/columns → columns}/types/pgBigDecimal.d.ts +0 -0
- package/{src/columns → columns}/types/pgBigDecimal.js +0 -0
- package/{src/columns → columns}/types/pgBigInt.d.ts +0 -0
- package/{src/columns → columns}/types/pgBigInt.js +0 -0
- package/{src/columns → columns}/types/pgBigSerial.d.ts +0 -0
- package/{src/columns → columns}/types/pgBigSerial.js +0 -0
- package/{src/columns → columns}/types/pgBoolean.d.ts +0 -0
- package/{src/columns → columns}/types/pgBoolean.js +0 -0
- package/{src/columns → columns}/types/pgEnum.d.ts +0 -0
- package/{src/columns → columns}/types/pgEnum.js +0 -0
- package/{src/columns → columns}/types/pgInteger.d.ts +0 -0
- package/{src/columns → columns}/types/pgInteger.js +0 -0
- package/{src/columns → columns}/types/pgJsonb.d.ts +0 -0
- package/{src/columns → columns}/types/pgJsonb.js +0 -0
- package/{src/columns → columns}/types/pgSerial.d.ts +0 -0
- package/{src/columns → columns}/types/pgSerial.js +0 -0
- package/{src/columns → columns}/types/pgSmallInt.d.ts +0 -0
- package/{src/columns → columns}/types/pgSmallInt.js +0 -0
- package/{src/columns → columns}/types/pgText.d.ts +0 -0
- package/{src/columns → columns}/types/pgText.js +0 -0
- package/{src/columns → columns}/types/pgTime.d.ts +0 -0
- package/{src/columns → columns}/types/pgTime.js +0 -0
- package/{src/columns → columns}/types/pgTimestamp.d.ts +0 -0
- package/{src/columns → columns}/types/pgTimestamp.js +0 -0
- package/{src/columns → columns}/types/pgTimestamptz.d.ts +0 -0
- package/{src/columns → columns}/types/pgTimestamptz.js +0 -0
- package/{src/columns → columns}/types/pgVarChar.d.ts +0 -0
- package/{src/columns → columns}/types/pgVarChar.js +0 -0
- package/{src/db → db}/db.d.ts +0 -0
- package/{src/db → db}/db.js +0 -0
- package/{src/db → db}/dbConnector.d.ts +0 -0
- package/{src/db → db}/dbConnector.js +0 -0
- package/{src/db → db}/dbStringConnector.d.ts +0 -0
- package/{src/db → db}/dbStringConnector.js +0 -0
- package/{src/db → db}/group_by.d.ts +0 -0
- package/{src/db → db}/group_by.js +0 -0
- package/{src/db → db}/index.d.ts +0 -0
- package/{src/db → db}/index.js +0 -0
- package/{src/db → db}/session.d.ts +0 -0
- package/{src/db → db}/session.js +0 -0
- package/{src/docs/cases/simple_insert.d.ts → docs/cases/simple_delete.d.ts} +0 -0
- package/{src/docs → docs}/cases/simple_delete.js +0 -0
- package/{src/docs/cases/simple_join.d.ts → docs/cases/simple_insert.d.ts} +0 -0
- package/{src/docs → docs}/cases/simple_insert.js +0 -0
- package/{src/docs/cases/simple_select.d.ts → docs/cases/simple_join.d.ts} +0 -0
- package/{src/docs → docs}/cases/simple_join.js +5 -5
- package/{src/docs/cases/simple_update.d.ts → docs/cases/simple_select.d.ts} +0 -0
- package/{src/docs → docs}/cases/simple_select.js +0 -0
- package/{tests/lowLevelbuilders/filters/filters.test.d.ts → docs/cases/simple_update.d.ts} +0 -0
- package/{src/docs → docs}/cases/simple_update.js +0 -0
- package/{src/docs → docs}/tables/citiesTable.d.ts +0 -0
- package/{src/docs → docs}/tables/citiesTable.js +0 -0
- package/{src/docs → docs}/tables/userGroupsTable.d.ts +1 -0
- package/{src/docs → docs}/tables/userGroupsTable.js +1 -0
- package/{src/docs → docs}/tables/usersTable.d.ts +0 -0
- package/{src/docs → docs}/tables/usersTable.js +1 -1
- package/{src/docs → docs}/tables/usersToUserGroups.d.ts +0 -0
- package/{src/docs → docs}/tables/usersToUserGroups.js +0 -0
- package/{src/docs → docs}/types/rolesType.d.ts +0 -0
- package/{src/docs → docs}/types/rolesType.js +0 -0
- package/{src/errors → errors}/baseError.d.ts +0 -0
- package/{src/errors → errors}/baseError.js +0 -0
- package/{src/errors → errors}/builderError.d.ts +0 -0
- package/{src/errors → errors}/builderError.js +0 -0
- package/{src/errors → errors}/dbErrors.d.ts +0 -0
- package/{src/errors → errors}/dbErrors.js +0 -0
- package/{src/index.d.ts → index.d.ts} +0 -0
- package/{src/index.js → index.js} +0 -0
- package/{src/indexes → indexes}/tableIndex.d.ts +0 -0
- package/{src/indexes → indexes}/tableIndex.js +0 -0
- package/{src/logger → logger}/abstractLogger.d.ts +0 -0
- package/{src/logger → logger}/abstractLogger.js +0 -0
- package/{src/logger → logger}/consoleLogger.d.ts +0 -0
- package/{src/logger → logger}/consoleLogger.js +0 -0
- package/{src/mappers → mappers}/index.d.ts +0 -0
- package/{src/mappers → mappers}/index.js +0 -0
- package/{src/mappers → mappers}/responseMapper.d.ts +3 -4
- package/{src/mappers → mappers}/responseMapper.js +2 -1
- package/{src/migrator → migrator}/index.d.ts +0 -0
- package/{src/migrator → migrator}/index.js +0 -0
- package/{src/migrator → migrator}/migrator.d.ts +0 -0
- package/{src/migrator → migrator}/migrator.js +0 -0
- package/package.json +4 -4
- package/{src/serializer → serializer}/serializer.d.ts +0 -0
- package/{src/serializer → serializer}/serializer.js +0 -0
- package/{src/tables → tables}/abstractTable.d.ts +3 -4
- package/{src/tables → tables}/abstractTable.js +1 -0
- package/{src/tables → tables}/index.d.ts +0 -0
- package/{src/tables → tables}/index.js +0 -0
- package/{src/tables → tables}/inferTypes.d.ts +6 -2
- package/{src/tables → tables}/inferTypes.js +0 -0
- package/{src/tables → tables}/migrationsTable.d.ts +0 -0
- package/{src/tables → tables}/migrationsTable.js +0 -0
- package/{src/test.d.ts → test.d.ts} +0 -0
- package/test.js +177 -0
- package/{src/types → types}/type.d.ts +0 -0
- package/{src/types → types}/type.js +0 -0
- package/{src/utils → utils}/ecranate.d.ts +0 -0
- package/{src/utils → utils}/ecranate.js +0 -0
- package/src/builders/highLvlBuilders/selectRequestBuilder.d.ts +0 -47
- package/src/builders/lowLvlBuilders/selects/select.js +0 -16
- package/src/builders/lowLvlBuilders/selects/selectFrom.js +0 -34
- package/src/builders/lowLvlBuilders/selects/selectJoined.js +0 -30
- package/src/test.js +0 -135
- package/tests/columnTypesTests/int/int.test.d.ts +0 -1
- package/tests/columnTypesTests/int/int.test.js +0 -561
- package/tests/columnTypesTests/int/models.d.ts +0 -10
- package/tests/columnTypesTests/int/models.js +0 -69
- package/tests/columnTypesTests/int/to/allIntsTable.d.ts +0 -16
- package/tests/columnTypesTests/int/to/allIntsTable.js +0 -28
- package/tests/examples/selects/index.test.d.ts +0 -1
- package/tests/examples/selects/index.test.js +0 -71
- package/tests/examples/selects/tables/to.d.ts +0 -12
- package/tests/examples/selects/tables/to.js +0 -25
- package/tests/highLevelBuilders/selects/index.test.d.ts +0 -1
- package/tests/highLevelBuilders/selects/index.test.js +0 -61
- package/tests/highLevelBuilders/selects/tables/to.d.ts +0 -12
- package/tests/highLevelBuilders/selects/tables/to.js +0 -25
- package/tests/lowLevelbuilders/filters/filters.test.js +0 -56
- package/tests/lowLevelbuilders/filters/usersTable.d.ts +0 -18
- package/tests/lowLevelbuilders/filters/usersTable.js +0 -32
- package/tests/lowLevelbuilders/updates/updates.test.d.ts +0 -1
- package/tests/lowLevelbuilders/updates/usersTable.d.ts +0 -18
- package/tests/lowLevelbuilders/updates/usersTable.js +0 -32
- package/tests/suites/simpleTableSuite/allInts/usersTable.d.ts +0 -11
- package/tests/suites/simpleTableSuite/allInts/usersTable.js +0 -22
- package/tests/suites/simpleTableSuite/allTexts/usersTable.d.ts +0 -11
- package/tests/suites/simpleTableSuite/allTexts/usersTable.js +0 -22
- package/tests/utils.d.ts +0 -8
- package/tests/utils.js +0 -75
package/README.md
CHANGED
|
@@ -342,79 +342,71 @@ await usersTable.insertMany([{
|
|
|
342
342
|
const usersTable = new UsersTable(db);
|
|
343
343
|
const citiesTable = new CitiesTable(db);
|
|
344
344
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
(users) => users.id)
|
|
350
|
-
.execute();
|
|
345
|
+
const userWithCities = await citiesTable.select()
|
|
346
|
+
.leftJoin(usersTable, (cities, users) => eq(cities.userId, users.id))
|
|
347
|
+
.where((cities, users) => eq(cities.id, 1))
|
|
348
|
+
.execute();
|
|
351
349
|
|
|
352
350
|
const citiesWithUserObject = userWithCities.map((city, user) => ({ ...city, user }));
|
|
353
351
|
```
|
|
354
352
|
|
|
355
353
|
### Join Many-To-Many Tables
|
|
356
|
-
##### Join User Groups with Users, using many-to-many table
|
|
357
|
-
```typescript
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
.leftJoin(UsersToUserGroupsTable, UserGroupsTable,
|
|
364
|
-
(userToGroup) => userToGroup.groupId,
|
|
365
|
-
(users) => users.id)
|
|
366
|
-
.execute();
|
|
367
|
-
|
|
368
|
-
const userGroupWithUsers = usersWithUserGroups.group({
|
|
369
|
-
one: (_, dbUser, dbUserGroup) => dbUser!,
|
|
370
|
-
many: (_, dbUser, dbUserGroup) => dbUserGroup!,
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
const userWithGroups: ExtractModel<UsersTable> & { groups: ExtractModel<UserGroupsTable>[] } = {
|
|
374
|
-
...userGroupWithUsers.one,
|
|
375
|
-
groups: userGroupWithUsers.many,
|
|
376
|
-
};
|
|
377
|
-
```
|
|
378
|
-
##### Join User Groups with Users, using many-to-many table and map response to get user group object with users array
|
|
379
|
-
```typescript
|
|
380
|
-
const usersWithUserGroups = await usersToUserGroupsTable.select()
|
|
381
|
-
.where(eq(userGroupsTable.id, 1))
|
|
382
|
-
.leftJoin(UsersTable,
|
|
383
|
-
(userToGroup) => userToGroup.userId,
|
|
384
|
-
(users) => users.id)
|
|
385
|
-
.leftJoin(UsersToUserGroupsTable, UserGroupsTable,
|
|
386
|
-
(userToGroup) => userToGroup.groupId,
|
|
387
|
-
(users) => users.id)
|
|
388
|
-
.execute();
|
|
389
|
-
|
|
390
|
-
const userGroupWithUsers = usersWithUserGroups.group({
|
|
391
|
-
one: (_, dbUser, dbUserGroup) => dbUserGroup!,
|
|
392
|
-
many: (_, dbUser, dbUserGroup) => dbUser!,
|
|
393
|
-
});
|
|
394
|
-
|
|
395
|
-
const userWithGroups: ExtractModel<UserGroupsTable> & { users: ExtractModel<UsersTable>[] } = {
|
|
396
|
-
...userGroupWithUsers.one,
|
|
397
|
-
users: userGroupWithUsers.many,
|
|
398
|
-
};
|
|
354
|
+
##### Join User Groups with Users, using many-to-many table
|
|
355
|
+
```typescript
|
|
356
|
+
const usersWithUserGroups = await usersToUserGroupsTable.select()
|
|
357
|
+
.leftJoin(usersTable, (usersToUserGroups, users) => eq(usersToUserGroups.userId, users.id))
|
|
358
|
+
.leftJoin(userGroupsTable, (usersToUserGroups, _users, userGroups) => eq(usersToUserGroups.groupId, userGroups.id))
|
|
359
|
+
.where((usersToUserGroups, _users, userGroups) => eq(userGroups.id, 1))
|
|
360
|
+
.execute();
|
|
399
361
|
```
|
|
400
362
|
### Join using partial field select
|
|
401
363
|
##### Join Cities with Users getting only needed fields form request
|
|
402
364
|
```typescript
|
|
403
|
-
await citiesTable.select({
|
|
365
|
+
await citiesTable.select({
|
|
404
366
|
id: citiesTable.id,
|
|
405
367
|
userId: citiesTable.userId,
|
|
406
368
|
})
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
(users) => users.id,
|
|
411
|
-
{
|
|
412
|
-
id: usersTable.id,
|
|
413
|
-
})
|
|
414
|
-
.execute();
|
|
369
|
+
.leftJoin(usersTable, (cities, users) => eq(cities.userId, users.id))
|
|
370
|
+
.where((cities, users) => eq(cities.id, 1))
|
|
371
|
+
.execute();
|
|
415
372
|
|
|
416
373
|
const citiesWithUserObject = userWithCities.map((city, user) => ({ ...city, user }));
|
|
417
374
|
```
|
|
375
|
+
### Another join examples with different callback ON statements
|
|
376
|
+
```typescript
|
|
377
|
+
await citiesTable.select()
|
|
378
|
+
.leftJoin(usersTable, (cities, _users) => eq(cities.id, 13))
|
|
379
|
+
.where((cities, _users) => eq(cities.location, 'q'))
|
|
380
|
+
.execute();
|
|
381
|
+
// Join statement generated from query
|
|
382
|
+
// LEFT JOIN users AS users_1
|
|
383
|
+
// ON cities."id"=$1
|
|
384
|
+
// WHERE cities."page"=$2
|
|
385
|
+
//
|
|
386
|
+
// Values: [13, 'q']
|
|
387
|
+
|
|
388
|
+
await citiesTable.select()
|
|
389
|
+
.leftJoin(usersTable, (cities, _users) => and([
|
|
390
|
+
eq(cities.id, 13), notEq(cities.id, 14),
|
|
391
|
+
]))
|
|
392
|
+
.execute();
|
|
393
|
+
// Join statement generated from query
|
|
394
|
+
// LEFT JOIN users AS users_1
|
|
395
|
+
// ON (cities."id"=$1 and cities."id"!=$2)
|
|
396
|
+
//
|
|
397
|
+
// Values: [13, 14]
|
|
398
|
+
|
|
399
|
+
await citiesTable.select()
|
|
400
|
+
.leftJoin(usersTable, (_cities, _users) => raw('<custom expression after ON statement>'))
|
|
401
|
+
.where((cities, _users) => eq(cities.location, 'location'))
|
|
402
|
+
.execute();
|
|
403
|
+
// Join statement generated from query
|
|
404
|
+
// LEFT JOIN users AS users_1
|
|
405
|
+
// ON <custom expression after ON statement>
|
|
406
|
+
// WHERE cities."page"=$1
|
|
407
|
+
//
|
|
408
|
+
// Values: ['location']
|
|
409
|
+
```
|
|
418
410
|
|
|
419
411
|
|
|
420
412
|
## Migrations
|
|
File without changes
|
|
@@ -16,7 +16,7 @@ class Aggregator {
|
|
|
16
16
|
selectFields.push('.');
|
|
17
17
|
selectFields.push(ecranate_1.ecranate(field.getColumnName()));
|
|
18
18
|
selectFields.push(' AS ');
|
|
19
|
-
selectFields.push(ecranate_1.ecranate(`${field.
|
|
19
|
+
selectFields.push(ecranate_1.ecranate(`${table}_${field.getColumnName()}`));
|
|
20
20
|
selectFields.push(',');
|
|
21
21
|
}
|
|
22
22
|
});
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { AbstractColumn } from '../../columns/column';
|
|
2
2
|
import ColumnType from '../../columns/types/columnType';
|
|
3
3
|
import { AbstractTable } from '../../tables';
|
|
4
|
+
import { JoinType } from '../highLvlBuilders/joins/selectJoinBuilder';
|
|
4
5
|
import Order from '../highLvlBuilders/order';
|
|
5
|
-
import Join from '../joinBuilders/join';
|
|
6
6
|
import Expr from '../requestBuilders/where/where';
|
|
7
7
|
import Aggregator from './abstractAggregator';
|
|
8
8
|
export default class SelectAggregator extends Aggregator {
|
|
@@ -25,13 +25,7 @@ export default class SelectAggregator extends Aggregator {
|
|
|
25
25
|
orderBy: (column?: AbstractColumn<ColumnType<{}>, boolean, boolean, any> | undefined, order?: Order | undefined) => SelectAggregator;
|
|
26
26
|
distinct: (column?: AbstractColumn<ColumnType<{}>, boolean, boolean, any> | undefined) => SelectAggregator;
|
|
27
27
|
appendFrom: (tableName: string) => SelectAggregator;
|
|
28
|
-
join: (joins:
|
|
29
|
-
join: Join<any>;
|
|
30
|
-
partial?: {
|
|
31
|
-
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, any>;
|
|
32
|
-
} | undefined;
|
|
33
|
-
id?: number | undefined;
|
|
34
|
-
}[]) => SelectAggregator;
|
|
28
|
+
join: (joins: Array<JoinType<AbstractTable<any>>>) => SelectAggregator;
|
|
35
29
|
buildQuery: () => {
|
|
36
30
|
query: string;
|
|
37
31
|
values: Array<any>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const ecranate_1 = require("../../utils/ecranate");
|
|
7
|
+
const order_1 = __importDefault(require("../highLvlBuilders/order"));
|
|
8
|
+
const abstractAggregator_1 = __importDefault(require("./abstractAggregator"));
|
|
9
|
+
class SelectAggregator extends abstractAggregator_1.default {
|
|
10
|
+
constructor(table, partial) {
|
|
11
|
+
super(table, partial);
|
|
12
|
+
this._from = [];
|
|
13
|
+
this._filters = [];
|
|
14
|
+
this._select = ['SELECT'];
|
|
15
|
+
this._join = [];
|
|
16
|
+
this._limit = [];
|
|
17
|
+
this._offset = [];
|
|
18
|
+
this._distinct = [];
|
|
19
|
+
// private _groupBy: Array<string> = [];
|
|
20
|
+
this._orderBy = [];
|
|
21
|
+
this._values = [];
|
|
22
|
+
this._joinCache = {};
|
|
23
|
+
this.filters = (filters) => {
|
|
24
|
+
if (filters) {
|
|
25
|
+
const queryBuilder = filters.toQuery({ position: this._values.length + 1, session: this._table.db.session() });
|
|
26
|
+
this._filters.push('WHERE ');
|
|
27
|
+
this._filters.push(queryBuilder.query);
|
|
28
|
+
this._values.push(...queryBuilder.values);
|
|
29
|
+
}
|
|
30
|
+
return this;
|
|
31
|
+
};
|
|
32
|
+
this.limit = (limit) => {
|
|
33
|
+
if (limit) {
|
|
34
|
+
this._limit.push('LIMIT ');
|
|
35
|
+
this._limit.push(limit.toString());
|
|
36
|
+
}
|
|
37
|
+
return this;
|
|
38
|
+
};
|
|
39
|
+
this.offset = (offset) => {
|
|
40
|
+
if (offset) {
|
|
41
|
+
this._offset.push('OFFSET ');
|
|
42
|
+
this._offset.push(offset.toString());
|
|
43
|
+
}
|
|
44
|
+
return this;
|
|
45
|
+
};
|
|
46
|
+
this.orderBy = (column, order) => {
|
|
47
|
+
if (column !== null && column !== undefined) {
|
|
48
|
+
this._orderBy.push('ORDER BY ');
|
|
49
|
+
const columnParent = this._joinCache[column.getParent().tableName()] ? this._joinCache[column.getParent().tableName()] : column.getParent().tableName();
|
|
50
|
+
this._orderBy.push(`${columnParent}.${ecranate_1.ecranate(column.getColumnName())} `);
|
|
51
|
+
this._orderBy.push(order_1.default[order]);
|
|
52
|
+
}
|
|
53
|
+
return this;
|
|
54
|
+
};
|
|
55
|
+
this.distinct = (column) => {
|
|
56
|
+
if (column) {
|
|
57
|
+
this._distinct.push(` DISTINCT ON(${column.getParent().tableName()}.${ecranate_1.ecranate(column.getColumnName())}) `);
|
|
58
|
+
}
|
|
59
|
+
return this;
|
|
60
|
+
};
|
|
61
|
+
this.appendFrom = (tableName) => {
|
|
62
|
+
this._from.push('FROM ');
|
|
63
|
+
this._from.push(tableName);
|
|
64
|
+
// this._from.push(`${tableName} AS ${tableName}_0`);
|
|
65
|
+
// this._joinCache[tableName] = tableName;
|
|
66
|
+
return this;
|
|
67
|
+
};
|
|
68
|
+
this.join = (joins) => {
|
|
69
|
+
const tableFrom = this._table.tableName();
|
|
70
|
+
for (const [index, join] of joins.entries()) {
|
|
71
|
+
const { table: tableToName, originalName, onExpression, type, columns, } = join;
|
|
72
|
+
const selectString = this.generateSelectArray(tableToName, Object.values(columns)).join('');
|
|
73
|
+
this._fields.push(', ');
|
|
74
|
+
this._fields.push(selectString);
|
|
75
|
+
this._join.push('\n');
|
|
76
|
+
this._join.push(type);
|
|
77
|
+
this._join.push(' ');
|
|
78
|
+
this._join.push(originalName);
|
|
79
|
+
this._join.push(' ');
|
|
80
|
+
this._join.push(`AS ${tableToName}`);
|
|
81
|
+
this._join.push('\n');
|
|
82
|
+
this._join.push('ON ');
|
|
83
|
+
const joinExpr = onExpression.toQuery({ position: this._values.length + 1, session: this._table.db.session() });
|
|
84
|
+
this._values.push(...joinExpr.values);
|
|
85
|
+
this._join.push(joinExpr.query);
|
|
86
|
+
}
|
|
87
|
+
return this;
|
|
88
|
+
};
|
|
89
|
+
this.buildQuery = () => {
|
|
90
|
+
this._select.push(this._distinct.join(''));
|
|
91
|
+
this._select.push(this._fields.join(''));
|
|
92
|
+
this._select.push('\n');
|
|
93
|
+
this._select.push(this._from.join(''));
|
|
94
|
+
this._select.push('\n');
|
|
95
|
+
this._select.push(this._join.join(''));
|
|
96
|
+
if (this._join.length > 0) {
|
|
97
|
+
this._select.push('\n');
|
|
98
|
+
}
|
|
99
|
+
this._select.push(this._filters.join(''));
|
|
100
|
+
this._select.push('\n');
|
|
101
|
+
this._select.push(this._orderBy.join(''));
|
|
102
|
+
this._select.push('\n');
|
|
103
|
+
this._select.push(this._limit.join(''));
|
|
104
|
+
this._select.push('\n');
|
|
105
|
+
this._select.push(this._offset.join(''));
|
|
106
|
+
return { query: this._select.join(''), values: this._values };
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.default = SelectAggregator;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { AbstractColumn } from '../../columns/column';
|
|
2
|
+
import ColumnType from '../../columns/types/columnType';
|
|
3
|
+
import { AbstractTable } from '../../tables';
|
|
4
|
+
import Order from '../highLvlBuilders/order';
|
|
5
|
+
import Join from '../joinBuilders/join';
|
|
6
|
+
import Expr from '../requestBuilders/where/where';
|
|
7
|
+
import Aggregator from './abstractAggregator';
|
|
8
|
+
export default class SelectAggregatorV1 extends Aggregator {
|
|
9
|
+
private _from;
|
|
10
|
+
private _filters;
|
|
11
|
+
private _select;
|
|
12
|
+
private _join;
|
|
13
|
+
private _limit;
|
|
14
|
+
private _offset;
|
|
15
|
+
private _distinct;
|
|
16
|
+
private _orderBy;
|
|
17
|
+
private _values;
|
|
18
|
+
private _joinCache;
|
|
19
|
+
constructor(table: AbstractTable<any>, partial?: {
|
|
20
|
+
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, AbstractTable<any>>;
|
|
21
|
+
});
|
|
22
|
+
filters: (filters: Expr) => SelectAggregatorV1;
|
|
23
|
+
limit: (limit?: number | undefined) => SelectAggregatorV1;
|
|
24
|
+
offset: (offset?: number | undefined) => SelectAggregatorV1;
|
|
25
|
+
orderBy: (column?: AbstractColumn<ColumnType<{}>, boolean, boolean, any> | undefined, order?: Order | undefined) => SelectAggregatorV1;
|
|
26
|
+
distinct: (column?: AbstractColumn<ColumnType<{}>, boolean, boolean, any> | undefined) => SelectAggregatorV1;
|
|
27
|
+
appendFrom: (tableName: string) => SelectAggregatorV1;
|
|
28
|
+
join: (joins: {
|
|
29
|
+
join: Join<any>;
|
|
30
|
+
partial?: {
|
|
31
|
+
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, any>;
|
|
32
|
+
} | undefined;
|
|
33
|
+
id?: number | undefined;
|
|
34
|
+
}[]) => SelectAggregatorV1;
|
|
35
|
+
buildQuery: () => {
|
|
36
|
+
query: string;
|
|
37
|
+
values: Array<any>;
|
|
38
|
+
};
|
|
39
|
+
}
|
package/{src/builders/aggregators/selectAggregator.js → builders/aggregators/selectAggregatorV1.js}
RENAMED
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const ecranate_1 = require("../../utils/ecranate");
|
|
7
7
|
const order_1 = __importDefault(require("../highLvlBuilders/order"));
|
|
8
8
|
const abstractAggregator_1 = __importDefault(require("./abstractAggregator"));
|
|
9
|
-
class
|
|
9
|
+
class SelectAggregatorV1 extends abstractAggregator_1.default {
|
|
10
10
|
// public constructor(table: AbstractTable<any>);
|
|
11
11
|
// public constructor(table: AbstractTable<any>, partial: {[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, AbstractTable<any>>})
|
|
12
12
|
constructor(table, partial) {
|
|
@@ -24,7 +24,7 @@ class SelectAggregator extends abstractAggregator_1.default {
|
|
|
24
24
|
this._joinCache = {};
|
|
25
25
|
this.filters = (filters) => {
|
|
26
26
|
if (filters) {
|
|
27
|
-
const queryBuilder = filters.
|
|
27
|
+
const queryBuilder = filters.toQueryV1({ position: 1, tableCache: this._joinCache, session: this._table.db.session() });
|
|
28
28
|
this._filters.push('WHERE ');
|
|
29
29
|
this._filters.push(queryBuilder.query);
|
|
30
30
|
this._values = queryBuilder.values;
|
|
@@ -140,4 +140,4 @@ class SelectAggregator extends abstractAggregator_1.default {
|
|
|
140
140
|
};
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
|
-
exports.default =
|
|
143
|
+
exports.default = SelectAggregatorV1;
|
|
File without changes
|
|
File without changes
|
|
@@ -4,9 +4,8 @@ import { ISession } from '../../db/session';
|
|
|
4
4
|
import BaseLogger from '../../logger/abstractLogger';
|
|
5
5
|
import { AbstractTable } from '../../tables';
|
|
6
6
|
import { ExtractModel } from '../../tables/inferTypes';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
} = {}> {
|
|
7
|
+
import { EmptyPartial } from './joins/selectJoinBuilder';
|
|
8
|
+
export default abstract class TableRequestBuilder<TTable extends AbstractTable<TTable>, TPartial extends EmptyPartial<TTable>> {
|
|
10
9
|
protected _table: TTable;
|
|
11
10
|
protected _session: ISession;
|
|
12
11
|
protected _mappedServiceToDb: {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import AbstractTable from '@/tables/abstractTable';
|
|
2
|
+
import { FullOrPartial } from '@/tables/inferTypes';
|
|
3
|
+
export default class JoinBuilderResponses<TResponses extends FullOrPartial<AbstractTable<any>, any>[]> {
|
|
4
|
+
private responses;
|
|
5
|
+
private responsesType;
|
|
6
|
+
constructor(responses: TResponses[]);
|
|
7
|
+
map: <M>(imac: (...args_0: TResponses) => M) => M[];
|
|
8
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class JoinBuilderResponses {
|
|
4
|
+
constructor(responses) {
|
|
5
|
+
this.responses = responses;
|
|
6
|
+
this.map = (imac) => {
|
|
7
|
+
const objects = new Array();
|
|
8
|
+
for (let i = 0; i < this.responses[0].length; i += 1) {
|
|
9
|
+
const responses = this.responses.map((res) => res[i]);
|
|
10
|
+
objects.push(imac(...responses));
|
|
11
|
+
}
|
|
12
|
+
return objects;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.default = JoinBuilderResponses;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import AbstractTable from '@/tables/abstractTable';
|
|
2
|
+
import ColumnType from '../../../../columns/types/columnType';
|
|
3
|
+
import { AbstractColumn } from '../../../../columns/column';
|
|
4
|
+
export declare class JoinedColumn<TJoinedTableColumn extends AbstractColumn<ColumnType>> implements ProxyHandler<TJoinedTableColumn> {
|
|
5
|
+
private tableObj;
|
|
6
|
+
private aliasCounter;
|
|
7
|
+
private parentName;
|
|
8
|
+
constructor(tableObj: any, aliasCounter: number);
|
|
9
|
+
get(columnObj: TJoinedTableColumn, prop: string): (() => string) | TJoinedTableColumn[keyof TJoinedTableColumn];
|
|
10
|
+
}
|
|
11
|
+
export declare class JoinedHandler<TJoinedTable extends AbstractTable<TJoinedTable>> implements ProxyHandler<TJoinedTable> {
|
|
12
|
+
private aliasCounter;
|
|
13
|
+
private tableName;
|
|
14
|
+
constructor(aliasCounter: number);
|
|
15
|
+
get(tableObj: TJoinedTable, prop: string | symbol, receiver: any): any;
|
|
16
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable max-classes-per-file */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.JoinedHandler = exports.JoinedColumn = void 0;
|
|
5
|
+
const column_1 = require("../../../../columns/column");
|
|
6
|
+
class JoinedColumn {
|
|
7
|
+
constructor(tableObj, aliasCounter) {
|
|
8
|
+
this.tableObj = tableObj;
|
|
9
|
+
this.aliasCounter = aliasCounter;
|
|
10
|
+
this.parentName = 'getParentName';
|
|
11
|
+
}
|
|
12
|
+
get(columnObj, prop) {
|
|
13
|
+
if (prop === this.parentName) {
|
|
14
|
+
return () => `${this.tableObj.tableName()}_${this.aliasCounter}`;
|
|
15
|
+
}
|
|
16
|
+
return columnObj[prop];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.JoinedColumn = JoinedColumn;
|
|
20
|
+
class JoinedHandler {
|
|
21
|
+
constructor(aliasCounter) {
|
|
22
|
+
this.aliasCounter = aliasCounter;
|
|
23
|
+
this.tableName = 'tableName';
|
|
24
|
+
}
|
|
25
|
+
get(tableObj, prop, receiver) {
|
|
26
|
+
if (prop === this.tableName) {
|
|
27
|
+
return () => `${tableObj.tableName()}_${this.aliasCounter}`;
|
|
28
|
+
}
|
|
29
|
+
const columnProp = tableObj[prop];
|
|
30
|
+
if (columnProp instanceof column_1.AbstractColumn) {
|
|
31
|
+
return new Proxy(columnProp, new JoinedColumn(tableObj, this.aliasCounter));
|
|
32
|
+
}
|
|
33
|
+
if (prop === 'mapServiceToDb') {
|
|
34
|
+
return () => Object.getOwnPropertyNames(tableObj)
|
|
35
|
+
.reduce((res, fieldName) => {
|
|
36
|
+
const field1 = tableObj[fieldName];
|
|
37
|
+
if (field1 instanceof column_1.AbstractColumn) {
|
|
38
|
+
const field = new Proxy(field1, new JoinedColumn(tableObj, this.aliasCounter));
|
|
39
|
+
res[fieldName] = field;
|
|
40
|
+
}
|
|
41
|
+
return res;
|
|
42
|
+
}, {});
|
|
43
|
+
}
|
|
44
|
+
return tableObj[prop];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.JoinedHandler = JoinedHandler;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ExtractPartialObjectFromColumns, FullOrPartial, PartialFor } from '../../../tables/inferTypes';
|
|
2
|
+
import AbstractTable from '../../../tables/abstractTable';
|
|
3
|
+
import BaseLogger from '../../../logger/abstractLogger';
|
|
4
|
+
import ColumnType from '../../../columns/types/columnType';
|
|
5
|
+
import { AbstractColumn } from '../../../columns/column';
|
|
6
|
+
import Expr from '../../requestBuilders/where/where';
|
|
7
|
+
import Order from '../order';
|
|
8
|
+
import JoinBuilderResponses from './joinBuilderResponse';
|
|
9
|
+
export interface JoinType<T extends AbstractTable<T>> {
|
|
10
|
+
table: string;
|
|
11
|
+
columns: ExtractPartialObjectFromColumns<T>;
|
|
12
|
+
onExpression: Expr;
|
|
13
|
+
type: string;
|
|
14
|
+
originalName: string;
|
|
15
|
+
}
|
|
16
|
+
export declare type TableIfPartialIsUndefined<TPartial, TJoinedTableMapped> = TPartial extends undefined ? TJoinedTableMapped : TPartial;
|
|
17
|
+
export declare type EmptyPartial<T extends AbstractTable<T>> = PartialFor<T> | undefined;
|
|
18
|
+
export default class JoinBuilder<TJoins extends {
|
|
19
|
+
[name: string]: any;
|
|
20
|
+
}[], TJoinsResponses extends FullOrPartial<AbstractTable<any>, any>[]> {
|
|
21
|
+
private joins;
|
|
22
|
+
private aliasCounter;
|
|
23
|
+
private rootTable;
|
|
24
|
+
private _filter;
|
|
25
|
+
private _props;
|
|
26
|
+
private _orderBy?;
|
|
27
|
+
private _order?;
|
|
28
|
+
private _distinct?;
|
|
29
|
+
private _partial?;
|
|
30
|
+
private _logger?;
|
|
31
|
+
private joinedTables;
|
|
32
|
+
private joinResponses;
|
|
33
|
+
constructor(joins: TJoins, onTableOriginalName: string, aliasCounter: number, onExpression: Expr, onTable: AbstractTable<any>, type: string, rootTable: AbstractTable<any>, _filter: Expr, _props: {
|
|
34
|
+
limit?: number;
|
|
35
|
+
offset?: number;
|
|
36
|
+
}, _orderBy?: AbstractColumn<ColumnType<{}>, boolean, boolean, any> | undefined, _order?: Order | undefined, _distinct?: AbstractColumn<ColumnType<{}>, boolean, boolean, any> | undefined, _partial?: any, _logger?: BaseLogger | undefined);
|
|
37
|
+
innerJoin<TJoinedTable extends AbstractTable<TJoinedTable>, TPartial extends EmptyPartial<TJoinedTable> = undefined>(value: TJoinedTable, callback: (...args: [...TJoins, TableIfPartialIsUndefined<TPartial, ExtractPartialObjectFromColumns<TJoinedTable>>]) => Expr, partial?: TPartial): JoinBuilder<[...TJoins, TableIfPartialIsUndefined<TPartial, ExtractPartialObjectFromColumns<TJoinedTable>>], [...TJoinsResponses, FullOrPartial<TJoinedTable, TPartial>]>;
|
|
38
|
+
leftJoin<TJoinedTable extends AbstractTable<TJoinedTable>, TPartial extends EmptyPartial<TJoinedTable> = undefined>(value: TJoinedTable, callback: (...args: [...TJoins, TableIfPartialIsUndefined<TPartial, ExtractPartialObjectFromColumns<TJoinedTable>>]) => Expr, partial?: TPartial): JoinBuilder<[...TJoins, TableIfPartialIsUndefined<TPartial, ExtractPartialObjectFromColumns<TJoinedTable>>], [...TJoinsResponses, FullOrPartial<TJoinedTable, TPartial>]>;
|
|
39
|
+
rightJoin<TJoinedTable extends AbstractTable<TJoinedTable>, TPartial extends EmptyPartial<TJoinedTable> = undefined>(value: TJoinedTable, callback: (...args: [...TJoins, TableIfPartialIsUndefined<TPartial, ExtractPartialObjectFromColumns<TJoinedTable>>]) => Expr, partial?: TPartial): JoinBuilder<[...TJoins, TableIfPartialIsUndefined<TPartial, ExtractPartialObjectFromColumns<TJoinedTable>>], [...TJoinsResponses, FullOrPartial<TJoinedTable, TPartial>]>;
|
|
40
|
+
fullJoin<TJoinedTable extends AbstractTable<TJoinedTable>, TPartial extends EmptyPartial<TJoinedTable> = undefined>(value: TJoinedTable, callback: (...args: [...TJoins, TableIfPartialIsUndefined<TPartial, ExtractPartialObjectFromColumns<TJoinedTable>>]) => Expr, partial?: TPartial): JoinBuilder<[...TJoins, TableIfPartialIsUndefined<TPartial, ExtractPartialObjectFromColumns<TJoinedTable>>], [...TJoinsResponses, FullOrPartial<TJoinedTable, TPartial>]>;
|
|
41
|
+
where: (callback: (...args_0: TJoins) => Expr) => this;
|
|
42
|
+
execute(): Promise<JoinBuilderResponses<TJoinsResponses>>;
|
|
43
|
+
private join;
|
|
44
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
const responseMapper_1 = __importDefault(require("../../../mappers/responseMapper"));
|
|
26
|
+
const builderError_1 = __importStar(require("../../../errors/builderError"));
|
|
27
|
+
const select_1 = __importDefault(require("../../lowLvlBuilders/selects/select"));
|
|
28
|
+
const joinBuilderResponse_1 = __importDefault(require("./joinBuilderResponse"));
|
|
29
|
+
const joinProxies_1 = require("./proxies/joinProxies");
|
|
30
|
+
class JoinBuilder {
|
|
31
|
+
constructor(joins, onTableOriginalName, aliasCounter, onExpression, onTable, type, rootTable, _filter, _props, _orderBy, _order, _distinct, _partial, _logger) {
|
|
32
|
+
this.joins = joins;
|
|
33
|
+
this.aliasCounter = aliasCounter;
|
|
34
|
+
this.rootTable = rootTable;
|
|
35
|
+
this._filter = _filter;
|
|
36
|
+
this._props = _props;
|
|
37
|
+
this._orderBy = _orderBy;
|
|
38
|
+
this._order = _order;
|
|
39
|
+
this._distinct = _distinct;
|
|
40
|
+
this._partial = _partial;
|
|
41
|
+
this._logger = _logger;
|
|
42
|
+
this.joinedTables = [];
|
|
43
|
+
this.where = (callback) => {
|
|
44
|
+
this._filter = callback(...this.joins);
|
|
45
|
+
return this;
|
|
46
|
+
};
|
|
47
|
+
this.joinedTables.push({
|
|
48
|
+
table: onTable.tableName(),
|
|
49
|
+
columns: joins[1],
|
|
50
|
+
originalName: onTableOriginalName,
|
|
51
|
+
onExpression,
|
|
52
|
+
type,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
innerJoin(value, callback, partial) {
|
|
56
|
+
return this.join(value, callback, 'INNER JOIN', partial);
|
|
57
|
+
}
|
|
58
|
+
leftJoin(value, callback, partial) {
|
|
59
|
+
return this.join(value, callback, 'LEFT JOIN', partial);
|
|
60
|
+
}
|
|
61
|
+
rightJoin(value, callback, partial) {
|
|
62
|
+
return this.join(value, callback, 'RIGHT JOIN', partial);
|
|
63
|
+
}
|
|
64
|
+
fullJoin(value, callback, partial) {
|
|
65
|
+
return this.join(value, callback, 'FULL JOIN', partial);
|
|
66
|
+
}
|
|
67
|
+
async execute() {
|
|
68
|
+
const queryBuilder = select_1.default
|
|
69
|
+
.from(this.rootTable, this._partial)
|
|
70
|
+
.distinct(this._distinct)
|
|
71
|
+
.joined(this.joinedTables)
|
|
72
|
+
.limit(this._props.limit)
|
|
73
|
+
.offset(this._props.offset)
|
|
74
|
+
.filteredBy(this._filter)
|
|
75
|
+
.orderBy(this._orderBy, this._order);
|
|
76
|
+
let query = '';
|
|
77
|
+
let values = [];
|
|
78
|
+
try {
|
|
79
|
+
const builderResult = queryBuilder.build();
|
|
80
|
+
query = builderResult.query;
|
|
81
|
+
values = builderResult.values;
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
throw new builderError_1.default(builderError_1.BuilderType.JOINED_SELECT, this.rootTable.tableName(), Object.values(this.rootTable.mapServiceToDb()), e, this.rootTable.db.session(), this._filter);
|
|
85
|
+
}
|
|
86
|
+
if (this._logger) {
|
|
87
|
+
this._logger.info(`Selecting from ${this.rootTable.tableName()} using query:\n ${query}`);
|
|
88
|
+
this._logger.info(`Values for query:\n ${values}`);
|
|
89
|
+
}
|
|
90
|
+
const result = await this.rootTable.db.session().execute(query, values);
|
|
91
|
+
const mappedResponse = this.joins.map((joinedTable) => responseMapper_1.default.map(joinedTable, result));
|
|
92
|
+
return new joinBuilderResponse_1.default(mappedResponse);
|
|
93
|
+
}
|
|
94
|
+
join(value, callback, joinType, partial) {
|
|
95
|
+
this.aliasCounter += 1;
|
|
96
|
+
const valueAsProxy = new Proxy(value, new joinProxies_1.JoinedHandler(this.aliasCounter));
|
|
97
|
+
if (partial) {
|
|
98
|
+
for (const key of Object.keys(partial)) {
|
|
99
|
+
// eslint-disable-next-line no-param-reassign
|
|
100
|
+
partial[key] = new Proxy(partial[key], new joinProxies_1.JoinedColumn(value, this.aliasCounter));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const obj = partial ? partial
|
|
104
|
+
: valueAsProxy.mapServiceToDb();
|
|
105
|
+
const onExpression = callback(...this.joins, obj);
|
|
106
|
+
this.joins.push(partial !== null && partial !== void 0 ? partial : valueAsProxy.mapServiceToDb());
|
|
107
|
+
this.joinedTables.push({
|
|
108
|
+
table: valueAsProxy.tableName(), columns: obj, originalName: value.tableName(), onExpression, type: joinType,
|
|
109
|
+
});
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.default = JoinBuilder;
|
|
File without changes
|
|
File without changes
|