001package com.hammurapi.extract; 002 003import java.util.Map; 004import java.util.Set; 005 006import com.hammurapi.extract.ComparisonResult.Type; 007 008public class Not<T, C> implements Predicate<T, C>, FacadeExtractor<T, Boolean, C> { 009 010 private Predicate<T, C> predicate; 011 012 public Not(Predicate<T, C> predicate) { 013 this.predicate = predicate; 014 } 015 016 public ComparisonResult compareTo(Extractor<T, Boolean, C> otherPredicate) { 017 ComparisonResult cr = predicate.compareTo(otherPredicate); 018 switch (cr.getType()) { 019 case EQUAL: 020 return new ComparisonResult(Type.OPPOSITE, cr.getIndexMap()); 021 case LESS_RESTRICTIVE: 022 return new ComparisonResult(Type.OPPOSITE_LESS_RESTRICTIVE, cr.getIndexMap()); 023 case MORE_RESTRICTIVE: 024 return new ComparisonResult(Type.OPPOSITE_MORE_RESTRICTIVE, cr.getIndexMap()); 025 case NOT_EQUAL: 026 return new ComparisonResult(Type.NOT_EQUAL, cr.getIndexMap()); 027 case OPPOSITE: 028 return new ComparisonResult(Type.EQUAL, cr.getIndexMap()); 029 case OPPOSITE_LESS_RESTRICTIVE: 030 return new ComparisonResult(Type.LESS_RESTRICTIVE, cr.getIndexMap()); 031 case OPPOSITE_MORE_RESTRICTIVE: 032 return new ComparisonResult(Type.MORE_RESTRICTIVE, cr.getIndexMap()); 033 default : 034 throw new ExtractorException("Invalid comparison result"); 035 } 036 } 037 038 public Predicate<T, C> getPredicate() { 039 return predicate; 040 } 041 042 public Boolean extract( 043 C context, 044 Map<C, Map<Extractor<T, ? super Boolean, C>, ? super Boolean>> cache, 045 T... obj) { 046 return !predicate.extract(context, cache, obj); 047 } 048 049 public Set<Integer> parameterIndices() { 050 return predicate.parameterIndices(); 051 } 052 053 054 public boolean isContextDependent() { 055 return predicate.isContextDependent(); 056 } 057 058 @Override 059 public double getCost() { 060 return predicate.getCost(); 061 } 062 063}