# HG changeset patch # User Sylvain Thénault # Date 1309526793 -7200 # Node ID 1eb6090311ffdd5bfcf39ecfbbf2c8d1444cdf55 # Parent 75d208ab8444df54dc82544f3b223eeeca9475fd# Parent 1302aa6ba4da3efd91a868baf53cd7c15187e28c backport stable diff -r 75d208ab8444 -r 1eb6090311ff schema.py --- a/schema.py Fri Jul 01 13:39:45 2011 +0200 +++ b/schema.py Fri Jul 01 15:26:33 2011 +0200 @@ -646,9 +646,10 @@ def split_expression(rqlstring): for expr in rqlstring.split(','): - for noparen in expr.split('('): - for word in noparen.split(): - yield word + for noparen1 in expr.split('('): + for noparen2 in noparen1.split(')'): + for word in noparen2.split(): + yield word def normalize_expression(rqlstring): """normalize an rql expression to ease schema synchronization (avoid diff -r 75d208ab8444 -r 1eb6090311ff test/unittest_schema.py --- a/test/unittest_schema.py Fri Jul 01 13:39:45 2011 +0200 +++ b/test/unittest_schema.py Fri Jul 01 15:26:33 2011 +0200 @@ -320,8 +320,8 @@ class GuessRrqlExprMainVarsTC(TestCase): def test_exists(self): - mainvars = guess_rrqlexpr_mainvars(normalize_expression('NOT EXISTS(O team_competition C, C level < 3)')) - self.assertEqual(mainvars, set(['O'])) + mainvars = guess_rrqlexpr_mainvars(normalize_expression('NOT EXISTS(O team_competition C, C level < 3, C concerns S)')) + self.assertEqual(mainvars, set(['S', 'O'])) if __name__ == '__main__': diff -r 75d208ab8444 -r 1eb6090311ff web/data/cubicweb.facets.js --- a/web/data/cubicweb.facets.js Fri Jul 01 13:39:45 2011 +0200 +++ b/web/data/cubicweb.facets.js Fri Jul 01 15:26:33 2011 +0200 @@ -133,11 +133,20 @@ // may changes and we must send its value when the callback is // called, not when the page is initialized var facetargs = form.attr('cubicweb:facetargs'); - if (facetargs !== undefined) { + if (facetargs != undefined && !form.attr('cubicweb:initialized')) { + form.attr('cubicweb:initialized', '1'); + var jsfacetargs = cw.evalJSON(form.attr('cubicweb:facetargs')); form.submit(function() { - buildRQL.apply(null, cw.evalJSON(form.attr('cubicweb:facetargs'))); + buildRQL.apply(null, jsfacetargs); return false; }); + var divid = jsfacetargs[0]; + if (jQuery('#'+divid).length) { + var $loadingDiv = $(DIV({id:'facetLoading'}, + facetLoadingMsg)); + $loadingDiv.corner(); + $(jQuery('#'+divid).get(0).parentNode).append($loadingDiv); + } form.find('div.facet').each(function() { var facet = jQuery(this); facet.find('div.facetCheckBox').each(function(i) { @@ -188,7 +197,7 @@ var $img = jQuery(this).find('img'); $img.attr('src', SELECTED_IMG).attr('alt', (_('selected'))); } - buildRQL.apply(null, cw.evalJSON(form.attr('cubicweb:facetargs'))); + buildRQL.apply(null, jsfacetargs); facet.find('.facetBody').animate({ scrollTop: 0 }, @@ -197,7 +206,7 @@ facet.find('select.facetOperator').change(function() { var nbselected = facet.find('div.facetValueSelected').length; if (nbselected >= 2) { - buildRQL.apply(null, cw.evalJSON(form.attr('cubicweb:facetargs'))); + buildRQL.apply(null, jsfacetargs); } }); facet.find('div.facetTitle').click(function() { diff -r 75d208ab8444 -r 1eb6090311ff web/facet.py --- a/web/facet.py Fri Jul 01 13:39:45 2011 +0200 +++ b/web/facet.py Fri Jul 01 15:26:33 2011 +0200 @@ -94,7 +94,7 @@ def prepare_facets_rqlst(rqlst, args=None): """prepare a syntax tree to generate facet filters - * remove ORDERBY clause + * remove ORDERBY/GROUPBY clauses * cleanup selection (remove everything) * undefine unnecessary variables * set DISTINCT @@ -106,8 +106,10 @@ select.set_limit(None) select.set_offset(None) baserql = select.as_string(kwargs=args) - # cleanup sort terms + # cleanup sort terms / group by select.remove_sort_terms() + select.remove_groups() + # XXX remove aggregat from having # selection: only vocabulary entity for term in select.selection[:]: select.remove_selected(term) diff -r 75d208ab8444 -r 1eb6090311ff web/test/unittest_facet.py --- a/web/test/unittest_facet.py Fri Jul 01 13:39:45 2011 +0200 +++ b/web/test/unittest_facet.py Fri Jul 01 15:26:33 2011 +0200 @@ -66,18 +66,18 @@ self.assertEqual(f.vocabulary(), [(u'guests', guests), (u'managers', managers)]) # ensure rqlst is left unmodified - self.assertEqual(rqlst.as_string(), 'DISTINCT Any GROUPBY X WHERE X in_group G?, G name GN, NOT G name "users"') + self.assertEqual(rqlst.as_string(), 'DISTINCT Any WHERE X in_group G?, G name GN, NOT G name "users"') #rqlst = rset.syntax_tree() self.assertEqual(sorted(f.possible_values()), [str(guests), str(managers)]) # ensure rqlst is left unmodified - self.assertEqual(rqlst.as_string(), 'DISTINCT Any GROUPBY X WHERE X in_group G?, G name GN, NOT G name "users"') + self.assertEqual(rqlst.as_string(), 'DISTINCT Any WHERE X in_group G?, G name GN, NOT G name "users"') req.form[f.__regid__] = str(guests) f.add_rql_restrictions() # selection is cluttered because rqlst has been prepared for facet (it # is not in real life) - self.assertEqual(f.rqlst.as_string(), - 'DISTINCT Any GROUPBY X WHERE X in_group G?, G name GN, NOT G name "users", X in_group D, D eid %s' % guests) + self.assertEqual(f.select.as_string(), + 'DISTINCT Any WHERE X in_group G?, G name GN, NOT G name "users", X in_group D, D eid %s' % guests) def test_relation_no_relation_1(self): f, (guests, managers) = self._in_group_facet(no_relation=True)