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. 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 -- Jérôme Velociter Winesquare http://www.winesquare.net/ _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

