syncope-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Francesco Chicchiriccò <ilgro...@apache.org>
Subject Re: AnyObjects query
Date Thu, 29 Jun 2017 09:19:35 GMT
On 29/06/2017 11:04, Sergey Beryozkin wrote:
> Hi Francesco
>
> OK. So, as far as the Syncope returning the list of printers to the 
> client code issuing the query, how would it guess that when someone 
> searches for the blue cartridges it is actually a list of printers is 
> expected ? Where will this code which next goes over the list of all 
> the cartridges and prepare a list of Printers will sit ?
>
> As far as the demand is concerned: it is driven by a too long URI 
> production issue Colm referred to

The URI too long is generated if you do the search the way Colm 
describes it.

If instead, by following Fabio's suggestion, you search for all 
Cartdriges with "colour==blue" having a certain RelationshipType (which 
you have prior defined, with Printers, say it is named 
'PRINTER_CARTDRIGE_ASSIGNMENT'), then you need a single query with the 
following FIQL:

$type==CARTDRIGE;color==blue;$relationshipTypes==PRINTER_CARTDRIGE_ASSIGNMENT

Such query will return a list of AnyObjectTO instances, each of which 
containing a list of RelationshipTO, where each RelationshipTO instance 
has a type field.

Hence, to get "the printers with a blue cartridge", it will be enough to 
iterate over the returned list of AnyObjectTO instances (of type 
CARTDRIGE), find the RelationshipTO instances of type 
PRINTER_CARTDRIGE_ASSIGNMENT, and finally get the other side of the 
relationship, e.g. the printer.
Code-wise:

         PagedResult<AnyObjectTO> cartdriges = ...; // returned by the 
search
         List<String> printers = new ArrayList<>();
         for (AnyObjectTO cartdrige: cartdriges.getResult()) {
             for (RelationshipTO relationship: 
cartdrige.getRelationships()) {
                 if 
("PRINTER_CARTDRIGE_ASSIGNMENT".equals(relationship.getType())) {
                     printers.add(relationship.getRightKey());
                 }
             }
         }

Anyway, as said, there is always room to improve.
Regards.

> On 29/06/17 09:53, Francesco Chicchiriccò wrote:
>> On 29/06/2017 10:52, Sergey Beryozkin wrote:
>>> Hi Fabio
>>>
>>> That would not work at the generic level as it would require a 2-way 
>>> relationship (cartridge - printer for ex) which is not always 
>>> realistic to expect,
>>
>> In the Syncope data model, all Relationships are 2-way.
>>
>> I agree with Fabio: the use case proposed by Colm is doable with 
>> current implementation.
>>
>> Naturally, there is always room for improvements, but I don't see 
>> much demand ATM.
>>
>> Regards.
>>
>>> On 29/06/17 09:07, Fabio Martelli wrote:
>>>>
>>>>
>>>> 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.
>>>>>>>>>>>>>
>>>>>
>>>>
>>>
>>>
>>
>
>

-- 
Francesco Chicchiriccò

Tirasa - Open Source Excellence
http://www.tirasa.net/

Member at The Apache Software Foundation
Syncope, Cocoon, Olingo, CXF, OpenJPA, PonyMail
http://home.apache.org/~ilgrosso/


Mime
View raw message