Я работаю над динамическим построением createCriteria
. Пока все хорошо:
obj
это объект домена (s )я хочу обратно
rulesList
представляет собой список карт, которые содержат поле для поиска, используемый оператор и значение для поиска
def c = obj.createCriteria()
l = c.list (max: irows, offset: offset) {
switch(obj){ //constrain results to those relevant to the user
case Vehicle:
eq("garage", usersGarage)
break
case Garage:
users {
idEq(user.id)
}
break
}
rulesList.each { rule ->
switch(rule['op']){
case 'eq':
eq("${rule['field']}", rule['value'])
break
case 'ne':
ne("${rule['field']}", rule['value'])
break
case 'gt':
gt("${rule['field']}", rule['value'])
break;
case 'ge':
ge("${rule['field']}", rule['value'])
break
case 'lt':
lt("${rule['field']}", rule['value'])
break
case 'le':
le("${rule['field']}", rule['value'])
break
case 'bw':
ilike("${rule['field']}", "${rule['value']}%")
break
case 'bn':
not{ilike("${rule['field']}", "${rule['value']}%")}
break
case 'ew':
ilike("${rule['field']}", "%${rule['value']}")
break
case 'en':
not{ilike("${rule['field']}", "%${rule['value']}")}
break
case 'cn':
ilike("${rule['field']}", "%${rule['value']}%")
break
case 'nc':
not{ilike("${rule['field']}", "%${rule['value']}%")}
break
}
}
}
}
Приведенный выше код отлично работает и лишь немного подробен -с операторами switch. Но что, если я хочу добавить функциональность, чтобы выбрать соответствие ЛЮБЫМ правилам или ВСЕМ из них? Мне нужно было бы условно поместить правила в or{}
. Я не могу сделать что-то вроде
if(groupOp == 'or'){
or{
}
прежде чем я просмотрю список правил, а затем
if(groupOp == 'or'){
}
}
потом. Все, что я могу сделать, это повторить код для каждого условия:
if(groupOp == 'or'){
or{
rulesList.each { rule ->
switch(rule['op']){
...
}
}
}
}
else{
rulesList.each { rule ->
switch(rule['op']){
...
}
}
Теперь код выглядит довольно неряшливо и повторяется. Предположим, я хочу выполнить поиск по свойству свойства объекта домена? (Пример :Я хочу вернуть автомобили с шинами определенной марки; Vehicle.tires.brand или автомобили, водители которых совпадают с именем; имя_автомобиля_водителя ). Должен ли я сделать что-то вроде:
switch(rule['op']){
case 'eq':
switch(thePropertiesProperty){
case Garage:
garage{
eq("${rule['field']}", rule['value'])
}
break
case Driver:
driver{
eq("${rule['field']}", rule['value'])
}
break
}
break
case 'ne':
...
}