]> err.no Git - sope/blobdiff - sope-core/NGExtensions/NGRuleEngine.subproj/NGRuleContext.m
bumped framework versions
[sope] / sope-core / NGExtensions / NGRuleEngine.subproj / NGRuleContext.m
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;