]> err.no Git - sope/blob - sope-core/EOControl/EOQualifier.h
Drop apache 1 build-dependency
[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 #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 - (unsigned int)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 }
159
160 - (id)initWithKey:(NSString *)_key
161   operatorSelector:(SEL)_selector
162   value:(id)_value;
163
164 - (NSString *)key;
165 - (SEL)selector;
166 - (id)value;
167
168 @end
169
170 @interface EOKeyComparisonQualifier : EOQualifier
171   < EOQualifierEvaluation, NSCoding >
172 {
173   /* this is a '%A selector %A' qualifier */
174   NSString *leftKey;
175   NSString *rightKey;
176   SEL      operator;
177 }
178
179 - (id)initWithLeftKey:(NSString *)_leftKey
180   operatorSelector:(SEL)_selector
181   rightKey:(NSString *)_rightKey;
182
183 - (NSString *)leftKey;
184 - (NSString *)rightKey;
185 - (SEL)selector;
186
187 @end
188
189 /* operators */
190
191 #define EOQualifierOperatorEqual                @selector(isEqualTo:)
192 #define EOQualifierOperatorNotEqual             @selector(isNotEqualTo:)
193 #define EOQualifierOperatorLessThan             @selector(isLessThan:)
194 #define EOQualifierOperatorGreaterThan          @selector(isGreaterThan:)
195 #define EOQualifierOperatorLessThanOrEqualTo    @selector(isLessThanOrEqualTo:)
196 #define EOQualifierOperatorGreaterThanOrEqualTo @selector(isGreaterThanOrEqualTo:)
197 #define EOQualifierOperatorContains             @selector(doesContain:)
198 #define EOQualifierOperatorLike                 @selector(isLike:)
199 #define EOQualifierOperatorCaseInsensitiveLike  @selector(isCaseInsensitiveLike:)
200
201 /* variable qualifier content */
202
203 @interface EOQualifierVariable : NSObject < NSCoding, EOKeyValueArchiving >
204 {
205   NSString *varKey;
206 }
207
208 + (id)variableWithKey:(NSString *)_key;
209 - (id)initWithKey:(NSString *)_key;
210
211 - (NSString *)key;
212
213 /* Comparing */
214
215 - (BOOL)isEqual:(id)_obj;
216 - (BOOL)isEqualToQualifierVariable:(EOQualifierVariable *)_obj;
217
218 @end
219
220 /* define the appropriate selectors */
221
222 @interface NSObject(QualifierComparisions)
223 - (BOOL)isEqualTo:(id)_object;
224 - (BOOL)isNotEqualTo:(id)_object;
225 - (BOOL)isLessThan:(id)_object;
226 - (BOOL)isGreaterThan:(id)_object;
227 - (BOOL)isLessThanOrEqualTo:(id)_object;
228 - (BOOL)isGreaterThanOrEqualTo:(id)_object;
229 - (BOOL)doesContain:(id)_object;
230 - (BOOL)isLike:(NSString *)_object;
231 - (BOOL)isCaseInsensitiveLike:(NSString *)_object;
232 @end
233
234 @interface NSObject(EOQualifierTransformer)
235
236 - (EOQualifier *)transformQualifier:(EOQualifier *)_q       inContext:(id)_ctx;
237 - (EOQualifier *)transformAndQualifier:(EOAndQualifier *)_q inContext:(id)_ctx;
238 - (EOQualifier *)transformOrQualifier:(EOOrQualifier *)_q   inContext:(id)_ctx;
239 - (EOQualifier *)transformNotQualifier:(EONotQualifier *)_q inContext:(id)_ctx;
240
241 - (EOQualifier *)transformKeyValueQualifier:(EOKeyValueQualifier *)_q 
242   inContext:(id)_ctx;
243 - (EOQualifier *)transformKeyComparisonQualifier:(EOKeyComparisonQualifier *)q 
244   inContext:(id)_ctx;
245
246 @end
247
248 /* array qualification */
249
250 #import <Foundation/NSArray.h>
251
252 @interface NSArray(Qualification)
253 - (NSArray *)filteredArrayUsingQualifier:(EOQualifier *)_qualifier;
254 @end
255
256 #endif /* __EOQualifier_h__ */