Skip to content

Commit 427e6bd

Browse files
committed
[QKQuerySet] Introduce range to match QuerySet
1 parent b9e068a commit 427e6bd

5 files changed

Lines changed: 42 additions & 17 deletions

File tree

QueryKit/ObjectiveC/QKQuerySet.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@
3131
/** This is a read only property to hold any sort descriptors set on this object. You can use the `orderBy:` and `reverse` methods to effect this value on a child */
3232
@property (nonatomic, copy, readonly) NSArray *sortDescriptors;
3333

34+
/** This is a read only property to hold a range set. */
35+
@property (nonatomic, assign, readonly) NSRange range;
36+
3437
#pragma mark - Creation
3538

3639
- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext entityDescription:(NSEntityDescription *)entityDescription __attribute((nonnull));
37-
- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext entityDescription:(NSEntityDescription *)entityDescription predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors __attribute((nonnull(1, 2)));
40+
- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext entityDescription:(NSEntityDescription *)entityDescription predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors range:(NSRange)range __attribute((nonnull(1, 2)));
3841
- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext fetchRequest:(NSFetchRequest *)fetchRequest __attribute((nonnull));
3942

4043
#pragma mark - Equality

QueryKit/ObjectiveC/QKQuerySet.m

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ @implementation QKQuerySet
2121
#pragma mark - Creation
2222

2323
- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext entityDescription:(NSEntityDescription *)entityDescription {
24-
return [self initWithManagedObjectContext:managedObjectContext entityDescription:entityDescription predicate:nil sortDescriptors:nil];
24+
return [self initWithManagedObjectContext:managedObjectContext entityDescription:entityDescription predicate:nil sortDescriptors:nil range:NSMakeRange(NSNotFound, NSNotFound)];
2525
}
2626

2727
- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext fetchRequest:(NSFetchRequest *)fetchRequest {
@@ -31,10 +31,10 @@ - (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedOb
3131
NSPredicate *predicate = [fetchRequest predicate];
3232
NSArray *sortDescriptors = [fetchRequest sortDescriptors];
3333

34-
return [self initWithManagedObjectContext:managedObjectContext entityDescription:entityDescription predicate:predicate sortDescriptors:sortDescriptors];
34+
return [self initWithManagedObjectContext:managedObjectContext entityDescription:entityDescription predicate:predicate sortDescriptors:sortDescriptors range:NSMakeRange(NSNotFound, NSNotFound)];
3535
}
3636

37-
- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext entityDescription:(NSEntityDescription *)entityDescription predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors {
37+
- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext entityDescription:(NSEntityDescription *)entityDescription predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors range:(NSRange)range {
3838
NSParameterAssert(managedObjectContext != nil);
3939
NSParameterAssert(entityDescription != nil);
4040

@@ -43,6 +43,7 @@ - (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedOb
4343
_entityDescription = entityDescription;
4444
_predicate = [predicate copy];
4545
_sortDescriptors = sortDescriptors? [sortDescriptors copy] : @[];
46+
_range = range;
4647
}
4748

4849
return self;
@@ -76,14 +77,15 @@ - (BOOL)isEqualToQuerySet:(QKQuerySet *)queryset {
7677
[self.managedObjectContext isEqual:[queryset managedObjectContext]] &&
7778
[self.entityDescription isEqual:[queryset entityDescription]] &&
7879
[self.predicate isEqual:[queryset predicate]] &&
79-
[self.sortDescriptors isEqual:[queryset sortDescriptors]]
80+
[self.sortDescriptors isEqual:[queryset sortDescriptors]] &&
81+
NSEqualRanges(self.range, queryset.range)
8082
);
8183
}
8284

8385
#pragma mark - NSCopying
8486

8587
- (instancetype)copyWithZone:(NSZone *)zone {
86-
return [[[self class] allocWithZone:zone] initWithManagedObjectContext:self.managedObjectContext entityDescription:self.entityDescription predicate:self.predicate sortDescriptors:self.sortDescriptors];
88+
return [[[self class] allocWithZone:zone] initWithManagedObjectContext:self.managedObjectContext entityDescription:self.entityDescription predicate:self.predicate sortDescriptors:self.sortDescriptors range:self.range];
8789
}
8890

8991
#pragma mark - NSFastEnumeration
@@ -103,6 +105,12 @@ - (NSFetchRequest *)fetchRequest {
103105
[fetchRequest setEntity:_entityDescription];
104106
[fetchRequest setPredicate:self.predicate];
105107
[fetchRequest setSortDescriptors:self.sortDescriptors];
108+
109+
if (self.range.location != NSNotFound) {
110+
fetchRequest.fetchOffset = self.range.location;
111+
fetchRequest.fetchLimit = self.range.length;
112+
}
113+
106114
return fetchRequest;
107115
}
108116

@@ -195,7 +203,7 @@ - (NSUInteger)deleteObjects:(NSError **)error {
195203
@implementation QKQuerySet (Sorting)
196204

197205
- (instancetype)orderBy:(NSArray *)sortDescriptors {
198-
return [[QKQuerySet alloc] initWithManagedObjectContext:_managedObjectContext entityDescription:_entityDescription predicate:_predicate sortDescriptors:sortDescriptors];
206+
return [[QKQuerySet alloc] initWithManagedObjectContext:_managedObjectContext entityDescription:_entityDescription predicate:_predicate sortDescriptors:sortDescriptors range:self.range];
199207
}
200208

201209
- (instancetype)reverse {
@@ -205,7 +213,7 @@ - (instancetype)reverse {
205213
[sortDescriptors addObject:[sortDescriptor reversedSortDescriptor]];
206214
}
207215

208-
return [[QKQuerySet alloc] initWithManagedObjectContext:_managedObjectContext entityDescription:_entityDescription predicate:_predicate sortDescriptors:sortDescriptors];
216+
return [[QKQuerySet alloc] initWithManagedObjectContext:_managedObjectContext entityDescription:_entityDescription predicate:_predicate sortDescriptors:sortDescriptors range:self.range];
209217
}
210218

211219
@end
@@ -219,15 +227,15 @@ - (instancetype)exclude:(NSPredicate *)predicate {
219227
predicate = [[NSCompoundPredicate alloc] initWithType:NSAndPredicateType subpredicates:@[_predicate, predicate]];
220228
}
221229

222-
return [[QKQuerySet alloc] initWithManagedObjectContext:_managedObjectContext entityDescription:_entityDescription predicate:predicate sortDescriptors:_sortDescriptors];
230+
return [[QKQuerySet alloc] initWithManagedObjectContext:_managedObjectContext entityDescription:_entityDescription predicate:predicate sortDescriptors:_sortDescriptors range:self.range];
223231
}
224232

225233
- (instancetype)filter:(NSPredicate *)predicate {
226234
if (_predicate) {
227235
predicate = [[NSCompoundPredicate alloc] initWithType:NSAndPredicateType subpredicates:@[_predicate, predicate]];
228236
}
229237

230-
return [[QKQuerySet alloc] initWithManagedObjectContext:_managedObjectContext entityDescription:_entityDescription predicate:predicate sortDescriptors:_sortDescriptors];
238+
return [[QKQuerySet alloc] initWithManagedObjectContext:_managedObjectContext entityDescription:_entityDescription predicate:predicate sortDescriptors:_sortDescriptors range:self.range];
231239
}
232240

233241
@end

QueryKit/ObjectiveC/QKQuerySet.swift

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,26 @@ import Foundation
33
extension QuerySet {
44
public func asQKQuerySet() -> QKQuerySet {
55
let entityDescription = NSEntityDescription.entityForName(entityName, inManagedObjectContext: context)
6-
entityDescription
7-
return QKQuerySet(managedObjectContext: context, entityDescription: entityDescription, predicate: predicate, sortDescriptors: sortDescriptors)
6+
7+
var nsrange:NSRange = NSMakeRange(NSNotFound, NSNotFound)
8+
if let range = self.range {
9+
nsrange = NSMakeRange(range.startIndex, range.endIndex - range.startIndex)
10+
}
11+
12+
return QKQuerySet(managedObjectContext: context, entityDescription: entityDescription, predicate: predicate, sortDescriptors: sortDescriptors, range:nsrange)
813
}
914
}
1015

1116
extension QKQuerySet {
1217
public func asQuerySet() -> QuerySet<NSManagedObject> {
1318
let queryset = QuerySet<NSManagedObject>(managedObjectContext, entityDescription.name)
14-
return queryset.orderBy(sortDescriptors as [NSSortDescriptor]).filter(predicate)
19+
.orderBy(sortDescriptors as [NSSortDescriptor])
20+
.filter(predicate)
21+
22+
if range.location != NSNotFound {
23+
return queryset[range.location..<(range.location + range.length)]
24+
}
25+
26+
return queryset
1527
}
1628
}

QueryKitTests/ObjectiveC/QKQuerySetTests.m

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ - (void)setUp {
3030
[NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO]
3131
];
3232

33-
self.queryset = [[QKQuerySet alloc] initWithManagedObjectContext:self.managedObjectContext entityDescription:self.entityDescription predicate:predicate sortDescriptors:sortDescriptors];
33+
self.queryset = [[QKQuerySet alloc] initWithManagedObjectContext:self.managedObjectContext entityDescription:self.entityDescription predicate:predicate sortDescriptors:sortDescriptors range:NSMakeRange(1, 3)];
3434
}
3535

3636
- (void)testInitializationWithContextAndEntityDescription {
@@ -79,7 +79,7 @@ - (void)testIsEqual {
7979
[NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO]
8080
];
8181

82-
QKQuerySet *queryset = [[QKQuerySet alloc] initWithManagedObjectContext:self.managedObjectContext entityDescription:self.entityDescription predicate:predicate sortDescriptors:sortDescriptors];
82+
QKQuerySet *queryset = [[QKQuerySet alloc] initWithManagedObjectContext:self.managedObjectContext entityDescription:self.entityDescription predicate:predicate sortDescriptors:sortDescriptors range:NSMakeRange(1, 3)];
8383

8484
XCTAssertEqualObjects(self.queryset, queryset);
8585
XCTAssertEqual([self.queryset hash], [queryset hash]);
@@ -134,6 +134,8 @@ - (void)testFetchRequest {
134134
XCTAssertEqualObjects(fetchRequest.entityName, self.entityDescription.name);
135135
XCTAssertEqualObjects(fetchRequest.predicate, predicate);
136136
XCTAssertEqualObjects(fetchRequest.sortDescriptors, sortDescriptors);
137+
XCTAssertEqual(fetchRequest.fetchOffset, 1);
138+
XCTAssertEqual(fetchRequest.fetchLimit, 3);
137139
}
138140

139141
@end

QueryKitTests/ObjectiveC/QKQuerySetTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ class QKQuerySetConversionTests: XCTestCase {
2222
let predicate = NSPredicate(format: "name == 'Kyle'")
2323
let sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
2424

25-
qkQueryset = QKQuerySet(managedObjectContext: context, entityDescription: entityDescription, predicate: predicate, sortDescriptors: sortDescriptors)
25+
qkQueryset = QKQuerySet(managedObjectContext: context, entityDescription: entityDescription, predicate: predicate, sortDescriptors: sortDescriptors, range:NSMakeRange(1, 4))
2626
queryset = QuerySet<NSManagedObject>(context, "Person")
27-
queryset = queryset.filter(predicate).orderBy(sortDescriptors)
27+
queryset = queryset.filter(predicate).orderBy(sortDescriptors)[1..<5]
2828
}
2929

3030
func testConvertingQuerySetToQKQuerySet() {

0 commit comments

Comments
 (0)