On Apr 16, 2012, at 10:23 PM, Jerome Velociter wrote:

> On Mon, Apr 16, 2012 at 9:59 PM, Vincent Massol <[email protected]> wrote:
>> Hi,
>> 
>> On Apr 16, 2012, at 8:10 PM, Jean-Vincent Drean wrote:
>> 
>>> Hi devs,
>>> 
>>> while replacing calls to xwiki#searchDocuments by calls to the query
>>> manager script service I ran into the following query manager issue:
>>> http://jira.xwiki.org/browse/XWIKI-7273 (XWQL short form queries
>>> should distinct on document fullname.)
>>> 
>>> I think we could use the recent QueryFilter mechanism to handle the
>>> addition of the "distinct" in the select statement.
>>> https://github.com/xwiki/xwiki-platform/blob/master/xwiki-platform-core/xwiki-platform-query/xwiki-platform-query-manager/src/main/java/org/xwiki/query/QueryFilter.java
>>> 
>>> QueryFilters allow to:
>>> - transform queries depending on a dynamic parameter (for example the
>>> user preferences in HiddenDocumentFilter)
>>> - transform the select part of a short query, without requiring
>>> programming rights
>>> 
>>> Here's an example of what it could look like from a velocity script:
>>> ----------------------------------------------------8<----------------------------------------------------
>>> #set($query = 
>>> $services.query.xwql("").addFilter("unique").addFilter("hidden"))
>>> ----------------------------------------------------8<----------------------------------------------------
>>> Note that in the future we could decide that the Query wrapper we use
>>> in the QueryManagerScriptService (ScriptQuery) have the "unique"
>>> filter by default + a way to remove it from the script.
>>> 
>>> I wasn't expecting us to consider using multiple filters when I added
>>> the new APIs in Query (4.0RC1).
>>> If we agree that a QueryFilter would be a nice way to handle this, I'd
>>> like to break those API before we release 4.0:
>>> ----------------------------------------------------8<----------------------------------------------------
>>> -    Query setFilter(QueryFilter filter);
>>> +    Query addFilter(QueryFilter filter);
>>> -    QueryFilter getFilter();
>>> +    List<QueryFilter> getFilters();
>>> ----------------------------------------------------8<----------------------------------------------------
>> 
>> It's a little bit more complex. We did consider several filters when we 
>> added setFilter()!! :)
>> 
>> We said that if we need more than one filter we could have an AndFilter() 
>> that takes a list of Filters. And allow more complex filters should we need 
>> them, like OrFilter, etc.
>> 
>> #set($query = $services.query.xwql("").setFilter(new AndFilter("unique", 
>> "hidden"))
>> 
>> Written with a fluent API that would give:
>> 
>> #set($query = $services.query.xwql("").setFilter(and("unique", "hidden"))
>> 
>> Or even:
>> 
>> #set($query = $services.query.xwql("").setFilter("unique").and("hidden")
>> 
>> Anyway I'm just mentioning this to explain what we thought about and an 
>> alternative to addFilter(). The only problem with addFilter() is if you need 
>> more complex Filters later on. It's not extensible whereas using AndFilter() 
>> and OrFilter() is more extensible at the expense of a little bit more text 
>> if not using a fluent api.
> 
> Also you can't expose it that easily in velocity. For example your
> fluent APIs examples above won't work in velocity ; you would need a
> layer in between to adapt from script service APIs to the Java APIs.

You can't do a "new" but the point of the fluent API is to not have to write 
any "new" (to make it fluent) and thus it's well adapted to Velocity actually :)

BTW on http://en.wikipedia.org/wiki/Fluent_interface#Java their examples shows 
a usage where they call setParameter several times.

This is also a possibility. We can call setFilter() several times.

Thanks
-Vincent

> Jerome.
> 
>> 
>> Anyway I'm fine with either addFilter or setFilter.
>> 
>> Also +1 to use a QueryFilter for adding a "distinct" in the query.
>> 
>> Thanks
>> -Vincent
>> 
>>> WDYT ?
>>> JV.
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to