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