recently found myself writing either db queries or simple seq method chains dynamic based on user input, instance:
def between(from: option[datetime], to: option[datetime]): seq[myobject] = { db.all() // let's returns seq[myobject] /* here want either restrict upper/lower bounds from/to if exist or take values otherwise */ } if lazy i'd go with:
def between(from: option[datetime], to: option[datetime]): seq[myobject] = { if(from.isempty && to.isempty) db.all() else if(from.isempty) db.all().filter(_.date <= to.get) else if(to.isempty) db.all().filter(_.date >= from.get) else db.all().filter(_.date >= from.get && _.date <= to.get) } obviously filter example, have same problem instance take when want take n elements or based on option.
but if have more options passed? idiomatic way of doing in scala?
i can go pattern matching, that's not extremely different if/else?
i make several vals , from.map(...).getorelse() introduces temporary vals , again doesn't better if/else.
are there other tricks use?
i don't think design start with, because violates meaning of word between.
i have separate methods each case, clear semantics :
def between(from: datetime, datetime) def after(from: datetime) def before(to: datetime) def anytime() otherwise, if want keep way :
def between(from: option[date], to: option[date]) = { val datepredicate = (test: (date,date) => boolean, date: option[date]) => (o: myobject) => date.map(test(o.date, _)).getorelse(true) val frompredicate = datepredicate(_ >= _, from) val topredicate = datepredicate(_ <= _, to) db.all().filter(x => frompredicate(x) && topredicate(x)) } it more general , extendable, obscure.
Comments
Post a Comment