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;
247
@end /* EOQualifier */
249
@implementation EOQualifier(QuickEval)
251
- (BOOL)evaluateWithObject:(id)_object inEvalContext:(id)_ctx {
252
return [(id<EOQualifierEvaluation>)self evaluateWithObject:_object];
255
@end /* EOQualifier(QuickEval) */