Skip to content

Commit 5701e64

Browse files
committed
Adds support for NSArray parameters to YapDatabaseQuery
Example: [YapDatabaseQuery queryWithFormat:@"WHERE col IN (?)", anArray]; - Adds unit tests for YapDatabaseQuery - Adds new unit test for YapDatabaseSecondaryIndex since it makes use of YapDatabaseQuery Addresses issue #119
1 parent 41c8e77 commit 5701e64

File tree

4 files changed

+104
-1
lines changed

4 files changed

+104
-1
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#import <XCTest/XCTest.h>
2+
3+
#import "YapDatabaseQuery.h"
4+
5+
@interface TestYapDatabaseQuery : XCTestCase
6+
@end
7+
8+
@implementation TestYapDatabaseQuery
9+
10+
- (void)test1
11+
{
12+
YapDatabaseQuery *query = [YapDatabaseQuery queryWithFormat:@"WHERE col > 5"];
13+
XCTAssertTrue([query.queryString isEqualToString:@"WHERE col > 5"], @"Incorrect queryString");
14+
15+
query = [YapDatabaseQuery queryWithFormat:@"WHERE col > ?", @(5)];
16+
NSArray *expectedArguments = @[@(5)];
17+
XCTAssertTrue([query.queryString isEqualToString:@"WHERE col > ?"], @"Incorrect queryString");
18+
XCTAssertTrue([query.queryParameters isEqualToArray:@[@(5)]], @"Incorrect queryParameters");
19+
20+
query = [YapDatabaseQuery queryWithFormat:@"WHERE col > ? AND col < ?", @(1), @(5)];
21+
expectedArguments = @[@(1), @(5)];
22+
XCTAssertTrue([query.queryString isEqualToString:@"WHERE col > ? AND col < ?"], @"Incorrect queryString");
23+
XCTAssertTrue([query.queryParameters isEqualToArray:expectedArguments], @"Incorrect queryParameters");
24+
25+
query = [YapDatabaseQuery queryWithFormat:@"WHERE col > ? AND col < ?", @(1), @(5)];
26+
expectedArguments = @[@(1), @(5)];
27+
XCTAssertTrue([query.queryString isEqualToString:@"WHERE col > ? AND col < ?"], @"Incorrect queryString");
28+
XCTAssertTrue([query.queryParameters isEqualToArray:expectedArguments], @"Incorrect queryParameters");
29+
30+
query = [YapDatabaseQuery queryWithFormat:@"WHERE col IN (?)", @[@(1), @(5)]];
31+
expectedArguments = @[@(1), @(5)];
32+
XCTAssertTrue([query.queryString isEqualToString:@"WHERE col IN (?,?)"], @"Incorrect queryString");
33+
XCTAssertTrue([query.queryParameters isEqualToArray:expectedArguments], @"Incorrect queryParameters");
34+
35+
query = [YapDatabaseQuery queryWithFormat:@"WHERE col IN (?) AND col2 <> ?", @[@(1), @(5)], @"test"];
36+
expectedArguments = @[@(1), @(5), @"test"];
37+
XCTAssertTrue([query.queryString isEqualToString:@"WHERE col IN (?,?) AND col2 <> ?"], @"Incorrect queryString");
38+
XCTAssertTrue([query.queryParameters isEqualToArray:expectedArguments], @"Incorrect queryParameters");
39+
40+
query = [YapDatabaseQuery queryWithFormat:@"WHERE col2 <> ? AND col IN (?)", @"test", @[@(1), @(5)]];
41+
expectedArguments = @[@"test", @(1), @(5)];
42+
XCTAssertTrue([query.queryString isEqualToString:@"WHERE col2 <> ? AND col IN (?,?)"], @"Incorrect queryString");
43+
XCTAssertTrue([query.queryParameters isEqualToArray:expectedArguments], @"Incorrect queryParameters");
44+
}
45+
46+
@end

Testing/UnitTesting/TestYapDatabaseSecondaryIndex.m

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,17 @@ - (void)test
152152
}];
153153

154154
XCTAssertTrue(count == 4, @"Incorrect count: %lu", (unsigned long)count);
155+
156+
count = 0;
157+
query = [YapDatabaseQuery queryWithFormat:@"WHERE someInt IN (?)",
158+
@[@(2), @(4), @(5.5), @(9)]];
159+
[[transaction ext:@"idx"] enumerateKeysMatchingQuery:query
160+
usingBlock:^(NSString *collection, NSString *key, BOOL *stop) {
161+
162+
count++;
163+
}];
164+
165+
XCTAssertTrue(count == 3, @"Incorrect count: %lu", (unsigned long)count);
155166
}];
156167

157168
//

Testing/Xcode-mobile/YapDatabase.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
5EC2813F19E378D20036CC87 /* TestYapDatabaseQuery.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EC2813E19E378D20036CC87 /* TestYapDatabaseQuery.m */; };
1011
DC005BC11774C666002E57DE /* TestViewChangeLogic.m in Sources */ = {isa = PBXBuildFile; fileRef = DC005BC01774C666002E57DE /* TestViewChangeLogic.m */; };
1112
DC00E87C19DC6D3400905481 /* YapDatabaseFullTextSearchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = DC00E87B19DC6D3400905481 /* YapDatabaseFullTextSearchHandler.m */; };
1213
DC00E87F19DC8ECC00905481 /* YapDatabaseSecondaryIndexHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = DC00E87E19DC8ECC00905481 /* YapDatabaseSecondaryIndexHandler.m */; };
@@ -176,6 +177,7 @@
176177
/* End PBXContainerItemProxy section */
177178

178179
/* Begin PBXFileReference section */
180+
5EC2813E19E378D20036CC87 /* TestYapDatabaseQuery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestYapDatabaseQuery.m; path = ../../UnitTesting/TestYapDatabaseQuery.m; sourceTree = "<group>"; };
179181
DC005BC01774C666002E57DE /* TestViewChangeLogic.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestViewChangeLogic.m; path = ../../UnitTesting/TestViewChangeLogic.m; sourceTree = "<group>"; };
180182
DC00E87A19DC6D3400905481 /* YapDatabaseFullTextSearchHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YapDatabaseFullTextSearchHandler.h; sourceTree = "<group>"; };
181183
DC00E87B19DC6D3400905481 /* YapDatabaseFullTextSearchHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YapDatabaseFullTextSearchHandler.m; sourceTree = "<group>"; };
@@ -396,6 +398,14 @@
396398
/* End PBXFrameworksBuildPhase section */
397399

398400
/* Begin PBXGroup section */
401+
5EC2813D19E376680036CC87 /* Utilities */ = {
402+
isa = PBXGroup;
403+
children = (
404+
5EC2813E19E378D20036CC87 /* TestYapDatabaseQuery.m */,
405+
);
406+
name = Utilities;
407+
sourceTree = "<group>";
408+
};
399409
DC059BB818EF864C0088574E /* Utilities */ = {
400410
isa = PBXGroup;
401411
children = (
@@ -835,6 +845,7 @@
835845
children = (
836846
DC3D2F251673FFEC00DFAFAA /* TestObject.h */,
837847
DC3D2F261673FFEC00DFAFAA /* TestObject.m */,
848+
5EC2813D19E376680036CC87 /* Utilities */,
838849
DC5BAD8A174E75B000DF9465 /* Database */,
839850
DC5BAD8B174E75C500DF9465 /* Views */,
840851
DC49734117E7ED0000489267 /* FullTextSearch */,
@@ -1132,6 +1143,7 @@
11321143
DC005BC11774C666002E57DE /* TestViewChangeLogic.m in Sources */,
11331144
DCEE835017AAC7F3009BF81D /* TestViewMappingsLogic.m in Sources */,
11341145
DC8E6043183F0A3D0091633D /* TestYapDatabaseFilteredView.m in Sources */,
1146+
5EC2813F19E378D20036CC87 /* TestYapDatabaseQuery.m in Sources */,
11351147
);
11361148
runOnlyForDeploymentPostprocessing = 0;
11371149
};

YapDatabase/Utilities/YapDatabaseQuery.m

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,14 @@ + (instancetype)queryWithFormat:(NSString *)format, ...
5858
NSRange searchRange = NSMakeRange(0, formatLength);
5959
NSRange paramRange = [format rangeOfString:@"?" options:0 range:searchRange];
6060

61+
NSMutableArray *paramLocations = [NSMutableArray array];
62+
6163
while (paramRange.location != NSNotFound)
6264
{
6365
paramCount++;
6466

67+
[paramLocations addObject:@(paramRange.location)];
68+
6569
searchRange.location = paramRange.location + 1;
6670
searchRange.length = formatLength - searchRange.location;
6771

@@ -79,11 +83,41 @@ + (instancetype)queryWithFormat:(NSString *)format, ...
7983

8084
@try
8185
{
86+
NSMutableDictionary *paramIndexToElementCountMap = [NSMutableDictionary dictionary];
8287
for (NSUInteger i = 0; i < paramCount; i++)
8388
{
8489
id param = va_arg(args, id);
90+
if ([param isKindOfClass:[NSArray class]])
91+
{
92+
paramIndexToElementCountMap[@(i)] = @([param count]);
93+
[queryParameters addObjectsFromArray:param];
94+
}
95+
else
96+
{
97+
[queryParameters addObject:param];
98+
}
99+
}
100+
101+
if (paramIndexToElementCountMap.count > 0)
102+
{
103+
NSUInteger unpackingOffset = 0;
104+
NSString *queryString = [format copy];
105+
NSRange range;
106+
for (NSNumber *index in paramIndexToElementCountMap)
107+
{
108+
NSInteger elementCount = [paramIndexToElementCountMap[index] intValue];
109+
NSMutableArray *unpackedParams = [NSMutableArray array];
110+
for (NSUInteger i = 0; i < elementCount; i++)
111+
{
112+
[unpackedParams addObject:@"?"];
113+
}
114+
NSString *unpackedParamsStr = [unpackedParams componentsJoinedByString:@","];
115+
range = NSMakeRange([paramLocations[[index intValue]] intValue] + unpackingOffset, 1);
116+
queryString = [queryString stringByReplacingCharactersInRange:range
117+
withString:unpackedParamsStr];
118+
}
85119

86-
[queryParameters addObject:param];
120+
format = [queryString copy];
87121
}
88122
}
89123
@catch (NSException *exception)

0 commit comments

Comments
 (0)