]> err.no Git - sope/commitdiff
added new rule engine method
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Thu, 4 Aug 2005 14:38:22 +0000 (14:38 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Thu, 4 Aug 2005 14:38:22 +0000 (14:38 +0000)
minor improv in NSPredicate unarchiving

git-svn-id: http://svn.opengroupware.org/SOPE/trunk@969 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-core/EOCoreData/ChangeLog
sope-core/EOCoreData/NSPredicate+EO.m
sope-core/EOCoreData/Version
sope-core/NGExtensions/ChangeLog
sope-core/NGExtensions/NGExtensions/NGRuleContext.h
sope-core/NGExtensions/NGRuleEngine.subproj/NGRuleContext.m
sope-core/NGExtensions/Version

index b91af797a3c4143b6db39fa0081e46174f73f9a4..27c2ab7b8ed42bdffc8d11a29d23c0b97719d5ec 100644 (file)
@@ -1,3 +1,8 @@
+2005-08-04  Helge Hess  <helge.hess@skyrix.com>
+
+       * NSPredicate+EO.m: also check 'selectorName' key during unarchiving
+         (v4.5.5)
+
 2005-08-04  Helge Hess  <helge.hess@opengroupware.org>
 
        * NSExpression+EO.m: added EOKeyValueArchiving (v4.5.4)
index 4d9ecbe262cdcc4eb1d80bc51731dfcc166e79c8..6b616ac85020c2b585d200a90217e28af617a6cb 100644 (file)
 
   /* custom selector */
   
-  selName = [_unarchiver decodeObjectForKey:@"selector"];
+  if ((selName = [_unarchiver decodeObjectForKey:@"selectorName"]) != nil) {
+    if (![selName hasSuffix:@":"]) 
+      selName = [selName stringByAppendingString:@":"];
+  }
+  else
+    selName = [_unarchiver decodeObjectForKey:@"selector"];
   if ([selName length] > 0) {
     return [self initWithLeftExpression:left rightExpression:right
-                customSelector:NSSelectorFromString(selName)];
+                customSelector:selName ? NSSelectorFromString(selName):NULL];
   }
   
   /* modifier */
index 9d93031b2c14602d3af70ada8fe43b6eda356ce9..d1646130b383b0ffd643ec15ead84ab41281eb5e 100644 (file)
@@ -1,3 +1,3 @@
 # version file
 
-SUBMINOR_VERSION:=4
+SUBMINOR_VERSION:=5
index 5fd5e6c8bebde7e16f664d917d52d9e41ee13413..6b0ead9bb67642a62f28d5c8fff1aeb18664f0c7 100644 (file)
@@ -1,3 +1,9 @@
+2005-08-04  Helge Hess  <helge.hess@skyrix.com>
+
+       * NGRuleEngine.subproj/NGRuleContext.m: added new method
+         -allPossibleValuesForKey: to calculate all possible values for a
+         given key, not just the first matching one (v4.5.169)
+
 2005-08-04  Helge Hess  <helge.hess@opengroupware.org>
 
        * EOFilterDataSource.m, EOCompoundDataSource.m: code cleanups
index 0be61d817fc7d30bf092149d5ec20fea9466f486..e33ad31a862f7141046d1a443ffa9dab60696796 100644 (file)
@@ -67,6 +67,7 @@
 - (id)valueForKey:(NSString *)_key;
 
 - (id)inferredValueForKey:(NSString *)_key;
+- (NSArray *)allPossibleValuesForKey:(NSString *)_key;
 
 - (NSArray *)valuesForKeyPath:(NSString *)_kp
   takingSuccessiveValues:(NSArray *)_values
index 7bf6e7c0f55ce48c922898401b989fe1c13e9156..9d39fffba7280c37960c8335b1397783090923cc 100644 (file)
   return nil;
 }
 
+- (NSArray *)allPossibleValuesForKey:(NSString *)_key {
+  NSMutableArray *values;
+  NSArray  *rules;
+  unsigned i, count;
+  
+  if (self->debugOn)
+    [self debugWithFormat:@"calculate all values for key: '%@'", _key];
+  
+  /* select candidates */
+  rules = [[self model] candidateRulesForKey:_key];
+  if (self->debugOn)
+    [self debugWithFormat:@"  candidate rules: %@", rules];
+  
+  values = [NSMutableArray arrayWithCapacity:16];
+  
+  /* check qualifiers */
+  for (i = 0, count = [rules count]; i < count; i++) {
+    NGRule *rule;
+    
+    rule = [rules objectAtIndex:i];
+    if ([(id<EOQualifierEvaluation>)[rule qualifier] evaluateWithObject:self]){
+      id v;
+      
+      if (self->debugOn)
+        [self debugWithFormat:@"  rule %i matches: %@", i, rule];
+      
+      v = [[rule action] fireInContext:self];
+      [values addObject:(v ? v : [NSNull null])];
+    }
+  }
+  if (self->debugOn)
+    [self debugWithFormat:@"  %d rules matched.", [values count]];
+  return values;
+}
+
 - (id)valueForKey:(NSString *)_key {
   id v;
+
+  // TODO: add rule cache?
   
   /* look for constants */
-  if ((v = [self->storedValues objectForKey:_key]))
+  if ((v = [self->storedValues objectForKey:_key]) != nil)
     return v;
   
   /* look into rule system */
-  if ((v = [self inferredValueForKey:_key]))
+  if ((v = [self inferredValueForKey:_key]) != nil)
     return v;
   
   return nil;
index 406c7817e89dd8131a056985ac31a9d9544966ca..5eee82ff933ebb335f140db6c07cbfce9612d507 100644 (file)
@@ -1,6 +1,6 @@
 # version
 
-SUBMINOR_VERSION:=168
+SUBMINOR_VERSION:=169
 
 # v4.3.115 requires libFoundation v1.0.59
 # v4.2.72  requires libEOControl  v4.2.39