prostgles-server 4.2.183 → 4.2.185
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/.github/workflows/main.yml +15 -15
- package/.prettierignore +2 -0
- package/README.md +1 -1
- package/dist/Auth/AuthHandler.d.ts +1 -1
- package/dist/Auth/AuthHandler.d.ts.map +1 -1
- package/dist/Auth/AuthHandler.js +64 -32
- package/dist/Auth/AuthHandler.js.map +1 -1
- package/dist/Auth/AuthTypes.d.ts +15 -1
- package/dist/Auth/AuthTypes.d.ts.map +1 -1
- package/dist/Auth/getSafeReturnURL.d.ts.map +1 -1
- package/dist/Auth/getSafeReturnURL.js.map +1 -1
- package/dist/Auth/sendEmail.d.ts.map +1 -1
- package/dist/Auth/sendEmail.js +6 -6
- package/dist/Auth/sendEmail.js.map +1 -1
- package/dist/Auth/setAuthProviders.d.ts +1 -1
- package/dist/Auth/setAuthProviders.d.ts.map +1 -1
- package/dist/Auth/setAuthProviders.js +15 -8
- package/dist/Auth/setAuthProviders.js.map +1 -1
- package/dist/Auth/setEmailProvider.d.ts.map +1 -1
- package/dist/Auth/setEmailProvider.js +23 -4
- package/dist/Auth/setEmailProvider.js.map +1 -1
- package/dist/Auth/setupAuthRoutes.d.ts.map +1 -1
- package/dist/Auth/setupAuthRoutes.js +27 -9
- package/dist/Auth/setupAuthRoutes.js.map +1 -1
- package/dist/DBEventsManager.d.ts.map +1 -1
- package/dist/DBEventsManager.js +24 -19
- package/dist/DBEventsManager.js.map +1 -1
- package/dist/DBSchemaBuilder.d.ts.map +1 -1
- package/dist/DBSchemaBuilder.js +18 -5
- package/dist/DBSchemaBuilder.js.map +1 -1
- package/dist/DboBuilder/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilder.js +7 -2
- package/dist/DboBuilder/DboBuilder.js.map +1 -1
- package/dist/DboBuilder/DboBuilderTypes.d.ts +4 -4
- package/dist/DboBuilder/DboBuilderTypes.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilderTypes.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/Functions.d.ts +2 -2
- package/dist/DboBuilder/QueryBuilder/Functions.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/Functions.js +293 -173
- package/dist/DboBuilder/QueryBuilder/Functions.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.d.ts +2 -2
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.js +52 -29
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getJoinQuery.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getJoinQuery.js +51 -32
- package/dist/DboBuilder/QueryBuilder/getJoinQuery.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getNewQuery.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getNewQuery.js +48 -25
- package/dist/DboBuilder/QueryBuilder/getNewQuery.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getSelectQuery.d.ts +1 -1
- package/dist/DboBuilder/QueryBuilder/getSelectQuery.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getSelectQuery.js +32 -23
- package/dist/DboBuilder/QueryBuilder/getSelectQuery.js.map +1 -1
- package/dist/DboBuilder/QueryStreamer.d.ts +2 -2
- package/dist/DboBuilder/QueryStreamer.d.ts.map +1 -1
- package/dist/DboBuilder/QueryStreamer.js +68 -23
- package/dist/DboBuilder/QueryStreamer.js.map +1 -1
- package/dist/DboBuilder/TableHandler/DataValidator.d.ts +1 -1
- package/dist/DboBuilder/TableHandler/DataValidator.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/DataValidator.js +79 -43
- package/dist/DboBuilder/TableHandler/DataValidator.js.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.js +39 -15
- package/dist/DboBuilder/TableHandler/TableHandler.js.map +1 -1
- package/dist/DboBuilder/TableHandler/delete.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/delete.js +44 -13
- package/dist/DboBuilder/TableHandler/delete.js.map +1 -1
- package/dist/DboBuilder/TableHandler/insert.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/insert.js +81 -22
- package/dist/DboBuilder/TableHandler/insert.js.map +1 -1
- package/dist/DboBuilder/TableHandler/insertTest.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/insertTest.js.map +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js +7 -4
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js.map +1 -1
- package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.js +24 -5
- package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.js.map +1 -1
- package/dist/DboBuilder/TableHandler/update.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/update.js +16 -4
- package/dist/DboBuilder/TableHandler/update.js.map +1 -1
- package/dist/DboBuilder/TableHandler/updateBatch.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/updateBatch.js +33 -10
- package/dist/DboBuilder/TableHandler/updateBatch.js.map +1 -1
- package/dist/DboBuilder/TableHandler/updateFile.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/updateFile.js +24 -6
- package/dist/DboBuilder/TableHandler/updateFile.js.map +1 -1
- package/dist/DboBuilder/TableHandler/upsert.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/upsert.js +22 -6
- package/dist/DboBuilder/TableHandler/upsert.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts +5 -5
- package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/ViewHandler.js +64 -36
- package/dist/DboBuilder/ViewHandler/ViewHandler.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/count.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/count.js +21 -7
- package/dist/DboBuilder/ViewHandler/count.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/find.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/find.js +76 -22
- package/dist/DboBuilder/ViewHandler/find.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsCondition.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsCondition.js +19 -10
- package/dist/DboBuilder/ViewHandler/getExistsCondition.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsFilters.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsFilters.js +12 -5
- package/dist/DboBuilder/ViewHandler/getExistsFilters.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getInfo.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getInfo.js +27 -9
- package/dist/DboBuilder/ViewHandler/getInfo.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getTableJoinQuery.d.ts +2 -2
- package/dist/DboBuilder/ViewHandler/getTableJoinQuery.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getTableJoinQuery.js +42 -23
- package/dist/DboBuilder/ViewHandler/getTableJoinQuery.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.js +22 -9
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseFieldFilter.d.ts +4 -4
- package/dist/DboBuilder/ViewHandler/parseFieldFilter.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseFieldFilter.js +13 -11
- package/dist/DboBuilder/ViewHandler/parseFieldFilter.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseJoinPath.d.ts +1 -1
- package/dist/DboBuilder/ViewHandler/parseJoinPath.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseJoinPath.js +44 -29
- package/dist/DboBuilder/ViewHandler/parseJoinPath.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareSortItems.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareSortItems.js +36 -27
- package/dist/DboBuilder/ViewHandler/prepareSortItems.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareWhere.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareWhere.js +16 -12
- package/dist/DboBuilder/ViewHandler/prepareWhere.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/size.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/size.js +24 -7
- package/dist/DboBuilder/ViewHandler/size.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/subscribe.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/subscribe.js +40 -12
- package/dist/DboBuilder/ViewHandler/subscribe.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/validateViewRules.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/validateViewRules.js +20 -5
- package/dist/DboBuilder/ViewHandler/validateViewRules.js.map +1 -1
- package/dist/DboBuilder/dboBuilderUtils.d.ts.map +1 -1
- package/dist/DboBuilder/dboBuilderUtils.js +18 -7
- package/dist/DboBuilder/dboBuilderUtils.js.map +1 -1
- package/dist/DboBuilder/getColumns.d.ts.map +1 -1
- package/dist/DboBuilder/getColumns.js +22 -7
- package/dist/DboBuilder/getColumns.js.map +1 -1
- package/dist/DboBuilder/getCondition.d.ts.map +1 -1
- package/dist/DboBuilder/getCondition.js +43 -30
- package/dist/DboBuilder/getCondition.js.map +1 -1
- package/dist/DboBuilder/getSubscribeRelatedTables.d.ts.map +1 -1
- package/dist/DboBuilder/getSubscribeRelatedTables.js +38 -27
- package/dist/DboBuilder/getSubscribeRelatedTables.js.map +1 -1
- package/dist/DboBuilder/getTablesForSchemaPostgresSQL.d.ts.map +1 -1
- package/dist/DboBuilder/getTablesForSchemaPostgresSQL.js +9 -9
- package/dist/DboBuilder/getTablesForSchemaPostgresSQL.js.map +1 -1
- package/dist/DboBuilder/insertNestedRecords.d.ts +3 -3
- package/dist/DboBuilder/insertNestedRecords.d.ts.map +1 -1
- package/dist/DboBuilder/insertNestedRecords.js +79 -44
- package/dist/DboBuilder/insertNestedRecords.js.map +1 -1
- package/dist/DboBuilder/parseUpdateRules.d.ts.map +1 -1
- package/dist/DboBuilder/parseUpdateRules.js +38 -14
- package/dist/DboBuilder/parseUpdateRules.js.map +1 -1
- package/dist/DboBuilder/prepareShortestJoinPaths.d.ts.map +1 -1
- package/dist/DboBuilder/prepareShortestJoinPaths.js +56 -31
- package/dist/DboBuilder/prepareShortestJoinPaths.js.map +1 -1
- package/dist/DboBuilder/runSQL.d.ts.map +1 -1
- package/dist/DboBuilder/runSQL.js +41 -21
- package/dist/DboBuilder/runSQL.js.map +1 -1
- package/dist/DboBuilder/runTransaction.d.ts +1 -1
- package/dist/DboBuilder/runTransaction.d.ts.map +1 -1
- package/dist/DboBuilder/runTransaction.js +2 -2
- package/dist/DboBuilder/runTransaction.js.map +1 -1
- package/dist/DboBuilder/sqlErrCodeToMsg.d.ts.map +1 -1
- package/dist/DboBuilder/sqlErrCodeToMsg.js +297 -38
- package/dist/DboBuilder/sqlErrCodeToMsg.js.map +1 -1
- package/dist/DboBuilder/uploadFile.d.ts.map +1 -1
- package/dist/DboBuilder/uploadFile.js +33 -9
- package/dist/DboBuilder/uploadFile.js.map +1 -1
- package/dist/Event_Trigger_Tags.d.ts +1 -1
- package/dist/Event_Trigger_Tags.d.ts.map +1 -1
- package/dist/Event_Trigger_Tags.js +1 -1
- package/dist/Event_Trigger_Tags.js.map +1 -1
- package/dist/FileManager/FileManager.d.ts.map +1 -1
- package/dist/FileManager/FileManager.js +6 -3
- package/dist/FileManager/FileManager.js.map +1 -1
- package/dist/FileManager/getValidatedFileType.d.ts.map +1 -1
- package/dist/FileManager/getValidatedFileType.js +18 -16
- package/dist/FileManager/getValidatedFileType.js.map +1 -1
- package/dist/FileManager/initFileManager.d.ts.map +1 -1
- package/dist/FileManager/initFileManager.js +7 -1
- package/dist/FileManager/initFileManager.js.map +1 -1
- package/dist/FileManager/upload.d.ts +1 -1
- package/dist/FileManager/upload.d.ts.map +1 -1
- package/dist/FileManager/upload.js +3 -3
- package/dist/FileManager/upload.js.map +1 -1
- package/dist/FileManager/uploadStream.d.ts +1 -1
- package/dist/FileManager/uploadStream.d.ts.map +1 -1
- package/dist/FileManager/uploadStream.js +6 -7
- package/dist/FileManager/uploadStream.js.map +1 -1
- package/dist/Filtering.d.ts +3 -3
- package/dist/Filtering.d.ts.map +1 -1
- package/dist/Filtering.js +70 -37
- package/dist/Filtering.js.map +1 -1
- package/dist/JSONBValidation/validate_jsonb_schema_sql.d.ts.map +1 -1
- package/dist/JSONBValidation/validate_jsonb_schema_sql.js +1 -4
- package/dist/JSONBValidation/validate_jsonb_schema_sql.js.map +1 -1
- package/dist/JSONBValidation/validation.d.ts.map +1 -1
- package/dist/JSONBValidation/validation.js +46 -24
- package/dist/JSONBValidation/validation.js.map +1 -1
- package/dist/Logging.d.ts +2 -2
- package/dist/Logging.d.ts.map +1 -1
- package/dist/PostgresNotifListenManager.d.ts.map +1 -1
- package/dist/PostgresNotifListenManager.js +20 -22
- package/dist/PostgresNotifListenManager.js.map +1 -1
- package/dist/Prostgles.d.ts +1 -1
- package/dist/Prostgles.d.ts.map +1 -1
- package/dist/Prostgles.js +37 -11
- package/dist/Prostgles.js.map +1 -1
- package/dist/ProstglesTypes.d.ts.map +1 -1
- package/dist/ProstglesTypes.js +6 -1
- package/dist/ProstglesTypes.js.map +1 -1
- package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/PubSubManager.js +10 -5
- package/dist/PubSubManager/PubSubManager.js.map +1 -1
- package/dist/PubSubManager/addSub.d.ts.map +1 -1
- package/dist/PubSubManager/addSub.js +4 -6
- package/dist/PubSubManager/addSub.js.map +1 -1
- package/dist/PubSubManager/addSync.d.ts.map +1 -1
- package/dist/PubSubManager/addSync.js +10 -6
- package/dist/PubSubManager/addSync.js.map +1 -1
- package/dist/PubSubManager/getCreatePubSubManagerError.d.ts.map +1 -1
- package/dist/PubSubManager/getCreatePubSubManagerError.js +3 -1
- package/dist/PubSubManager/getCreatePubSubManagerError.js.map +1 -1
- package/dist/PubSubManager/getPubSubManagerInitQuery.d.ts.map +1 -1
- package/dist/PubSubManager/getPubSubManagerInitQuery.js +8 -8
- package/dist/PubSubManager/getPubSubManagerInitQuery.js.map +1 -1
- package/dist/PubSubManager/initPubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/initPubSubManager.js +7 -9
- package/dist/PubSubManager/initPubSubManager.js.map +1 -1
- package/dist/PubSubManager/notifListener.d.ts.map +1 -1
- package/dist/PubSubManager/notifListener.js +23 -12
- package/dist/PubSubManager/notifListener.js.map +1 -1
- package/dist/PubSubManager/orphanTriggerCheck.d.ts.map +1 -1
- package/dist/PubSubManager/orphanTriggerCheck.js.map +1 -1
- package/dist/PubSubManager/pushSubData.d.ts.map +1 -1
- package/dist/PubSubManager/pushSubData.js +1 -1
- package/dist/PubSubManager/pushSubData.js.map +1 -1
- package/dist/PublishParser/PublishParser.d.ts +1 -1
- package/dist/PublishParser/PublishParser.d.ts.map +1 -1
- package/dist/PublishParser/PublishParser.js +25 -14
- package/dist/PublishParser/PublishParser.js.map +1 -1
- package/dist/PublishParser/getFileTableRules.d.ts.map +1 -1
- package/dist/PublishParser/getFileTableRules.js +23 -16
- package/dist/PublishParser/getFileTableRules.js.map +1 -1
- package/dist/PublishParser/getSchemaFromPublish.d.ts.map +1 -1
- package/dist/PublishParser/getSchemaFromPublish.js +39 -16
- package/dist/PublishParser/getSchemaFromPublish.js.map +1 -1
- package/dist/PublishParser/getTableRulesWithoutFileTable.d.ts.map +1 -1
- package/dist/PublishParser/getTableRulesWithoutFileTable.js +42 -22
- package/dist/PublishParser/getTableRulesWithoutFileTable.js.map +1 -1
- package/dist/PublishParser/publishTypesAndUtils.d.ts.map +1 -1
- package/dist/PublishParser/publishTypesAndUtils.js +5 -1
- package/dist/PublishParser/publishTypesAndUtils.js.map +1 -1
- package/dist/RestApi.d.ts +1 -1
- package/dist/RestApi.d.ts.map +1 -1
- package/dist/RestApi.js +1 -1
- package/dist/RestApi.js.map +1 -1
- package/dist/SchemaWatch/SchemaWatch.d.ts +2 -2
- package/dist/SchemaWatch/SchemaWatch.d.ts.map +1 -1
- package/dist/SchemaWatch/SchemaWatch.js +11 -9
- package/dist/SchemaWatch/SchemaWatch.js.map +1 -1
- package/dist/SchemaWatch/getValidatedWatchSchemaType.d.ts.map +1 -1
- package/dist/SchemaWatch/getValidatedWatchSchemaType.js +3 -3
- package/dist/SchemaWatch/getValidatedWatchSchemaType.js.map +1 -1
- package/dist/SchemaWatch/getWatchSchemaTagList.d.ts.map +1 -1
- package/dist/SchemaWatch/getWatchSchemaTagList.js +12 -6
- package/dist/SchemaWatch/getWatchSchemaTagList.js.map +1 -1
- package/dist/SyncReplication.d.ts.map +1 -1
- package/dist/SyncReplication.js +84 -42
- package/dist/SyncReplication.js.map +1 -1
- package/dist/TableConfig/TableConfig.d.ts +5 -5
- package/dist/TableConfig/TableConfig.d.ts.map +1 -1
- package/dist/TableConfig/TableConfig.js +18 -5
- package/dist/TableConfig/TableConfig.js.map +1 -1
- package/dist/TableConfig/getColumnDefinitionQuery.d.ts +2 -2
- package/dist/TableConfig/getColumnDefinitionQuery.d.ts.map +1 -1
- package/dist/TableConfig/getColumnDefinitionQuery.js +20 -9
- package/dist/TableConfig/getColumnDefinitionQuery.js.map +1 -1
- package/dist/TableConfig/getConstraintDefinitionQueries.d.ts +3 -3
- package/dist/TableConfig/getConstraintDefinitionQueries.d.ts.map +1 -1
- package/dist/TableConfig/getConstraintDefinitionQueries.js +12 -7
- package/dist/TableConfig/getConstraintDefinitionQueries.js.map +1 -1
- package/dist/TableConfig/getFutureTableSchema.d.ts +1 -1
- package/dist/TableConfig/getFutureTableSchema.d.ts.map +1 -1
- package/dist/TableConfig/getFutureTableSchema.js +6 -4
- package/dist/TableConfig/getFutureTableSchema.js.map +1 -1
- package/dist/TableConfig/getPGIndexes.d.ts.map +1 -1
- package/dist/TableConfig/getPGIndexes.js.map +1 -1
- package/dist/TableConfig/getTableColumnQueries.d.ts +1 -1
- package/dist/TableConfig/getTableColumnQueries.d.ts.map +1 -1
- package/dist/TableConfig/getTableColumnQueries.js +38 -19
- package/dist/TableConfig/getTableColumnQueries.js.map +1 -1
- package/dist/TableConfig/initTableConfig.d.ts.map +1 -1
- package/dist/TableConfig/initTableConfig.js +91 -43
- package/dist/TableConfig/initTableConfig.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/initProstgles.d.ts.map +1 -1
- package/dist/initProstgles.js +14 -10
- package/dist/initProstgles.js.map +1 -1
- package/dist/onSocketConnected.d.ts.map +1 -1
- package/dist/onSocketConnected.js +38 -16
- package/dist/onSocketConnected.js.map +1 -1
- package/dist/runClientRequest.d.ts.map +1 -1
- package/dist/runClientRequest.js +33 -14
- package/dist/runClientRequest.js.map +1 -1
- package/dist/shortestPath.d.ts.map +1 -1
- package/dist/shortestPath.js +1 -1
- package/dist/shortestPath.js.map +1 -1
- package/dist/typeTests/dboTypeCheck.js.map +1 -1
- package/examples/full-example-typescript/DBoGenerated.d.ts +112 -54
- package/examples/full-example-typescript/DBoGenerated.js +3 -3
- package/examples/full-example-typescript/home.html +28 -26
- package/examples/full-example-typescript/index.d.ts +1 -1
- package/examples/full-example-typescript/index.js +80 -53
- package/examples/full-example-vanilla/home.html +151 -125
- package/examples/server/javascript/index.js +17 -19
- package/lib/Auth/AuthHandler.ts +234 -155
- package/lib/Auth/AuthTypes.ts +27 -4
- package/lib/Auth/getSafeReturnURL.ts +35 -21
- package/lib/Auth/sendEmail.ts +34 -31
- package/lib/Auth/setAuthProviders.ts +94 -71
- package/lib/Auth/setEmailProvider.ts +45 -27
- package/lib/Auth/setupAuthRoutes.ts +164 -100
- package/lib/DBEventsManager.ts +87 -65
- package/lib/DBSchemaBuilder.ts +62 -28
- package/lib/DboBuilder/DboBuilder.ts +45 -21
- package/lib/DboBuilder/DboBuilderTypes.ts +99 -95
- package/lib/DboBuilder/QueryBuilder/Functions.ts +862 -580
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.ts +202 -141
- package/lib/DboBuilder/QueryBuilder/getJoinQuery.ts +199 -124
- package/lib/DboBuilder/QueryBuilder/getNewQuery.ts +209 -148
- package/lib/DboBuilder/QueryBuilder/getSelectQuery.ts +101 -75
- package/lib/DboBuilder/QueryBuilder/prepareHaving.ts +10 -5
- package/lib/DboBuilder/QueryStreamer.ts +207 -100
- package/lib/DboBuilder/TableHandler/DataValidator.ts +253 -148
- package/lib/DboBuilder/TableHandler/TableHandler.ts +155 -60
- package/lib/DboBuilder/TableHandler/delete.ts +82 -29
- package/lib/DboBuilder/TableHandler/insert.ts +177 -81
- package/lib/DboBuilder/TableHandler/insertTest.ts +13 -7
- package/lib/DboBuilder/TableHandler/onDeleteFromFileTable.ts +35 -21
- package/lib/DboBuilder/TableHandler/runInsertUpdateQuery.ts +95 -45
- package/lib/DboBuilder/TableHandler/update.ts +54 -14
- package/lib/DboBuilder/TableHandler/updateBatch.ts +59 -21
- package/lib/DboBuilder/TableHandler/updateFile.ts +57 -26
- package/lib/DboBuilder/TableHandler/upsert.ts +58 -13
- package/lib/DboBuilder/ViewHandler/ViewHandler.ts +264 -121
- package/lib/DboBuilder/ViewHandler/count.ts +56 -25
- package/lib/DboBuilder/ViewHandler/find.ts +153 -68
- package/lib/DboBuilder/ViewHandler/getExistsCondition.ts +59 -32
- package/lib/DboBuilder/ViewHandler/getExistsFilters.ts +31 -19
- package/lib/DboBuilder/ViewHandler/getInfo.ts +47 -16
- package/lib/DboBuilder/ViewHandler/getTableJoinQuery.ts +91 -57
- package/lib/DboBuilder/ViewHandler/parseComplexFilter.ts +51 -29
- package/lib/DboBuilder/ViewHandler/parseFieldFilter.ts +35 -29
- package/lib/DboBuilder/ViewHandler/parseJoinPath.ts +130 -76
- package/lib/DboBuilder/ViewHandler/prepareSortItems.ts +140 -92
- package/lib/DboBuilder/ViewHandler/prepareWhere.ts +66 -26
- package/lib/DboBuilder/ViewHandler/size.ts +56 -22
- package/lib/DboBuilder/ViewHandler/subscribe.ts +122 -46
- package/lib/DboBuilder/ViewHandler/validateViewRules.ts +39 -14
- package/lib/DboBuilder/dboBuilderUtils.ts +41 -18
- package/lib/DboBuilder/getColumns.ts +44 -12
- package/lib/DboBuilder/getCondition.ts +120 -79
- package/lib/DboBuilder/getSubscribeRelatedTables.ts +144 -83
- package/lib/DboBuilder/getTablesForSchemaPostgresSQL.ts +61 -44
- package/lib/DboBuilder/insertNestedRecords.ts +370 -235
- package/lib/DboBuilder/parseUpdateRules.ts +117 -61
- package/lib/DboBuilder/prepareShortestJoinPaths.ts +115 -56
- package/lib/DboBuilder/runSQL.ts +135 -74
- package/lib/DboBuilder/runTransaction.ts +27 -16
- package/lib/DboBuilder/sqlErrCodeToMsg.ts +502 -244
- package/lib/DboBuilder/uploadFile.ts +67 -31
- package/lib/Event_Trigger_Tags.ts +6 -4
- package/lib/FileManager/FileManager.ts +53 -21
- package/lib/FileManager/getValidatedFileType.ts +79 -35
- package/lib/FileManager/initFileManager.ts +21 -9
- package/lib/FileManager/upload.ts +21 -19
- package/lib/FileManager/uploadStream.ts +33 -34
- package/lib/Filtering.ts +249 -197
- package/lib/JSONBValidation/validate_jsonb_schema_sql.ts +2 -7
- package/lib/JSONBValidation/validation.ts +147 -82
- package/lib/Logging.ts +107 -97
- package/lib/PostgresNotifListenManager.ts +96 -63
- package/lib/Prostgles.ts +106 -35
- package/lib/ProstglesTypes.ts +31 -9
- package/lib/PubSubManager/PubSubManager.ts +62 -27
- package/lib/PubSubManager/addSub.ts +56 -37
- package/lib/PubSubManager/addSync.ts +50 -33
- package/lib/PubSubManager/getCreatePubSubManagerError.ts +29 -21
- package/lib/PubSubManager/getPubSubManagerInitQuery.ts +45 -27
- package/lib/PubSubManager/initPubSubManager.ts +27 -18
- package/lib/PubSubManager/notifListener.ts +77 -59
- package/lib/PubSubManager/orphanTriggerCheck.ts +5 -4
- package/lib/PubSubManager/pushSubData.ts +11 -9
- package/lib/PublishParser/PublishParser.ts +102 -44
- package/lib/PublishParser/getFileTableRules.ts +97 -54
- package/lib/PublishParser/getSchemaFromPublish.ts +146 -74
- package/lib/PublishParser/getTableRulesWithoutFileTable.ts +101 -51
- package/lib/PublishParser/publishTypesAndUtils.ts +74 -23
- package/lib/RestApi.ts +10 -2
- package/lib/SchemaWatch/SchemaWatch.ts +52 -34
- package/lib/SchemaWatch/createSchemaWatchEventTrigger.ts +1 -1
- package/lib/SchemaWatch/getValidatedWatchSchemaType.ts +32 -22
- package/lib/SchemaWatch/getWatchSchemaTagList.ts +24 -16
- package/lib/SyncReplication.ts +376 -190
- package/lib/TableConfig/TableConfig.ts +200 -136
- package/lib/TableConfig/getColumnDefinitionQuery.ts +65 -44
- package/lib/TableConfig/getConstraintDefinitionQueries.ts +41 -25
- package/lib/TableConfig/getFutureTableSchema.ts +31 -21
- package/lib/TableConfig/getPGIndexes.ts +7 -4
- package/lib/TableConfig/getTableColumnQueries.ts +101 -54
- package/lib/TableConfig/initTableConfig.ts +192 -101
- package/lib/index.ts +6 -5
- package/lib/initProstgles.ts +57 -51
- package/lib/onSocketConnected.ts +75 -40
- package/lib/runClientRequest.ts +148 -79
- package/lib/shortestPath.ts +80 -76
- package/lib/typeTests/DBoGenerated.d.ts +5 -1
- package/lib/typeTests/dboTypeCheck.ts +8 -8
- package/package.json +1 -1
|
@@ -9,7 +9,7 @@ const parseFunction = (funcData) => {
|
|
|
9
9
|
const { func, args, functions, allowedFields } = funcData;
|
|
10
10
|
/* Function is computed column. No checks needed */
|
|
11
11
|
if (typeof func !== "string") {
|
|
12
|
-
const computedCol = exports.COMPUTED_FIELDS.find(c => c.name === func.name);
|
|
12
|
+
const computedCol = exports.COMPUTED_FIELDS.find((c) => c.name === func.name);
|
|
13
13
|
if (!computedCol)
|
|
14
14
|
throw `Unexpected function: computed column spec not found for ${JSON.stringify(func.name)}`;
|
|
15
15
|
return func;
|
|
@@ -19,16 +19,20 @@ const parseFunction = (funcData) => {
|
|
|
19
19
|
return `Issue with function ${JSON.stringify({ [funcName]: args })}: \n${msg}`;
|
|
20
20
|
};
|
|
21
21
|
/* Find function */
|
|
22
|
-
const funcDef = functions.find(f => f.name === funcName);
|
|
22
|
+
const funcDef = functions.find((f) => f.name === funcName);
|
|
23
23
|
if (!funcDef) {
|
|
24
|
-
const sf = functions
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
const sf = functions
|
|
25
|
+
.filter((f) => f.name.toLowerCase().slice(1).startsWith(funcName.toLowerCase()))
|
|
26
|
+
.sort((a, b) => a.name.length - b.name.length);
|
|
27
|
+
const hint = sf.length
|
|
28
|
+
? `. \n Maybe you meant: \n | ${sf.map((s) => s.name + " " + (s.description || "")).join(" \n | ")} ?`
|
|
29
|
+
: "";
|
|
30
|
+
throw ("\n Function " + funcName + " does not exist or is not allowed " + hint);
|
|
27
31
|
}
|
|
28
32
|
/* Validate fields */
|
|
29
33
|
const fields = funcDef.getFields(args);
|
|
30
34
|
if (fields !== "*") {
|
|
31
|
-
fields.forEach(fieldKey => {
|
|
35
|
+
fields.forEach((fieldKey) => {
|
|
32
36
|
if (typeof fieldKey !== "string" || !allowedFields.includes(fieldKey)) {
|
|
33
37
|
throw makeErr(`getFields() => field name ${JSON.stringify(fieldKey)} is invalid or disallowed`);
|
|
34
38
|
}
|
|
@@ -37,7 +41,11 @@ const parseFunction = (funcData) => {
|
|
|
37
41
|
throw makeErr(`Less columns provided than necessary (minCols=${funcDef.minCols})`);
|
|
38
42
|
}
|
|
39
43
|
}
|
|
40
|
-
if (funcDef.numArgs &&
|
|
44
|
+
if (funcDef.numArgs &&
|
|
45
|
+
funcDef.minCols !== 0 &&
|
|
46
|
+
fields !== "*" &&
|
|
47
|
+
Array.isArray(fields) &&
|
|
48
|
+
!fields.length) {
|
|
41
49
|
throw `\n Function "${funcDef.name}" expects at least a field name but has not been provided with one`;
|
|
42
50
|
}
|
|
43
51
|
return funcDef;
|
|
@@ -49,7 +57,9 @@ const parseUnix = (colName, tableAlias, allColumns, opts) => {
|
|
|
49
57
|
let tz = "";
|
|
50
58
|
if (opts) {
|
|
51
59
|
const { timeZone } = opts ?? {};
|
|
52
|
-
if (timeZone &&
|
|
60
|
+
if (timeZone &&
|
|
61
|
+
typeof timeZone !== "string" &&
|
|
62
|
+
typeof timeZone !== "boolean") {
|
|
53
63
|
throw `Bad timeZone value. timeZone can be boolean or string`;
|
|
54
64
|
}
|
|
55
65
|
if (timeZone === true) {
|
|
@@ -59,7 +69,7 @@ const parseUnix = (colName, tableAlias, allColumns, opts) => {
|
|
|
59
69
|
tz = ` AT TIME ZONE ${asValue(timeZone)}`;
|
|
60
70
|
}
|
|
61
71
|
}
|
|
62
|
-
const col = allColumns.find(c => c.name === colName);
|
|
72
|
+
const col = allColumns.find((c) => c.name === colName);
|
|
63
73
|
if (!col)
|
|
64
74
|
throw `Unexpected: column ${colName} not found`;
|
|
65
75
|
const escapedName = (0, QueryBuilder_1.asNameAlias)(colName, tableAlias);
|
|
@@ -76,16 +86,18 @@ const JSON_Funcs = [
|
|
|
76
86
|
numArgs: 4,
|
|
77
87
|
type: "function",
|
|
78
88
|
getFields: ([column]) => column,
|
|
79
|
-
getQuery: ({ args: [colName, path = [], new_value, create_missing = true], tableAlias, allowedFields }) => {
|
|
89
|
+
getQuery: ({ args: [colName, path = [], new_value, create_missing = true], tableAlias, allowedFields, }) => {
|
|
80
90
|
if (!allowedFields.includes(colName)) {
|
|
81
91
|
throw `Unexpected: column ${colName} not found`;
|
|
82
92
|
}
|
|
83
|
-
if (!path ||
|
|
93
|
+
if (!path ||
|
|
94
|
+
!Array.isArray(path) ||
|
|
95
|
+
!path.every((v) => ["number", "string"].includes(typeof v))) {
|
|
84
96
|
throw "Expecting: [columnName: string, path: (string | number)[], new_value?: any, create_missing?: boolean ]";
|
|
85
97
|
}
|
|
86
98
|
const escapedName = (0, QueryBuilder_1.asNameAlias)(colName, tableAlias);
|
|
87
99
|
return `jsonb_set(${escapedName}, ${asValue(path)}, ${asValue(new_value)}, ${create_missing})`;
|
|
88
|
-
}
|
|
100
|
+
},
|
|
89
101
|
},
|
|
90
102
|
{
|
|
91
103
|
name: "$jsonb_path_query",
|
|
@@ -94,7 +106,7 @@ const JSON_Funcs = [
|
|
|
94
106
|
numArgs: 4,
|
|
95
107
|
type: "function",
|
|
96
108
|
getFields: ([column]) => column,
|
|
97
|
-
getQuery: ({ args: [colName, jsonPath, ...otherArgs], tableAlias, allowedFields }) => {
|
|
109
|
+
getQuery: ({ args: [colName, jsonPath, ...otherArgs], tableAlias, allowedFields, }) => {
|
|
98
110
|
if (!allowedFields.includes(colName)) {
|
|
99
111
|
throw `Unexpected: column ${colName} not found`;
|
|
100
112
|
}
|
|
@@ -102,20 +114,38 @@ const JSON_Funcs = [
|
|
|
102
114
|
throw "Expecting: [columnName: string, jsonPath: string, vars?: object, silent?: boolean]";
|
|
103
115
|
}
|
|
104
116
|
const escapedName = (0, QueryBuilder_1.asNameAlias)(colName, tableAlias);
|
|
105
|
-
return `jsonb_path_query(${escapedName}, ${[jsonPath, ...otherArgs].map(v => asValue(v)).join(", ")})`;
|
|
106
|
-
}
|
|
117
|
+
return `jsonb_path_query(${escapedName}, ${[jsonPath, ...otherArgs].map((v) => asValue(v)).join(", ")})`;
|
|
118
|
+
},
|
|
107
119
|
},
|
|
108
120
|
...[
|
|
109
|
-
[
|
|
110
|
-
|
|
111
|
-
|
|
121
|
+
[
|
|
122
|
+
"jsonb_array_length",
|
|
123
|
+
"Returns the number of elements in the outermost JSON array",
|
|
124
|
+
],
|
|
125
|
+
[
|
|
126
|
+
"jsonb_each",
|
|
127
|
+
"Expands the outermost JSON object into a set of key/value pairs",
|
|
128
|
+
],
|
|
129
|
+
[
|
|
130
|
+
"jsonb_each_text",
|
|
131
|
+
"Expands the outermost JSON object into a set of key/value pairs. The returned values will be of type text",
|
|
132
|
+
],
|
|
112
133
|
["jsonb_object_keys", "Returns set of keys in the outermost JSON object"],
|
|
113
|
-
[
|
|
134
|
+
[
|
|
135
|
+
"jsonb_strip_nulls",
|
|
136
|
+
"Returns from_json with all object fields that have null values omitted. Other null values are untouched",
|
|
137
|
+
],
|
|
114
138
|
["jsonb_pretty", "Returns from_json as indented JSON text "],
|
|
115
139
|
["jsonb_to_record", "Builds an arbitrary record from a JSON object"],
|
|
116
140
|
["jsonb_array_elements", "Expands a JSON array to a set of JSON values"],
|
|
117
|
-
[
|
|
118
|
-
|
|
141
|
+
[
|
|
142
|
+
"jsonb_array_elements_text",
|
|
143
|
+
"Expands a JSON array to a set of text values ",
|
|
144
|
+
],
|
|
145
|
+
[
|
|
146
|
+
"jsonb_typeof",
|
|
147
|
+
"Returns the type of the outermost JSON value as a text string. Possible types are object, array, string, number, boolean, and null ",
|
|
148
|
+
],
|
|
119
149
|
].map(([name, description]) => ({
|
|
120
150
|
name: "$" + name,
|
|
121
151
|
description,
|
|
@@ -126,8 +156,8 @@ const JSON_Funcs = [
|
|
|
126
156
|
getQuery: ({ args: [colName], tableAlias }) => {
|
|
127
157
|
const escapedName = (0, QueryBuilder_1.asNameAlias)(colName, tableAlias);
|
|
128
158
|
return `${name}(${escapedName})`;
|
|
129
|
-
}
|
|
130
|
-
}))
|
|
159
|
+
},
|
|
160
|
+
})),
|
|
131
161
|
];
|
|
132
162
|
const FTS_Funcs =
|
|
133
163
|
/* Full text search
|
|
@@ -138,10 +168,10 @@ const FTS_Funcs =
|
|
|
138
168
|
// "synonym", // replace word with a synonym
|
|
139
169
|
"english",
|
|
140
170
|
// "english_stem",
|
|
141
|
-
// "english_hunspell",
|
|
142
|
-
""
|
|
143
|
-
].map(type => ({
|
|
144
|
-
name: "$ts_headline" + (type ?
|
|
171
|
+
// "english_hunspell",
|
|
172
|
+
"",
|
|
173
|
+
].map((type) => ({
|
|
174
|
+
name: "$ts_headline" + (type ? "_" + type : ""),
|
|
145
175
|
description: ` :[column_name <string>, search_term: <string | { to_tsquery: string } > ] -> sha512 hash of the of column content`,
|
|
146
176
|
type: "function",
|
|
147
177
|
singleColArg: true,
|
|
@@ -150,7 +180,7 @@ const FTS_Funcs =
|
|
|
150
180
|
getQuery: ({ args }) => {
|
|
151
181
|
const col = (0, prostgles_types_1.asName)(args[0]);
|
|
152
182
|
let qVal = args[1], qType = "to_tsquery";
|
|
153
|
-
const _type = type ?
|
|
183
|
+
const _type = type ? asValue(type) + "," : "";
|
|
154
184
|
const searchTypes = prostgles_types_1.TextFilter_FullTextSearchFilterKeys;
|
|
155
185
|
/* { to_tsquery: 'search term' } */
|
|
156
186
|
if ((0, DboBuilder_1.isPlainObject)(qVal)) {
|
|
@@ -158,7 +188,8 @@ const FTS_Funcs =
|
|
|
158
188
|
if (!keys.length)
|
|
159
189
|
throw "Bad arg";
|
|
160
190
|
if (keys.length !== 1 || !searchTypes.includes(keys[0]))
|
|
161
|
-
throw "Expecting a an object with a single key named one of: " +
|
|
191
|
+
throw ("Expecting a an object with a single key named one of: " +
|
|
192
|
+
searchTypes.join(", "));
|
|
162
193
|
qType = keys[0];
|
|
163
194
|
qVal = asValue(qVal[qType]);
|
|
164
195
|
/* 'search term' */
|
|
@@ -171,7 +202,7 @@ const FTS_Funcs =
|
|
|
171
202
|
const res = `ts_headline(${_type} ${col}::text, ${qVal}, 'ShortWord=1 ' )`;
|
|
172
203
|
// console.log(res)
|
|
173
204
|
return res;
|
|
174
|
-
}
|
|
205
|
+
},
|
|
175
206
|
}));
|
|
176
207
|
let PostGIS_Funcs = [
|
|
177
208
|
{
|
|
@@ -180,12 +211,12 @@ let PostGIS_Funcs = [
|
|
|
180
211
|
-> Returns true if the geometries are within a given distance
|
|
181
212
|
For geometry: The distance is specified in units defined by the spatial reference system of the geometries. For this function to make sense, the source geometries must be in the same coordinate system (have the same SRID).
|
|
182
213
|
For geography: units are in meters and distance measurement defaults to use_spheroid=true. For faster evaluation use use_spheroid=false to measure on the sphere.
|
|
183
|
-
|
|
214
|
+
`,
|
|
184
215
|
},
|
|
185
216
|
{
|
|
186
217
|
fname: "<->",
|
|
187
218
|
description: `:[column_name, { lat?: number; lng?: number; geojson?: object; srid?: number; use_spheroid?: boolean }]
|
|
188
|
-
-> The <-> operator returns the 2D distance between two geometries. Used in the "ORDER BY" clause provides index-assisted nearest-neighbor result sets. For PostgreSQL below 9.5 only gives centroid distance of bounding boxes and for PostgreSQL 9.5+, does true KNN distance search giving true distance between geometries, and distance sphere for geographies
|
|
219
|
+
-> The <-> operator returns the 2D distance between two geometries. Used in the "ORDER BY" clause provides index-assisted nearest-neighbor result sets. For PostgreSQL below 9.5 only gives centroid distance of bounding boxes and for PostgreSQL 9.5+, does true KNN distance search giving true distance between geometries, and distance sphere for geographies.`,
|
|
189
220
|
},
|
|
190
221
|
{
|
|
191
222
|
fname: "ST_Distance",
|
|
@@ -193,15 +224,17 @@ let PostGIS_Funcs = [
|
|
|
193
224
|
-> For geometry types returns the minimum 2D Cartesian (planar) distance between two geometries, in projected units (spatial ref units).
|
|
194
225
|
-> For geography types defaults to return the minimum geodesic distance between two geographies in meters, compute on the spheroid determined by the SRID. If use_spheroid is false, a faster spherical calculation is used.
|
|
195
226
|
`,
|
|
196
|
-
},
|
|
227
|
+
},
|
|
228
|
+
{
|
|
197
229
|
fname: "ST_DistanceSpheroid",
|
|
198
230
|
description: ` :[column_name, { lat?: number; lng?: number; geojson?: object; srid?: number; spheroid?: string; }] -> Returns minimum distance in meters between two lon/lat geometries given a particular spheroid. See the explanation of spheroids given for ST_LengthSpheroid.
|
|
199
231
|
|
|
200
232
|
`,
|
|
201
|
-
},
|
|
233
|
+
},
|
|
234
|
+
{
|
|
202
235
|
fname: "ST_DistanceSphere",
|
|
203
236
|
description: ` :[column_name, { lat?: number; lng?: number; geojson?: object; srid?: number }] -> Returns linear distance in meters between two lon/lat points. Uses a spherical earth and radius of 6370986 meters. Faster than ST_DistanceSpheroid, but less accurate. Only implemented for points.`,
|
|
204
|
-
}
|
|
237
|
+
},
|
|
205
238
|
].map(({ fname, description }) => ({
|
|
206
239
|
name: "$" + fname,
|
|
207
240
|
description,
|
|
@@ -211,20 +244,22 @@ let PostGIS_Funcs = [
|
|
|
211
244
|
canBeUsedForFilter: fname === "ST_DWithin",
|
|
212
245
|
getFields: (args) => [args[0]],
|
|
213
246
|
getQuery: ({ allColumns, args: [columnName, arg2], tableAlias }) => {
|
|
214
|
-
const mErr = () => {
|
|
247
|
+
const mErr = () => {
|
|
248
|
+
throw `${fname}: Expecting a second argument like: { lat?: number; lng?: number; geojson?: object; srid?: number; use_spheroid?: boolean }`;
|
|
249
|
+
};
|
|
215
250
|
if (!(0, prostgles_types_1.isObject)(arg2)) {
|
|
216
251
|
mErr();
|
|
217
252
|
}
|
|
218
|
-
const col = allColumns.find(c => c.name === columnName);
|
|
253
|
+
const col = allColumns.find((c) => c.name === columnName);
|
|
219
254
|
if (!col) {
|
|
220
255
|
throw new Error("Col not found: " + columnName);
|
|
221
256
|
}
|
|
222
|
-
const { lat, lng, srid = 4326, geojson, text, use_spheroid, distance, spheroid = 'SPHEROID["WGS 84", 6378137, 298.257223563]', unit, debug } = arg2;
|
|
257
|
+
const { lat, lng, srid = 4326, geojson, text, use_spheroid, distance, spheroid = 'SPHEROID["WGS 84", 6378137, 298.257223563]', unit, debug, } = arg2;
|
|
223
258
|
let geomQ = "", extraParams = "";
|
|
224
259
|
if (typeof text === "string") {
|
|
225
260
|
geomQ = `ST_GeomFromText(${asValue(text)})`;
|
|
226
261
|
}
|
|
227
|
-
else if ([lat, lng].every(v => Number.isFinite(v))) {
|
|
262
|
+
else if ([lat, lng].every((v) => Number.isFinite(v))) {
|
|
228
263
|
geomQ = `ST_Point(${asValue(lng)}, ${asValue(lat)})`;
|
|
229
264
|
}
|
|
230
265
|
else if ((0, DboBuilder_1.isPlainObject)(geojson)) {
|
|
@@ -246,8 +281,8 @@ let PostGIS_Funcs = [
|
|
|
246
281
|
if (typeof use_spheroid === "boolean") {
|
|
247
282
|
extraParams = ", " + asValue(use_spheroid);
|
|
248
283
|
}
|
|
249
|
-
colCast =
|
|
250
|
-
geomQCast =
|
|
284
|
+
colCast = colIsGeog || use_spheroid ? "::geography" : "::geometry";
|
|
285
|
+
geomQCast = colIsGeog || use_spheroid ? "::geography" : "::geometry";
|
|
251
286
|
/**
|
|
252
287
|
* boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
|
|
253
288
|
* boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid = true);
|
|
@@ -300,15 +335,21 @@ let PostGIS_Funcs = [
|
|
|
300
335
|
throw query;
|
|
301
336
|
}
|
|
302
337
|
return query;
|
|
303
|
-
}
|
|
338
|
+
},
|
|
304
339
|
}));
|
|
305
340
|
PostGIS_Funcs = PostGIS_Funcs.concat([
|
|
306
|
-
"ST_AsText",
|
|
307
|
-
"
|
|
308
|
-
"
|
|
341
|
+
"ST_AsText",
|
|
342
|
+
"ST_AsEWKT",
|
|
343
|
+
"ST_AsEWKB",
|
|
344
|
+
"ST_AsBinary",
|
|
345
|
+
"ST_AsMVT",
|
|
346
|
+
"ST_AsMVTGeom",
|
|
347
|
+
"ST_AsGeoJSON",
|
|
348
|
+
"ST_Simplify",
|
|
349
|
+
"ST_SnapToGrid",
|
|
350
|
+
"ST_Centroid",
|
|
309
351
|
"st_aslatlontext",
|
|
310
|
-
]
|
|
311
|
-
.map(fname => {
|
|
352
|
+
].map((fname) => {
|
|
312
353
|
const res = {
|
|
313
354
|
name: "$" + fname,
|
|
314
355
|
description: ` :[column_name, precision?] -> json GeoJSON output of a geometry column`,
|
|
@@ -319,20 +360,32 @@ PostGIS_Funcs = PostGIS_Funcs.concat([
|
|
|
319
360
|
getQuery: ({ args: [colName, ...otherArgs], tableAlias }) => {
|
|
320
361
|
let secondArg = "";
|
|
321
362
|
if (otherArgs.length)
|
|
322
|
-
secondArg = ", " + otherArgs.map(arg => asValue(arg)).join(", ");
|
|
363
|
+
secondArg = ", " + otherArgs.map((arg) => asValue(arg)).join(", ");
|
|
323
364
|
const escTabelName = (0, QueryBuilder_1.asNameAlias)(colName, tableAlias) + "::geometry";
|
|
324
|
-
const result = DboBuilder_1.pgp.as.format(fname +
|
|
365
|
+
const result = DboBuilder_1.pgp.as.format(fname +
|
|
366
|
+
"(" +
|
|
367
|
+
escTabelName +
|
|
368
|
+
secondArg +
|
|
369
|
+
(fname === "ST_AsGeoJSON" ? ")::jsonb" : ")"));
|
|
325
370
|
if (["ST_Centroid", "ST_SnapToGrid", "ST_Simplify"].includes(fname)) {
|
|
326
371
|
const r = `ST_AsGeoJSON(${result})::jsonb`;
|
|
327
372
|
return r;
|
|
328
373
|
}
|
|
329
374
|
return result;
|
|
330
|
-
}
|
|
375
|
+
},
|
|
331
376
|
};
|
|
332
377
|
return res;
|
|
333
378
|
}));
|
|
334
|
-
PostGIS_Funcs = PostGIS_Funcs.concat([
|
|
335
|
-
|
|
379
|
+
PostGIS_Funcs = PostGIS_Funcs.concat([
|
|
380
|
+
"ST_Extent",
|
|
381
|
+
"ST_3DExtent",
|
|
382
|
+
"ST_XMin_Agg",
|
|
383
|
+
"ST_XMax_Agg",
|
|
384
|
+
"ST_YMin_Agg",
|
|
385
|
+
"ST_YMax_Agg",
|
|
386
|
+
"ST_ZMin_Agg",
|
|
387
|
+
"ST_ZMax_Agg",
|
|
388
|
+
].map((fname) => {
|
|
336
389
|
const res = {
|
|
337
390
|
name: "$" + fname,
|
|
338
391
|
description: ` :[column_name] -> ST_Extent returns a bounding box that encloses a set of geometries.
|
|
@@ -348,11 +401,11 @@ PostGIS_Funcs = PostGIS_Funcs.concat(["ST_Extent", "ST_3DExtent", "ST_XMin_Agg",
|
|
|
348
401
|
return `${fname}(${escTabelName})`;
|
|
349
402
|
}
|
|
350
403
|
return `${fname.endsWith("_Agg") ? fname.slice(0, -4) : fname}(ST_Collect(${escTabelName}))`;
|
|
351
|
-
}
|
|
404
|
+
},
|
|
352
405
|
};
|
|
353
406
|
return res;
|
|
354
407
|
}));
|
|
355
|
-
PostGIS_Funcs = PostGIS_Funcs.concat(["ST_Length", "ST_X", "ST_Y", "ST_Z"].map(fname => ({
|
|
408
|
+
PostGIS_Funcs = PostGIS_Funcs.concat(["ST_Length", "ST_X", "ST_Y", "ST_Z"].map((fname) => ({
|
|
356
409
|
name: "$" + fname,
|
|
357
410
|
type: "function",
|
|
358
411
|
singleColArg: true,
|
|
@@ -361,15 +414,15 @@ PostGIS_Funcs = PostGIS_Funcs.concat(["ST_Length", "ST_X", "ST_Y", "ST_Z"].map(f
|
|
|
361
414
|
getQuery: ({ allColumns, args, tableAlias }) => {
|
|
362
415
|
const colName = args[0];
|
|
363
416
|
const escapedColName = (0, QueryBuilder_1.asNameAlias)(colName, tableAlias);
|
|
364
|
-
const col = allColumns.find(c => c.name === colName);
|
|
417
|
+
const col = allColumns.find((c) => c.name === colName);
|
|
365
418
|
if (!col)
|
|
366
419
|
throw new Error("Col not found: " + colName);
|
|
367
420
|
return `${fname}(${escapedColName})`;
|
|
368
|
-
}
|
|
421
|
+
},
|
|
369
422
|
})));
|
|
370
423
|
/**
|
|
371
|
-
* Each function expects a column at the very least
|
|
372
|
-
*/
|
|
424
|
+
* Each function expects a column at the very least
|
|
425
|
+
*/
|
|
373
426
|
exports.FUNCTIONS = [
|
|
374
427
|
// Hashing
|
|
375
428
|
{
|
|
@@ -380,9 +433,13 @@ exports.FUNCTIONS = [
|
|
|
380
433
|
numArgs: MAX_COL_NUM,
|
|
381
434
|
getFields: (args) => args,
|
|
382
435
|
getQuery: ({ args, tableAlias }) => {
|
|
383
|
-
const q = DboBuilder_1.pgp.as.format("md5(" +
|
|
436
|
+
const q = DboBuilder_1.pgp.as.format("md5(" +
|
|
437
|
+
args
|
|
438
|
+
.map((fname) => "COALESCE( " + (0, QueryBuilder_1.asNameAlias)(fname, tableAlias) + "::text, '' )")
|
|
439
|
+
.join(" || ") +
|
|
440
|
+
")");
|
|
384
441
|
return q;
|
|
385
|
-
}
|
|
442
|
+
},
|
|
386
443
|
},
|
|
387
444
|
{
|
|
388
445
|
name: "$md5_multi_agg",
|
|
@@ -392,9 +449,13 @@ exports.FUNCTIONS = [
|
|
|
392
449
|
numArgs: MAX_COL_NUM,
|
|
393
450
|
getFields: (args) => args,
|
|
394
451
|
getQuery: ({ args, tableAlias }) => {
|
|
395
|
-
const q = DboBuilder_1.pgp.as.format("md5(string_agg(" +
|
|
452
|
+
const q = DboBuilder_1.pgp.as.format("md5(string_agg(" +
|
|
453
|
+
args
|
|
454
|
+
.map((fname) => "COALESCE( " + (0, QueryBuilder_1.asNameAlias)(fname, tableAlias) + "::text, '' )")
|
|
455
|
+
.join(" || ") +
|
|
456
|
+
", ','))");
|
|
396
457
|
return q;
|
|
397
|
-
}
|
|
458
|
+
},
|
|
398
459
|
},
|
|
399
460
|
{
|
|
400
461
|
name: "$sha256_multi",
|
|
@@ -404,9 +465,13 @@ exports.FUNCTIONS = [
|
|
|
404
465
|
numArgs: MAX_COL_NUM,
|
|
405
466
|
getFields: (args) => args,
|
|
406
467
|
getQuery: ({ args, tableAlias }) => {
|
|
407
|
-
const q = DboBuilder_1.pgp.as.format("encode(sha256((" +
|
|
468
|
+
const q = DboBuilder_1.pgp.as.format("encode(sha256((" +
|
|
469
|
+
args
|
|
470
|
+
.map((fname) => "COALESCE( " + (0, QueryBuilder_1.asNameAlias)(fname, tableAlias) + ", '' )")
|
|
471
|
+
.join(" || ") +
|
|
472
|
+
")::text::bytea), 'hex')");
|
|
408
473
|
return q;
|
|
409
|
-
}
|
|
474
|
+
},
|
|
410
475
|
},
|
|
411
476
|
{
|
|
412
477
|
name: "$sha256_multi_agg",
|
|
@@ -416,9 +481,13 @@ exports.FUNCTIONS = [
|
|
|
416
481
|
numArgs: MAX_COL_NUM,
|
|
417
482
|
getFields: (args) => args,
|
|
418
483
|
getQuery: ({ args, tableAlias }) => {
|
|
419
|
-
const q = DboBuilder_1.pgp.as.format("encode(sha256(string_agg(" +
|
|
484
|
+
const q = DboBuilder_1.pgp.as.format("encode(sha256(string_agg(" +
|
|
485
|
+
args
|
|
486
|
+
.map((fname) => "COALESCE( " + (0, QueryBuilder_1.asNameAlias)(fname, tableAlias) + ", '' )")
|
|
487
|
+
.join(" || ") +
|
|
488
|
+
", ',')::text::bytea), 'hex')");
|
|
420
489
|
return q;
|
|
421
|
-
}
|
|
490
|
+
},
|
|
422
491
|
},
|
|
423
492
|
{
|
|
424
493
|
name: "$sha512_multi",
|
|
@@ -428,9 +497,13 @@ exports.FUNCTIONS = [
|
|
|
428
497
|
numArgs: MAX_COL_NUM,
|
|
429
498
|
getFields: (args) => args,
|
|
430
499
|
getQuery: ({ args, tableAlias }) => {
|
|
431
|
-
const q = DboBuilder_1.pgp.as.format("encode(sha512((" +
|
|
500
|
+
const q = DboBuilder_1.pgp.as.format("encode(sha512((" +
|
|
501
|
+
args
|
|
502
|
+
.map((fname) => "COALESCE( " + (0, QueryBuilder_1.asNameAlias)(fname, tableAlias) + ", '' )")
|
|
503
|
+
.join(" || ") +
|
|
504
|
+
")::text::bytea), 'hex')");
|
|
432
505
|
return q;
|
|
433
|
-
}
|
|
506
|
+
},
|
|
434
507
|
},
|
|
435
508
|
{
|
|
436
509
|
name: "$sha512_multi_agg",
|
|
@@ -440,9 +513,13 @@ exports.FUNCTIONS = [
|
|
|
440
513
|
numArgs: MAX_COL_NUM,
|
|
441
514
|
getFields: (args) => args,
|
|
442
515
|
getQuery: ({ args, tableAlias }) => {
|
|
443
|
-
const q = DboBuilder_1.pgp.as.format("encode(sha512(string_agg(" +
|
|
516
|
+
const q = DboBuilder_1.pgp.as.format("encode(sha512(string_agg(" +
|
|
517
|
+
args
|
|
518
|
+
.map((fname) => "COALESCE( " + (0, QueryBuilder_1.asNameAlias)(fname, tableAlias) + ", '' )")
|
|
519
|
+
.join(" || ") +
|
|
520
|
+
", ',')::text::bytea), 'hex')");
|
|
444
521
|
return q;
|
|
445
|
-
}
|
|
522
|
+
},
|
|
446
523
|
},
|
|
447
524
|
...FTS_Funcs,
|
|
448
525
|
...JSON_Funcs,
|
|
@@ -456,7 +533,7 @@ exports.FUNCTIONS = [
|
|
|
456
533
|
getFields: (args) => [args[0]],
|
|
457
534
|
getQuery: ({ allowedFields, args, tableAlias }) => {
|
|
458
535
|
return DboBuilder_1.pgp.as.format("LEFT(" + (0, QueryBuilder_1.asNameAlias)(args[0], tableAlias) + ", $1)", [args[1]]);
|
|
459
|
-
}
|
|
536
|
+
},
|
|
460
537
|
},
|
|
461
538
|
{
|
|
462
539
|
name: "$unnest_words",
|
|
@@ -466,8 +543,10 @@ exports.FUNCTIONS = [
|
|
|
466
543
|
singleColArg: true,
|
|
467
544
|
getFields: (args) => [args[0]],
|
|
468
545
|
getQuery: ({ allowedFields, args, tableAlias }) => {
|
|
469
|
-
return DboBuilder_1.pgp.as.format("unnest(string_to_array(" +
|
|
470
|
-
|
|
546
|
+
return DboBuilder_1.pgp.as.format("unnest(string_to_array(" +
|
|
547
|
+
(0, QueryBuilder_1.asNameAlias)(args[0], tableAlias) +
|
|
548
|
+
"::TEXT , ' '))"); //, [args[1]]
|
|
549
|
+
},
|
|
471
550
|
},
|
|
472
551
|
{
|
|
473
552
|
name: "$right",
|
|
@@ -478,7 +557,7 @@ exports.FUNCTIONS = [
|
|
|
478
557
|
getFields: (args) => [args[0]],
|
|
479
558
|
getQuery: ({ allowedFields, args, tableAlias }) => {
|
|
480
559
|
return DboBuilder_1.pgp.as.format("RIGHT(" + (0, QueryBuilder_1.asNameAlias)(args[0], tableAlias) + ", $1)", [args[1]]);
|
|
481
|
-
}
|
|
560
|
+
},
|
|
482
561
|
},
|
|
483
562
|
{
|
|
484
563
|
name: "$to_char",
|
|
@@ -492,7 +571,7 @@ exports.FUNCTIONS = [
|
|
|
492
571
|
return DboBuilder_1.pgp.as.format("to_char(" + (0, QueryBuilder_1.asNameAlias)(args[0], tableAlias) + ", $2, $3)", [args[0], args[1], args[2]]);
|
|
493
572
|
}
|
|
494
573
|
return DboBuilder_1.pgp.as.format("to_char(" + (0, QueryBuilder_1.asNameAlias)(args[0], tableAlias) + ", $2)", [args[0], args[1]]);
|
|
495
|
-
}
|
|
574
|
+
},
|
|
496
575
|
},
|
|
497
576
|
/**
|
|
498
577
|
* Date trunc utils
|
|
@@ -510,40 +589,42 @@ exports.FUNCTIONS = [
|
|
|
510
589
|
"year",
|
|
511
590
|
"decade",
|
|
512
591
|
"century",
|
|
513
|
-
"millennium"
|
|
514
|
-
]
|
|
592
|
+
"millennium",
|
|
593
|
+
]
|
|
594
|
+
.map((k) => ({ val: 0, unit: k }))
|
|
515
595
|
.concat([
|
|
516
|
-
{ val: 6, unit:
|
|
517
|
-
{ val: 4, unit:
|
|
518
|
-
{ val: 2, unit:
|
|
519
|
-
{ val: 8, unit:
|
|
520
|
-
{ val: 4, unit:
|
|
521
|
-
{ val: 2, unit:
|
|
522
|
-
{ val: 30, unit:
|
|
523
|
-
{ val: 15, unit:
|
|
524
|
-
{ val: 6, unit:
|
|
525
|
-
{ val: 5, unit:
|
|
526
|
-
{ val: 4, unit:
|
|
527
|
-
{ val: 3, unit:
|
|
528
|
-
{ val: 2, unit:
|
|
529
|
-
{ val: 30, unit:
|
|
530
|
-
{ val: 15, unit:
|
|
531
|
-
{ val: 10, unit:
|
|
532
|
-
{ val: 8, unit:
|
|
533
|
-
{ val: 6, unit:
|
|
534
|
-
{ val: 5, unit:
|
|
535
|
-
{ val: 4, unit:
|
|
536
|
-
{ val: 3, unit:
|
|
537
|
-
{ val: 2, unit:
|
|
538
|
-
{ val: 500, unit:
|
|
539
|
-
{ val: 250, unit:
|
|
540
|
-
{ val: 100, unit:
|
|
541
|
-
{ val: 50, unit:
|
|
542
|
-
{ val: 25, unit:
|
|
543
|
-
{ val: 10, unit:
|
|
544
|
-
{ val: 5, unit:
|
|
545
|
-
{ val: 2, unit:
|
|
546
|
-
])
|
|
596
|
+
{ val: 6, unit: "month" },
|
|
597
|
+
{ val: 4, unit: "month" },
|
|
598
|
+
{ val: 2, unit: "month" },
|
|
599
|
+
{ val: 8, unit: "hour" },
|
|
600
|
+
{ val: 4, unit: "hour" },
|
|
601
|
+
{ val: 2, unit: "hour" },
|
|
602
|
+
{ val: 30, unit: "minute" },
|
|
603
|
+
{ val: 15, unit: "minute" },
|
|
604
|
+
{ val: 6, unit: "minute" },
|
|
605
|
+
{ val: 5, unit: "minute" },
|
|
606
|
+
{ val: 4, unit: "minute" },
|
|
607
|
+
{ val: 3, unit: "minute" },
|
|
608
|
+
{ val: 2, unit: "minute" },
|
|
609
|
+
{ val: 30, unit: "second" },
|
|
610
|
+
{ val: 15, unit: "second" },
|
|
611
|
+
{ val: 10, unit: "second" },
|
|
612
|
+
{ val: 8, unit: "second" },
|
|
613
|
+
{ val: 6, unit: "second" },
|
|
614
|
+
{ val: 5, unit: "second" },
|
|
615
|
+
{ val: 4, unit: "second" },
|
|
616
|
+
{ val: 3, unit: "second" },
|
|
617
|
+
{ val: 2, unit: "second" },
|
|
618
|
+
{ val: 500, unit: "millisecond" },
|
|
619
|
+
{ val: 250, unit: "millisecond" },
|
|
620
|
+
{ val: 100, unit: "millisecond" },
|
|
621
|
+
{ val: 50, unit: "millisecond" },
|
|
622
|
+
{ val: 25, unit: "millisecond" },
|
|
623
|
+
{ val: 10, unit: "millisecond" },
|
|
624
|
+
{ val: 5, unit: "millisecond" },
|
|
625
|
+
{ val: 2, unit: "millisecond" },
|
|
626
|
+
])
|
|
627
|
+
.map(({ val, unit }) => ({
|
|
547
628
|
name: "$date_trunc_" + (val || "") + unit,
|
|
548
629
|
type: "function",
|
|
549
630
|
description: ` :[column_name, opts?: { timeZone: true | 'TZ Name' }] -> round down timestamp to closest ${val || ""} ${unit} `,
|
|
@@ -575,19 +656,23 @@ exports.FUNCTIONS = [
|
|
|
575
656
|
const res = `(date_trunc(${asValue(prevUnit)}, ${col}) + floor(${extractedUnit} / ${val}) * interval ${asValue(val + " " + unit)})`;
|
|
576
657
|
// console.log(res);
|
|
577
658
|
return res;
|
|
578
|
-
}
|
|
659
|
+
},
|
|
579
660
|
})),
|
|
580
661
|
/* Date funcs date_part */
|
|
581
|
-
...["date_trunc", "date_part"].map(funcName => ({
|
|
662
|
+
...["date_trunc", "date_part"].map((funcName) => ({
|
|
582
663
|
name: "$" + funcName,
|
|
583
664
|
type: "function",
|
|
584
665
|
numArgs: 3,
|
|
585
|
-
description: ` :[unit<string>, column_name, opts?: { timeZone: true | string }] -> ` +
|
|
666
|
+
description: ` :[unit<string>, column_name, opts?: { timeZone: true | string }] -> ` +
|
|
667
|
+
(funcName === "date_trunc"
|
|
668
|
+
? ` round down timestamp to closest unit value. `
|
|
669
|
+
: ` extract date unit as float8. `) +
|
|
670
|
+
` E.g. ['hour', col] `,
|
|
586
671
|
singleColArg: false,
|
|
587
672
|
getFields: (args) => [args[1]],
|
|
588
673
|
getQuery: ({ allColumns, args, tableAlias }) => {
|
|
589
674
|
return `${funcName}(${asValue(args[0])}, ${parseUnix(args[1], tableAlias, allColumns, args[2])})`;
|
|
590
|
-
}
|
|
675
|
+
},
|
|
591
676
|
})),
|
|
592
677
|
/* Handy date funcs */
|
|
593
678
|
...[
|
|
@@ -621,22 +706,24 @@ exports.FUNCTIONS = [
|
|
|
621
706
|
].map(([funcName, txt]) => ({
|
|
622
707
|
name: "$" + funcName,
|
|
623
708
|
type: "function",
|
|
624
|
-
description: ` :[column_name, opts?: { timeZone: true | string }] -> get timestamp formated as ` +
|
|
709
|
+
description: ` :[column_name, opts?: { timeZone: true | string }] -> get timestamp formated as ` +
|
|
710
|
+
txt,
|
|
625
711
|
singleColArg: true,
|
|
626
712
|
numArgs: 1,
|
|
627
713
|
getFields: (args) => [args[0]],
|
|
628
714
|
getQuery: ({ allColumns, args, tableAlias }) => {
|
|
629
|
-
return DboBuilder_1.pgp.as.format("trim(to_char(" +
|
|
630
|
-
|
|
715
|
+
return DboBuilder_1.pgp.as.format("trim(to_char(" +
|
|
716
|
+
parseUnix(args[0], tableAlias, allColumns, args[1]) +
|
|
717
|
+
", $2))", [args[0], txt]);
|
|
718
|
+
},
|
|
631
719
|
})),
|
|
632
720
|
/* Basic 1 arg col funcs */
|
|
633
721
|
...[
|
|
634
|
-
...["TEXT"].flatMap(cast => [
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
].map(funcName => ({ cast, funcName }))),
|
|
722
|
+
...["TEXT"].flatMap((cast) => ["upper", "lower", "length", "reverse", "trim", "initcap"].map((funcName) => ({ cast, funcName }))),
|
|
723
|
+
...[""].flatMap((cast) => ["round", "ceil", "floor", "sign", "md5"].map((funcName) => ({
|
|
724
|
+
cast,
|
|
725
|
+
funcName,
|
|
726
|
+
}))),
|
|
640
727
|
].map(({ funcName, cast }) => ({
|
|
641
728
|
name: "$" + funcName,
|
|
642
729
|
type: "function",
|
|
@@ -645,22 +732,31 @@ exports.FUNCTIONS = [
|
|
|
645
732
|
getFields: (args) => [args[0]],
|
|
646
733
|
getQuery: ({ args, tableAlias }) => {
|
|
647
734
|
return `${funcName}(${(0, QueryBuilder_1.asNameAlias)(args[0], tableAlias)}${cast ? `::${cast}` : ""})`;
|
|
648
|
-
}
|
|
735
|
+
},
|
|
649
736
|
})),
|
|
650
737
|
/**
|
|
651
738
|
* Interval funcs
|
|
652
739
|
* (col1, col2?, trunc )
|
|
653
740
|
* */
|
|
654
|
-
...["age", "ageNow", "difference"].map(funcName => ({
|
|
741
|
+
...["age", "ageNow", "difference"].map((funcName) => ({
|
|
655
742
|
name: "$" + funcName,
|
|
656
743
|
type: "function",
|
|
657
744
|
numArgs: 2,
|
|
658
745
|
singleColArg: true,
|
|
659
|
-
getFields: (args) => args.slice(0, 2).filter(a => typeof a === "string"), // Filtered because the second arg is optional
|
|
746
|
+
getFields: (args) => args.slice(0, 2).filter((a) => typeof a === "string"), // Filtered because the second arg is optional
|
|
660
747
|
getQuery: ({ allowedFields, args, tableAlias, allColumns }) => {
|
|
661
|
-
const validColCount = args
|
|
748
|
+
const validColCount = args
|
|
749
|
+
.slice(0, 2)
|
|
750
|
+
.filter((a) => typeof a === "string").length;
|
|
662
751
|
const trunc = args[2];
|
|
663
|
-
const allowedTruncs = [
|
|
752
|
+
const allowedTruncs = [
|
|
753
|
+
"second",
|
|
754
|
+
"minute",
|
|
755
|
+
"hour",
|
|
756
|
+
"day",
|
|
757
|
+
"month",
|
|
758
|
+
"year",
|
|
759
|
+
];
|
|
664
760
|
if (trunc && !allowedTruncs.includes(trunc))
|
|
665
761
|
throw new Error("Incorrect trunc provided. Allowed values: " + allowedTruncs);
|
|
666
762
|
if (funcName === "difference" && validColCount !== 2)
|
|
@@ -670,7 +766,9 @@ exports.FUNCTIONS = [
|
|
|
670
766
|
const [leftField, rightField] = args;
|
|
671
767
|
const tzOpts = args[2];
|
|
672
768
|
const leftQ = parseUnix(leftField, tableAlias, allColumns, tzOpts);
|
|
673
|
-
let rightQ = rightField
|
|
769
|
+
let rightQ = rightField
|
|
770
|
+
? parseUnix(rightField, tableAlias, allColumns, tzOpts)
|
|
771
|
+
: "";
|
|
674
772
|
let query = "";
|
|
675
773
|
if (funcName === "ageNow" && validColCount === 1) {
|
|
676
774
|
query = `age(now(), ${leftQ})`;
|
|
@@ -684,10 +782,10 @@ exports.FUNCTIONS = [
|
|
|
684
782
|
query = `${leftQ} - ${rightQ}`;
|
|
685
783
|
}
|
|
686
784
|
return trunc ? `date_trunc(${asValue(trunc)}, ${query})` : query;
|
|
687
|
-
}
|
|
785
|
+
},
|
|
688
786
|
})),
|
|
689
787
|
/* pgcrypto funcs */
|
|
690
|
-
...["crypt"].map(funcName => ({
|
|
788
|
+
...["crypt"].map((funcName) => ({
|
|
691
789
|
name: "$" + funcName,
|
|
692
790
|
type: "function",
|
|
693
791
|
numArgs: 1,
|
|
@@ -696,10 +794,10 @@ exports.FUNCTIONS = [
|
|
|
696
794
|
getQuery: ({ allowedFields, args, tableAlias }) => {
|
|
697
795
|
const value = asValue(args[0]) + "", seedColumnName = (0, QueryBuilder_1.asNameAlias)(args[1], tableAlias);
|
|
698
796
|
return `crypt(${value}, ${seedColumnName}::text)`;
|
|
699
|
-
}
|
|
797
|
+
},
|
|
700
798
|
})),
|
|
701
799
|
/* Text col and value funcs */
|
|
702
|
-
...["position", "position_lower"].map(funcName => ({
|
|
800
|
+
...["position", "position_lower"].map((funcName) => ({
|
|
703
801
|
name: "$" + funcName,
|
|
704
802
|
type: "function",
|
|
705
803
|
numArgs: 1,
|
|
@@ -712,9 +810,9 @@ exports.FUNCTIONS = [
|
|
|
712
810
|
a2 = `LOWER(${a2}::text)`;
|
|
713
811
|
}
|
|
714
812
|
return `position( ${a1} IN ${a2} )`;
|
|
715
|
-
}
|
|
813
|
+
},
|
|
716
814
|
})),
|
|
717
|
-
...["template_string"].map(funcName => ({
|
|
815
|
+
...["template_string"].map((funcName) => ({
|
|
718
816
|
name: "$" + funcName,
|
|
719
817
|
type: "function",
|
|
720
818
|
numArgs: 1,
|
|
@@ -726,16 +824,16 @@ exports.FUNCTIONS = [
|
|
|
726
824
|
throw "First argument must be a string. E.g.: '{col1} ..text {col2} ...' ";
|
|
727
825
|
const rawValue = args[0];
|
|
728
826
|
let finalValue = rawValue;
|
|
729
|
-
const usedColumns = allowedFields.filter(fName => rawValue.includes(`{${fName}}`));
|
|
827
|
+
const usedColumns = allowedFields.filter((fName) => rawValue.includes(`{${fName}}`));
|
|
730
828
|
usedColumns.forEach((colName, idx) => {
|
|
731
829
|
finalValue = finalValue.split(`{${colName}}`).join(`%${idx + 1}$s`);
|
|
732
830
|
});
|
|
733
831
|
finalValue = asValue(finalValue);
|
|
734
832
|
if (usedColumns.length) {
|
|
735
|
-
return `format(${finalValue}, ${usedColumns.map(c => `${(0, QueryBuilder_1.asNameAlias)(c, tableAlias)}::TEXT`).join(", ")})`;
|
|
833
|
+
return `format(${finalValue}, ${usedColumns.map((c) => `${(0, QueryBuilder_1.asNameAlias)(c, tableAlias)}::TEXT`).join(", ")})`;
|
|
736
834
|
}
|
|
737
835
|
return `format(${finalValue})`;
|
|
738
|
-
}
|
|
836
|
+
},
|
|
739
837
|
})),
|
|
740
838
|
/** Custom highlight -> myterm => ['some text and', ['myterm'], ' and some other text']
|
|
741
839
|
* (fields: "*" | string[], term: string, { edgeTruncate: number = -1; noFields: boolean = false }) => string | (string | [string])[]
|
|
@@ -743,7 +841,7 @@ exports.FUNCTIONS = [
|
|
|
743
841
|
* noFields = exclude field names in search
|
|
744
842
|
* */
|
|
745
843
|
{
|
|
746
|
-
name: "$term_highlight"
|
|
844
|
+
name: "$term_highlight" /* */,
|
|
747
845
|
description: ` :[column_names<string[] | "*">, search_term<string>, opts?<{ returnIndex?: number; edgeTruncate?: number; noFields?: boolean }>] -> get case-insensitive text match highlight`,
|
|
748
846
|
type: "function",
|
|
749
847
|
numArgs: 1,
|
|
@@ -754,19 +852,26 @@ exports.FUNCTIONS = [
|
|
|
754
852
|
const cols = (0, parseFieldFilter_1.parseFieldFilter)(args[0], false, allowedFields);
|
|
755
853
|
let term = args[1];
|
|
756
854
|
const rawTerm = args[1];
|
|
757
|
-
const { edgeTruncate, noFields = false, returnType, matchCase = false } = args[2] || {};
|
|
855
|
+
const { edgeTruncate, noFields = false, returnType, matchCase = false, } = args[2] || {};
|
|
758
856
|
if (!(0, prostgles_types_1.isEmpty)(args[2])) {
|
|
759
857
|
const keys = Object.keys(args[2]);
|
|
760
|
-
const validKeys = [
|
|
761
|
-
|
|
858
|
+
const validKeys = [
|
|
859
|
+
"edgeTruncate",
|
|
860
|
+
"noFields",
|
|
861
|
+
"returnType",
|
|
862
|
+
"matchCase",
|
|
863
|
+
];
|
|
864
|
+
const bad_keys = keys.filter((k) => !validKeys.includes(k));
|
|
762
865
|
if (bad_keys.length)
|
|
763
|
-
throw "Invalid options provided for $term_highlight. Expecting one of: " +
|
|
866
|
+
throw ("Invalid options provided for $term_highlight. Expecting one of: " +
|
|
867
|
+
validKeys.join(", "));
|
|
764
868
|
}
|
|
765
869
|
if (!cols.length)
|
|
766
870
|
throw "Cols are empty/invalid";
|
|
767
871
|
if (typeof term !== "string")
|
|
768
872
|
throw "Non string term provided: " + term;
|
|
769
|
-
if (edgeTruncate !== undefined &&
|
|
873
|
+
if (edgeTruncate !== undefined &&
|
|
874
|
+
(!Number.isInteger(edgeTruncate) || edgeTruncate < -1))
|
|
770
875
|
throw "Invalid edgeTruncate. expecting a positive integer";
|
|
771
876
|
if (typeof noFields !== "boolean")
|
|
772
877
|
throw "Invalid noFields. expecting boolean";
|
|
@@ -799,7 +904,11 @@ exports.FUNCTIONS = [
|
|
|
799
904
|
END
|
|
800
905
|
`;
|
|
801
906
|
};
|
|
802
|
-
const colRaw = "( " +
|
|
907
|
+
const colRaw = "( " +
|
|
908
|
+
cols
|
|
909
|
+
.map((c) => `${noFields ? "" : asValue(c + ": ") + " || "} COALESCE(${(0, QueryBuilder_1.asNameAlias)(c, tableAlias)}::TEXT, '')`)
|
|
910
|
+
.join(" || ', ' || ") +
|
|
911
|
+
" )";
|
|
803
912
|
let col = colRaw;
|
|
804
913
|
term = asValue(term);
|
|
805
914
|
if (!matchCase) {
|
|
@@ -820,27 +929,27 @@ exports.FUNCTIONS = [
|
|
|
820
929
|
}
|
|
821
930
|
else if (returnType === "object" || returnType === "boolean") {
|
|
822
931
|
const hasChars = Boolean(rawTerm && /[a-z]/i.test(rawTerm));
|
|
823
|
-
const validCols = cols
|
|
824
|
-
|
|
932
|
+
const validCols = cols
|
|
933
|
+
.map((c) => {
|
|
934
|
+
const colInfo = allColumns.find((ac) => ac.name === c);
|
|
825
935
|
return {
|
|
826
936
|
key: c,
|
|
827
|
-
colInfo
|
|
937
|
+
colInfo,
|
|
828
938
|
};
|
|
829
939
|
})
|
|
830
|
-
.filter(c => c.colInfo && c.colInfo.udt_name !== "bytea");
|
|
831
|
-
const _cols = validCols.filter(c =>
|
|
940
|
+
.filter((c) => c.colInfo && c.colInfo.udt_name !== "bytea");
|
|
941
|
+
const _cols = validCols.filter((c) =>
|
|
832
942
|
/** Exclude numeric columns when the search tern contains a character */
|
|
833
|
-
!hasChars ||
|
|
834
|
-
(0, DboBuilder_1.postgresToTsType)(c.colInfo.udt_name) !== "number");
|
|
943
|
+
!hasChars || (0, DboBuilder_1.postgresToTsType)(c.colInfo.udt_name) !== "number");
|
|
835
944
|
/** This will break GROUP BY (non-integer constant in GROUP BY) */
|
|
836
945
|
if (!_cols.length) {
|
|
837
946
|
if (validCols.length && hasChars)
|
|
838
947
|
throw `You're searching the impossible: characters in numeric fields. Use this to prevent making such a request in future: /[a-z]/i.test(your_term) `;
|
|
839
|
-
return
|
|
948
|
+
return returnType === "boolean" ? "FALSE" : "NULL";
|
|
840
949
|
}
|
|
841
950
|
res = `CASE
|
|
842
951
|
${_cols
|
|
843
|
-
.map(c => {
|
|
952
|
+
.map((c) => {
|
|
844
953
|
const colNameEscaped = (0, QueryBuilder_1.asNameAlias)(c.key, tableAlias);
|
|
845
954
|
let colSelect = `${colNameEscaped}::TEXT`;
|
|
846
955
|
const isTstamp = c.colInfo?.udt_name.startsWith("timestamp");
|
|
@@ -856,19 +965,20 @@ exports.FUNCTIONS = [
|
|
|
856
965
|
const colTxt = `COALESCE(${colSelect}, '')`; // position(${term} IN ${colTxt}) > 0
|
|
857
966
|
if (returnType === "boolean") {
|
|
858
967
|
return `
|
|
859
|
-
WHEN ${colTxt} ${matchCase ? "LIKE" : "ILIKE"} ${asValue(
|
|
968
|
+
WHEN ${colTxt} ${matchCase ? "LIKE" : "ILIKE"} ${asValue("%" + rawTerm + "%")}
|
|
860
969
|
THEN TRUE
|
|
861
970
|
`;
|
|
862
971
|
}
|
|
863
972
|
return `
|
|
864
|
-
WHEN ${colTxt} ${matchCase ? "LIKE" : "ILIKE"} ${asValue(
|
|
973
|
+
WHEN ${colTxt} ${matchCase ? "LIKE" : "ILIKE"} ${asValue("%" + rawTerm + "%")}
|
|
865
974
|
THEN json_build_object(
|
|
866
975
|
${asValue(c.key)},
|
|
867
976
|
${makeTextMatcherArray(colTxt, term)}
|
|
868
977
|
)::jsonb
|
|
869
978
|
`;
|
|
870
|
-
})
|
|
871
|
-
|
|
979
|
+
})
|
|
980
|
+
.join(" ")}
|
|
981
|
+
ELSE ${returnType === "boolean" ? "FALSE" : "NULL"}
|
|
872
982
|
|
|
873
983
|
END`;
|
|
874
984
|
// console.log(res)
|
|
@@ -884,10 +994,20 @@ exports.FUNCTIONS = [
|
|
|
884
994
|
]) ELSE array_to_json(ARRAY[(${colRaw})::TEXT]) END`;
|
|
885
995
|
}
|
|
886
996
|
return res;
|
|
887
|
-
}
|
|
997
|
+
},
|
|
888
998
|
},
|
|
889
999
|
/* Aggs */
|
|
890
|
-
...[
|
|
1000
|
+
...[
|
|
1001
|
+
"max",
|
|
1002
|
+
"min",
|
|
1003
|
+
"count",
|
|
1004
|
+
"avg",
|
|
1005
|
+
"json_agg",
|
|
1006
|
+
"jsonb_agg",
|
|
1007
|
+
"string_agg",
|
|
1008
|
+
"array_agg",
|
|
1009
|
+
"sum",
|
|
1010
|
+
].map((aggName) => ({
|
|
891
1011
|
name: "$" + aggName,
|
|
892
1012
|
type: "aggregation",
|
|
893
1013
|
numArgs: 1,
|
|
@@ -898,8 +1018,8 @@ exports.FUNCTIONS = [
|
|
|
898
1018
|
if (args.length > 1) {
|
|
899
1019
|
extraArgs = DboBuilder_1.pgp.as.format(", $1:csv", args.slice(1));
|
|
900
1020
|
}
|
|
901
|
-
return aggName + "(" + (0, QueryBuilder_1.asNameAlias)(args[0], tableAlias) + `${extraArgs})
|
|
902
|
-
}
|
|
1021
|
+
return (aggName + "(" + (0, QueryBuilder_1.asNameAlias)(args[0], tableAlias) + `${extraArgs})`);
|
|
1022
|
+
},
|
|
903
1023
|
})),
|
|
904
1024
|
{
|
|
905
1025
|
name: "$jsonb_build_object",
|
|
@@ -907,10 +1027,10 @@ exports.FUNCTIONS = [
|
|
|
907
1027
|
numArgs: 22,
|
|
908
1028
|
minCols: 1,
|
|
909
1029
|
singleColArg: false,
|
|
910
|
-
getFields: args => args,
|
|
1030
|
+
getFields: (args) => args,
|
|
911
1031
|
getQuery: ({ args, tableAlias }) => {
|
|
912
|
-
return `jsonb_build_object(${args.flatMap(arg => [asValue(arg), (0, QueryBuilder_1.asNameAlias)(arg, tableAlias)]).join(", ")})`;
|
|
913
|
-
}
|
|
1032
|
+
return `jsonb_build_object(${args.flatMap((arg) => [asValue(arg), (0, QueryBuilder_1.asNameAlias)(arg, tableAlias)]).join(", ")})`;
|
|
1033
|
+
},
|
|
914
1034
|
},
|
|
915
1035
|
/* More aggs */
|
|
916
1036
|
{
|
|
@@ -922,7 +1042,7 @@ exports.FUNCTIONS = [
|
|
|
922
1042
|
getFields: (args) => [],
|
|
923
1043
|
getQuery: ({ allowedFields, args, tableAlias }) => {
|
|
924
1044
|
return "COUNT(*)";
|
|
925
|
-
}
|
|
1045
|
+
},
|
|
926
1046
|
},
|
|
927
1047
|
{
|
|
928
1048
|
name: "$diff_perc",
|
|
@@ -933,8 +1053,8 @@ exports.FUNCTIONS = [
|
|
|
933
1053
|
getQuery: ({ allowedFields, args, tableAlias }) => {
|
|
934
1054
|
const col = (0, QueryBuilder_1.asNameAlias)(args[0], tableAlias);
|
|
935
1055
|
return `round( ( ( MAX(${col}) - MIN(${col}) )::float/MIN(${col}) ) * 100, 2)`;
|
|
936
|
-
}
|
|
937
|
-
}
|
|
1056
|
+
},
|
|
1057
|
+
},
|
|
938
1058
|
];
|
|
939
1059
|
/* The difference between a function and computed field is that the computed field does not require any arguments */
|
|
940
1060
|
exports.COMPUTED_FIELDS = [
|
|
@@ -946,17 +1066,17 @@ exports.COMPUTED_FIELDS = [
|
|
|
946
1066
|
type: "computed",
|
|
947
1067
|
// description: ` order hash of row content `,
|
|
948
1068
|
getQuery: ({ allowedFields, tableAlias, ctidField }) => {
|
|
949
|
-
return "md5(" +
|
|
1069
|
+
return ("md5(" +
|
|
950
1070
|
allowedFields
|
|
951
1071
|
/* CTID not available in AFTER trigger */
|
|
952
1072
|
// .concat(ctidField? [ctidField] : [])
|
|
953
1073
|
.sort()
|
|
954
|
-
.map(f => (0, QueryBuilder_1.asNameAlias)(f, tableAlias))
|
|
955
|
-
.map(f => `md5(coalesce(${f}::text, 'dd'))`)
|
|
1074
|
+
.map((f) => (0, QueryBuilder_1.asNameAlias)(f, tableAlias))
|
|
1075
|
+
.map((f) => `md5(coalesce(${f}::text, 'dd'))`)
|
|
956
1076
|
.join(" || ") +
|
|
957
|
-
`)
|
|
958
|
-
}
|
|
959
|
-
}
|
|
1077
|
+
`)`);
|
|
1078
|
+
},
|
|
1079
|
+
},
|
|
960
1080
|
// ,{
|
|
961
1081
|
// name: "ctid",
|
|
962
1082
|
// type: "computed",
|
|
@@ -1007,5 +1127,5 @@ WHERE NOT EXISTS ( --Keep only leaf values
|
|
|
1007
1127
|
AND starts_with(t2.path, t1.path)
|
|
1008
1128
|
);
|
|
1009
1129
|
|
|
1010
|
-
*/
|
|
1130
|
+
*/
|
|
1011
1131
|
//# sourceMappingURL=Functions.js.map
|