2 Copyright (C) 2000-2005 SKYRIX Software AG
4 This file is part of SOPE.
6 SOPE is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with SOPE; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 #include "EOFetchSpecification.h"
23 #include "EOQualifier.h"
24 #include "EOSortOrdering.h"
27 @implementation EOFetchSpecification
29 + (EOFetchSpecification *)fetchSpecificationWithEntityName:(NSString *)_ename
30 qualifier:(EOQualifier *)_qualifier
31 sortOrderings:(NSArray *)_sortOrderings
33 EOFetchSpecification *fs = nil;
35 fs = [[self alloc] initWithEntityName:_ename
37 sortOrderings:_sortOrderings
38 usesDistinct:NO isDeep:NO
40 return [fs autorelease];
43 - (id)initWithEntityName:(NSString *)_name
44 qualifier:(EOQualifier *)_qualifier
45 sortOrderings:(NSArray *)_sortOrderings
46 usesDistinct:(BOOL)_dflag isDeep:(BOOL)_isDeep
47 hints:(NSDictionary *)_hints
49 if ((self = [super init])) {
50 self->entityName = [_name copyWithZone:[self zone]];
51 self->qualifier = [_qualifier retain];
52 self->sortOrderings = [_sortOrderings retain];
54 self->hints = [_hints retain];
56 self->fsFlags.usesDistinct = _dflag ? 1 : 0;
57 self->fsFlags.deep = _isDeep ? 1 : 0;
61 - (id)initWithEntityName:(NSString *)_name
62 qualifier:(EOQualifier *)_qualifier
63 sortOrderings:(NSArray *)_sortOrderings
64 usesDistinct:(BOOL)_dflag
67 // Note: this does not work with GDL2! (and probably not with EOF 4)
68 return [self initWithEntityName:_name qualifier:_qualifier
69 sortOrderings:_sortOrderings usesDistinct:_dflag
74 if ((self = [super init])) {
80 [self->hints release];
81 [self->entityName release];
82 [self->qualifier release];
83 [self->sortOrderings release];
89 - (void)setEntityName:(NSString *)_name {
92 if (_name == self->entityName)
95 tmp = self->entityName;
96 self->entityName = [_name copyWithZone:[self zone]];
99 - (NSString *)entityName {
100 return self->entityName;
103 - (void)setQualifier:(EOQualifier *)_qualifier {
104 ASSIGN(self->qualifier, _qualifier);
106 - (EOQualifier *)qualifier {
107 return self->qualifier;
110 - (void)setSortOrderings:(NSArray *)_orderings {
111 ASSIGN(self->sortOrderings, _orderings);
113 - (NSArray *)sortOrderings {
114 return self->sortOrderings;
117 - (void)setUsesDistinct:(BOOL)_flag {
118 self->fsFlags.usesDistinct = _flag ? 1 : 0;
120 - (BOOL)usesDistinct {
121 return self->fsFlags.usesDistinct ? YES : NO;
124 - (void)setLocksObjects:(BOOL)_flag {
125 self->fsFlags.locksObjects = _flag ? 1 : 0;
127 - (BOOL)locksObjects {
128 return self->fsFlags.locksObjects ? YES : NO;
131 - (void)setIsDeep:(BOOL)_flag {
132 self->fsFlags.deep = _flag ? 1 : 0;
135 return self->fsFlags.deep ? YES : NO;
138 - (void)setFetchLimit:(unsigned)_limit {
139 self->fetchLimit = _limit;
141 - (unsigned)fetchLimit {
142 return self->fetchLimit;
145 - (void)setHints:(NSDictionary *)_hints {
146 ASSIGN(self->hints, _hints);
148 - (NSDictionary *)hints {
154 - (EOFetchSpecification *)
155 fetchSpecificationWithQualifierBindings:(NSDictionary *)_bindings
157 EOQualifier *q = nil;
158 EOFetchSpecification *newfs = nil;
160 q = [[self qualifier] qualifierWithBindings:_bindings
161 requiresAllVariables:NO];
162 newfs = [[[self class] alloc]
163 initWithEntityName:[self entityName]
165 sortOrderings:[self sortOrderings]
166 usesDistinct:[self usesDistinct]];
168 [newfs setLocksObjects:[self locksObjects]];
169 [newfs setFetchLimit:[self fetchLimit]];
171 return [newfs autorelease];
174 /* GDL2 compatibility */
176 - (EOFetchSpecification *)
177 fetchSpecificationByApplyingBindings:(NSDictionary *)_bindings
179 return [self fetchSpecificationWithQualifierBindings:_bindings];
184 - (id)copyWithZone:(NSZone *)_zone {
185 EOFetchSpecification *fspec;
188 hdict = [[self hints] copy];
190 fspec = [[[self class] alloc] initWithEntityName:[self entityName]
191 qualifier:[self qualifier]
192 sortOrderings:[self sortOrderings]
193 usesDistinct:[self usesDistinct]
194 isDeep:[self isDeep] hints:hdict];
195 [fspec setLocksObjects:[self locksObjects]];
196 [fspec setFetchLimit:[self fetchLimit]];
204 - (BOOL)isEqualToFetchSpecification:(EOFetchSpecification *)_fspec {
209 t1 = [self entityName];
210 t2 = [_fspec entityName];
212 if (![t1 isEqualToString:t2])
216 t1 = [self sortOrderings];
217 t2 = [_fspec sortOrderings];
219 if (![t1 isEqual:t2])
223 t1 = [self qualifier];
224 t2 = [_fspec qualifier];
226 if (![t1 isEqual:t2])
230 if ([self usesDistinct] != [_fspec usesDistinct])
232 if ([self locksObjects] != [_fspec locksObjects])
234 if ([self fetchLimit] != [_fspec fetchLimit])
240 if (![t1 isEqual:t2])
246 - (BOOL)isEqual:(id)_other {
247 if ([_other isKindOfClass:[EOFetchSpecification class]])
248 return [self isEqualToFetchSpecification:_other];
255 - (EOFetchSpecification *)fetchSpecificationByApplyingKeyMap:(NSDictionary *)_m {
256 NSAutoreleasePool *pool;
257 EOFetchSpecification *fs;
258 NSMutableDictionary *lHints;
259 EOQualifier *q = nil;
260 NSMutableArray *o = nil;
262 pool = [[NSAutoreleasePool alloc] init];
264 /* process qualifier */
266 q = [self->qualifier qualifierByApplyingKeyMap:_m];
268 /* process attributes */
274 a = [self->hints objectForKey:@"attributes"];
275 if ((len = [a count]) > 0) {
279 ma = [[NSMutableArray alloc] initWithCapacity:(len + 1)];
280 for (i = 0; i < len; i++) {
281 NSString *key, *tkey;
283 key = [a objectAtIndex:i];
284 tkey = [_m objectForKey:key];
286 [ma addObject:(tkey ? tkey : key)];
289 lHints = [self->hints mutableCopy];
290 [lHints setObject:ma forKey:@"attributes"];
294 lHints = [self->hints retain];
299 /* process orderings */
301 if (self->sortOrderings) {
304 len = [self->sortOrderings count];
305 o = [[NSMutableArray alloc] initWithCapacity:len];
306 for (i = 0; i < len; i++) {
307 EOSortOrdering *so, *tso;
309 so = [self->sortOrderings objectAtIndex:i];
310 tso = [so sortOrderingByApplyingKeyMap:_m];
311 [o addObject:tso ? tso : so];
317 /* construct result */
319 fs = [[EOFetchSpecification alloc] initWithEntityName:self->entityName
322 usesDistinct:[self usesDistinct]
325 [fs setLocksObjects:[self locksObjects]];
326 [fs setFetchLimit:self->fetchLimit];
328 [fs setHints:lHints];
333 return [fs autorelease];
336 /* key/value archiving */
338 - (id)initWithKeyValueUnarchiver:(EOKeyValueUnarchiver *)_unarchiver {
339 if ((self = [super init]) != nil) {
340 self->entityName = [[_unarchiver decodeObjectForKey:@"entityName"] copy];
341 self->qualifier = [[_unarchiver decodeObjectForKey:@"qualifier"] retain];
342 self->hints = [[_unarchiver decodeObjectForKey:@"hints"] copy];
343 self->sortOrderings =
344 [[_unarchiver decodeObjectForKey:@"sortOrderings"] retain];
346 self->fetchLimit = [_unarchiver decodeIntForKey:@"fetchLimit"];
348 self->fsFlags.usesDistinct =
349 [_unarchiver decodeBoolForKey:@"usesDistinct"] ? 1 : 0;
350 self->fsFlags.locksObjects =
351 [_unarchiver decodeBoolForKey:@"locksObjects"] ? 1 : 0;
353 [_unarchiver decodeBoolForKey:@"deep"] ? 1 : 0;
357 - (void)encodeWithKeyValueArchiver:(EOKeyValueArchiver *)_archiver {
358 [_archiver encodeObject:[self entityName] forKey:@"entityName"];
359 [_archiver encodeObject:[self qualifier] forKey:@"qualifier"];
360 [_archiver encodeObject:[self hints] forKey:@"hints"];
361 [_archiver encodeObject:[self sortOrderings] forKey:@"sortOrderings"];
363 [_archiver encodeInt:[self fetchLimit] forKey:@"fetchLimit"];
365 [_archiver encodeBool:self->fsFlags.usesDistinct forKey:@"usesDistinct"];
366 [_archiver encodeBool:self->fsFlags.locksObjects forKey:@"locksObjects"];
367 [_archiver encodeBool:self->fsFlags.deep forKey:@"deep"];
372 - (NSString *)description {
376 ms = [NSMutableString stringWithCapacity:128];
377 [ms appendFormat:@"<%@[0x%08X]:", NSStringFromClass([self class]), self];
379 if ((tmp = [self entityName]))
380 [ms appendFormat:@" entity=%@", tmp];
381 if ((tmp = [self qualifier]))
382 [ms appendFormat:@" qualifier=%@", tmp];
384 if ((tmp = [self sortOrderings]))
385 [ms appendFormat:@" orderings=%@", tmp];
387 if ([self locksObjects]) [ms appendString:@" locks"];
388 if ([self usesDistinct]) [ms appendString:@" distinct"];
390 if ([self fetchLimit] > 0)
391 [ms appendFormat:@" limit=%i", [self fetchLimit]];
393 if ((tmp = [self hints])) {
398 [ms appendString:@" hints:"];
399 e = [tmp keyEnumerator];
400 while ((hint = [e nextObject])) {
401 if (isFirst) isFirst = NO;
402 else [ms appendString:@","];
403 [ms appendString:hint];
404 [ms appendString:@"="];
405 [ms appendString:[[(NSDictionary *)tmp objectForKey:hint] stringValue]];
409 [ms appendString:@">"];
413 @end /* EOFetchSpecification */