2 Copyright (C) 2000-2004 SKYRIX Software AG
4 This file is part of OpenGroupware.org.
6 OGo 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 OGo 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 OGo; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 #include "EOFetchSpecification.h"
24 #include "EOQualifier.h"
25 #include "EOSortOrdering.h"
28 @implementation EOFetchSpecification
30 + (EOFetchSpecification *)fetchSpecificationWithEntityName:(NSString *)_ename
31 qualifier:(EOQualifier *)_qualifier
32 sortOrderings:(NSArray *)_sortOrderings
34 EOFetchSpecification *fs = nil;
36 fs = [[self alloc] initWithEntityName:_ename
38 sortOrderings:_sortOrderings
39 usesDistinct:NO isDeep:NO
41 return [fs autorelease];
44 - (id)initWithEntityName:(NSString *)_name
45 qualifier:(EOQualifier *)_qualifier
46 sortOrderings:(NSArray *)_sortOrderings
47 usesDistinct:(BOOL)_dflag isDeep:(BOOL)_isDeep
48 hints:(NSDictionary *)_hints
50 if ((self = [super init])) {
51 self->entityName = [_name copyWithZone:[self zone]];
52 self->qualifier = [_qualifier retain];
53 self->sortOrderings = [_sortOrderings retain];
55 self->hints = [_hints retain];
57 self->fsFlags.usesDistinct = _dflag ? 1 : 0;
58 self->fsFlags.deep = _isDeep ? 1 : 0;
62 - (id)initWithEntityName:(NSString *)_name
63 qualifier:(EOQualifier *)_qualifier
64 sortOrderings:(NSArray *)_sortOrderings
65 usesDistinct:(BOOL)_dflag
68 // Note: this does not work with GDL2! (and probably not with EOF 4)
69 return [self initWithEntityName:_name qualifier:_qualifier
70 sortOrderings:_sortOrderings usesDistinct:_dflag
75 if ((self = [super init])) {
81 [self->hints release];
82 [self->entityName release];
83 [self->qualifier release];
84 [self->sortOrderings release];
90 - (void)setEntityName:(NSString *)_name {
91 if (_name != self->entityName) {
92 #if !LIB_FOUNDATION_BOEHM_GC
93 id tmp = self->entityName;
95 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];
338 - (NSString *)description {
342 ms = [NSMutableString stringWithCapacity:128];
343 [ms appendFormat:@"<%@[0x%08X]:", NSStringFromClass([self class]), self];
345 if ((tmp = [self entityName]))
346 [ms appendFormat:@" entity=%@", tmp];
347 if ((tmp = [self qualifier]))
348 [ms appendFormat:@" qualifier=%@", tmp];
350 if ((tmp = [self sortOrderings]))
351 [ms appendFormat:@" orderings=%@", tmp];
353 if ([self locksObjects]) [ms appendString:@" locks"];
354 if ([self usesDistinct]) [ms appendString:@" distinct"];
356 if ([self fetchLimit] > 0)
357 [ms appendFormat:@" limit=%i", [self fetchLimit]];
359 if ((tmp = [self hints])) {
364 [ms appendString:@" hints:"];
365 e = [tmp keyEnumerator];
366 while ((hint = [e nextObject])) {
367 if (isFirst) isFirst = NO;
368 else [ms appendString:@","];
369 [ms appendString:hint];
370 [ms appendString:@"="];
371 [ms appendString:[[(NSDictionary *)tmp objectForKey:hint] stringValue]];
375 [ms appendString:@">"];
379 @end /* EOFetchSpecification */