But the existing default behaviour in performFind is "AND"ed every conditions (that is the more common way to search something in my opinion, each user input restrain the result).
That make this design impossible without adding another key or changing global logic of performFind service, which I guess is not really what we want.
I think managing more complex cases (like the one you gave me) without rewriting the performFind could be too complicate, and i'd propose another way to solve such needs.
We could add the ability to put an EntityCondition in inputFields map that will be specified in a script just before calling performFind service. This entityCondition will be "AND"ed to the default ones (i already got a working patch with unit test working :) ).
Then we willl get for simple OR condition a way to do it within widget, and for more complex case, resolve it through specific script/action.
On 02/02/2018 15:47, Taher Alkhateeb wrote:
May I try to share a design that might be a bit more generic? Here is one idea: <field name="field1" search-group="group1"><text-find/></field> <field name="field2" search-group="group1"><text-find/></field> <field name="field3" search-group="group2"><text-find/></field> <field name="field4" search-group="group2"><text-find/></field> Then we change the find services so that each group "AND" its members and the groups are "OR"ed together. So in this example the find service would have the condition: (field1 AND field2) OR (field3 AND field4) I think this is simple enough but maybe provides more flexibility? On Feb 2, 2018 4:22 PM, "gil portenseigne" <[email protected]> wrote: I'll try to improve xml widget integration adding a field like : <field name="field1" group-find-condition="unionKey"><text-find/></field> WDYT ? On 02/02/2018 14:16, gil portenseigne wrote:In a widget form to "OR" a condition between x fields you have to : <field name="field1"><text-find/></field> <field name="field1_grp"><hidden value="unionKey"/></field> <field name="field2"><text-find/></field> <field name="field2_grp"><hidden value="unionKey"/></field> <field name="field3"><text-find/></field> <field name="field3_grp"><hidden value="unionKey"/></field> <field name="field4"><text-find/></field> <field name="field4_grp"><hidden value="unionKey2"/></field> <field name="field5"><text-find/></field> <field name="field5_grp"><hidden value="unionKey2"/></field <field name="field6"><text-find/></field> <field name="field7"><text-find/></field> You'll get EntityCondition.makeCondition( UtilMisc.toList(field1Condition, field2Condition, field3Condition), EntityOperator.OR) EntityCondition.makeCondition( UtilMisc.toList(field4Condition, field5Condition), EntityOperator.OR) These will be "AND" with the others... (6 and 7) Indeed that's a bit ugly... but that do the job, and like I said, it's a pretty rare need. On 02/02/2018 12:14, Taher Alkhateeb wrote:Oh okay I understand. Well .. in that case how do you "OR" conditions in the form? Do you do it selectively or do you want all "OR" or all "AND"? On Feb 2, 2018 1:26 PM, "gil portenseigne" <[email protected]> wrote: InlineOn 02/02/2018 11:04, Taher Alkhateeb wrote: So it's not some SQL union but rather just a simple "OR" instead of "AND"for some conditions. Yes it's that simple, but between different fields.I was actually thinking of this problem recently but not only for twooptions but rather multiple options. Nice, so we are not alone meeting this issue. This improvement allow the"OR" to be used between multiple (2 and more) fields conditions (even multi-select widget). I took 2 for the example, but you can defined many different groups, that can contains many fields. To be more specific, our drop-down form widgets have an attribute"allow-multiple" or something like that which yields a list of values. This cannot be currently handled by performFind and the other related search services. I confirm that performFind works with multi-select fields, if *nospecific operator* is set : if(UtilValidate.isNotEmpty(UtilGenerics.toList(fieldValue))){ fieldOp = EntityOperator.IN; } else { fieldOp = EntityOperator.EQUALS; } The condition will be EntityCondition.makeCondition(myField, EntityOperator.IN, selectedValues) So I think having an automatic "OR" on multiple dropdown valuesis an important feature to implement and I would give that a +1. The improvement concern OR condition between differents fields :)Thanks ! Gil On Feb 2, 2018 11:44 AM, "gil portenseigne" <[email protected]wrote: Yes, actually using form widget with performFind services do not offer a way to union two search criteria. Exemple : i want to find all communicationEvent that are in Bounced status *or* that contains something in note field. (very specific, strange, thats why) By default all search criteria are managed in EntityCondition like : List<EntityCondition> allDefaultSearchCriteria = UtilMisc.toList(criteria1Condition, criteria2Condition ...); The resulting final condition would result as : EntityCondition.makeCondition(allDefaultSearchCriteria, EntityOperator.AND) With the enhancement, by regrouping two fields with field1_grp = 'groupKey' and field2_grp = 'groupKey' the following condition is added to the other default ones like : allDefaultSearchCriteria.add(EntityCondition.makeCondition(U tilMisc.toList(field1Condition, field2Condition), EntityOperator.OR)); I hope this will be clearer. On 01/02/2018 21:07, Taher Alkhateeb wrote: Hi, perhaps if you share the idea of how to translate it to the entityengine conditions then we'd be better informed? On Feb 1, 2018 6:30 PM, "gil portenseigne" < [email protected]> wrote: Hello, In a customer project we met a very specific need in a search screenthat offer search criteria that must unions and not intersect. I propose this improvement in OFBIZ-10195, https://s.apache.org/sjW1 but i'm wondering if any of you ever met such need ? Is that worth to be commited in the code base ? I tend to say yes, but i'd like to hear the community out about this. Thanks ! Gil
