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
package/lib/Filtering.ts
CHANGED
|
@@ -1,33 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
1
|
import {
|
|
4
2
|
BetweenFilterKeys,
|
|
5
3
|
CompareFilterKeys,
|
|
6
4
|
CompareInFilterKeys,
|
|
7
5
|
FilterDataType,
|
|
8
6
|
FullFilter,
|
|
9
|
-
GeomFilterKeys,
|
|
7
|
+
GeomFilterKeys,
|
|
8
|
+
GeomFilter_Funcs,
|
|
10
9
|
JsonbFilterKeys,
|
|
11
10
|
TextFilterKeys,
|
|
12
11
|
TextFilter_FullTextSearchFilterKeys,
|
|
13
12
|
getKeys,
|
|
14
13
|
isEmpty,
|
|
15
|
-
isObject
|
|
14
|
+
isObject,
|
|
16
15
|
} from "prostgles-types";
|
|
17
16
|
import { SelectItem } from "./DboBuilder/QueryBuilder/QueryBuilder";
|
|
18
17
|
import { pgp } from "./DboBuilder/DboBuilderTypes";
|
|
19
18
|
|
|
20
|
-
|
|
21
19
|
export const FILTER_OPERANDS = [
|
|
22
20
|
...TextFilterKeys,
|
|
23
21
|
...JsonbFilterKeys,
|
|
24
22
|
...CompareFilterKeys,
|
|
25
23
|
...BetweenFilterKeys,
|
|
26
|
-
...CompareInFilterKeys
|
|
24
|
+
...CompareInFilterKeys,
|
|
27
25
|
] as const;
|
|
28
26
|
|
|
29
27
|
export const FILTER_OPERAND_TO_SQL_OPERAND = Object.fromEntries(
|
|
30
|
-
FILTER_OPERANDS.map(filterOperand => {
|
|
28
|
+
FILTER_OPERANDS.map((filterOperand) => {
|
|
31
29
|
let sqlOperand = filterOperand as string;
|
|
32
30
|
if (filterOperand === "$eq") sqlOperand = "=";
|
|
33
31
|
else if (filterOperand === "$gt") sqlOperand = ">";
|
|
@@ -43,18 +41,20 @@ export const FILTER_OPERAND_TO_SQL_OPERAND = Object.fromEntries(
|
|
|
43
41
|
else if (filterOperand === "$nin") sqlOperand = "NOT IN";
|
|
44
42
|
else if (filterOperand === "$between") sqlOperand = "BETWEEN";
|
|
45
43
|
else if (filterOperand === "$notBetween") sqlOperand = "NOT BETWEEN";
|
|
46
|
-
else if (filterOperand === "$isDistinctFrom")
|
|
47
|
-
|
|
44
|
+
else if (filterOperand === "$isDistinctFrom")
|
|
45
|
+
sqlOperand = "IS DISTINCT FROM";
|
|
46
|
+
else if (filterOperand === "$isNotDistinctFrom")
|
|
47
|
+
sqlOperand = "IS NOT DISTINCT FROM";
|
|
48
48
|
return [filterOperand, sqlOperand];
|
|
49
|
-
})
|
|
50
|
-
) as Record<typeof FILTER_OPERANDS[number], string>;
|
|
49
|
+
}),
|
|
50
|
+
) as Record<(typeof FILTER_OPERANDS)[number], string>;
|
|
51
51
|
|
|
52
52
|
/**
|
|
53
|
-
* Parse a single filter
|
|
54
|
-
* Ensure only single key objects reach this point
|
|
55
|
-
*/
|
|
56
|
-
type ParseFilterItemArgs = {
|
|
57
|
-
filter: FullFilter<void, void>;
|
|
53
|
+
* Parse a single filter
|
|
54
|
+
* Ensure only single key objects reach this point
|
|
55
|
+
*/
|
|
56
|
+
type ParseFilterItemArgs = {
|
|
57
|
+
filter: FullFilter<void, void>;
|
|
58
58
|
select: SelectItem[] | undefined;
|
|
59
59
|
tableAlias: string | undefined;
|
|
60
60
|
allowedColumnNames: string[];
|
|
@@ -63,401 +63,453 @@ type ParseFilterItemArgs = {
|
|
|
63
63
|
export const parseFilterItem = (args: ParseFilterItemArgs): string => {
|
|
64
64
|
const { filter: _f, select, tableAlias, allowedColumnNames } = args;
|
|
65
65
|
|
|
66
|
-
if(!_f || isEmpty(_f)) return "";
|
|
66
|
+
if (!_f || isEmpty(_f)) return "";
|
|
67
67
|
|
|
68
68
|
const mErr = (msg: string) => {
|
|
69
|
-
throw `${msg}: ${JSON.stringify(_f, null, 2)}
|
|
69
|
+
throw `${msg}: ${JSON.stringify(_f, null, 2)}`;
|
|
70
70
|
};
|
|
71
71
|
const asValue = (v: any) => pgp.as.format("$1", [v]);
|
|
72
72
|
|
|
73
|
-
const fKeys = getKeys(_f)
|
|
74
|
-
if(fKeys.length === 0){
|
|
73
|
+
const fKeys = getKeys(_f);
|
|
74
|
+
if (fKeys.length === 0) {
|
|
75
75
|
return "";
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
} else if(fKeys.length > 1){
|
|
81
|
-
return fKeys
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* { field1: cond1, field2: cond2 }
|
|
79
|
+
*/
|
|
80
|
+
} else if (fKeys.length > 1) {
|
|
81
|
+
return fKeys
|
|
82
|
+
.map((fk) =>
|
|
83
|
+
parseFilterItem({
|
|
84
|
+
filter: { [fk]: _f[fk] },
|
|
85
|
+
select,
|
|
86
|
+
tableAlias,
|
|
87
|
+
allowedColumnNames,
|
|
88
|
+
}),
|
|
89
|
+
)
|
|
90
|
+
.sort() /* sorted to ensure duplicate subscription channels are not created due to different condition order */
|
|
91
|
+
.join(" AND ");
|
|
89
92
|
}
|
|
90
93
|
|
|
91
94
|
const fKey: string = fKeys[0]!;
|
|
92
95
|
|
|
93
96
|
let selItem: SelectItem | undefined;
|
|
94
|
-
if(select) {
|
|
95
|
-
selItem = select.find(s => fKey === s.alias);
|
|
97
|
+
if (select) {
|
|
98
|
+
selItem = select.find((s) => fKey === s.alias);
|
|
96
99
|
}
|
|
97
100
|
let rightF: FilterDataType<any> = (_f as any)[fKey];
|
|
98
101
|
|
|
99
102
|
const validateSelectedItemFilter = (selectedItem: SelectItem | undefined) => {
|
|
100
103
|
const fields = selectedItem?.getFields();
|
|
101
|
-
if(Array.isArray(fields) && fields.length > 1) {
|
|
102
|
-
const dissallowedFields = fields.filter(
|
|
103
|
-
|
|
104
|
-
|
|
104
|
+
if (Array.isArray(fields) && fields.length > 1) {
|
|
105
|
+
const dissallowedFields = fields.filter(
|
|
106
|
+
(fname) => !allowedColumnNames.includes(fname),
|
|
107
|
+
);
|
|
108
|
+
if (dissallowedFields.length) {
|
|
109
|
+
throw new Error(
|
|
110
|
+
`Invalid/disallowed columns found in filter: ${dissallowedFields}`,
|
|
111
|
+
);
|
|
105
112
|
}
|
|
106
113
|
}
|
|
107
|
-
}
|
|
114
|
+
};
|
|
108
115
|
const getLeftQ = (selItm: SelectItem) => {
|
|
109
116
|
validateSelectedItemFilter(selItem);
|
|
110
|
-
if(selItm.type === "function" || selItm.type === "aggregation")
|
|
117
|
+
if (selItm.type === "function" || selItm.type === "aggregation")
|
|
118
|
+
return selItm.getQuery();
|
|
111
119
|
return selItm.getQuery(tableAlias);
|
|
112
|
-
}
|
|
120
|
+
};
|
|
113
121
|
|
|
114
122
|
/**
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
let leftQ: string | undefined
|
|
123
|
+
* Parsed left side of the query
|
|
124
|
+
*/
|
|
125
|
+
let leftQ: string | undefined; // = asName(selItem.alias);
|
|
118
126
|
|
|
119
127
|
/*
|
|
120
128
|
Select item not found.
|
|
121
129
|
Check if dot/json notation. Build obj if necessary
|
|
122
130
|
*/
|
|
123
131
|
const dot_notation_delims = ["->", "."];
|
|
124
|
-
if(!selItem){
|
|
125
|
-
|
|
132
|
+
if (!selItem) {
|
|
126
133
|
/* See if dot notation. Pick the best matching starting string */
|
|
127
|
-
if(select){
|
|
128
|
-
selItem = select.find(s =>
|
|
129
|
-
dot_notation_delims.find(delimiter =>
|
|
134
|
+
if (select) {
|
|
135
|
+
selItem = select.find((s) =>
|
|
136
|
+
dot_notation_delims.find((delimiter) =>
|
|
137
|
+
fKey.startsWith(s.alias + delimiter),
|
|
138
|
+
),
|
|
130
139
|
);
|
|
131
140
|
validateSelectedItemFilter(selItem);
|
|
132
141
|
}
|
|
133
|
-
if(!selItem) {
|
|
134
|
-
return mErr(
|
|
142
|
+
if (!selItem) {
|
|
143
|
+
return mErr(
|
|
144
|
+
"Bad filter. Could not match to a column or alias or dot notation" +
|
|
145
|
+
select?.map((s) => s.alias),
|
|
146
|
+
);
|
|
135
147
|
}
|
|
136
148
|
|
|
137
149
|
let remainingStr = fKey.slice(selItem.alias.length);
|
|
138
150
|
|
|
139
151
|
/* Is json path spec */
|
|
140
|
-
if(remainingStr.startsWith("->")){
|
|
141
|
-
|
|
152
|
+
if (remainingStr.startsWith("->")) {
|
|
142
153
|
/** Has shorthand operand 'col->>key.<>' */
|
|
143
|
-
const matchingOperand = CompareFilterKeys.find(operand =>
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
154
|
+
const matchingOperand = CompareFilterKeys.find((operand) =>
|
|
155
|
+
remainingStr.endsWith(`.${operand}`),
|
|
156
|
+
);
|
|
157
|
+
if (matchingOperand) {
|
|
158
|
+
remainingStr = remainingStr.slice(0, -matchingOperand.length - 1);
|
|
159
|
+
rightF = { [matchingOperand]: rightF };
|
|
147
160
|
}
|
|
148
161
|
|
|
149
162
|
leftQ = getLeftQ(selItem);
|
|
150
|
-
|
|
163
|
+
|
|
151
164
|
/**
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
type GetSepRes = { idx: number; sep: string } | undefined
|
|
165
|
+
* get json path separators. Expecting -> to come first
|
|
166
|
+
*/
|
|
167
|
+
type GetSepRes = { idx: number; sep: string } | undefined;
|
|
155
168
|
const getSep = (fromIdx = 0): GetSepRes => {
|
|
156
|
-
const strPart = remainingStr.slice(fromIdx)
|
|
169
|
+
const strPart = remainingStr.slice(fromIdx);
|
|
157
170
|
let idx = strPart.indexOf("->");
|
|
158
171
|
const idxx = strPart.indexOf("->>");
|
|
159
|
-
if(idx > -1) {
|
|
172
|
+
if (idx > -1) {
|
|
160
173
|
/* if -> matches then check if it's the last separator */
|
|
161
|
-
if(idx === idxx) return { idx: idx + fromIdx, sep: "->>" }
|
|
162
|
-
return { idx: idx + fromIdx, sep: "->" }
|
|
174
|
+
if (idx === idxx) return { idx: idx + fromIdx, sep: "->>" };
|
|
175
|
+
return { idx: idx + fromIdx, sep: "->" };
|
|
163
176
|
}
|
|
164
177
|
idx = strPart.indexOf("->>");
|
|
165
|
-
if(idx > -1) {
|
|
166
|
-
return { idx: idx + fromIdx, sep: "->>" }
|
|
178
|
+
if (idx > -1) {
|
|
179
|
+
return { idx: idx + fromIdx, sep: "->>" };
|
|
167
180
|
}
|
|
168
181
|
|
|
169
182
|
return undefined;
|
|
170
|
-
}
|
|
171
|
-
|
|
183
|
+
};
|
|
172
184
|
|
|
173
185
|
let currSep = getSep();
|
|
174
|
-
while(currSep){
|
|
186
|
+
while (currSep) {
|
|
175
187
|
let nextSep = getSep(currSep.idx + currSep.sep.length);
|
|
176
188
|
|
|
177
|
-
let nextIdx = nextSep? nextSep.idx : remainingStr.length;
|
|
189
|
+
let nextIdx = nextSep ? nextSep.idx : remainingStr.length;
|
|
178
190
|
|
|
179
191
|
/* If ending in set then add set as well into key */
|
|
180
|
-
if(nextSep && nextIdx + nextSep.sep.length === remainingStr.length) {
|
|
192
|
+
if (nextSep && nextIdx + nextSep.sep.length === remainingStr.length) {
|
|
181
193
|
nextIdx = remainingStr.length;
|
|
182
|
-
nextSep =
|
|
194
|
+
nextSep = undefined;
|
|
183
195
|
}
|
|
184
196
|
|
|
185
|
-
leftQ +=
|
|
197
|
+
leftQ +=
|
|
198
|
+
currSep.sep +
|
|
199
|
+
asValue(
|
|
200
|
+
remainingStr.slice(currSep.idx + currSep.sep.length, nextIdx),
|
|
201
|
+
);
|
|
186
202
|
currSep = nextSep;
|
|
187
203
|
}
|
|
188
204
|
|
|
189
|
-
|
|
205
|
+
/*
|
|
190
206
|
Is collapsed filter spec e.g. { "col.$ilike": 'text' }
|
|
191
207
|
will transform into { col: { $ilike: ['text'] } }
|
|
192
208
|
*/
|
|
193
|
-
} else if(remainingStr.startsWith(".")){
|
|
209
|
+
} else if (remainingStr.startsWith(".")) {
|
|
194
210
|
leftQ = getLeftQ(selItem);
|
|
195
211
|
|
|
196
212
|
const getSep = (fromIdx = 0) => {
|
|
197
213
|
const idx = remainingStr.slice(fromIdx).indexOf(".");
|
|
198
|
-
if(idx > -1) return fromIdx + idx;
|
|
199
|
-
return idx;
|
|
200
|
-
}
|
|
214
|
+
if (idx > -1) return fromIdx + idx;
|
|
215
|
+
return idx;
|
|
216
|
+
};
|
|
201
217
|
let currIdx = getSep();
|
|
202
218
|
const res: any = {};
|
|
203
219
|
let curObj = res;
|
|
204
220
|
|
|
205
|
-
while(currIdx > -1){
|
|
221
|
+
while (currIdx > -1) {
|
|
206
222
|
let nextIdx = getSep(currIdx + 1);
|
|
207
|
-
let nIdx = nextIdx > -1? nextIdx : remainingStr.length;
|
|
223
|
+
let nIdx = nextIdx > -1 ? nextIdx : remainingStr.length;
|
|
208
224
|
|
|
209
225
|
/* If ending in dot then add dot as well into key */
|
|
210
|
-
if(nextIdx + 1 === remainingStr.length) {
|
|
226
|
+
if (nextIdx + 1 === remainingStr.length) {
|
|
211
227
|
nIdx = remainingStr.length;
|
|
212
228
|
nextIdx = -1;
|
|
213
229
|
}
|
|
214
230
|
|
|
215
231
|
const key = remainingStr.slice(currIdx + 1, nIdx);
|
|
216
|
-
curObj[key] = nextIdx > -1? {} : (_f as any)[fKey];
|
|
232
|
+
curObj[key] = nextIdx > -1 ? {} : (_f as any)[fKey];
|
|
217
233
|
curObj = curObj[key];
|
|
218
234
|
|
|
219
235
|
currIdx = nextIdx;
|
|
220
236
|
}
|
|
221
|
-
|
|
237
|
+
|
|
222
238
|
rightF = res;
|
|
223
239
|
} else {
|
|
224
240
|
// console.trace(141, select, selItem, remainingStr)
|
|
225
|
-
mErr(
|
|
241
|
+
mErr(
|
|
242
|
+
"Bad filter. Could not find the valid col name or alias or col json path",
|
|
243
|
+
);
|
|
226
244
|
}
|
|
227
|
-
|
|
228
245
|
} else {
|
|
229
246
|
leftQ = getLeftQ(selItem);
|
|
230
247
|
}
|
|
231
248
|
|
|
232
|
-
if(!leftQ) mErr("Internal error: leftQ missing?!");
|
|
249
|
+
if (!leftQ) mErr("Internal error: leftQ missing?!");
|
|
233
250
|
|
|
234
|
-
const parseRightVal = (
|
|
251
|
+
const parseRightVal = (
|
|
252
|
+
val: any,
|
|
253
|
+
expect?: "csv" | "array" | "json" | "jsonb",
|
|
254
|
+
) => {
|
|
235
255
|
try {
|
|
236
256
|
return parseFilterRightValue(val, { selectItem: selItem, expect });
|
|
237
|
-
} catch(e: any){
|
|
257
|
+
} catch (e: any) {
|
|
238
258
|
return mErr(e);
|
|
239
259
|
}
|
|
240
|
-
}
|
|
260
|
+
};
|
|
241
261
|
|
|
242
262
|
/* Matching sel item */
|
|
243
|
-
if(isObject(rightF)){
|
|
244
|
-
|
|
263
|
+
if (isObject(rightF)) {
|
|
245
264
|
const filterKeys = Object.keys(rightF);
|
|
246
|
-
let filterOperand: typeof FILTER_OPERANDS[number] = filterKeys[0] as any;
|
|
265
|
+
let filterOperand: (typeof FILTER_OPERANDS)[number] = filterKeys[0] as any;
|
|
247
266
|
|
|
248
267
|
/** JSON cannot be compared so we'll cast it to TEXT */
|
|
249
|
-
if
|
|
250
|
-
|
|
268
|
+
if (
|
|
269
|
+
selItem?.column_udt_type === "json" ||
|
|
270
|
+
TextFilterKeys.includes(filterOperand as any)
|
|
271
|
+
) {
|
|
272
|
+
leftQ += "::TEXT ";
|
|
251
273
|
}
|
|
252
274
|
|
|
253
275
|
/** It's an object key which means it's an equality comparison against a json object */
|
|
254
|
-
if
|
|
276
|
+
if (
|
|
277
|
+
selItem?.column_udt_type?.startsWith("json") &&
|
|
278
|
+
!FILTER_OPERANDS.includes(filterOperand)
|
|
279
|
+
) {
|
|
255
280
|
return leftQ + " = " + parseRightVal(rightF);
|
|
256
|
-
}
|
|
281
|
+
}
|
|
257
282
|
|
|
258
283
|
let filterValue = rightF[filterOperand];
|
|
259
|
-
const ALLOWED_FUNCS = [
|
|
260
|
-
|
|
284
|
+
const ALLOWED_FUNCS = [
|
|
285
|
+
...GeomFilter_Funcs,
|
|
286
|
+
...TextFilter_FullTextSearchFilterKeys,
|
|
287
|
+
] as const;
|
|
288
|
+
let funcName: undefined | (typeof ALLOWED_FUNCS)[number];
|
|
261
289
|
let funcArgs: undefined | any[];
|
|
262
290
|
|
|
263
|
-
if
|
|
291
|
+
if (
|
|
292
|
+
selItem.column_udt_type === "interval" &&
|
|
293
|
+
isObject(rightF) &&
|
|
294
|
+
Object.values(rightF).every((v) => Number.isFinite(v))
|
|
295
|
+
) {
|
|
264
296
|
filterOperand = "=";
|
|
265
|
-
filterValue = Object.entries(rightF)
|
|
266
|
-
|
|
267
|
-
|
|
297
|
+
filterValue = Object.entries(rightF)
|
|
298
|
+
.map(([k, v]) => `${v}${k}`)
|
|
299
|
+
.join(" ");
|
|
300
|
+
} else if (filterKeys.length !== 1 && selItem.column_udt_type !== "jsonb") {
|
|
268
301
|
return mErr("Bad filter. Expecting one key only");
|
|
269
|
-
|
|
270
|
-
} else if(isObject(filterValue) && !(filterValue instanceof Date)){
|
|
271
|
-
|
|
302
|
+
} else if (isObject(filterValue) && !(filterValue instanceof Date)) {
|
|
272
303
|
/**
|
|
273
304
|
* Filter notation
|
|
274
305
|
* geom && st_makeenvelope(funcArgs)
|
|
275
306
|
*/
|
|
276
307
|
const filterValueKeys = Object.keys(filterValue);
|
|
277
308
|
funcName = filterValueKeys[0] as any;
|
|
278
|
-
if(ALLOWED_FUNCS.includes(funcName as any)){
|
|
309
|
+
if (ALLOWED_FUNCS.includes(funcName as any)) {
|
|
279
310
|
funcArgs = filterValue[funcName as any];
|
|
280
311
|
} else {
|
|
281
312
|
funcName = undefined;
|
|
282
313
|
}
|
|
283
|
-
}
|
|
314
|
+
}
|
|
284
315
|
|
|
285
316
|
/** st_makeenvelope */
|
|
286
|
-
if
|
|
287
|
-
|
|
288
|
-
|
|
317
|
+
if (
|
|
318
|
+
GeomFilterKeys.includes(filterOperand as any) &&
|
|
319
|
+
funcName &&
|
|
320
|
+
GeomFilter_Funcs.includes(funcName as any)
|
|
321
|
+
) {
|
|
322
|
+
/**
|
|
289
323
|
* If leftQ is geography then:
|
|
290
|
-
* - err can happen: 'Antipodal (180 degrees long) edge detected!'
|
|
324
|
+
* - err can happen: 'Antipodal (180 degrees long) edge detected!'
|
|
291
325
|
* - inacurrate results at large envelopes due to the curvature of the earth
|
|
292
326
|
* https://gis.stackexchange.com/questions/78816/maximum-size-on-the-bounding-box-with-st-makeenvelope-and-and-geography-colum
|
|
293
|
-
|
|
294
|
-
if(funcName.toLowerCase() === "st_makeenvelope") {
|
|
327
|
+
*/
|
|
328
|
+
if (funcName.toLowerCase() === "st_makeenvelope") {
|
|
295
329
|
leftQ += "::geometry";
|
|
296
330
|
}
|
|
297
331
|
|
|
298
332
|
return `${leftQ} ${filterOperand} ${funcName}${parseRightVal(funcArgs, "csv")}`;
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
if(filterValue === null) return leftQ + " IS NULL ";
|
|
333
|
+
} else if (["=", "$eq"].includes(filterOperand) && !funcName) {
|
|
334
|
+
if (filterValue === null) return leftQ + " IS NULL ";
|
|
302
335
|
return leftQ + " = " + parseRightVal(filterValue);
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
if(filterValue === null) return leftQ + " IS NOT NULL ";
|
|
336
|
+
} else if (["<>", "$ne"].includes(filterOperand)) {
|
|
337
|
+
if (filterValue === null) return leftQ + " IS NOT NULL ";
|
|
306
338
|
return leftQ + " <> " + parseRightVal(filterValue);
|
|
307
|
-
|
|
308
|
-
} else if([">", "$gt"].includes(filterOperand)){
|
|
339
|
+
} else if ([">", "$gt"].includes(filterOperand)) {
|
|
309
340
|
return leftQ + " > " + parseRightVal(filterValue);
|
|
310
|
-
|
|
311
|
-
} else if(["<", "$lt"].includes(filterOperand)){
|
|
341
|
+
} else if (["<", "$lt"].includes(filterOperand)) {
|
|
312
342
|
return leftQ + " < " + parseRightVal(filterValue);
|
|
313
|
-
|
|
314
|
-
} else if([">=", "$gte"].includes(filterOperand)){
|
|
343
|
+
} else if ([">=", "$gte"].includes(filterOperand)) {
|
|
315
344
|
return leftQ + " >= " + parseRightVal(filterValue);
|
|
316
|
-
|
|
317
|
-
} else if(["<=", "$lte"].includes(filterOperand)){
|
|
345
|
+
} else if (["<=", "$lte"].includes(filterOperand)) {
|
|
318
346
|
return leftQ + " <= " + parseRightVal(filterValue);
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
if(!filterValue?.length) {
|
|
347
|
+
} else if (["$in"].includes(filterOperand)) {
|
|
348
|
+
if (!filterValue?.length) {
|
|
322
349
|
return " FALSE ";
|
|
323
350
|
}
|
|
324
351
|
|
|
325
|
-
const filterNonNullValues: any[] = filterValue.filter(
|
|
326
|
-
|
|
327
|
-
|
|
352
|
+
const filterNonNullValues: any[] = filterValue.filter(
|
|
353
|
+
(v: any) => v !== null,
|
|
354
|
+
);
|
|
355
|
+
let c1 = "",
|
|
356
|
+
c2 = "";
|
|
357
|
+
if (filterNonNullValues.length) {
|
|
328
358
|
c1 = leftQ + " IN " + parseRightVal(filterNonNullValues, "csv");
|
|
329
359
|
}
|
|
330
|
-
if(filterValue.includes(null)) {
|
|
360
|
+
if (filterValue.includes(null)) {
|
|
331
361
|
c2 = ` ${leftQ} IS NULL `;
|
|
332
362
|
}
|
|
333
|
-
return [c1, c2].filter(c => c).join(" OR ");
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
if(!filterValue?.length) {
|
|
363
|
+
return [c1, c2].filter((c) => c).join(" OR ");
|
|
364
|
+
} else if (["$nin"].includes(filterOperand)) {
|
|
365
|
+
if (!filterValue?.length) {
|
|
337
366
|
return " TRUE ";
|
|
338
367
|
}
|
|
339
368
|
|
|
340
|
-
const nonNullFilterValues: any[] = filterValue.filter(
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
if(
|
|
369
|
+
const nonNullFilterValues: any[] = filterValue.filter(
|
|
370
|
+
(v: any) => v !== null,
|
|
371
|
+
);
|
|
372
|
+
let c1 = "",
|
|
373
|
+
c2 = "";
|
|
374
|
+
if (nonNullFilterValues.length)
|
|
375
|
+
c1 = leftQ + " NOT IN " + parseRightVal(nonNullFilterValues, "csv");
|
|
376
|
+
if (filterValue.includes(null)) c2 = ` ${leftQ} IS NOT NULL `;
|
|
377
|
+
return [c1, c2].filter((c) => c).join(" AND ");
|
|
378
|
+
} else if (["$between"].includes(filterOperand)) {
|
|
379
|
+
if (!Array.isArray(filterValue) || filterValue.length !== 2) {
|
|
348
380
|
return mErr("Between filter expects an array of two values");
|
|
349
381
|
}
|
|
350
|
-
return
|
|
351
|
-
|
|
352
|
-
|
|
382
|
+
return (
|
|
383
|
+
leftQ +
|
|
384
|
+
" BETWEEN " +
|
|
385
|
+
asValue(filterValue[0]) +
|
|
386
|
+
" AND " +
|
|
387
|
+
asValue(filterValue[1])
|
|
388
|
+
);
|
|
389
|
+
} else if (["$ilike"].includes(filterOperand)) {
|
|
353
390
|
return leftQ + " ILIKE " + asValue(filterValue);
|
|
354
|
-
|
|
355
|
-
} else if(["$like"].includes(filterOperand)){
|
|
391
|
+
} else if (["$like"].includes(filterOperand)) {
|
|
356
392
|
return leftQ + " LIKE " + asValue(filterValue);
|
|
357
|
-
|
|
358
|
-
} else if(["$nilike"].includes(filterOperand)){
|
|
393
|
+
} else if (["$nilike"].includes(filterOperand)) {
|
|
359
394
|
return leftQ + " NOT ILIKE " + asValue(filterValue);
|
|
360
|
-
|
|
361
|
-
} else if(["$nlike"].includes(filterOperand)){
|
|
395
|
+
} else if (["$nlike"].includes(filterOperand)) {
|
|
362
396
|
return leftQ + " NOT LIKE " + asValue(filterValue);
|
|
363
|
-
|
|
364
|
-
|
|
397
|
+
} else if (
|
|
398
|
+
filterOperand === "$isDistinctFrom" ||
|
|
399
|
+
filterOperand === "$isNotDistinctFrom"
|
|
400
|
+
) {
|
|
365
401
|
const operator = FILTER_OPERAND_TO_SQL_OPERAND[filterOperand];
|
|
366
402
|
return leftQ + ` ${operator} ` + asValue(filterValue);
|
|
367
403
|
|
|
368
|
-
|
|
369
|
-
} else if
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
404
|
+
/* MAYBE TEXT OR MAYBE ARRAY */
|
|
405
|
+
} else if (
|
|
406
|
+
[
|
|
407
|
+
"@>",
|
|
408
|
+
"<@",
|
|
409
|
+
"$contains",
|
|
410
|
+
"$containedBy",
|
|
411
|
+
"$overlaps",
|
|
412
|
+
"&&",
|
|
413
|
+
"@@",
|
|
414
|
+
].includes(filterOperand)
|
|
415
|
+
) {
|
|
416
|
+
const operand =
|
|
417
|
+
filterOperand === "@@"
|
|
418
|
+
? "@@"
|
|
419
|
+
: ["@>", "$contains"].includes(filterOperand)
|
|
420
|
+
? "@>"
|
|
421
|
+
: ["&&", "$overlaps"].includes(filterOperand)
|
|
422
|
+
? "&&"
|
|
423
|
+
: "<@";
|
|
374
424
|
|
|
375
425
|
/* Array for sure */
|
|
376
|
-
if(Array.isArray(filterValue)){
|
|
426
|
+
if (Array.isArray(filterValue)) {
|
|
377
427
|
return leftQ + operand + parseRightVal(filterValue, "array");
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
} else if
|
|
428
|
+
|
|
429
|
+
/* FTSQuery */
|
|
430
|
+
} else if (
|
|
431
|
+
["@@"].includes(filterOperand) &&
|
|
432
|
+
TextFilter_FullTextSearchFilterKeys.includes(funcName! as any)
|
|
433
|
+
) {
|
|
381
434
|
let lq = `to_tsvector(${leftQ}::text)`;
|
|
382
|
-
if(selItem && selItem.columnPGDataType === "tsvector") lq = leftQ!;
|
|
435
|
+
if (selItem && selItem.columnPGDataType === "tsvector") lq = leftQ!;
|
|
383
436
|
|
|
384
|
-
const res =
|
|
437
|
+
const res =
|
|
438
|
+
`${lq} ${operand} ` + `${funcName}${parseRightVal(funcArgs, "csv")}`;
|
|
385
439
|
|
|
386
440
|
return res;
|
|
387
441
|
} else {
|
|
388
442
|
return mErr("Unrecognised filter operand: " + filterOperand + " ");
|
|
389
443
|
}
|
|
390
|
-
|
|
391
444
|
} else {
|
|
392
|
-
|
|
393
445
|
return mErr("Unrecognised filter operand: " + filterOperand + " ");
|
|
394
446
|
}
|
|
395
|
-
|
|
396
|
-
|
|
397
447
|
} else {
|
|
398
|
-
|
|
399
448
|
/* Is an equal filter */
|
|
400
|
-
if(rightF === null){
|
|
449
|
+
if (rightF === null) {
|
|
401
450
|
return leftQ + " IS NULL ";
|
|
402
451
|
} else {
|
|
403
|
-
|
|
404
452
|
/**
|
|
405
453
|
* Ensure that when comparing an array to a json column, the array is cast to json
|
|
406
454
|
*/
|
|
407
455
|
let valueStr = asValue(rightF);
|
|
408
|
-
if
|
|
456
|
+
if (
|
|
457
|
+
selItem?.column_udt_type?.startsWith("json") &&
|
|
458
|
+
Array.isArray(rightF)
|
|
459
|
+
) {
|
|
409
460
|
valueStr = pgp.as.format(`$1::jsonb`, [JSON.stringify(rightF)]);
|
|
410
|
-
}
|
|
461
|
+
}
|
|
411
462
|
return `${leftQ} = ${valueStr}`;
|
|
412
463
|
}
|
|
413
464
|
}
|
|
414
|
-
}
|
|
465
|
+
};
|
|
415
466
|
|
|
416
467
|
type ParseRightValOpts = {
|
|
417
468
|
expect?: "csv" | "array" | "json" | "jsonb";
|
|
418
469
|
selectItem: SelectItem | undefined;
|
|
419
|
-
}
|
|
420
|
-
export const parseFilterRightValue = (
|
|
470
|
+
};
|
|
471
|
+
export const parseFilterRightValue = (
|
|
472
|
+
val: any,
|
|
473
|
+
{ expect, selectItem }: ParseRightValOpts,
|
|
474
|
+
) => {
|
|
421
475
|
const asValue = (v: any) => pgp.as.format("$1", [v]);
|
|
422
476
|
const checkIfArr = () => {
|
|
423
|
-
if(!Array.isArray(val)) {
|
|
477
|
+
if (!Array.isArray(val)) {
|
|
424
478
|
throw "This type of filter/column expects an Array of items";
|
|
425
479
|
}
|
|
426
|
-
}
|
|
427
|
-
if(expect === "csv" || expect?.startsWith("json")){
|
|
480
|
+
};
|
|
481
|
+
if (expect === "csv" || expect?.startsWith("json")) {
|
|
428
482
|
checkIfArr();
|
|
429
483
|
return pgp.as.format(`($1:${expect})`, [val]);
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
checkIfArr();
|
|
484
|
+
} else if (expect === "array" || selectItem?.columnPGDataType === "ARRAY") {
|
|
485
|
+
checkIfArr();
|
|
433
486
|
return pgp.as.format(" ARRAY[$1:csv]", [val]);
|
|
434
|
-
|
|
435
487
|
}
|
|
436
488
|
|
|
437
489
|
return asValue(val);
|
|
438
|
-
}
|
|
490
|
+
};
|
|
439
491
|
|
|
440
492
|
// ensure pgp is not NULL!!!
|
|
441
493
|
// const asValue = v => v;// pgp.as.value;
|
|
442
494
|
|
|
443
495
|
// const filters: FilterSpec[] = [
|
|
444
|
-
// ...(["ilike", "like"].map(op => ({
|
|
496
|
+
// ...(["ilike", "like"].map(op => ({
|
|
445
497
|
// operands: ["$" + op],
|
|
446
498
|
// tsDataTypes: ["any"] as TSDataType[],
|
|
447
499
|
// tsDefinition: ` { $${op}: string } `,
|
|
448
|
-
// // data_types:
|
|
500
|
+
// // data_types:
|
|
449
501
|
// getQuery: (leftQuery: string, rightVal: any) => {
|
|
450
|
-
// return `${leftQuery}::text ${op.toUpperCase()} ${asValue(rightVal)}::text`
|
|
502
|
+
// return `${leftQuery}::text ${op.toUpperCase()} ${asValue(rightVal)}::text`
|
|
451
503
|
// }
|
|
452
504
|
// }))),
|
|
453
|
-
// {
|
|
505
|
+
// {
|
|
454
506
|
// operands: ["", "="],
|
|
455
507
|
// tsDataTypes: ["any"],
|
|
456
508
|
// tsDefinition: ` { "=": any } | any `,
|
|
457
|
-
// // data_types:
|
|
509
|
+
// // data_types:
|
|
458
510
|
// getQuery: (leftQuery: string, rightVal: any) => {
|
|
459
511
|
// if(rightVal === null) return`${leftQuery} IS NULL `;
|
|
460
512
|
// return `${leftQuery} = ${asValue(rightVal)}`;
|
|
461
513
|
// }
|
|
462
514
|
// }
|
|
463
|
-
// ];
|
|
515
|
+
// ];
|