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 #ifndef __EOQualifier_h__ 23 #define __EOQualifier_h__ 24 25 #import <Foundation/NSObject.h> 26 #include <EOControl/EOKeyValueArchiver.h> 27 28 /* 29 EOQualifier 30 31 EOQualifier is the superclass of all the concrete qualifier classes which 32 are used to build up a qualification object hierarchy (aka a SQL where 33 statement). 34 35 Subclasses: 36 EOAndQualifier 37 EOOrQualifier 38 EONotQualifier 39 EOKeyValueQualifier 40 EOKeyComparisonQualifier 41 42 EOQualifierVariable 43 44 EOQualifierVariable defers the evaluation of some qualification value to 45 runtime. It's comparable to SQL late-binding variables (aka "a=$value"). 46 47 Also provided are some categories on NSObject and NSArray to filter an 48 in-memory object tree. 49 */ 50 51 @class NSDictionary, NSArray, NSSet, NSMutableSet; 52 53 @protocol EOQualifierEvaluation 54 - (BOOL)evaluateWithObject:(id)_object; 55 @end 56 57 @interface EOQualifier : NSObject < NSCopying, EOKeyValueArchiving > 58 59 + (EOQualifier *)qualifierToMatchAnyValue:(NSDictionary *)_values; 60 + (EOQualifier *)qualifierToMatchAllValues:(NSDictionary *)_values; 61 62 + (SEL)operatorSelectorForString:(NSString *)_str; 63 + (NSString *)stringForOperatorSelector:(SEL)_sel; 64 65 /* bindings */ 66 67 - (EOQualifier *)qualifierWithBindings:(NSDictionary *)_bindings 68 requiresAllVariables:(BOOL)_reqAll; 69 - (NSArray *)bindingKeys; 70 71 /* keys (new in WO 4.5) */ 72 73 - (NSSet *)allQualifierKeys; 74 - (void)addQualifierKeysToSet:(NSMutableSet *)_keys; 75 76 /* comparing */ 77 78 - (BOOL)isEqual:(id)_obj; 79 - (BOOL)isEqualToQualifier:(EOQualifier *)_qual; 80 81 /* remapping keys */ 82 83 - (EOQualifier *)qualifierByApplyingTransformer:(id)_t inContext:(id)_ctx; 84 - (EOQualifier *)qualifierByApplyingKeyMap:(NSDictionary *)_map; 85 86 /* BDControl additions */ 87 88 - (NSUInteger)count; 89 - (NSArray *)subqualifiers; 90 91 /* debugging */ 92 93 + (BOOL)isEvaluationDebuggingEnabled; 94 95 @end /* EOQualifier */ 96 97 @interface EOQualifier(Parsing) 98 99 + (EOQualifier *)qualifierWithQualifierFormat:(NSString *)_qualifierFormat, ...; 100 + (EOQualifier *)qualifierWithQualifierFormat:(NSString *)_qualifierFormat 101 arguments:(NSArray *)_arguments; 102 103 /* this is used in "cast (xxx as mytypename)" expressions */ 104 + (void)registerValueClass:(Class)_valueClass forTypeName:(NSString *)_type; 105 106 @end 107 108 @interface EOAndQualifier : EOQualifier < EOQualifierEvaluation, NSCoding > 109 { 110 NSArray *qualifiers; 111 unsigned count; 112 } 113 114 - (id)initWithQualifierArray:(NSArray *)_qualifiers; 115 - (id)initWithQualifiers:(EOQualifier *)_qual1, ...; 116 - (NSArray *)qualifiers; 117 118 @end /* EOAndQualifier */ 119 120 @interface EOOrQualifier : EOQualifier < EOQualifierEvaluation, NSCoding > 121 { 122 NSArray *qualifiers; 123 unsigned count; 124 } 125 126 - (id)initWithQualifierArray:(NSArray *)_qualifiers; /* designated init */ 127 - (id)initWithQualifiers:(EOQualifier *)_qual1, ...; 128 - (NSArray *)qualifiers; 129 130 @end /* EOOrQualifier */ 131 132 @interface EONotQualifier : EOQualifier < EOQualifierEvaluation, NSCoding > 133 { 134 EOQualifier *qualifier; 135 } 136 137 - (id)initWithQualifier:(EOQualifier *)_qualifier; /* designated init */ 138 - (EOQualifier *)qualifier; 139 140 @end /* EONotQualifier */ 141 142 extern SEL EOQualifierOperatorEqual; 143 extern SEL EOQualifierOperatorNotEqual; 144 extern SEL EOQualifierOperatorLessThan; 145 extern SEL EOQualifierOperatorGreaterThan; 146 extern SEL EOQualifierOperatorLessThanOrEqualTo; 147 extern SEL EOQualifierOperatorGreaterThanOrEqualTo; 148 extern SEL EOQualifierOperatorContains; 149 extern SEL EOQualifierOperatorLike; 150 extern SEL EOQualifierOperatorCaseInsensitiveLike; 151 152 @interface EOKeyValueQualifier : EOQualifier < EOQualifierEvaluation, NSCoding > 153 { 154 /* this is a '%A selector %@' qualifier */ 155 NSString *key; 156 id value; 157 SEL operator; 158 BOOL formatted; 159 } 160 161 - (id)initWithKey:(NSString *)_key 162 operatorSelector:(SEL)_selector 163 value:(id)_value; 164 165 - (NSString *)key; 166 - (SEL)selector; 167 - (id)value; 168 - (void) setValue: (id) _value; 169 - (BOOL) formatted; 170 - (void) setFormatted: (BOOL) _formatted; 171 172 @end 173 174 @interface EOKeyComparisonQualifier : EOQualifier 175 < EOQualifierEvaluation, NSCoding > 176 { 177 /* this is a '%A selector %A' qualifier */ 178 NSString *leftKey; 179 NSString *rightKey; 180 SEL operator; 181 } 182 183 - (id)initWithLeftKey:(NSString *)_leftKey 184 operatorSelector:(SEL)_selector 185 rightKey:(NSString *)_rightKey; 186 187 - (NSString *)leftKey; 188 - (NSString *)rightKey; 189 - (SEL)selector; 190 191 @end 192 193 /* operators */ 194 195 #define EOQualifierOperatorEqual @selector(isEqualTo:) 196 #define EOQualifierOperatorNotEqual @selector(isNotEqualTo:) 197 #define EOQualifierOperatorLessThan @selector(isLessThan:) 198 #define EOQualifierOperatorGreaterThan @selector(isGreaterThan:) 199 #define EOQualifierOperatorLessThanOrEqualTo @selector(isLessThanOrEqualTo:) 200 #define EOQualifierOperatorGreaterThanOrEqualTo @selector(isGreaterThanOrEqualTo:) 201 #define EOQualifierOperatorContains @selector(doesContain:) 202 #define EOQualifierOperatorLike @selector(isLike:) 203 #define EOQualifierOperatorCaseInsensitiveLike @selector(isCaseInsensitiveLike:) 204 205 /* variable qualifier content */ 206 207 @interface EOQualifierVariable : NSObject < NSCoding, EOKeyValueArchiving > 208 { 209 NSString *varKey; 210 } 211 212 + (id)variableWithKey:(NSString *)_key; 213 - (id)initWithKey:(NSString *)_key; 214 215 - (NSString *)key; 216 217 /* Comparing */ 218 219 - (BOOL)isEqual:(id)_obj; 220 - (BOOL)isEqualToQualifierVariable:(EOQualifierVariable *)_obj; 221 222 @end 223 224 /* define the appropriate selectors */ 225 226 @interface NSObject(QualifierComparisions) 227 - (BOOL)isEqualTo:(id)_object; 228 - (BOOL)isNotEqualTo:(id)_object; 229 - (BOOL)isLessThan:(id)_object; 230 - (BOOL)isGreaterThan:(id)_object; 231 - (BOOL)isLessThanOrEqualTo:(id)_object; 232 - (BOOL)isGreaterThanOrEqualTo:(id)_object; 233 - (BOOL)doesContain:(id)_object; 234 - (BOOL)isLike:(NSString *)_object; 235 - (BOOL)isCaseInsensitiveLike:(NSString *)_object; 236 @end 237 238 @interface NSObject(EOQualifierTransformer) 239 240 - (EOQualifier *)transformQualifier:(EOQualifier *)_q inContext:(id)_ctx; 241 - (EOQualifier *)transformAndQualifier:(EOAndQualifier *)_q inContext:(id)_ctx; 242 - (EOQualifier *)transformOrQualifier:(EOOrQualifier *)_q inContext:(id)_ctx; 243 - (EOQualifier *)transformNotQualifier:(EONotQualifier *)_q inContext:(id)_ctx; 244 245 - (EOQualifier *)transformKeyValueQualifier:(EOKeyValueQualifier *)_q 246 inContext:(id)_ctx; 247 - (EOQualifier *)transformKeyComparisonQualifier:(EOKeyComparisonQualifier *)q 248 inContext:(id)_ctx; 249 250 @end 251 252 /* array qualification */ 253 254 #import <Foundation/NSArray.h> 255 256 @interface NSArray(Qualification) 257 - (NSArray *)filteredArrayUsingQualifier:(EOQualifier *)_qualifier; 258 @end 259 260 #endif /* __EOQualifier_h__ */ 261