173 unsigned int _options;
222 _customSelector = selector;
245 _modifier = modifier;
254 _customSelector = NULL;
274 - (SEL)customSelector
276 return _customSelector;
328 default: modifier =
"";
344 default: options =
"";
380 return [
CPString stringWithFormat:@"%s%s %s%s %s",modifier,[_left description],operator,options,[_right description]];
385 var left = [_left _expressionWithSubstitutionVariables:variables],
386 right = [_right _expressionWithSubstitutionVariables:variables];
396 if (
self === anObject)
399 if (anObject.isa !==
self.isa || _modifier !== [anObject comparisonPredicateModifier] || _type !== [anObject predicateOperatorType] || _options !== [anObject options] || _customSelector !== [anObject customSelector] || ![_left
isEqual:[anObject leftExpression]] || ![_right
isEqual:[anObject rightExpression]])
405 - (BOOL)_evaluateValue:lhs rightValue:rhs
407 var leftIsNil = (lhs == nil || [lhs isEqual:[
CPNull null]]),
411 return (leftIsNil == rightIsNil &&
416 var string_compare_options = 0;
431 lhs = lhs.stripDiacritics();
432 rhs = rhs.stripDiacritics();
434 return (
new RegExp(rhs,commut)).test(lhs);
438 lhs = lhs.stripDiacritics();
439 rhs = rhs.stripDiacritics();
442 reg =
new RegExp(rhs.escapeForRegExp(),commut);
443 return reg.test(lhs);
448 if (_options & CPDiacriticInsensitivePredicateOption)
450 return ([lhs compare:rhs options:string_compare_options range:range] ==
CPOrderedSame);
453 if (_options & CPCaseInsensitivePredicateOption)
455 if (_options & CPDiacriticInsensitivePredicateOption)
457 return ([lhs compare:rhs options:string_compare_options range:range] ==
CPOrderedSame);
466 if (![lhs respondsToSelector:
@selector(objectEnumerator)])
467 [
CPException raise:CPInvalidArgumentException
reason:@"The left/right hand side for a CONTAINS/IN operator must be a collection or a string"];
469 return [lhs containsObject:rhs];
472 if (_options & CPCaseInsensitivePredicateOption)
474 if (_options & CPDiacriticInsensitivePredicateOption)
477 return ([lhs rangeOfString:rhs options:string_compare_options].location !=
CPNotFound);
480 [
CPException raise:CPInvalidArgumentException
reason:@"The right hand side for a BETWEEN operator must contain 2 objects"];
488 - (BOOL)evaluateWithObject:(
id)object
493 - (BOOL)evaluateWithObject:(
id)object substitutionVariables:(
CPDictionary)variables
495 var leftValue = [_left expressionValueWithObject:object context:variables],
496 rightValue = [_right expressionValueWithObject:object context:variables];
499 return [
self _evaluateValue:leftValue rightValue:rightValue];
502 if (![leftValue respondsToSelector:
@selector(objectEnumerator)])
503 [
CPException raise:CPInvalidArgumentException
reason:@"The left hand side for an ALL or ANY operator must be either a CPArray or a CPSet"];
505 var e = [leftValue objectEnumerator],
509 while ((value = [e nextObject]) !== nil)
511 var eval = [
self _evaluateValue:value rightValue:rightValue];
530 _left = [coder decodeObjectForKey:@"CPComparisonPredicateLeftExpression"];
531 _right = [coder decodeObjectForKey:@"CPComparisonPredicateRightExpression"];
532 _modifier = [coder decodeIntForKey:@"CPComparisonPredicateModifier"];
533 _type = [coder decodeIntForKey:@"CPComparisonPredicateType"];
534 _options = [coder decodeIntForKey:@"CPComparisonPredicateOptions"];
535 _customSelector = [coder decodeObjectForKey:@"CPComparisonPredicateCustomSelector"];
543 [coder encodeObject:_left forKey:@"CPComparisonPredicateLeftExpression"];
544 [coder encodeObject:_right forKey:@"CPComparisonPredicateRightExpression"];
545 [coder encodeInt:_modifier forKey:@"CPComparisonPredicateModifier"];
546 [coder encodeInt:_type forKey:@"CPComparisonPredicateType"];
547 [coder encodeInt:_options forKey:@"CPComparisonPredicateOptions"];
548 [coder encodeObject:_customSelector forKey:@"CPComparisonPredicateCustomSelector"];
553 var
source = ['*','?','(',')','{','}','.','+','|','/',','^'],
554 dest = ['.*','.?','\\(','\\)','\\{','\\}','\\.','\\+','\\|','\\/','\\$','\\^'];
556 String.prototype.escapeForRegExp =
function()
558 var foundChar =
false,
561 for (; i <
source.length; ++i)
563 if (this.indexOf(
source[i]) !== -1)
575 for (i = 0; i < this.length; ++i)
577 var sourceIndex =
source.indexOf(this.charAt(i));
578 if (sourceIndex !== -1)
579 result +=
dest[sourceIndex];
581 result += this.charAt(i);