Reputation: 393
I need a better solution for the following code block, that better meets the DRY principle. Is there a means to handle the operators <,...,>= in each closure as a variable ?
def query
if (wvOp == ' ')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}"
}
if (wvOp == '<')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin < wiedervorlage
}
if (wvOp == '<=')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin <= wiedervorlage
}
if (wvOp == '=')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin == wiedervorlage
}
if (wvOp == '>')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin > wiedervorlage
}
if (wvOp == '>=')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin >= wiedervorlage
}
query.findAll()
peter Dortmund, Germany
Upvotes: 0
Views: 78
Reputation: 27255
You can eliminate a bunch of the duplication. Instead of this...
def query
if (wvOp == ' ')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}"
}
}
if (wvOp == '<')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin < wiedervorlage
}
}
if (wvOp == '<=')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin <= wiedervorlage
}
}
if (wvOp == '=')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin == wiedervorlage
}
}
if (wvOp == '>')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin > wiedervorlage
}
}
if (wvOp == '>=')
query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}" &&
anlagetermin >= wiedervorlage
}
}
You could do something like this...
def query = Notiz.where {
notiztext =~ "${params['notiztext']}" &&
referenz =~ "${params['referenz']}"
if (wvOp == '<') {
anlagetermin < wiedervorlage
} else if (wvOp == '<=')
anlagetermin <= wiedervorlage
} else if (wvOp == '=')
anlagetermin == wiedervorlage
} else if (wvOp == '>')
anlagetermin > wiedervorlage
} else if (wvOp == '>=')
anlagetermin >= wiedervorlage
}
}
Upvotes: 0
Reputation: 2249
One approach would be to replace your where
with a criteria-based query. Somthing along these lines:
// translate incoming comparison operator to equivalent criteria method
def opMap = [ '<': 'lt', '<=': 'lte', '=': 'eq', '>': 'gt', '>=': 'gte' ]
def c = Notiz.createCriteria()
def results = c.list {
and {
ilike(notiztext, params['notiztext'])
ilike(referenz, params['referenz'])
if (wvOp in opMap.keySet()) {
"${opMap[wvOp]}"(anlagetermin, wiedervorlage)
}
}
}
Upvotes: 2