Skip to content
This repository was archived by the owner on Apr 11, 2023. It is now read-only.

Commit e04e6e3

Browse files
committed
FIX: ODataV4 service function parameters in url
1 parent 50d034e commit e04e6e3

File tree

5 files changed

+129
-218
lines changed

5 files changed

+129
-218
lines changed

src/Types/Expressions/ConstantExpression.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
import $data, { $C, Guard, Container, Exception } from '../../TypeSystem/index.js';
22

33
$C('$data.Expressions.ConstantExpression', $data.Expressions.ExpressionNode, null, {
4-
constructor: function (value, type, name) {
4+
constructor: function (value, type, name, elementType) {
55
this.value = value;
66
//TODO
77
//this.type = Container.getTypeName(value);
88

99
this.type = type;
1010
this.name = name;
11+
this.elementType = elementType;
1112
if (!Guard.isNullOrUndefined(this.value)) {
1213
this.type = Container.resolveType(this.type)
13-
if (Container.resolveType(Container.getTypeName(this.value)) !== this.type)
14-
this.value = Container.convertTo(value, this.type);
14+
if ((this.type === $data.Array && this.elementType) || Container.resolveType(Container.getTypeName(this.value)) !== this.type)
15+
this.value = Container.convertTo(value, this.type, this.elementType);
1516
}
1617
},
1718
nodeType: { value: $data.Expressions.ExpressionType.Constant, enumerable: true },
1819
type: { value: Object, writable: true },
20+
elementType: { value: Object, writable: true },
1921
value: { value: undefined, writable: true },
2022
toString: function (debug) {
2123
//return "[constant: " + this.value.toString() + "]";

src/Types/ServiceOperation.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ $data.Class.define('$data.ServiceOperation', null, null, {}, {
8888
for (var i = 0; i < cfg.params.length; i++) {
8989
var paramConfig = cfg.params[i];
9090
if (paramConfig.name && paramConfig.type && paramConfig.name in argObj) {
91-
paramConstExpression.push(Container.createConstantExpression(argObj[paramConfig.name], Container.resolveType(paramConfig.type), paramConfig.name));
91+
paramConstExpression.push(Container.createConstantExpression(argObj[paramConfig.name], Container.resolveType(paramConfig.type), paramConfig.name, paramConfig.elementType));
9292
}
9393
}
9494
}
@@ -100,7 +100,7 @@ $data.Class.define('$data.ServiceOperation', null, null, {}, {
100100
//TODO: check params type
101101
var paramConfig = cfg.params[i];
102102
if (paramConfig.name && paramConfig.type && arguments[i] !== undefined) {
103-
paramConstExpression.push(Container.createConstantExpression(arguments[i], Container.resolveType(paramConfig.type), paramConfig.name));
103+
paramConstExpression.push(Container.createConstantExpression(arguments[i], Container.resolveType(paramConfig.type), paramConfig.name, paramConfig.elementType));
104104
}
105105
}
106106
}

src/Types/StorageProviders/oData/oDataCompiler.js

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,14 @@ $C('$data.storageProviders.oData.oDataCompiler', $data.Expressions.EntityExpress
3232

3333
var queryText = queryFragments.urlText;
3434
var addAmp = false;
35+
36+
if(queryFragments.$funcParams){
37+
queryText += "(" + queryFragments.$funcParams + ")"
38+
}
39+
3540
for (var name in queryFragments) {
3641
if (name != "urlText" && name != "actionPack" && name != "data" && name != "lambda" && name != "method" && name != "postData" &&
37-
name != "_isBatchExecuteQuery" && name != "_subQueries" && queryFragments[name] != "") {
42+
name != "_isBatchExecuteQuery" && name != "_subQueries" && name != "$funcParams" && queryFragments[name] != "") {
3843

3944
if (addAmp) { queryText += "&"; } else { queryText += "?"; }
4045
addAmp = true;
@@ -166,9 +171,11 @@ $C('$data.storageProviders.oData.oDataCompiler', $data.Expressions.EntityExpress
166171

167172
//this.logicalType = expression.returnType;
168173
if (expression.params) {
174+
context.serviceConfig = expression.cfg
169175
for (var i = 0; i < expression.params.length; i++) {
170176
this.Visit(expression.params[i], context);
171177
}
178+
delete context.serviceConfig;
172179
}
173180
},
174181
VisitBatchDeleteExpression: function (expression, context) {
@@ -183,16 +190,34 @@ $C('$data.storageProviders.oData.oDataCompiler', $data.Expressions.EntityExpress
183190
typeName = $data.Entity.fullName;
184191

185192
var converter = this.provider.fieldConverter.toDb[typeName];
186-
var value = converter ? converter(expression.value) : expression.value;
193+
var value = converter ? converter(expression.value, expression) : expression.value;
187194

188195

189196
if (context.method === 'GET' || !context.method) {
190197
converter = this.provider.fieldConverter.escape[typeName];
191-
value = converter ? converter(value) : value;
192-
198+
value = converter ? converter(value, expression) : value;
193199
if (value !== undefined) {
194-
if (context['$urlParams']) { context['$urlParams'] += '&'; } else { context['$urlParams'] = ''; }
195-
context['$urlParams'] += expression.name + '=' + value;
200+
var serviceConfig = context.serviceConfig || {};
201+
var paramConfig = (serviceConfig && serviceConfig.params.filter(p => p.name == expression.name)[0]) || {}
202+
203+
var useAlias = serviceConfig.namespace &&
204+
(paramConfig.useAlias ||
205+
serviceConfig.useAlias ||
206+
this.provider.providerConfiguration.useParameterAlias ||
207+
$data.defaults.OData.useParameterAlias);
208+
209+
var paramValue = useAlias ? "@" + expression.name : value;
210+
var paramName = (useAlias ? "@" : "") + expression.name;
211+
212+
if (serviceConfig.namespace) {
213+
if (context['$funcParams']) { context['$funcParams'] += ','; } else { context['$funcParams'] = ''; }
214+
context['$funcParams'] += expression.name + '=' + paramValue;
215+
}
216+
217+
if (!serviceConfig.namespace || useAlias) {
218+
if (context['$urlParams']) { context['$urlParams'] += '&'; } else { context['$urlParams'] = ''; }
219+
context['$urlParams'] += paramName + '=' + value;
220+
}
196221
}
197222
} else {
198223
context.postData = context.postData || {};

src/Types/StorageProviders/oData/oDataConverter.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,18 @@ $data.oDataConverter = {
100100
'$data.Boolean': $data.Container.proxyConverter,
101101
'$data.Blob': function (v) { return v ? $data.Blob.toBase64(v) : v; },
102102
'$data.Object': $data.Container.proxyConverter,
103-
'$data.Array': $data.Container.proxyConverter,
103+
'$data.Array': function(o, def){
104+
if(o && def && def.elementType){
105+
var typeName = Container.resolveName(def.elementType);
106+
var values = [];
107+
for(var i = 0; i < o.length; i++){
108+
values.push($data.oDataConverter['toDb'][typeName](o[i]));
109+
}
110+
111+
return values;
112+
}
113+
return $data.Container.proxyConverter.apply(this, arguments);
114+
},
104115
'$data.GeographyPoint': $data.Container.proxyConverter,
105116
'$data.GeographyLineString': $data.Container.proxyConverter,
106117
'$data.GeographyPolygon': $data.Container.proxyConverter,
@@ -139,7 +150,18 @@ $data.oDataConverter = {
139150
'$data.Boolean': function (bool) { return typeof bool === 'boolean' ? bool.toString() : bool; },
140151
'$data.Blob': function (b) { return b ? "binary'" + b + "'" : b; },
141152
'$data.Object': function (o) { return JSON.stringify(o); },
142-
'$data.Array': function (o) { return JSON.stringify(o); },
153+
'$data.Array': function (o, def) {
154+
if(o && def && def.elementType){
155+
var typeName = Container.resolveName(def.elementType);
156+
var values = [];
157+
for(var i = 0; i < o.length; i++){
158+
values.push($data.oDataConverter['escape'][typeName](o[i]));
159+
}
160+
161+
return "[" + values.join(',') + "]"
162+
}
163+
return JSON.stringify(o);
164+
},
143165
'$data.GeographyPoint': function (g) { if (g) { return $data.GeographyBase.stringifyToUrl(g); } return g; },
144166
'$data.GeographyLineString': function (g) { if (g) { return $data.GeographyBase.stringifyToUrl(g); } return g; },
145167
'$data.GeographyPolygon': function (g) { if (g) { return $data.GeographyBase.stringifyToUrl(g); } return g; },

0 commit comments

Comments
 (0)