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
23 #include "EOQualifier.h"
24 #include "EOKeyValueCoding.h"
27 #import <Foundation/NSException.h>
29 @interface NSObject(QualifierDescription)
30 - (NSString *)qualifierDescription;
33 @implementation EOQualifier
35 static NSMapTable *operatorToSelector = NULL;
36 static NSMapTable *selectorToOperator = NULL;
37 static EONull *null = nil;
40 if (null == nil) null = [EONull null];
42 if (operatorToSelector == NULL) {
43 operatorToSelector = NSCreateMapTable(NSObjectMapKeyCallBacks,
44 NSIntMapValueCallBacks,
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);
60 if (selectorToOperator == NULL) {
61 selectorToOperator = NSCreateMapTable(NSObjectMapKeyCallBacks,
62 NSObjectMapValueCallBacks,
64 NSMapInsert(selectorToOperator,
65 NSStringFromSelector(EOQualifierOperatorEqual),
67 NSMapInsert(selectorToOperator,
68 NSStringFromSelector(EOQualifierOperatorNotEqual),
70 NSMapInsert(selectorToOperator,
71 NSStringFromSelector(EOQualifierOperatorLessThan),
73 NSMapInsert(selectorToOperator,
74 NSStringFromSelector(EOQualifierOperatorGreaterThan),
76 NSMapInsert(selectorToOperator,
77 NSStringFromSelector(EOQualifierOperatorLessThanOrEqualTo),
79 NSMapInsert(selectorToOperator,
80 NSStringFromSelector(EOQualifierOperatorLike),
82 NSMapInsert(selectorToOperator,
83 NSStringFromSelector(EOQualifierOperatorGreaterThanOrEqualTo),
85 NSMapInsert(selectorToOperator,
86 NSStringFromSelector(EOQualifierOperatorCaseInsensitiveLike),
87 @"caseInsensitiveLike");
91 + (EOQualifier *)qualifierToMatchAnyValue:(NSDictionary *)_values {
97 id qualifiers[[_values count] + 1];
99 keys = [_values keyEnumerator];
100 for (i = 0; (key = [keys nextObject]); i++) {
103 value = [_values objectForKey:key];
105 [[EOKeyValueQualifier alloc]
107 operatorSelector:EOQualifierOperatorEqual
109 qualifiers[i] = [qualifiers[i] autorelease];
111 array = [NSArray arrayWithObjects:qualifiers count:i];
112 return [[[EOOrQualifier alloc] initWithQualifierArray:array] autorelease];
115 + (EOQualifier *)qualifierToMatchAllValues:(NSDictionary *)_values {
121 id qualifiers[[_values count] + 1];
123 keys = [_values keyEnumerator];
124 for (i = 0; (key = [keys nextObject]); i++) {
127 value = [_values objectForKey:key];
129 [[EOKeyValueQualifier alloc]
131 operatorSelector:EOQualifierOperatorEqual
133 qualifiers[i] = [qualifiers[i] autorelease];
135 array = [NSArray arrayWithObjects:qualifiers count:i];
136 return [[[EOAndQualifier alloc] initWithQualifierArray:array] autorelease];
139 + (SEL)operatorSelectorForString:(NSString *)_str {
142 if ((s = NSMapGet(operatorToSelector, _str)))
145 return NSSelectorFromString(_str);
148 + (NSString *)stringForOperatorSelector:(SEL)_sel {
151 if ((s = NSStringFromSelector(_sel)) == nil)
154 if ((ss = NSMapGet(selectorToOperator, s)))
162 - (EOQualifier *)qualifierWithBindings:(NSDictionary *)_bindings
163 requiresAllVariables:(BOOL)_reqAll
168 - (NSArray *)bindingKeys {
172 - (BOOL)requiresAllQualifierBindingVariables {
178 - (NSSet *)allQualifierKeys {
182 set = [NSMutableSet setWithCapacity:64];
183 [self addQualifierKeysToSet:set];
184 return [[set copy] autorelease];
187 - (void)addQualifierKeysToSet:(NSMutableSet *)_keys {
193 - (BOOL)isEqual:(id)_obj {
194 if ([_obj isKindOfClass:[self class]])
195 return [self isEqualToQualifier:(EOQualifier *)_obj];
200 - (BOOL)isEqualToQualifier:(EOQualifier *)_qual {
201 [self doesNotRecognizeSelector:_cmd];
207 - (EOQualifier *)qualifierByApplyingTransformer:(id)_t inContext:(id)_ctx {
208 if ([_t respondsToSelector:@selector(transformQualifier:inContext:)])
209 return [_t transformQualifier:self inContext:_ctx];
211 return [[self retain] autorelease];
213 - (EOQualifier *)qualifierByApplyingKeyMap:(NSDictionary *)_key {
214 return [[self copy] autorelease];
217 /* GDL2 compatibility */
219 - (EOQualifier *)qualifierByApplyingBindings:(NSDictionary *)_bindings {
220 return [self qualifierWithBindings:_bindings
221 requiresAllVariables:
222 [self requiresAllQualifierBindingVariables]];
225 /* BDControl additions */
227 - (unsigned int)count {
228 return [[self subqualifiers] count];
230 - (NSArray *)subqualifiers {
236 + (BOOL)isEvaluationDebuggingEnabled {
237 static int evalDebug = -1;
238 if (evalDebug == -1) {
239 evalDebug = [[NSUserDefaults standardUserDefaults]
240 boolForKey:@"EOQualifierDebugEvaluation"] ? 1 : 0;
242 NSLog(@"WARNING: qualifier evaluation debugging is enabled !");
244 return evalDebug ? YES : NO;
249 - (BOOL)evaluateWithObject:(id)_object inEvalContext:(id)_ctx {
250 return [(id<EOQualifierEvaluation>)self evaluateWithObject:_object];
253 /* key/value archiving */
255 - (id)initWithKeyValueUnarchiver:(EOKeyValueUnarchiver *)_unarchiver {
258 - (void)encodeWithKeyValueArchiver:(EOKeyValueArchiver *)_archiver {
263 - (id)copyWithZone:(NSZone *)_zone {
264 /* EOQualifiers are supposed to be immutable */
265 return [self retain];
268 @end /* EOQualifier */