syncope-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Fabio Martelli <fabio.marte...@gmail.com>
Subject Re: AnyObjects query
Date Thu, 29 Jun 2017 08:07:26 GMT


Il 28/06/2017 18:34, Colm O hEigeartaigh ha scritto:
> 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?
Hi Colm, maybe you can search all the cartridges blue with a 
relationship with a printer.
The result will be a list of cartridges. Each item will be reported 
including a specific field relationships (if I well remember) about all 
the printers related to the item.
In this case, you will have all the info you need retrieved by a single 
short query. Don't you agree?

BR,
F.
>
> Colm.
>
> On Wed, Jun 28, 2017 at 10:52 AM, Sergey Beryozkin <sberyozkin@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ò <
>>>>>>>> ilgrosso@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.
>>>>>>>>>
>

-- 
Fabio Martelli
https://it.linkedin.com/pub/fabio-martelli/1/974/a44
http://blog.tirasa.net/author/fabio/index.html

Tirasa - Open Source Excellence
http://www.tirasa.net/index.html?pk_campaign=email&pk_kwd=fm

Apache Syncope PMC
http://people.apache.org/~fmartelli/


Mime
View raw message