@sap/cds 5.9.8 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +252 -20
- package/apis/services.d.ts +1 -1
- package/app/fiori/preview.js +2 -6
- package/app/index.js +3 -3
- package/bin/build/buildTaskEngine.js +17 -15
- package/bin/build/buildTaskFactory.js +29 -19
- package/bin/build/buildTaskHandler.js +27 -11
- package/bin/build/buildTaskProvider.js +2 -4
- package/bin/build/buildTaskProviderFactory.js +11 -16
- package/bin/build/constants.js +14 -6
- package/bin/build/csv-reader.js +2 -1
- package/bin/build/index.js +12 -18
- package/bin/build/provider/buildTaskHandlerEdmx.js +3 -39
- package/bin/build/provider/buildTaskHandlerFeatureToggles.js +149 -0
- package/bin/build/provider/buildTaskHandlerInternal.js +2 -3
- package/bin/build/provider/buildTaskProviderInternal.js +108 -239
- package/bin/build/provider/fiori/index.js +2 -2
- package/bin/build/provider/hana/2migration.js +11 -11
- package/bin/build/provider/hana/2tabledata.js +3 -3
- package/bin/build/provider/hana/index.js +89 -99
- package/bin/build/provider/hana/migrationtable.js +4 -3
- package/bin/build/provider/java/index.js +101 -0
- package/bin/build/provider/java-cf/index.js +1 -101
- package/bin/build/provider/mtx/index.js +83 -41
- package/bin/build/provider/mtx/resourcesTarBuilder.js +68 -0
- package/bin/build/provider/mtx-sidecar/index.js +80 -0
- package/bin/build/provider/node-cf/index.js +1 -308
- package/bin/build/provider/nodejs/index.js +189 -0
- package/bin/build/util.js +19 -31
- package/bin/cds.js +5 -3
- package/bin/deploy/to-hana/cfUtil.js +31 -6
- package/bin/deploy/to-hana/gitUtil.js +5 -3
- package/bin/deploy/to-hana/hana.js +9 -10
- package/bin/{build → deploy/to-hana}/mtaUtil.js +10 -9
- package/bin/mtx/in-cds.js +19 -7
- package/bin/serve.js +56 -21
- package/bin/utils/log.js +13 -30
- package/bin/version.js +4 -3
- package/common.cds +61 -16
- package/lib/compile/cdsc.js +3 -2
- package/lib/compile/etc/_localized.js +15 -14
- package/lib/compile/for/drafts.js +3 -4
- package/lib/compile/for/java.js +13 -10
- package/lib/compile/for/nodejs.js +8 -8
- package/lib/compile/for/odata.js +7 -12
- package/lib/compile/for/sql.js +5 -6
- package/lib/compile/index.js +5 -4
- package/lib/compile/load.js +9 -11
- package/lib/compile/minify.js +8 -5
- package/lib/compile/parse.js +4 -2
- package/lib/compile/resolve.js +18 -15
- package/lib/compile/to/edm.js +0 -1
- package/lib/compile/to/gql.js +3 -2
- package/lib/compile/to/json.js +24 -17
- package/lib/connect/bindings.js +3 -2
- package/lib/connect/index.js +5 -5
- package/lib/core/classes.js +74 -2
- package/lib/core/entities.js +52 -3
- package/lib/core/reflect.js +2 -1
- package/lib/deploy.js +11 -8
- package/lib/env/defaults.js +4 -3
- package/lib/env/index.js +71 -31
- package/lib/env/presets.js +1 -14
- package/lib/env/requires.js +70 -20
- package/lib/env/serviceBindings.js +147 -0
- package/lib/i18n/localize.js +22 -23
- package/lib/index.js +148 -144
- package/lib/log/errors.js +55 -12
- package/lib/log/format/kibana.js +1 -1
- package/lib/log/index.js +4 -0
- package/lib/ql/SELECT.js +7 -2
- package/lib/ql/Whereable.js +8 -2
- package/lib/ql/index.js +2 -2
- package/lib/req/assert.js +71 -0
- package/lib/req/cds-context.js +38 -70
- package/lib/req/context.js +34 -21
- package/lib/req/request.js +12 -18
- package/lib/req/response.js +6 -2
- package/lib/req/user.js +30 -22
- package/lib/serve/Service-api.js +17 -12
- package/lib/serve/Service-dispatch.js +5 -9
- package/lib/serve/Service-methods.js +4 -3
- package/lib/serve/Transaction.js +24 -21
- package/lib/serve/adapters.js +15 -5
- package/lib/serve/factory.js +23 -20
- package/lib/serve/index.js +51 -54
- package/lib/utils/axios.js +8 -12
- package/lib/utils/index.js +3 -3
- package/lib/utils/resources/index.js +1 -44
- package/lib/utils/resources/tar.js +2 -1
- package/lib/utils/tests.js +13 -15
- package/libx/_runtime/.eslintrc +1 -1
- package/libx/_runtime/audit/Service.js +6 -4
- package/libx/_runtime/audit/generic/personal/access.js +19 -43
- package/libx/_runtime/audit/generic/personal/index.js +40 -34
- package/libx/_runtime/audit/generic/personal/modification.js +11 -9
- package/libx/_runtime/audit/generic/personal/utils.js +13 -6
- package/libx/_runtime/audit/utils/v2.js +6 -3
- package/libx/_runtime/auth/index.js +71 -66
- package/libx/_runtime/auth/strategies/JWT.js +3 -2
- package/libx/_runtime/auth/strategies/mock.js +54 -53
- package/libx/_runtime/auth/strategies/xssecUtils.js +3 -4
- package/libx/_runtime/auth/strategies/xsuaa.js +3 -2
- package/libx/_runtime/auth/utils.js +2 -15
- package/libx/_runtime/cds-services/adapter/odata-v4/Dispatcher.js +127 -41
- package/libx/_runtime/cds-services/adapter/odata-v4/OData.js +6 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/ODataRequest.js +93 -73
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/action.js +10 -45
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/create.js +5 -9
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/error.js +9 -5
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/metadata.js +4 -2
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/read.js +60 -53
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/request.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/update.js +15 -21
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/ExpressionToCQN.js +8 -15
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/expandToCQN.js +29 -41
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/index.js +1 -4
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/readToCQN.js +13 -13
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/selectToCQN.js +0 -7
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/utils.js +24 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/edm/EdmEntityContainer.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/uri/UriHelper.js +4 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/PrimitiveValueDecoder.js +4 -5
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/ValueConverter.js +4 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/validator/ValueValidator.js +5 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/core/ResponseHeaderSetter.js +2 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/DebugSerializingCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/PresetResponseHeadersCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SerializingCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SetResponseHeadersCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ContextURLFactory.js +3 -2
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ErrorJsonSerializer.js +3 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/SerializerFactory.js +1 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/TrustedResourceJsonSerializer.js +3 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/data.js +36 -25
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/handlerUtils.js +100 -91
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/metaInfo.js +382 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/oDataConfiguration.js +1 -4
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/omitValues.js +5 -6
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/readAfterWrite.js +77 -21
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/request.js +3 -11
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/result.js +91 -69
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/stream.js +27 -6
- package/libx/_runtime/cds-services/adapter/rest/utils/validation-checks.js +7 -17
- package/libx/_runtime/cds-services/services/Service.js +17 -76
- package/libx/_runtime/cds-services/services/utils/columns.js +6 -4
- package/libx/_runtime/cds-services/services/utils/compareJson.js +1 -53
- package/libx/_runtime/cds-services/services/utils/differ.js +15 -19
- package/libx/_runtime/cds-services/util/assert.js +107 -34
- package/libx/_runtime/cds.js +1 -31
- package/libx/_runtime/common/aspects/Association.js +40 -54
- package/libx/_runtime/common/aspects/any.js +61 -6
- package/libx/_runtime/common/aspects/entity.js +19 -79
- package/libx/_runtime/common/composition/data.js +2 -2
- package/libx/_runtime/common/composition/delete.js +8 -7
- package/libx/_runtime/common/composition/tree.js +10 -10
- package/libx/_runtime/common/composition/update.js +3 -2
- package/libx/_runtime/common/constants/events.js +15 -0
- package/libx/_runtime/common/error/entry.js +9 -3
- package/libx/_runtime/common/error/frontend.js +13 -19
- package/libx/_runtime/common/error/index.js +8 -3
- package/libx/_runtime/common/generic/auth/capabilities.js +2 -1
- package/libx/_runtime/common/generic/auth/constants.js +1 -4
- package/libx/_runtime/common/generic/auth/requires.js +1 -1
- package/libx/_runtime/common/generic/auth/restrict.js +12 -28
- package/libx/_runtime/common/generic/auth/restrictions.js +12 -4
- package/libx/_runtime/common/generic/auth/utils.js +2 -1
- package/libx/_runtime/common/generic/crud.js +9 -60
- package/libx/_runtime/common/generic/etag.js +41 -7
- package/libx/_runtime/common/generic/input.js +128 -66
- package/libx/_runtime/common/generic/paging.js +9 -3
- package/libx/_runtime/common/generic/put.js +2 -2
- package/libx/_runtime/common/generic/sorting.js +7 -3
- package/libx/_runtime/common/generic/temporal.js +0 -5
- package/libx/_runtime/common/i18n/messages.properties +2 -1
- package/libx/_runtime/common/utils/binary.js +69 -0
- package/libx/_runtime/common/utils/cqn.js +39 -14
- package/libx/_runtime/common/utils/cqn2cqn4sql.js +93 -59
- package/libx/_runtime/common/utils/csn.js +87 -85
- package/libx/_runtime/common/utils/dollar.js +8 -7
- package/libx/_runtime/common/utils/draft.js +1 -1
- package/libx/_runtime/common/utils/foreignKeyPropagations.js +23 -7
- package/libx/_runtime/common/utils/generateOnCond.js +2 -1
- package/libx/_runtime/common/utils/keys.js +30 -13
- package/libx/_runtime/common/utils/postProcessing.js +6 -1
- package/libx/_runtime/common/utils/quotingStyles.js +0 -23
- package/libx/_runtime/common/utils/resolveStructured.js +23 -26
- package/libx/_runtime/common/utils/resolveView.js +4 -1
- package/libx/_runtime/common/utils/rewriteAsterisks.js +3 -0
- package/libx/_runtime/common/utils/search2cqn4sql.js +4 -13
- package/libx/_runtime/common/utils/searchToLike.js +9 -13
- package/libx/_runtime/common/utils/streamProp.js +35 -0
- package/libx/_runtime/common/utils/structured.js +12 -18
- package/libx/_runtime/common/utils/template.js +3 -5
- package/libx/_runtime/common/utils/templateProcessor.js +22 -14
- package/libx/_runtime/common/utils/unionCqnTemplate.js +4 -14
- package/libx/_runtime/db/Service.js +2 -1
- package/libx/_runtime/db/expand/expand-v2.js +2 -2
- package/libx/_runtime/db/expand/expandCQNToJoin.js +7 -6
- package/libx/_runtime/db/generic/input.js +14 -17
- package/libx/_runtime/db/generic/integrity.js +1 -2
- package/libx/_runtime/db/generic/update.js +14 -1
- package/libx/_runtime/db/query/read.js +0 -1
- package/libx/_runtime/db/query/update.js +1 -1
- package/libx/_runtime/db/sql-builder/BaseBuilder.js +1 -1
- package/libx/_runtime/db/sql-builder/ExpressionBuilder.js +5 -31
- package/libx/_runtime/db/sql-builder/InsertBuilder.js +1 -1
- package/libx/_runtime/db/sql-builder/ReferenceBuilder.js +0 -9
- package/libx/_runtime/db/sql-builder/SelectBuilder.js +11 -10
- package/libx/_runtime/db/sql-builder/UpdateBuilder.js +2 -2
- package/libx/_runtime/db/sql-builder/annotations.js +1 -2
- package/libx/_runtime/db/utils/coloredTxCommands.js +5 -0
- package/libx/_runtime/db/utils/columns.js +1 -1
- package/libx/_runtime/db/utils/propagateForeignKeys.js +10 -2
- package/libx/_runtime/extensibility/activate.js +69 -0
- package/libx/_runtime/extensibility/add.js +41 -0
- package/libx/_runtime/extensibility/addExtension.js +68 -0
- package/libx/_runtime/extensibility/defaults.js +39 -0
- package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformREAD.js +0 -0
- package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformRESULT.js +2 -2
- package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformWRITE.js +2 -2
- package/libx/_runtime/extensibility/push.js +61 -0
- package/libx/_runtime/extensibility/service.js +21 -0
- package/libx/_runtime/extensibility/{uiflex/utils.js → utils.js} +39 -3
- package/libx/_runtime/extensibility/validation.js +53 -0
- package/libx/_runtime/extensibility/views.js +12 -0
- package/libx/_runtime/fiori/generic/activate.js +6 -4
- package/libx/_runtime/fiori/generic/before.js +17 -29
- package/libx/_runtime/fiori/generic/cancel.js +2 -4
- package/libx/_runtime/fiori/generic/delete.js +2 -4
- package/libx/_runtime/fiori/generic/edit.js +3 -7
- package/libx/_runtime/fiori/generic/index.js +31 -0
- package/libx/_runtime/fiori/generic/new.js +2 -4
- package/libx/_runtime/fiori/generic/patch.js +4 -8
- package/libx/_runtime/fiori/generic/prepare.js +2 -4
- package/libx/_runtime/fiori/generic/read.js +137 -162
- package/libx/_runtime/fiori/generic/readOverDraft.js +10 -4
- package/libx/_runtime/fiori/utils/handler.js +10 -5
- package/libx/_runtime/fiori/utils/where.js +1 -4
- package/libx/_runtime/hana/Service.js +14 -7
- package/libx/_runtime/hana/customBuilder/CustomSelectBuilder.js +1 -1
- package/libx/_runtime/hana/dynatrace.js +2 -2
- package/libx/_runtime/hana/localized.js +7 -6
- package/libx/_runtime/hana/pool.js +9 -6
- package/libx/_runtime/hana/search.js +2 -3
- package/libx/_runtime/hana/{searchToContains.js → search2Contains.js} +5 -2
- package/libx/_runtime/hana/search2cqn4sql.js +20 -17
- package/libx/_runtime/index.js +2 -6
- package/libx/_runtime/messaging/AMQPWebhookMessaging.js +11 -2
- package/libx/_runtime/messaging/common-utils/AMQPClient.js +4 -3
- package/libx/_runtime/messaging/common-utils/appId.js +9 -0
- package/libx/_runtime/messaging/common-utils/authorizedRequest.js +2 -18
- package/libx/_runtime/messaging/common-utils/connections.js +1 -1
- package/libx/_runtime/messaging/enterprise-messaging-shared.js +2 -2
- package/libx/_runtime/messaging/enterprise-messaging-utils/EMManagement.js +305 -231
- package/libx/_runtime/messaging/enterprise-messaging-utils/cloudEvents.js +2 -2
- package/libx/_runtime/messaging/enterprise-messaging-utils/options-management.js +15 -8
- package/libx/_runtime/messaging/enterprise-messaging-utils/options-messaging.js +57 -14
- package/libx/_runtime/messaging/enterprise-messaging.js +14 -19
- package/libx/_runtime/messaging/file-based.js +2 -1
- package/libx/_runtime/messaging/http-utils/token.js +18 -6
- package/libx/_runtime/messaging/message-queuing-utils/options-management.js +22 -12
- package/libx/_runtime/messaging/message-queuing-utils/options-messaging.js +27 -14
- package/libx/_runtime/messaging/message-queuing.js +138 -85
- package/libx/_runtime/messaging/outbox/utils.js +13 -7
- package/libx/_runtime/messaging/redis-messaging.js +0 -1
- package/libx/_runtime/messaging/service.js +4 -1
- package/libx/_runtime/remote/Service.js +24 -18
- package/libx/_runtime/remote/utils/client.js +84 -46
- package/libx/_runtime/remote/utils/data.js +23 -6
- package/libx/_runtime/sqlite/Service.js +14 -13
- package/libx/_runtime/sqlite/convertAssocToOneManaged.js +2 -0
- package/libx/_runtime/sqlite/customBuilder/CustomSelectBuilder.js +1 -0
- package/libx/_runtime/sqlite/execute.js +3 -9
- package/libx/_runtime/types/api.js +23 -11
- package/libx/common/utils/ucsn.js +15 -9
- package/libx/odata/afterburner.js +109 -29
- package/libx/odata/cqn2odata.js +48 -9
- package/libx/odata/grammar.pegjs +261 -157
- package/libx/odata/index.js +21 -9
- package/libx/odata/parseToCqn.js +8 -5
- package/libx/odata/parser.js +1 -1
- package/libx/odata/utils.js +13 -3
- package/libx/rest/RestAdapter.js +173 -113
- package/libx/rest/RestRequest.js +3 -2
- package/libx/rest/middleware/create.js +8 -6
- package/libx/rest/middleware/delete.js +6 -13
- package/libx/rest/middleware/error.js +1 -1
- package/libx/rest/middleware/input.js +6 -6
- package/libx/rest/middleware/operation.js +8 -3
- package/libx/rest/middleware/parse.js +3 -3
- package/libx/rest/middleware/payload.js +12 -0
- package/libx/rest/middleware/read.js +12 -2
- package/libx/rest/middleware/update.js +3 -3
- package/package.json +4 -6
- package/server.js +3 -44
- package/srv/extensibility-service.cds +56 -0
- package/srv/extensibility-service.js +1 -0
- package/srv/extensions.cds +8 -0
- package/srv/model-provider.cds +59 -0
- package/srv/model-provider.js +163 -0
- package/srv/mtx.cds +2 -0
- package/srv/mtx.js +22 -0
- package/srv/outbox.cds +2 -0
- package/tasks/enterprise-messaging-deploy.js +19 -12
- package/lib/serve/Service-compat.js +0 -36
- package/libx/_runtime/audit/generic/personal/constants.js +0 -4
- package/libx/_runtime/auth/strategies/dwc.js +0 -45
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/dispatcherUtils.js +0 -56
- package/libx/_runtime/cds-services/adapter/rest/Rest.js +0 -183
- package/libx/_runtime/cds-services/adapter/rest/RestRequest.js +0 -67
- package/libx/_runtime/cds-services/adapter/rest/handlers/create.js +0 -82
- package/libx/_runtime/cds-services/adapter/rest/handlers/delete.js +0 -39
- package/libx/_runtime/cds-services/adapter/rest/handlers/operation.js +0 -63
- package/libx/_runtime/cds-services/adapter/rest/handlers/read.js +0 -52
- package/libx/_runtime/cds-services/adapter/rest/handlers/update.js +0 -81
- package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/index.js +0 -56
- package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/utils.js +0 -33
- package/libx/_runtime/cds-services/adapter/rest/to.js +0 -8
- package/libx/_runtime/cds-services/adapter/rest/utils/binary.js +0 -50
- package/libx/_runtime/cds-services/adapter/rest/utils/data.js +0 -117
- package/libx/_runtime/cds-services/adapter/rest/utils/header-checks.js +0 -14
- package/libx/_runtime/cds-services/adapter/rest/utils/key-value-utils.js +0 -30
- package/libx/_runtime/cds-services/adapter/rest/utils/parse-url.js +0 -250
- package/libx/_runtime/cds-services/adapter/rest/utils/result.js +0 -26
- package/libx/_runtime/cds-services/services/utils/handlerUtils.js +0 -200
- package/libx/_runtime/common/aspects/utils.js +0 -152
- package/libx/_runtime/common/toggles/handler.js +0 -21
- package/libx/_runtime/common/utils/extensibilityUtils.js +0 -18
- package/libx/_runtime/extensibility/mps/index.js +0 -5
- package/libx/_runtime/extensibility/mps/service.js +0 -111
- package/libx/_runtime/extensibility/mps/tar.js +0 -42
- package/libx/_runtime/extensibility/mps/utils.js +0 -11
- package/libx/_runtime/extensibility/uiflex/index.js +0 -54
- package/libx/_runtime/extensibility/uiflex/service.js +0 -276
- package/libx/_runtime/messaging/common-utils/naming-conventions.js +0 -20
- package/libx/_runtime/remote/utils/client-types.d.ts +0 -7
- package/libx/gql/GraphQLAdapter.js +0 -33
- package/libx/gql/constants/adapter.js +0 -69
- package/libx/gql/constants/cds.js +0 -18
- package/libx/gql/constants/graphql.js +0 -33
- package/libx/gql/readme.md +0 -1
- package/libx/gql/resolvers/crud/create.js +0 -20
- package/libx/gql/resolvers/crud/delete.js +0 -29
- package/libx/gql/resolvers/crud/index.js +0 -6
- package/libx/gql/resolvers/crud/read.js +0 -30
- package/libx/gql/resolvers/crud/update.js +0 -42
- package/libx/gql/resolvers/crud/utils/index.js +0 -36
- package/libx/gql/resolvers/field.js +0 -5
- package/libx/gql/resolvers/index.js +0 -7
- package/libx/gql/resolvers/mutation.js +0 -23
- package/libx/gql/resolvers/parse/ast/enrich.js +0 -52
- package/libx/gql/resolvers/parse/ast/fragment.js +0 -11
- package/libx/gql/resolvers/parse/ast/fromObject.js +0 -39
- package/libx/gql/resolvers/parse/ast/index.js +0 -3
- package/libx/gql/resolvers/parse/ast/meta.js +0 -4
- package/libx/gql/resolvers/parse/ast/variable.js +0 -7
- package/libx/gql/resolvers/parse/ast2cqn/columns.js +0 -44
- package/libx/gql/resolvers/parse/ast2cqn/entries.js +0 -31
- package/libx/gql/resolvers/parse/ast2cqn/index.js +0 -8
- package/libx/gql/resolvers/parse/ast2cqn/limit.js +0 -6
- package/libx/gql/resolvers/parse/ast2cqn/orderBy.js +0 -24
- package/libx/gql/resolvers/parse/ast2cqn/utils/index.js +0 -3
- package/libx/gql/resolvers/parse/ast2cqn/where.js +0 -70
- package/libx/gql/resolvers/parse/utils/index.js +0 -8
- package/libx/gql/resolvers/query.js +0 -13
- package/libx/gql/resolvers/root.js +0 -34
- package/libx/gql/schema/generate.js +0 -18
- package/libx/gql/schema/index.js +0 -5
- package/libx/gql/schema/mutation.js +0 -76
- package/libx/gql/schema/query.js +0 -108
- package/libx/gql/schema/typeDefMap.js +0 -45
- package/libx/gql/schema/utils/index.js +0 -54
- package/libx/gql/utils/index.js +0 -12
- package/libx/rest/middleware/auth.js +0 -20
- package/libx/rest/middleware/content.js +0 -19
- package/srv/flex.cds +0 -21
- package/srv/flex.js +0 -1
- package/srv/mps.cds +0 -23
- package/srv/mps.js +0 -1
- package/srv/outbox.js +0 -0
|
@@ -6,7 +6,7 @@ const Query = require('../../../../lib/ql/Query')
|
|
|
6
6
|
|
|
7
7
|
const { resolveView } = require('./resolveView')
|
|
8
8
|
const { ensureNoDraftsSuffix, getDraftColumnsCQNForDraft } = require('./draft')
|
|
9
|
-
const { flattenStructuredSelect } = require('./structured')
|
|
9
|
+
const { flattenStructuredSelect, OPERATIONS_MAP } = require('./structured')
|
|
10
10
|
const search2cqn4sql = require('./search2cqn4sql')
|
|
11
11
|
const { getEntityNameFromCQN } = require('./entityFromCqn')
|
|
12
12
|
const getError = require('../../common/error')
|
|
@@ -16,11 +16,7 @@ const { removeIsActiveEntityRecursively } = require('../../fiori/utils/where')
|
|
|
16
16
|
const { addRefToWhereIfNecessary } = require('../../../odata/afterburner')
|
|
17
17
|
const { addAliasToExpression, PARENT_ALIAS, FOREIGN_ALIAS } = require('../../db/utils/generateAliases')
|
|
18
18
|
const { getColumns } = require('../../cds-services/services/utils/columns')
|
|
19
|
-
|
|
20
|
-
const OPERATIONS_MAP = ['=', '>', '<', '!=', '<>', '>=', '<=', 'like', 'between', 'in', 'not in'].reduce((acc, cur) => {
|
|
21
|
-
acc[cur] = 1
|
|
22
|
-
return acc
|
|
23
|
-
}, {})
|
|
19
|
+
const { handleStreamProperties } = require('./streamProp')
|
|
24
20
|
|
|
25
21
|
const _elementFromRef = (name, entity) => {
|
|
26
22
|
if (!entity) return
|
|
@@ -30,9 +26,7 @@ const _elementFromRef = (name, entity) => {
|
|
|
30
26
|
}
|
|
31
27
|
}
|
|
32
28
|
|
|
33
|
-
const _getTargetFromRef = ref =>
|
|
34
|
-
return ref.id || ref
|
|
35
|
-
}
|
|
29
|
+
const _getTargetFromRef = ref => ref.id || ref
|
|
36
30
|
|
|
37
31
|
const _getEntityName = (fromClause, entity, i) => {
|
|
38
32
|
const targetName = _getTargetFromRef(fromClause.ref[i])
|
|
@@ -41,6 +35,7 @@ const _getEntityName = (fromClause, entity, i) => {
|
|
|
41
35
|
|
|
42
36
|
const convertPathExpressionToWhere = (fromClause, model, options) => {
|
|
43
37
|
if (!fromClause.ref) return
|
|
38
|
+
|
|
44
39
|
if (fromClause.ref.length === 1) {
|
|
45
40
|
const target = _getTargetFromRef(fromClause.ref[0])
|
|
46
41
|
const alias = fromClause.as
|
|
@@ -124,9 +119,7 @@ const _convertPathExpressionForInsert = (intoClause, model) => {
|
|
|
124
119
|
}, '')
|
|
125
120
|
}
|
|
126
121
|
|
|
127
|
-
const _getBottomTopRefOrVal = (func, refVal) =>
|
|
128
|
-
return func.args.filter(el => el[refVal])
|
|
129
|
-
}
|
|
122
|
+
const _getBottomTopRefOrVal = (func, refVal) => func.args.filter(el => el[refVal])
|
|
130
123
|
|
|
131
124
|
const _getWindowWhere = (where, bottomTop) => {
|
|
132
125
|
const windWhere = where || []
|
|
@@ -163,24 +156,16 @@ const _getWindowXpr = (groupBy, bottomTop) => {
|
|
|
163
156
|
return acc
|
|
164
157
|
}, [])
|
|
165
158
|
)
|
|
159
|
+
|
|
166
160
|
xpr.push('ORDER BY', _getOrderByForWindowFn(bottomTop))
|
|
167
161
|
xpr.push(')')
|
|
168
162
|
return { xpr: xpr, as: 'rowNumber' }
|
|
169
163
|
}
|
|
170
164
|
|
|
171
165
|
const _isNavCountFunc = el => el.func && el.func === 'count' && el.args[0] !== '*'
|
|
172
|
-
|
|
173
|
-
const
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
const _isBottomTop = columns => {
|
|
178
|
-
return columns.some(el => el.func && (el.func === 'topcount' || el.func === 'bottomcount'))
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const _getWindColumns = (columns, groupBy, bottomTop) => {
|
|
182
|
-
return [].concat(columns, _getWindowXpr(groupBy, bottomTop))
|
|
183
|
-
}
|
|
166
|
+
const _isCountNavigation = columns => columns.some(_isNavCountFunc)
|
|
167
|
+
const _isBottomTop = columns => columns.some(el => el.func && (el.func === 'topcount' || el.func === 'bottomcount'))
|
|
168
|
+
const _getWindColumns = (columns, groupBy, bottomTop) => [].concat(columns, _getWindowXpr(groupBy, bottomTop))
|
|
184
169
|
|
|
185
170
|
const _convertCountNavigation = (SELECT, target) => {
|
|
186
171
|
const newWhere = []
|
|
@@ -192,6 +177,7 @@ const _convertCountNavigation = (SELECT, target) => {
|
|
|
192
177
|
continue
|
|
193
178
|
}
|
|
194
179
|
|
|
180
|
+
if (SELECT.from.as && SELECT.from.as === element.args[0].ref[0]) element.args[0].ref.shift()
|
|
195
181
|
const navigations = element.args[0].ref
|
|
196
182
|
const navigationName = navigations[0].id || navigations[0]
|
|
197
183
|
if (target.elements[navigationName]) {
|
|
@@ -218,6 +204,7 @@ const _convertCountNavigation = (SELECT, target) => {
|
|
|
218
204
|
const nestedNavigationName = nextNavigation.id || nextNavigation
|
|
219
205
|
if (j === navigations.length - 1) {
|
|
220
206
|
nestedExistsQuery.columns('count(1) as counted')
|
|
207
|
+
|
|
221
208
|
if (lastQuery) {
|
|
222
209
|
lastQuery.where([nestedExistsQuery, SELECT.where[i + 1], SELECT.where[i + 2]])
|
|
223
210
|
newWhere.push('exists', topQuery)
|
|
@@ -235,6 +222,7 @@ const _convertCountNavigation = (SELECT, target) => {
|
|
|
235
222
|
i += 2
|
|
236
223
|
}
|
|
237
224
|
}
|
|
225
|
+
|
|
238
226
|
SELECT.where = newWhere
|
|
239
227
|
}
|
|
240
228
|
|
|
@@ -243,9 +231,11 @@ const _addTableName = (where, tableName) => {
|
|
|
243
231
|
if (whereEl.xpr) {
|
|
244
232
|
return { xpr: _addTableName(whereEl.xpr, tableName) }
|
|
245
233
|
}
|
|
234
|
+
|
|
246
235
|
if (whereEl.ref) {
|
|
247
236
|
whereEl.ref.unshift(tableName)
|
|
248
237
|
}
|
|
238
|
+
|
|
249
239
|
return whereEl
|
|
250
240
|
})
|
|
251
241
|
}
|
|
@@ -261,7 +251,6 @@ const _buildExistsQuery = (entity, navigation, currentAlias, nextAlias) => {
|
|
|
261
251
|
}
|
|
262
252
|
|
|
263
253
|
const onCond = entity.elements[navigation.id || navigation]._relations.join(nextAlias, currentAlias)
|
|
264
|
-
|
|
265
254
|
return existsQuery.where(onCond)
|
|
266
255
|
}
|
|
267
256
|
|
|
@@ -332,6 +321,7 @@ const _getWhereExistsSubSelect = (queryTarget, outerAlias, innerAlias, ref, mode
|
|
|
332
321
|
if (subSelect.SELECT.from.as) {
|
|
333
322
|
for (let i = 0; i < condition.length; i++) {
|
|
334
323
|
if (!condition[i].ref) continue
|
|
324
|
+
|
|
335
325
|
if (
|
|
336
326
|
condition[i].ref.length > 1 &&
|
|
337
327
|
condition[i].ref.every(r => typeof r === 'string') &&
|
|
@@ -343,6 +333,7 @@ const _getWhereExistsSubSelect = (queryTarget, outerAlias, innerAlias, ref, mode
|
|
|
343
333
|
}
|
|
344
334
|
}
|
|
345
335
|
}
|
|
336
|
+
|
|
346
337
|
// skip for where: [{ val: 1 }]
|
|
347
338
|
// where: [{ func: 'contains', args: [] }] must be evaluated
|
|
348
339
|
if (condition.length > 1 || (condition.length === 1 && !('val' in condition[0]))) subSelect.where(condition)
|
|
@@ -356,7 +347,6 @@ const _getWhereExistsSubSelect = (queryTarget, outerAlias, innerAlias, ref, mode
|
|
|
356
347
|
|
|
357
348
|
// nested where exists needs recursive conversion
|
|
358
349
|
options.lambdaIteration++
|
|
359
|
-
|
|
360
350
|
return _convertSelect(subSelect, model, options)
|
|
361
351
|
}
|
|
362
352
|
|
|
@@ -369,6 +359,7 @@ const _ensureExpandedNestedWhereExists = ({ ref }, aliases) => {
|
|
|
369
359
|
const acc = {}
|
|
370
360
|
let cur = acc
|
|
371
361
|
let alias
|
|
362
|
+
|
|
372
363
|
for (const r of ref) {
|
|
373
364
|
if (Array.isArray(cur)) {
|
|
374
365
|
if (cur.length > 1) {
|
|
@@ -381,6 +372,7 @@ const _ensureExpandedNestedWhereExists = ({ ref }, aliases) => {
|
|
|
381
372
|
cur = cur[1].ref[0]
|
|
382
373
|
}
|
|
383
374
|
}
|
|
375
|
+
|
|
384
376
|
if (typeof r === 'string' && aliases.includes(r)) {
|
|
385
377
|
alias = r
|
|
386
378
|
} else {
|
|
@@ -390,6 +382,7 @@ const _ensureExpandedNestedWhereExists = ({ ref }, aliases) => {
|
|
|
390
382
|
cur = cur.where
|
|
391
383
|
}
|
|
392
384
|
}
|
|
385
|
+
|
|
393
386
|
if (alias) return { ref: [alias, acc] }
|
|
394
387
|
return { ref: [acc] }
|
|
395
388
|
}
|
|
@@ -437,16 +430,18 @@ const convertWhereExists = (query, model, options, currentTarget) => {
|
|
|
437
430
|
(query.from &&
|
|
438
431
|
((query.from.ref && query.from) || (query.from.args && query.from.args[0].ref && query.from.args[0]))) ||
|
|
439
432
|
{}
|
|
433
|
+
|
|
440
434
|
if (!ref) return
|
|
441
435
|
|
|
442
436
|
if (!options.lambdaIteration) options.lambdaIteration = 1
|
|
443
437
|
const lambdaIteration = options.lambdaIteration
|
|
444
|
-
|
|
438
|
+
|
|
439
|
+
if (currentTarget) {
|
|
440
|
+
queryTarget = getEntityFromPath({ ref }, currentTarget)
|
|
441
|
+
} else {
|
|
445
442
|
queryTarget = getEntityFromPath(getPathFromRef(ref), model)
|
|
446
443
|
outerAlias = as || PARENT_ALIAS + lambdaIteration
|
|
447
444
|
innerAlias = FOREIGN_ALIAS + lambdaIteration
|
|
448
|
-
} else {
|
|
449
|
-
queryTarget = getEntityFromPath({ ref }, currentTarget)
|
|
450
445
|
}
|
|
451
446
|
|
|
452
447
|
if (where) {
|
|
@@ -471,6 +466,7 @@ const convertWhereExists = (query, model, options, currentTarget) => {
|
|
|
471
466
|
} else if (element.SELECT) {
|
|
472
467
|
convertWhereExists(element.SELECT, model, options)
|
|
473
468
|
}
|
|
469
|
+
|
|
474
470
|
options.lambdaIteration = lambdaIteration
|
|
475
471
|
}
|
|
476
472
|
}
|
|
@@ -478,18 +474,20 @@ const convertWhereExists = (query, model, options, currentTarget) => {
|
|
|
478
474
|
if (columns) {
|
|
479
475
|
columns.forEach(column => _convertWhereExistsColumn(column, model, options, queryTarget))
|
|
480
476
|
}
|
|
477
|
+
|
|
481
478
|
if (expand && expand !== '*') {
|
|
482
479
|
expand.forEach(column => _convertWhereExistsColumn(column, model, options, queryTarget))
|
|
483
480
|
}
|
|
484
481
|
}
|
|
485
482
|
|
|
486
483
|
const _convertNotEqual = (container, partName = 'where') => {
|
|
484
|
+
const NOT_EQUAL = { '!=': 1, '<>': 1 }
|
|
487
485
|
const where = container[partName]
|
|
488
486
|
|
|
489
487
|
if (where) {
|
|
490
488
|
for (let index = 0; index < where.length; index++) {
|
|
491
489
|
const el = where[index]
|
|
492
|
-
if (el
|
|
490
|
+
if (el in NOT_EQUAL) {
|
|
493
491
|
const refIndex = _getRefIndex(where, index)
|
|
494
492
|
if (refIndex !== undefined) {
|
|
495
493
|
where[index - 1] = {
|
|
@@ -500,9 +498,12 @@ const _convertNotEqual = (container, partName = 'where') => {
|
|
|
500
498
|
}
|
|
501
499
|
}
|
|
502
500
|
|
|
503
|
-
if (el) {
|
|
504
|
-
|
|
505
|
-
|
|
501
|
+
if (el && el.SELECT) {
|
|
502
|
+
_convertNotEqual(el.SELECT, partName)
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
if (el && el.xpr) {
|
|
506
|
+
_convertNotEqual(el, 'xpr')
|
|
506
507
|
}
|
|
507
508
|
}
|
|
508
509
|
}
|
|
@@ -512,7 +513,10 @@ const _convertNotEqual = (container, partName = 'where') => {
|
|
|
512
513
|
if (typeof col === 'object') {
|
|
513
514
|
if (col.SELECT) {
|
|
514
515
|
_convertNotEqual(col.SELECT, partName)
|
|
515
|
-
|
|
516
|
+
return
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
if (col.where) {
|
|
516
520
|
_convertNotEqual(col, partName)
|
|
517
521
|
}
|
|
518
522
|
}
|
|
@@ -560,6 +564,7 @@ const _convertOrderByOrWhereCQN = (orderByOrWhereCQN, target, model, alias, proc
|
|
|
560
564
|
_convertOrderByOrWhereCQN(el.xpr, target, model, alias, processFn)
|
|
561
565
|
return
|
|
562
566
|
}
|
|
567
|
+
|
|
563
568
|
if (el.ref && _skip(queryTarget, el.ref, alias, model)) processFn(orderByOrWhereCQN, index)
|
|
564
569
|
})
|
|
565
570
|
}
|
|
@@ -581,10 +586,12 @@ const _convertExpand = expand => {
|
|
|
581
586
|
if (expandElement.ref[0].where) {
|
|
582
587
|
expandElement.where = expandElement.ref[0].where
|
|
583
588
|
}
|
|
589
|
+
|
|
584
590
|
if (expandElement.ref[0].id) {
|
|
585
591
|
expandElement.ref[0] = expandElement.ref[0].id
|
|
586
592
|
}
|
|
587
593
|
}
|
|
594
|
+
|
|
588
595
|
if (expandElement.expand) {
|
|
589
596
|
_convertExpand(expandElement.expand)
|
|
590
597
|
}
|
|
@@ -592,13 +599,13 @@ const _convertExpand = expand => {
|
|
|
592
599
|
}
|
|
593
600
|
|
|
594
601
|
const _convertRefWhereInExpand = columns => {
|
|
595
|
-
if (columns)
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
+
if (!columns) return
|
|
603
|
+
|
|
604
|
+
columns.forEach(col => {
|
|
605
|
+
if (col.expand && typeof col.expand !== 'string') {
|
|
606
|
+
_convertExpand(col.expand)
|
|
607
|
+
}
|
|
608
|
+
})
|
|
602
609
|
}
|
|
603
610
|
|
|
604
611
|
const _convertPathExpression = (query, model, options = {}) => {
|
|
@@ -606,6 +613,7 @@ const _convertPathExpression = (query, model, options = {}) => {
|
|
|
606
613
|
for (const whereEl of query.SELECT.where || []) {
|
|
607
614
|
if (typeof whereEl === 'object' && whereEl.SELECT) _convertPathExpression(whereEl, model)
|
|
608
615
|
}
|
|
616
|
+
|
|
609
617
|
const conversion = convertPathExpressionToWhere(query.SELECT.from, model, options)
|
|
610
618
|
if (!conversion) return
|
|
611
619
|
const { target, alias, where, cardinality, columns, args } = conversion
|
|
@@ -617,12 +625,14 @@ const _convertPathExpression = (query, model, options = {}) => {
|
|
|
617
625
|
} else {
|
|
618
626
|
query.SELECT.from = { ref: [target] }
|
|
619
627
|
}
|
|
628
|
+
|
|
620
629
|
if (alias) {
|
|
621
630
|
query.SELECT.from.as = alias
|
|
622
631
|
if (query.SELECT.where && alias !== prevAlias) {
|
|
623
632
|
query.SELECT.where = addAliasToExpression(query.SELECT.where, alias)
|
|
624
633
|
}
|
|
625
634
|
}
|
|
635
|
+
|
|
626
636
|
if (columns) {
|
|
627
637
|
// TODO: use streaming as outer property
|
|
628
638
|
if (options.isStreaming) query.SELECT.columns = columns
|
|
@@ -642,15 +652,17 @@ const _convertPathExpression = (query, model, options = {}) => {
|
|
|
642
652
|
query.SELECT.columns.push(...columns)
|
|
643
653
|
}
|
|
644
654
|
}
|
|
655
|
+
|
|
645
656
|
if (cardinality && cardinality.max === 1) {
|
|
646
657
|
query.SELECT.one = true
|
|
647
658
|
}
|
|
659
|
+
|
|
648
660
|
// TODO: REVISIT: We need to add alias to subselect in .where, .columns, .from, ... etc
|
|
649
661
|
if (where) {
|
|
650
662
|
if (options._4fiori) {
|
|
651
663
|
query.where(where)
|
|
652
664
|
} else {
|
|
653
|
-
query.where(removeIsActiveEntityRecursively(where))
|
|
665
|
+
query.where({ xpr: removeIsActiveEntityRecursively(where) })
|
|
654
666
|
}
|
|
655
667
|
}
|
|
656
668
|
}
|
|
@@ -664,10 +676,12 @@ const _convertToOneEqNullInFilter = (query, target) => {
|
|
|
664
676
|
if (w.xpr) {
|
|
665
677
|
_convertToOneEqNullInFilter({ where: w.xpr }, target)
|
|
666
678
|
}
|
|
679
|
+
|
|
667
680
|
const w2 = query.where[i + 2]
|
|
668
681
|
if (!w2 || !w.ref || w2.val !== null) {
|
|
669
682
|
continue
|
|
670
683
|
}
|
|
684
|
+
|
|
671
685
|
const element = target.elements[w.ref[w.ref.length - 1]]
|
|
672
686
|
if (element && element.is2one && !element.on) {
|
|
673
687
|
const foreignKeys = Object.values(element.parent.elements).filter(e => e._foreignKey4 === element.name)
|
|
@@ -679,33 +693,31 @@ const _convertToOneEqNullInFilter = (query, target) => {
|
|
|
679
693
|
return arr
|
|
680
694
|
}, [])
|
|
681
695
|
|
|
682
|
-
query.where.splice(i, 3,
|
|
683
|
-
i
|
|
696
|
+
query.where.splice(i, 3, { xpr: [...replacedKeys] })
|
|
697
|
+
i++
|
|
684
698
|
}
|
|
685
699
|
}
|
|
686
700
|
}
|
|
687
701
|
|
|
688
702
|
// eslint-disable-next-line complexity
|
|
689
703
|
const _convertSelect = (query, model, _options) => {
|
|
690
|
-
const
|
|
691
|
-
|
|
692
|
-
_4db: _options.service instanceof cds.DatabaseService,
|
|
693
|
-
isStreaming: query._streaming
|
|
694
|
-
},
|
|
695
|
-
_options
|
|
696
|
-
)
|
|
704
|
+
const _4db = _options.service instanceof cds.DatabaseService
|
|
705
|
+
const options = Object.assign({ _4db, isStreaming: query._streaming }, _options)
|
|
697
706
|
|
|
698
707
|
// ensure query is ql enabled
|
|
699
708
|
if (!(query instanceof Query)) Object.setPrototypeOf(query, Object.getPrototypeOf(SELECT()))
|
|
700
709
|
if (query.SELECT.from && query.SELECT.from.SELECT) {
|
|
701
710
|
if (query.SELECT._4odata) query.SELECT.from.SELECT._4odata = true
|
|
702
711
|
query.SELECT.from = _convertSelect(query.SELECT.from, model, options)
|
|
712
|
+
if (!query.SELECT.columns || !query.SELECT.columns.length) {
|
|
713
|
+
query.SELECT.columns = query.SELECT.from.SELECT.columns.map(c => (c.as ? { ref: [c.as] } : c))
|
|
714
|
+
}
|
|
703
715
|
}
|
|
704
716
|
|
|
705
717
|
// lambda functions
|
|
706
718
|
convertWhereExists(query.SELECT, model, options)
|
|
707
719
|
|
|
708
|
-
// add 'or is null' in case of '!='
|
|
720
|
+
// add 'or is null' in case of not equal: '!=' or '<>'
|
|
709
721
|
if (query.SELECT._4odata) {
|
|
710
722
|
_convertNotEqual(query.SELECT, 'where')
|
|
711
723
|
_convertNotEqual(query.SELECT, 'having')
|
|
@@ -713,13 +725,16 @@ const _convertSelect = (query, model, _options) => {
|
|
|
713
725
|
|
|
714
726
|
_convertPathExpression(query, model, options)
|
|
715
727
|
rewriteAsterisks(query, model, options)
|
|
728
|
+
const entity =
|
|
729
|
+
(query.SELECT.from.ref && (query.SELECT.from.ref[0].id || query.SELECT.from.ref[0])) || query.SELECT.from
|
|
730
|
+
const target = entity && model.definitions[entity]
|
|
731
|
+
handleStreamProperties(target, query, model)
|
|
732
|
+
|
|
716
733
|
if (query.SELECT.where) {
|
|
717
|
-
const entityName =
|
|
718
|
-
(query.SELECT.from.ref && (query.SELECT.from.ref[0].id || query.SELECT.from.ref[0])) || query.SELECT.from
|
|
719
|
-
const target = model.definitions[entityName]
|
|
720
734
|
if (_isCountNavigation(query.SELECT.where)) {
|
|
721
735
|
_convertCountNavigation(query.SELECT, target)
|
|
722
736
|
}
|
|
737
|
+
|
|
723
738
|
_convertToOneEqNullInFilter(query.SELECT, target)
|
|
724
739
|
}
|
|
725
740
|
|
|
@@ -737,6 +752,25 @@ const _convertSelect = (query, model, _options) => {
|
|
|
737
752
|
search2cqn4sql(query, model, { ...query._searchOptions, ...{ entityName, alias } })
|
|
738
753
|
}
|
|
739
754
|
|
|
755
|
+
if (target && query.SELECT.columns) {
|
|
756
|
+
// clean up associations / compositions from columns, if not expanded
|
|
757
|
+
const cleanedUpColumns = []
|
|
758
|
+
for (const col of query.SELECT.columns) {
|
|
759
|
+
if (!col.expand) {
|
|
760
|
+
const ref = col.ref && col.ref[col.ref.length - 1]
|
|
761
|
+
const refElement = target.elements[ref]
|
|
762
|
+
if (refElement && refElement.isAssociation) {
|
|
763
|
+
// ignore
|
|
764
|
+
continue
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
cleanedUpColumns.push(col)
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
query.SELECT.columns = cleanedUpColumns
|
|
772
|
+
}
|
|
773
|
+
|
|
740
774
|
if (query.SELECT.columns && (cds.env.effective.odata.structs || cds.env.features.ucsn_struct_conversion)) {
|
|
741
775
|
flattenStructuredSelect(query, model)
|
|
742
776
|
}
|
|
@@ -752,6 +786,7 @@ const _convertSelect = (query, model, _options) => {
|
|
|
752
786
|
if (target && target._unresolved && typeof target.name === 'string') {
|
|
753
787
|
target = model.definitions[ensureNoDraftsSuffix(target.name)] || target
|
|
754
788
|
}
|
|
789
|
+
|
|
755
790
|
if (target && !Object.prototype.hasOwnProperty.call(target, '_unresolved')) {
|
|
756
791
|
const cols = getColumns(target, { onlyNames: true, filterVirtual: true })
|
|
757
792
|
query.columns(cols)
|
|
@@ -765,7 +800,7 @@ const _convertSelect = (query, model, _options) => {
|
|
|
765
800
|
return query
|
|
766
801
|
}
|
|
767
802
|
|
|
768
|
-
const _convertInsert = (query, model
|
|
803
|
+
const _convertInsert = (query, model) => {
|
|
769
804
|
// resolve path expression
|
|
770
805
|
const resolvedIntoClause = _convertPathExpressionForInsert(query.INSERT.into, model)
|
|
771
806
|
|
|
@@ -787,6 +822,7 @@ const _convertInsert = (query, model, options) => {
|
|
|
787
822
|
|
|
788
823
|
function _modifyNavigationInWhere(whereClause, target) {
|
|
789
824
|
if (!whereClause) return
|
|
825
|
+
|
|
790
826
|
whereClause.forEach(e => {
|
|
791
827
|
if (e.ref && e.ref.length > 1 && target.elements[e.ref[0]]) {
|
|
792
828
|
const element = target.elements[e.ref[0]]
|
|
@@ -853,7 +889,6 @@ function _plainUpdate(cqn, model) {
|
|
|
853
889
|
}
|
|
854
890
|
|
|
855
891
|
if (!target) return cqn
|
|
856
|
-
|
|
857
892
|
return resolveView(cqn, model, cds.db)
|
|
858
893
|
}
|
|
859
894
|
|
|
@@ -885,7 +920,6 @@ const _convertUpdate = (query, model, options) => {
|
|
|
885
920
|
}
|
|
886
921
|
|
|
887
922
|
if (!targetEntity) return update
|
|
888
|
-
|
|
889
923
|
return resolveView(update, model, cds.db)
|
|
890
924
|
}
|
|
891
925
|
|
|
@@ -909,7 +943,7 @@ const cqn2cqn4sql = (query, model, options = { suppressSearch: false }) => {
|
|
|
909
943
|
}
|
|
910
944
|
|
|
911
945
|
if (query.INSERT) {
|
|
912
|
-
return _convertInsert(query, model
|
|
946
|
+
return _convertInsert(query, model)
|
|
913
947
|
}
|
|
914
948
|
|
|
915
949
|
if (query.DELETE) {
|