package org.jactr.modules.pm.common.memory.filter; /* * default logging */ import java.util.Comparator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.core.production.request.ChunkTypeRequest; import org.jactr.core.slot.IConditionalSlot; public class NumericIndexFilter extends AbstractIndexFilter<Double> { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(NumericIndexFilter.class); private final String _slotName; private final boolean _sortAscending; public NumericIndexFilter(String slotName, boolean ascending) { _slotName = slotName; _sortAscending = ascending; } @Override protected Double compute(ChunkTypeRequest request) { for (IConditionalSlot cSlot : request.getConditionalSlots()) if (cSlot.getCondition() == IConditionalSlot.EQUALS && _slotName.equals(cSlot.getName())) { Object value = cSlot.getValue(); if (value instanceof Number) return ((Number) value).doubleValue(); } return null; } public boolean accept(ChunkTypeRequest template) { Double value = get(template); return value != null; } public Comparator<ChunkTypeRequest> getComparator() { return new Comparator<ChunkTypeRequest>() { public int compare(ChunkTypeRequest o1, ChunkTypeRequest o2) { if (o1 == o2) return 0; Double v1 = get(o1); Double v2 = get(o2); int rtn = 0; if (v1 < v2) rtn = -1; if (v1 > v2) rtn = 1; if (!_sortAscending) rtn *= -1; return rtn; } }; } public IIndexFilter instantiate(ChunkTypeRequest request) { int weight = -1; int count = 0; for (IConditionalSlot cSlot : request.getConditionalSlots()) { ++count; if (_slotName.equals(cSlot.getName())) { weight = count; break; } } if (weight == -1) return null; NumericIndexFilter instance = new NumericIndexFilter(_slotName, _sortAscending); instance.setWeight(weight); instance.setPerceptualMemory(getPerceptualMemory()); return instance; } }