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

Commit 8cd101c

Browse files
committed
OData provider: support date functions in projection expression, add fractionalseconds field operation
1 parent 64d466a commit 8cd101c

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

src/Types/StorageProviders/oData/oDataCompiler.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
import $data, { $C, Guard, Container, Exception, MemberDefinition } from 'jaydata/core';
22

3+
$C('$data.storageProviders.oData.oDataModelBinderConfigCompiler', $data.modelBinder.ModelBinderConfigCompiler, null, {
4+
VisitEntityFieldOperationExpression: function(expression, builder){
5+
this.Visit(expression.source, builder);
6+
var opDef = expression.operation.memberDefinition;
7+
if (typeof opDef.projection == "function"){
8+
builder.modelBinderConfig.$type = opDef.returnType || opDef.dataType;
9+
builder.modelBinderConfig.$value = function(meta, data){ return opDef.projection(data[meta.$source]); };
10+
}
11+
}
12+
});
13+
314
$C('$data.storageProviders.oData.oDataCompiler', $data.Expressions.EntityExpressionVisitor, null, {
415
constructor: function () {
516
this.context = {};
@@ -26,7 +37,7 @@ $C('$data.storageProviders.oData.oDataCompiler', $data.Expressions.EntityExpress
2637

2738

2839
query.modelBinderConfig = {};
29-
var modelBinder = Container.createModelBinderConfigCompiler(query, this.includes, true);
40+
var modelBinder = $data.storageProviders.oData.oDataModelBinderConfigCompiler.create(query, this.includes, true);
3041
modelBinder.Visit(query.expression);
3142

3243

src/Types/StorageProviders/oData/oDataProjectionCompiler.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,5 +167,8 @@ $C('$data.storageProviders.oData.oDataProjectionCompiler', $data.Expressions.Ent
167167
//Guard.raise(new Exception('Constant value is not supported in Projection.', 'Not supported!'));
168168
//context.data += expression.value;
169169
context.data = context.data.slice(0, context.data.length - 1);
170+
},
171+
VisitEntityFieldOperationExpression: function (expression, context) {
172+
this.Visit(expression.source, context);
170173
}
171174
});

src/Types/StorageProviders/oData/oDataProvider.js

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,7 @@ $C('$data.storageProviders.oData.oDataProvider', $data.StorageProviderBase, null
928928

929929
length: [{
930930
allowedType: 'string',
931+
projection: function(v){ return v ? v.length : 0; },
931932
dataType: "number", allowedIn: [$data.Expressions.FilterExpression, $data.Expressions.ProjectionExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
932933
parameters: [{ name: "@expression", dataType: "string" }]
933934
},
@@ -948,6 +949,7 @@ $C('$data.storageProviders.oData.oDataProvider', $data.StorageProviderBase, null
948949

949950
strLength: {
950951
mapTo: "length",
952+
projection: function(v){ return v ? v.length : 0; },
951953
dataType: "number", allowedIn: [$data.Expressions.FilterExpression, $data.Expressions.ProjectionExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
952954
parameters: [{ name: "@expression", dataType: "string" }]
953955
},
@@ -998,27 +1000,45 @@ $C('$data.storageProviders.oData.oDataProvider', $data.StorageProviderBase, null
9981000
/* data functions */
9991001

10001002
day: {
1001-
allowedIn: [$data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1003+
allowedIn: [$data.Expressions.ProjectionExpression, $data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1004+
dataType: "number",
1005+
projection: function(v){ return new Date(v).getUTCDate(); },
10021006
parameters: [{ name: "@expression", dataType: "date" }]
10031007
},
10041008
hour: {
1005-
allowedIn: [$data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1009+
allowedIn: [$data.Expressions.ProjectionExpression, $data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1010+
dataType: "number",
1011+
projection: function(v){ return new Date(v).getUTCHours(); },
10061012
parameters: [{ name: "@expression", dataType: "date" }]
10071013
},
10081014
minute: {
1009-
allowedIn: [$data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1015+
allowedIn: [$data.Expressions.ProjectionExpression, $data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1016+
dataType: "number",
1017+
projection: function(v){ return new Date(v).getUTCMinutes(); },
10101018
parameters: [{ name: "@expression", dataType: "date" }]
10111019
},
10121020
month: {
1013-
allowedIn: [$data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1021+
allowedIn: [$data.Expressions.ProjectionExpression, $data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1022+
dataType: "number",
1023+
projection: function(v){ return new Date(v).getUTCMonth() + 1; },
10141024
parameters: [{ name: "@expression", dataType: "date" }]
10151025
},
10161026
second: {
1017-
allowedIn: [$data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1027+
allowedIn: [$data.Expressions.ProjectionExpression, $data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1028+
dataType: "number",
1029+
projection: function(v){ return new Date(v).getUTCSeconds(); },
10181030
parameters: [{ name: "@expression", dataType: "date" }]
10191031
},
10201032
year: {
1021-
allowedIn: [$data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1033+
allowedIn: [$data.Expressions.ProjectionExpression, $data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1034+
dataType: "number",
1035+
projection: function(v){ return new Date(v).getFullYear(); },
1036+
parameters: [{ name: "@expression", dataType: "date" }]
1037+
},
1038+
fractionalseconds: {
1039+
allowedIn: [$data.Expressions.ProjectionExpression, $data.Expressions.FilterExpression, $data.Expressions.OrderExpression, $data.Expressions.SomeExpression, $data.Expressions.EveryExpression],
1040+
dataType: "number",
1041+
projection: function(v){ return new Date(v).getUTCMilliseconds() / 1000; },
10221042
parameters: [{ name: "@expression", dataType: "date" }]
10231043
},
10241044

0 commit comments

Comments
 (0)