From 8b359e6cc7e9a543a2b33a9f7a8df8bd7d091dd1 Mon Sep 17 00:00:00 2001 From: Lars Lutz Date: Fri, 20 Jan 2023 10:19:31 +0100 Subject: [PATCH 1/6] replace like with contains func --- lib/resolvers/parse/ast2cqn/where.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/resolvers/parse/ast2cqn/where.js b/lib/resolvers/parse/ast2cqn/where.js index ab2699b6..21235c54 100644 --- a/lib/resolvers/parse/ast2cqn/where.js +++ b/lib/resolvers/parse/ast2cqn/where.js @@ -4,7 +4,7 @@ const { Kind } = require('graphql') const GQL_TO_CDS_STRING_OPERATIONS = { [STRING_OPERATIONS.startswith]: 'like', [STRING_OPERATIONS.endswith]: 'like', - [STRING_OPERATIONS.contains]: 'like' + [STRING_OPERATIONS.contains]: 'contains' } const GQL_TO_CDS_QL_OPERATOR = { @@ -34,8 +34,14 @@ const _objectFieldTo_xpr = (objectField, columnName) => { const cdsOperator = _gqlOperatorToCdsOperator(gqlOperator) const gqlValue = objectField.value.value const cdsValue = _gqlValueToCdsValue(cdsOperator, gqlOperator, gqlValue) + let where + if(cdsOperator === GQL_TO_CDS_STRING_OPERATIONS[STRING_OPERATIONS.contains]) where = [_genericFn(cdsOperator, [{ ref: [columnName] },{ val: cdsValue }])] + else where = [{ ref: [columnName] }, cdsOperator, { val: cdsValue }] + return where +} - return [{ ref: [columnName] }, cdsOperator, { val: cdsValue }] +const _genericFn = (methodName, args, operator) => { + return { func: `${operator ? `${operator} ` : ''}${methodName}`, args } } const _parseObjectField = (objectField, columnName) => { From 1dc51c60127c77995abf4b9eeca5798cfe2a6971 Mon Sep 17 00:00:00 2001 From: Lars Lutz Date: Fri, 20 Jan 2023 10:26:17 +0100 Subject: [PATCH 2/6] formating --- lib/resolvers/parse/ast2cqn/where.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/resolvers/parse/ast2cqn/where.js b/lib/resolvers/parse/ast2cqn/where.js index 21235c54..e3c262c4 100644 --- a/lib/resolvers/parse/ast2cqn/where.js +++ b/lib/resolvers/parse/ast2cqn/where.js @@ -35,14 +35,12 @@ const _objectFieldTo_xpr = (objectField, columnName) => { const gqlValue = objectField.value.value const cdsValue = _gqlValueToCdsValue(cdsOperator, gqlOperator, gqlValue) let where - if(cdsOperator === GQL_TO_CDS_STRING_OPERATIONS[STRING_OPERATIONS.contains]) where = [_genericFn(cdsOperator, [{ ref: [columnName] },{ val: cdsValue }])] + if(cdsOperator === GQL_TO_CDS_STRING_OPERATIONS[STRING_OPERATIONS.contains]) where = [ _genericFn(cdsOperator, [{ ref: [columnName] },{ val: cdsValue }]) ] else where = [{ ref: [columnName] }, cdsOperator, { val: cdsValue }] return where } -const _genericFn = (methodName, args, operator) => { - return { func: `${operator ? `${operator} ` : ''}${methodName}`, args } -} +const _genericFn = (methodName, args, operator) => ({ func: `${operator ? `${operator} ` : ''}${methodName}`, args }) const _parseObjectField = (objectField, columnName) => { const value = objectField.value From 085e3a94c43c4b256540fcf5864dae6f4602987d Mon Sep 17 00:00:00 2001 From: Marcel Schwarz Date: Fri, 20 Jan 2023 12:36:22 +0100 Subject: [PATCH 3/6] Cleanup and use CQN functions for startswith and endsWith --- lib/resolvers/parse/ast2cqn/where.js | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/lib/resolvers/parse/ast2cqn/where.js b/lib/resolvers/parse/ast2cqn/where.js index e3c262c4..348df557 100644 --- a/lib/resolvers/parse/ast2cqn/where.js +++ b/lib/resolvers/parse/ast2cqn/where.js @@ -2,8 +2,8 @@ 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.startswith]: 'startswith', + [STRING_OPERATIONS.endswith]: 'endswith', [STRING_OPERATIONS.contains]: 'contains' } @@ -16,28 +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) - let where - if(cdsOperator === GQL_TO_CDS_STRING_OPERATIONS[STRING_OPERATIONS.contains]) where = [ _genericFn(cdsOperator, [{ ref: [columnName] },{ val: cdsValue }]) ] - else where = [{ ref: [columnName] }, cdsOperator, { val: cdsValue }] - return where + + const ref = { ref: [columnName] } + const val = { val: objectField.value.value } + + if (STRING_OPERATIONS[gqlOperator]) return [_genericFn(cdsOperator, [ref, val])] + + return [ref, cdsOperator, val] } const _genericFn = (methodName, args, operator) => ({ func: `${operator ? `${operator} ` : ''}${methodName}`, args }) From 77d621638056de156ec9adf5f3087fe170ef3f78 Mon Sep 17 00:00:00 2001 From: Marcel Schwarz Date: Fri, 20 Jan 2023 12:50:00 +0100 Subject: [PATCH 4/6] Rm helper function --- lib/resolvers/parse/ast2cqn/where.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/resolvers/parse/ast2cqn/where.js b/lib/resolvers/parse/ast2cqn/where.js index 348df557..1b47085c 100644 --- a/lib/resolvers/parse/ast2cqn/where.js +++ b/lib/resolvers/parse/ast2cqn/where.js @@ -26,13 +26,11 @@ const _objectFieldTo_xpr = (objectField, columnName) => { const ref = { ref: [columnName] } const val = { val: objectField.value.value } - if (STRING_OPERATIONS[gqlOperator]) return [_genericFn(cdsOperator, [ref, val])] + if (STRING_OPERATIONS[gqlOperator]) return [{ func: cdsOperator, args: [ref, val] }] return [ref, cdsOperator, val] } -const _genericFn = (methodName, args, operator) => ({ func: `${operator ? `${operator} ` : ''}${methodName}`, args }) - const _parseObjectField = (objectField, columnName) => { const value = objectField.value const name = objectField.name.value From 147f98ee55cd63983aa343b4aab599776ae0dc70 Mon Sep 17 00:00:00 2001 From: Marcel Schwarz Date: Fri, 20 Jan 2023 12:54:58 +0100 Subject: [PATCH 5/6] Add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ffbcf3c8..acfa222b 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 +- Filters `contains`, `startswith`, and `endswith` now generate CQN function calls instead of generating `like` expressions directly ### Fixed From 5cbb7eee6d4cfe2f7ee52a76778828bfd49e47e7 Mon Sep 17 00:00:00 2001 From: Marcel Schwarz Date: Fri, 20 Jan 2023 13:03:37 +0100 Subject: [PATCH 6/6] Improve wording --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index acfa222b..58924f13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +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 -- Filters `contains`, `startswith`, and `endswith` now generate CQN function calls instead of generating `like` expressions directly +- The filters `contains`, `startswith`, and `endswith` now generate CQN function calls instead of generating `like` expressions directly ### Fixed