package gw.rating.rtm.matchop uses gw.api.database.Query uses gw.api.database.Relop uses gw.rating.rtm.domain.OrderedPersistenceAdapter uses java.lang.Comparable uses java.math.RoundingMode @ReadOnly class StatelessLessThanOrEqualMatch extends StatelessMatchOperator { construct(matchOp : RateTableMatchOp) { super(matchOp) initConverter() } override function compare(bean: OrderedPersistenceAdapter, arg: Comparable): int { var cellValue = bean.get(this.ArgIndex) var v : int if (cellValue == null) { v = 0 } else { v = compareMin(bean, arg) } return v } override function needsSubrangeMerge(isNormalized : boolean) : boolean { return true } override public property get OrderDependent() : boolean { return true } override function getScore(bean: OrderedPersistenceAdapter, arg: Comparable): Comparable { return new ReverseComparable(bean.get(this.ArgIndex)) // nonmatching elements are gone, so lowest element is what we want } override function filter(query: Query, arg: Comparable) { // DB layer forces us to compare Column to arg rather than the inverse. // So this matchop actually computes Column >= arg, not arg <= Column query.compare(ColumnName, Relop.GreaterThanOrEquals, arg) } override protected function getRounding(paramIndex : int) : RoundingMode { // input value 2.5 vs row value 3 should match (2.5 <= 3); vs row value 2 (2.5 <= 2) should not // we actually compute the inverse (3 >= 2.5) and (2 >= 2.5) // so we convert input value 2.5 to 3, giving (3 >= 3) and (2 >= 3) return CEILING } override protected function compareMax(bean : OrderedPersistenceAdapter, arg : Comparable) : int { return ACCEPT_ALL_MAX } override protected function compareMin(bean : OrderedPersistenceAdapter, arg : Comparable) : int { // Return "equal" until we encounter a bean which is < arg return bean.get(this.ArgIndex).compareTo(arg) >= 0 ? 0 : -1 } override protected function compareMid(bean : OrderedPersistenceAdapter, arg : Comparable) : int { return compareMin(bean, arg) } }