Thanks for the feedback guys! Let me just expand a bit on the motivation behind my previous example....
Let's say I'm managing hundreds of printers each of which have a relationship to a cartridge (of which there are many hundreds) with a colour attribute. I want to find the printers with a blue cartridge. So I first make a search for a list of "blue" cartridges. Then I search for the printers that have a relationship with these cartridges. The problem is on the second search I end up with a ginormous search expression "relationships%3D%3D7db4512-ad25-40e8-bc78-63ad25c0e894%2C%24relationships%3D%3D16dc6acd-6.....". " that could be an invalid URL. Is there a better way of handling it than this? Colm. On Wed, Jun 28, 2017 at 10:52 AM, Sergey Beryozkin <sberyoz...@gmail.com> wrote: > Hi Francesco > > One thing I can point to is this code: > > https://github.com/apache/cxf/blob/master/rt/rs/extensions/s > earch/src/main/java/org/apache/cxf/jaxrs/ext/search/jpa/Abst > ractJPATypedQueryVisitor.java#L167 > > There, in the end, > > https://github.com/apache/cxf/blob/master/rt/rs/extensions/s > earch/src/main/java/org/apache/cxf/jaxrs/ext/search/jpa/Abst > ractJPATypedQueryVisitor.java#L181 > > it branches to either doBuildPredicate() (==> similar to Syncope > SearchCondVisitor.visitPrimitive) or doBuildCollectionPredicate() > > When we have "a.b.c" then if 'b' is a collection then it would branch to > doBuildCollectionPredicate. > > It was awhile back since I played with the typed JPA2 code, Native one is > a mystery... > > I agree supporting such queries is not easy...but supporting then can > offer an ultimate search experience :-) > > Cheers, Sergey > > On 28/06/17 10:26, Francesco Chicchiriccò wrote: > >> On 28/06/2017 10:59, Sergey Beryozkin wrote: >> >>> Hi Francesco >>> >>> Thanks for the explanation. >>> >>> I see why the example I pointed to won't be applicable to Syncope. >>> In that case when the linked beans are available, CXF >>> AbstractSearchParser will prepare a bean tree which would be initialized >>> with the values from the expression like "a.b.c" and the OOB visitor like >>> JPA2 one takes care of dealing with these linked beans. >>> >>> In the SearchBean case it is up to the custom visitor whether to react >>> to the '.'s or not where a '.' indicates that for ex 'a' needs to have 'b' >>> with a property 'c'. >>> >>> Do you reckon Syncope custom visitors can be updated to support such >>> queries ? Not sure about ElasticSearch but for SQL it should probably be >>> possible... >>> >> >> Maybe in principle yes, it could be possible to support such queries but: >> >> 1. implementation would be rather complex as the query logic is already >> quite involved >> 2. we haven't had may requests for such complex queries so far >> >> ...anyway, as you know, volunteers are welcome :-) >> >> Regards. >> >> On 28/06/17 09:46, Francesco Chicchiriccò wrote: >>> >>>> On 28/06/2017 10:41, Sergey Beryozkin wrote: >>>> >>>>> Hi >>>>> >>>>> I think something similar works for a CXF FIQL JPA2 visitor, for >>>>> example: >>>>> >>>>> https://github.com/apache/cxf/blob/master/rt/rs/extensions/s >>>>> earch/src/test/java/org/apache/cxf/jaxrs/ext/search/jpa/JPAT >>>>> ypedQueryVisitorFiqlTest.java#L65 >>>>> >>>>> (find the books which have been revied done by Ted) >>>>> >>>> >>>> Hi Sergey, >>>> that would work if we had straight beans as in the linked sample. >>>> >>>> Syncope data model is instead much more involved as new schema for >>>> attributes can be defined at runtime: this is the reason why we have >>>> SearchCondVisitor [1] translating FIQL into our internal search conditions, >>>> which serve as input to one of available implementations of AnySearchDAO >>>> like as the default one based on SQL views [2] and another relying on >>>> Elasticsearch-based [3]. >>>> >>>> Regards. >>>> >>>> [1] https://github.com/apache/syncope/blob/2_0_X/core/persistenc >>>> e-api/src/main/java/org/apache/syncope/core/persistenc >>>> e/api/search/SearchCondVisitor.java >>>> [2] https://github.com/apache/syncope/blob/2_0_X/core/persistenc >>>> e-jpa/src/main/java/org/apache/syncope/core/persistenc >>>> e/jpa/dao/JPAAnySearchDAO.java >>>> [3] https://github.com/apache/syncope/blob/2_0_X/ext/elasticsear >>>> ch/persistence-jpa/src/main/java/org/apache/syncope/core/ >>>> persistence/jpa/dao/ElasticsearchAnySearchDAO.java >>>> >>>> On 28/06/17 08:54, Francesco Chicchiriccò wrote: >>>>> >>>>>> On 27/06/2017 18:18, Colm O hEigeartaigh wrote: >>>>>> >>>>>>> Thanks Francesco! On a related note, let's say I have some AnyObjects >>>>>>> (Printer) with a relationship to other AnyObjects (Cartridge). Now I >>>>>>> want >>>>>>> to search for a Printer which has a relationship with a Cartridge >>>>>>> with a >>>>>>> "colour" attribute of "blue". Is there a way to do this via a FIQL >>>>>>> expression? >>>>>>> >>>>>> >>>>>> No, you cannot express such condition ATM; you could do for example: >>>>>> >>>>>> SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER"). >>>>>> inRelationships("ce75249b-76e4-44b6-88ae-0841846faceb"). >>>>>> and().is("colour").equalTo("blue").query(); >>>>>> >>>>>> which translates to FIQL >>>>>> >>>>>> $type==PRINTER;$relationships==ce75249b-76e4-44b6-88ae-0841846faceb;colour==blue >>>>>> >>>>>> >>>>>> but this would rather search for blue printers having a relationship >>>>>> with an any object with key 'ce75249b-76e4-44b6-88ae-0841846faceb'. >>>>>> >>>>>> or alternatively >>>>>> >>>>>> SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER"). >>>>>> inRelationshipTypes("WITH_CARTDRIGE"). >>>>>> and().is("color").equalTo("blue").query(); >>>>>> >>>>>> which translates to FIQL >>>>>> >>>>>> $type==PRINTER;$relationshipTypes==WITH_CARTDRIGE;color==blue >>>>>> >>>>>> but this would rather search for blue printers having a relationship >>>>>> on type WITH_CARTDRIGE. >>>>>> >>>>>> Regards. >>>>>> >>>>>> On Tue, Jun 27, 2017 at 4:29 PM, Francesco Chicchiriccò < >>>>>>> ilgro...@apache.org> wrote: >>>>>>> >>>>>>> On 27/06/2017 17:24, Colm O hEigeartaigh wrote: >>>>>>>> >>>>>>>> Hi all, >>>>>>>>> >>>>>>>>> How can I retrieve a list of AnyObjects? The following returns a >>>>>>>>> 400: >>>>>>>>> >>>>>>>>> curl -I -X GET -u admin:password >>>>>>>>> http://localhost:9080/syncope/rest/anyObjects >>>>>>>>> >>>>>>>>> You must at least provide the AnyType, e.g. >>>>>>>> >>>>>>>> http://localhost:9080/syncope/rest/anyObjects;fiql=%24type%3 >>>>>>>> D%3DPRINTER >>>>>>>> >>>>>>>> Regards. >>>>>>>> >>>>>>> >> -- Colm O hEigeartaigh Talend Community Coder http://coders.talend.com