2014-10-02 2 views
0

다음 코드 블록에서 DRY 원칙을보다 잘 충족하는 더 나은 솔루션이 필요합니다. 각 클로저에서 연산자로 <, ...,> =을 처리 할 수있는 방법이 있습니까?클로저에서 변수가 여러 개인 경우를 피하기 위해

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' 쿼리가 처리되는 방식의 성격입니다. 기준의 구조는 기준 쿼리와 달리 컴파일시 알 수 있어야합니다. 도움이되기를 바랍니다. –

답변

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

나는'and' 블록이 불필요하다고 생각합니다. 기본 동작은 모든 조건을 함께 표시하는 것입니다. –

+0

는 난을 ommitting, 기준 접근 방법을 사용 block.that 내 솔루션은 지금 모습입니다 같은 : 데프 C = Notiz.createCriteria() \t \t c.list { \t \t \t (anlOp opMap.keySet에서()) 경우 \t \t \t \t "$ {opMap [anlOp]}"("anlagetermin"anlage) \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는 I 쉽게 오퍼레이터를 갖는 제 2 기준을 추가 할 수있다 – user3647093

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 
    } 
} 
관련 문제