]> err.no Git - sope/blob - sope-core/EOControl/EOQualifier.m
Drop apache 1 build-dependency
[sope] / sope-core / EOControl / EOQualifier.m
1 /*
2   Copyright (C) 2000-2005 SKYRIX Software AG
3
4   This file is part of SOPE.
5
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
9   later version.
10
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.
15
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
19   02111-1307, USA.
20 */
21
22 #include <stdio.h>
23 #include "EOQualifier.h"
24 #include "EOKeyValueCoding.h"
25 #include "common.h"
26 #include "EONull.h"
27 #import <Foundation/NSException.h>
28
29 @interface NSObject(QualifierDescription)
30 - (NSString *)qualifierDescription;
31 @end
32
33 @implementation EOQualifier
34
35 static NSMapTable *operatorToSelector = NULL;
36 static NSMapTable *selectorToOperator = NULL;
37 static EONull     *null = nil;
38
39 + (void)initialize {
40   if (null == nil) null = [EONull null];
41   
42   if (operatorToSelector == NULL) {
43     operatorToSelector = NSCreateMapTable(NSObjectMapKeyCallBacks,
44                                           NSIntMapValueCallBacks,
45                                           10);
46     NSMapInsert(operatorToSelector, @"=",   EOQualifierOperatorEqual);
47     NSMapInsert(operatorToSelector, @"==",  EOQualifierOperatorEqual);
48     NSMapInsert(operatorToSelector, @"!=",  EOQualifierOperatorNotEqual);
49     NSMapInsert(operatorToSelector, @"<>",  EOQualifierOperatorNotEqual);        
50     NSMapInsert(operatorToSelector, @"<",   EOQualifierOperatorLessThan);
51     NSMapInsert(operatorToSelector, @">",   EOQualifierOperatorGreaterThan);
52     NSMapInsert(operatorToSelector, @"<=",  EOQualifierOperatorLessThanOrEqualTo);
53     NSMapInsert(operatorToSelector, @"like",EOQualifierOperatorLike);
54     NSMapInsert(operatorToSelector, @"LIKE",EOQualifierOperatorLike);
55     NSMapInsert(operatorToSelector, @">=",
56                 EOQualifierOperatorGreaterThanOrEqualTo);
57     NSMapInsert(operatorToSelector, @"caseInsensitiveLike",
58                 EOQualifierOperatorCaseInsensitiveLike);
59   }
60   if (selectorToOperator == NULL) {
61     selectorToOperator = NSCreateMapTable(NSObjectMapKeyCallBacks,
62                                           NSObjectMapValueCallBacks,
63                                           10);
64     NSMapInsert(selectorToOperator,
65                 NSStringFromSelector(EOQualifierOperatorEqual),
66                 @"=");
67     NSMapInsert(selectorToOperator,
68                 NSStringFromSelector(EOQualifierOperatorNotEqual),
69                 @"<>");
70     NSMapInsert(selectorToOperator,
71                 NSStringFromSelector(EOQualifierOperatorLessThan),
72                 @"<");
73     NSMapInsert(selectorToOperator,
74                 NSStringFromSelector(EOQualifierOperatorGreaterThan),
75                 @">");
76     NSMapInsert(selectorToOperator,
77                 NSStringFromSelector(EOQualifierOperatorLessThanOrEqualTo),
78                 @"<=");
79     NSMapInsert(selectorToOperator,
80                 NSStringFromSelector(EOQualifierOperatorLike),
81                 @"like");
82     NSMapInsert(selectorToOperator,
83                 NSStringFromSelector(EOQualifierOperatorGreaterThanOrEqualTo),
84                 @">=");
85     NSMapInsert(selectorToOperator,
86                 NSStringFromSelector(EOQualifierOperatorCaseInsensitiveLike),
87                 @"caseInsensitiveLike");
88   }
89 }
90
91 + (EOQualifier *)qualifierToMatchAnyValue:(NSDictionary *)_values {
92   /* OR qualifier */
93   NSEnumerator *keys;
94   NSString     *key;
95   NSArray      *array;
96   unsigned i;
97   id qualifiers[[_values count] + 1];
98   
99   keys = [_values keyEnumerator];
100   for (i = 0; (key = [keys nextObject]); i++) {
101     id value;
102     
103     value = [_values objectForKey:key];
104     qualifiers[i] =
105       [[EOKeyValueQualifier alloc]
106                             initWithKey:key
107                             operatorSelector:EOQualifierOperatorEqual
108                             value:value];
109     qualifiers[i] = [qualifiers[i] autorelease];
110   }
111   array = [NSArray arrayWithObjects:qualifiers count:i];
112   return [[[EOOrQualifier alloc] initWithQualifierArray:array] autorelease];
113 }
114
115 + (EOQualifier *)qualifierToMatchAllValues:(NSDictionary *)_values {
116   /* AND qualifier */
117   NSEnumerator *keys;
118   NSString     *key;
119   NSArray      *array;
120   unsigned i;
121   id qualifiers[[_values count] + 1];
122   
123   keys = [_values keyEnumerator];
124   for (i = 0; (key = [keys nextObject]); i++) {
125     id value;
126     
127     value = [_values objectForKey:key];
128     qualifiers[i] =
129       [[EOKeyValueQualifier alloc]
130                             initWithKey:key
131                             operatorSelector:EOQualifierOperatorEqual
132                             value:value];
133     qualifiers[i] = [qualifiers[i] autorelease];
134   }
135   array = [NSArray arrayWithObjects:qualifiers count:i];
136   return [[[EOAndQualifier alloc] initWithQualifierArray:array] autorelease];
137 }
138
139 + (SEL)operatorSelectorForString:(NSString *)_str {
140   SEL s;
141
142   if ((s = NSMapGet(operatorToSelector, _str)))
143     return s;
144   else
145     return NSSelectorFromString(_str);
146 }
147
148 + (NSString *)stringForOperatorSelector:(SEL)_sel {
149   NSString *s, *ss;
150   
151   if ((s = NSStringFromSelector(_sel)) == nil)
152     return nil;
153   
154   if ((ss = NSMapGet(selectorToOperator, s)))
155     return ss;
156   
157   return s;
158 }
159
160 /* bindings */
161
162 - (EOQualifier *)qualifierWithBindings:(NSDictionary *)_bindings
163   requiresAllVariables:(BOOL)_reqAll
164 {
165   return self;
166 }
167
168 - (NSArray *)bindingKeys {
169   return nil;
170 }
171
172 - (BOOL)requiresAllQualifierBindingVariables {
173   return YES;
174 }
175
176 /* keys */
177
178 - (NSSet *)allQualifierKeys {
179   /* new in WO 4.5 */
180   id set;
181
182   set = [NSMutableSet setWithCapacity:64];
183   [self addQualifierKeysToSet:set];
184   return [[set copy] autorelease];
185 }
186
187 - (void)addQualifierKeysToSet:(NSMutableSet *)_keys {
188   /* new in WO 4.5 */
189 }
190
191 /* Comparing */
192
193 - (BOOL)isEqual:(id)_obj {
194   if ([_obj isKindOfClass:[self class]])
195     return [self isEqualToQualifier:(EOQualifier *)_obj];
196   
197   return NO;
198 }
199
200 - (BOOL)isEqualToQualifier:(EOQualifier *)_qual {
201   [self doesNotRecognizeSelector:_cmd];
202   return NO;
203 }
204
205 /* remapping keys */
206
207 - (EOQualifier *)qualifierByApplyingTransformer:(id)_t inContext:(id)_ctx {
208   if ([_t respondsToSelector:@selector(transformQualifier:inContext:)])
209     return [_t transformQualifier:self inContext:_ctx];
210   else
211     return [[self retain] autorelease];
212 }
213 - (EOQualifier *)qualifierByApplyingKeyMap:(NSDictionary *)_key {
214   return [[self copy] autorelease];
215 }
216
217 /* GDL2 compatibility */
218
219 - (EOQualifier *)qualifierByApplyingBindings:(NSDictionary *)_bindings {
220   return [self qualifierWithBindings:_bindings 
221                requiresAllVariables:
222                  [self requiresAllQualifierBindingVariables]];
223 }
224
225 /* BDControl additions */
226
227 - (unsigned int)count {
228   return [[self subqualifiers] count];
229 }
230 - (NSArray *)subqualifiers {
231   return nil;
232 }
233
234 /* debugging */
235
236 + (BOOL)isEvaluationDebuggingEnabled {
237   static int evalDebug = -1;
238   if (evalDebug == -1) {
239     evalDebug = [[NSUserDefaults standardUserDefaults] 
240                   boolForKey:@"EOQualifierDebugEvaluation"] ? 1 : 0;
241     if (evalDebug)
242       NSLog(@"WARNING: qualifier evaluation debugging is enabled !");
243   }
244   return evalDebug ? YES : NO;
245 }
246
247 /* QuickEval */
248
249 - (BOOL)evaluateWithObject:(id)_object inEvalContext:(id)_ctx {
250   return [(id<EOQualifierEvaluation>)self evaluateWithObject:_object];
251 }
252
253 /* key/value archiving */
254
255 - (id)initWithKeyValueUnarchiver:(EOKeyValueUnarchiver *)_unarchiver {
256   return [super init];
257 }
258 - (void)encodeWithKeyValueArchiver:(EOKeyValueArchiver *)_archiver {
259 }
260
261 /* NSCopying */
262
263 - (id)copyWithZone:(NSZone *)_zone {
264   /* EOQualifiers are supposed to be immutable */
265   return [self retain];
266 }
267
268 @end /* EOQualifier */