package com.feedly.cassandra.dao; import java.util.BitSet; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import com.feedly.cassandra.entity.EntityMetadata; import com.feedly.cassandra.entity.IndexMetadata; import com.feedly.cassandra.entity.PropertyMetadataBase; import com.feedly.cassandra.entity.SimplePropertyMetadata; import com.feedly.cassandra.entity.enhance.IEnhancedEntity; /** * used to perform filter-on-read logic during index retrievals. This class handles equality checks. * * @author kireet * * @param <V> the entity type */ class EqualityValueFilter<V> implements IValueFilter<V> { private final EntityMetadata<V> _entityMeta; private final Map<PropertyMetadataBase, Object> _propsFilter = new HashMap<PropertyMetadataBase, Object>(); public EqualityValueFilter(EntityMetadata<V> meta, V template, IndexMetadata index) { _entityMeta = meta; BitSet dirty = ((IEnhancedEntity)template).getModifiedFields(); Set<SimplePropertyMetadata> indexedProps = new HashSet<SimplePropertyMetadata>(); for(int i = dirty.nextSetBit (0); i>= 0; i = dirty.nextSetBit(i+1)) { PropertyMetadataBase p = _entityMeta.getProperties().get(i); if(!indexedProps.contains(p)) _propsFilter.put(p, invokeGetter(p, template)); } for(SimplePropertyMetadata pm : index.getIndexedProperties()) { _propsFilter.remove(pm); } } public EFilterResult isFiltered(IndexedValue<V> value) { for(Map.Entry<PropertyMetadataBase, Object> entry : _propsFilter.entrySet()) { Object pval = invokeGetter(entry.getKey(), value.getValue()); if(!entry.getValue().equals(pval)) return EFilterResult.FAIL; } return EFilterResult.PASS; } protected Object invokeGetter(PropertyMetadataBase pm, V obj) { try { return pm.getGetter().invoke(obj); } catch(Exception e) { throw new IllegalArgumentException("unexpected error invoking " + pm.getGetter(), e); } } }