2014-10-02 89 views
0

我需要更好的解決方案爲下面的代碼塊,更好地滿足DRY原則。是否有辦法在每個閉包中處理運算符<,...,> =作爲變量?封閉變量,以避免多個if

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() 

彼得 多特蒙德,德國

+0

如果你願意放棄'where'查詢(類型安全的好處,編譯時檢查,'DetachedCriteria'等),那麼下面關於使用標準查詢的建議可以工作。如果你想要'where'查詢所提供的好處,那麼你可以擺脫所有的重複,如下面的答案所示,但是你不能擺脫單個的布爾表達式。這就是處理「where」查詢的本質。與標準查詢不同,標準的結構在編譯時必須是可知的。我希望有所幫助。 – 2014-10-02 19:43:16

回答

2

一種方法是用基於標準的查詢,以取代where。沿着這些路線的東西:

// 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) 
     } 
    } 
} 
+3

我認爲'和'塊是多餘的。默認行爲是將所有的標準「並在一起」。 – 2014-10-02 19:39:20

+0

我所用的標準方法,ommitting的和block.that就是我的解決方案,現在看起來像:DEF C = Notiz.createCriteria() \t \t c.list { \t \t \t如果(anlOp在opMap.keySet()) \t \t \t \t 「$ {opMap [anlOp]}」( 「anlagetermin」,原基) \t \t \t ILIKE( 「notiztext」,params.notiztext) \t \t \t ILIKE( 「referenz」,params.referenz) \t \t \t如果(在wvOp opMap.keySet()) \t \t \t \t 「$ {opMap [wvOp]}」( 「wiedervorlagetermin」,wiedervorlage) \t \t}的atvantage是,我可以很容易地添加第二準則與操作者 – user3647093 2014-10-03 11:18:32

0

你可以消除一堆的重複。取而代之的是...

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 
    } 
} 

你可以做這樣的事情......

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 
    } 
}