Skip to content

Commit b48df4e

Browse files
authored
fix(DataStore): support predicate evaluation on model with Enum (#1516)
* fix(DataStore): support predicate evaluation on model with Enum * address PR comments
1 parent 7a5cb21 commit b48df4e

File tree

3 files changed

+138
-5
lines changed

3 files changed

+138
-5
lines changed

Amplify.xcodeproj/project.pbxproj

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
214F49CE24898E8500DA616C /* Article+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 214F49CC24898E8500DA616C /* Article+Schema.swift */; };
8484
21558E3E237BB4BF0032A5BB /* GraphQLRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21558E3D237BB4BF0032A5BB /* GraphQLRequest.swift */; };
8585
21558E40237CB8640032A5BB /* GraphQLError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21558E3F237CB8640032A5BB /* GraphQLError.swift */; };
86+
2163356E273C799900F0DF3F /* QueryPredicateEvaluateGeneratedEnumTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2163356C273C799000F0DF3F /* QueryPredicateEvaluateGeneratedEnumTests.swift */; };
8687
21644B7C2588258100C548A5 /* ModelListDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21644B7A2588258100C548A5 /* ModelListDecoder.swift */; };
8788
21665EF5259A947100841696 /* ListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21665EF4259A947100841696 /* ListTests.swift */; };
8889
21687A3E236371C4004A056E /* AnalyticsCategory+HubPayloadEventName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21687A3D236371C4004A056E /* AnalyticsCategory+HubPayloadEventName.swift */; };
@@ -932,6 +933,7 @@
932933
21558E3D237BB4BF0032A5BB /* GraphQLRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphQLRequest.swift; sourceTree = "<group>"; };
933934
21558E3F237CB8640032A5BB /* GraphQLError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphQLError.swift; sourceTree = "<group>"; };
934935
215F4BCAAB89FA54AA121BDE /* Pods-AmplifyAWSPlugins-AWSPluginsCore-AWSPinpointAnalyticsPlugin.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AmplifyAWSPlugins-AWSPluginsCore-AWSPinpointAnalyticsPlugin.release.xcconfig"; path = "Target Support Files/Pods-AmplifyAWSPlugins-AWSPluginsCore-AWSPinpointAnalyticsPlugin/Pods-AmplifyAWSPlugins-AWSPluginsCore-AWSPinpointAnalyticsPlugin.release.xcconfig"; sourceTree = "<group>"; };
936+
2163356C273C799000F0DF3F /* QueryPredicateEvaluateGeneratedEnumTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueryPredicateEvaluateGeneratedEnumTests.swift; sourceTree = "<group>"; };
935937
21644B7A2588258100C548A5 /* ModelListDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ModelListDecoder.swift; sourceTree = "<group>"; };
936938
21665EF4259A947100841696 /* ListTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListTests.swift; sourceTree = "<group>"; };
937939
21687A3D236371C4004A056E /* AnalyticsCategory+HubPayloadEventName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AnalyticsCategory+HubPayloadEventName.swift"; sourceTree = "<group>"; };
@@ -2458,17 +2460,18 @@
24582460
6B59798B2564DB210038C3E2 /* Query */ = {
24592461
isa = PBXGroup;
24602462
children = (
2461-
6B5087CE25674F99000AB673 /* QueryPredicateEvaluateTests.swift */,
2462-
6BAF4F37256893B900A811BA /* QueryPredicateEvaluateGenerator.swift */,
24632463
6B5979CA2565D18B0038C3E2 /* QueryPredicateEvaluateGeneratedBoolTests.swift */,
2464-
6B5087BC2565E5AD000AB673 /* QueryPredicateEvaluateGeneratedDoubleTests.swift */,
2464+
6B5087C6256638EA000AB673 /* QueryPredicateEvaluateGeneratedDateTests.swift */,
2465+
6B5087CA2566F70F000AB673 /* QueryPredicateEvaluateGeneratedDateTimeTests.swift */,
24652466
6B5087C025662DC3000AB673 /* QueryPredicateEvaluateGeneratedDoubleIntTests.swift */,
2467+
6B5087BC2565E5AD000AB673 /* QueryPredicateEvaluateGeneratedDoubleTests.swift */,
2468+
2163356C273C799000F0DF3F /* QueryPredicateEvaluateGeneratedEnumTests.swift */,
24662469
6B5087C82566F0FF000AB673 /* QueryPredicateEvaluateGeneratedIntDoubleTests.swift */,
24672470
6B5087C2256630DB000AB673 /* QueryPredicateEvaluateGeneratedIntTests.swift */,
24682471
6B5087C4256632D3000AB673 /* QueryPredicateEvaluateGeneratedStringTests.swift */,
2469-
6B5087C6256638EA000AB673 /* QueryPredicateEvaluateGeneratedDateTests.swift */,
2470-
6B5087CA2566F70F000AB673 /* QueryPredicateEvaluateGeneratedDateTimeTests.swift */,
24712472
6B5087CC25673AC8000AB673 /* QueryPredicateEvaluateGeneratedTimeTests.swift */,
2473+
6BAF4F37256893B900A811BA /* QueryPredicateEvaluateGenerator.swift */,
2474+
6B5087CE25674F99000AB673 /* QueryPredicateEvaluateTests.swift */,
24722475
);
24732476
path = Query;
24742477
sourceTree = "<group>";
@@ -4887,6 +4890,7 @@
48874890
21AD425B249C0DBE0016FE95 /* AnyModelTests.swift in Sources */,
48884891
D83C5160248964780091548E /* ModelGraphQLTests.swift in Sources */,
48894892
21DDCDF7272C3D7400D9B297 /* ModelSchemaGraphQLTests.swift in Sources */,
4893+
2163356E273C799900F0DF3F /* QueryPredicateEvaluateGeneratedEnumTests.swift in Sources */,
48904894
);
48914895
runOnlyForDeploymentPostprocessing = 0;
48924896
};

Amplify/Categories/DataStore/Query/QueryPredicate.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ public class QueryPredicateOperation: QueryPredicate {
130130
guard let fieldValue = target[field] else {
131131
return false
132132
}
133+
133134
guard let value = fieldValue else {
134135
return false
135136
}
@@ -145,10 +146,15 @@ public class QueryPredicateOperation: QueryPredicate {
145146
if let intValue = value as? Int {
146147
return self.operator.evaluate(target: intValue)
147148
}
149+
148150
if let timeValue = value as? Temporal.Time {
149151
return self.operator.evaluate(target: timeValue)
150152
}
151153

154+
if let enumValue = value as? EnumPersistable {
155+
return self.operator.evaluate(target: enumValue.rawValue)
156+
}
157+
152158
return self.operator.evaluate(target: value)
153159
}
154160
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
import Foundation
9+
import XCTest
10+
11+
@testable import Amplify
12+
@testable import AmplifyTestCommon
13+
14+
class QueryPredicateEvaluateGeneratedEnumTests: XCTestCase {
15+
16+
func testEnumNotEqual_False() throws {
17+
let predicate = Post.keys.status.ne(PostStatus.published)
18+
let instance = Post(title: "title",
19+
content: "content",
20+
createdAt: .now(),
21+
updatedAt: .now(),
22+
status: .published)
23+
24+
let evaluation = try predicate.evaluate(target: instance.eraseToAnyModel().instance)
25+
26+
XCTAssertFalse(evaluation)
27+
}
28+
29+
func testEnumNotEqual_True() throws {
30+
let predicate = Post.keys.status.ne(PostStatus.published)
31+
let instance = Post(title: "title",
32+
content: "content",
33+
createdAt: .now(),
34+
updatedAt: .now(),
35+
status: .draft)
36+
37+
let evaluation = try predicate.evaluate(target: instance.eraseToAnyModel().instance)
38+
39+
XCTAssertTrue(evaluation)
40+
}
41+
42+
func testEnumEquals_True() throws {
43+
let predicate = Post.keys.status.eq(PostStatus.published)
44+
let instance = Post(title: "title",
45+
content: "content",
46+
createdAt: .now(),
47+
updatedAt: .now(),
48+
status: .published)
49+
50+
let evaluation = try predicate.evaluate(target: instance.eraseToAnyModel().instance)
51+
52+
XCTAssertTrue(evaluation)
53+
}
54+
55+
func testEnumEquals_False() throws {
56+
let predicate = Post.keys.status.eq(PostStatus.published)
57+
let instance = Post(title: "title",
58+
content: "content",
59+
createdAt: .now(),
60+
updatedAt: .now(),
61+
status: .draft)
62+
63+
let evaluation = try predicate.evaluate(target: instance.eraseToAnyModel().instance)
64+
65+
XCTAssertFalse(evaluation)
66+
}
67+
68+
/// Draft is not greater than published, evaluates to false
69+
func testEnumToStringGreaterThan_False() throws {
70+
let predicate = Post.keys.status.gt(PostStatus.published.rawValue)
71+
let instance = Post(title: "title",
72+
content: "content",
73+
createdAt: .now(),
74+
updatedAt: .now(),
75+
status: .draft)
76+
77+
let evaluation = try predicate.evaluate(target: instance.eraseToAnyModel().instance)
78+
79+
XCTAssertFalse(evaluation)
80+
}
81+
82+
/// Published is greater than draft, evaluates to true
83+
func testEnumToStringGreaterThan_True() throws {
84+
let predicate = Post.keys.status.gt(PostStatus.draft.rawValue)
85+
let instance = Post(title: "title",
86+
content: "content",
87+
createdAt: .now(),
88+
updatedAt: .now(),
89+
status: .published)
90+
91+
let evaluation = try predicate.evaluate(target: instance.eraseToAnyModel().instance)
92+
93+
XCTAssertTrue(evaluation)
94+
}
95+
96+
/// Published is not less than draft, evalutates to false
97+
func testEnumToStringLessThan_False() throws {
98+
let predicate = Post.keys.status.lt(PostStatus.draft.rawValue)
99+
let instance = Post(title: "title",
100+
content: "content",
101+
createdAt: .now(),
102+
updatedAt: .now(),
103+
status: .published)
104+
105+
let evaluation = try predicate.evaluate(target: instance.eraseToAnyModel().instance)
106+
107+
XCTAssertFalse(evaluation)
108+
}
109+
110+
/// Draft is less than publshed, evaluates to true
111+
func testEnumToStringLessThan_True() throws {
112+
let predicate = Post.keys.status.lt(PostStatus.published.rawValue)
113+
let instance = Post(title: "title",
114+
content: "content",
115+
createdAt: .now(),
116+
updatedAt: .now(),
117+
status: .draft)
118+
119+
let evaluation = try predicate.evaluate(target: instance.eraseToAnyModel().instance)
120+
121+
XCTAssertTrue(evaluation)
122+
}
123+
}

0 commit comments

Comments
 (0)