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