user3647093
user3647093

Reputation: 393

Variable in a closure to avoid multiple if's

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

Answers (2)

Jeff Scott Brown
Jeff Scott Brown

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

Andrew
Andrew

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

Related Questions