diff --git a/CHANGELOG.md b/CHANGELOG.md index ffbcf3c8..58924f13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Register `aliasFieldResolver` during schema generation instead of passing it to the GraphQL server +- The filters `contains`, `startswith`, and `endswith` now generate CQN function calls instead of generating `like` expressions directly ### Fixed diff --git a/lib/resolvers/parse/ast2cqn/where.js b/lib/resolvers/parse/ast2cqn/where.js index ab2699b6..1b47085c 100644 --- a/lib/resolvers/parse/ast2cqn/where.js +++ b/lib/resolvers/parse/ast2cqn/where.js @@ -2,9 +2,9 @@ const { RELATIONAL_OPERATORS, STRING_OPERATIONS } = require('../../../constants' const { Kind } = require('graphql') const GQL_TO_CDS_STRING_OPERATIONS = { - [STRING_OPERATIONS.startswith]: 'like', - [STRING_OPERATIONS.endswith]: 'like', - [STRING_OPERATIONS.contains]: 'like' + [STRING_OPERATIONS.startswith]: 'startswith', + [STRING_OPERATIONS.endswith]: 'endswith', + [STRING_OPERATIONS.contains]: 'contains' } const GQL_TO_CDS_QL_OPERATOR = { @@ -16,26 +16,19 @@ const GQL_TO_CDS_QL_OPERATOR = { [RELATIONAL_OPERATORS.lt]: '<' } -const _stringOperationToLikeString = (operator, string) => - ({ - [STRING_OPERATIONS.startswith]: `${string}%`, - [STRING_OPERATIONS.endswith]: `%${string}`, - [STRING_OPERATIONS.contains]: `%${string}%` - }[operator]) - -const _gqlValueToCdsValue = (cdsOperator, gqlOperator, gqlValue) => - cdsOperator === 'like' ? _stringOperationToLikeString(gqlOperator, gqlValue) : gqlValue - const _gqlOperatorToCdsOperator = gqlOperator => GQL_TO_CDS_QL_OPERATOR[gqlOperator] || GQL_TO_CDS_STRING_OPERATIONS[gqlOperator] const _objectFieldTo_xpr = (objectField, columnName) => { const gqlOperator = objectField.name.value const cdsOperator = _gqlOperatorToCdsOperator(gqlOperator) - const gqlValue = objectField.value.value - const cdsValue = _gqlValueToCdsValue(cdsOperator, gqlOperator, gqlValue) - return [{ ref: [columnName] }, cdsOperator, { val: cdsValue }] + const ref = { ref: [columnName] } + const val = { val: objectField.value.value } + + if (STRING_OPERATIONS[gqlOperator]) return [{ func: cdsOperator, args: [ref, val] }] + + return [ref, cdsOperator, val] } const _parseObjectField = (objectField, columnName) => {