Highlighted

Having problems with groups in Query

briansnyderBC

05-04-2018

I'm tying to use groups in a Query to get pages by Tags.  I want to select the members that match at least 1 item in both Group 1 and Group 2 so, like this:

( A or B ) AND ( 1 or 2 )

My query is successful and gives expected results when I supply a single item to the first pair ( A or B ) and multiple values to the second pair, but if I supply multiple values to the first pair I get no results instead of additive results.

I'm using AEM 6.1 (upgrade soon!).

The predicate strings are nearly identical so I'm wondering if I'm using the "x_group.p.or = true" correctly or in the right places. Below are the two queries I'm generating. How can I fix my query to achieve ( A or B ) AND ( 1 or 2 )?

This returns expected results:

ROOT=group: hits=full, limit=-1[

     {orderby=orderby: orderby=@jcr:content/jcr:title, sort=asc}

     {path=path: path=/content/bc-web/test/discernment}

     {type=type: type=cq:Page}

     {1_property=property: property=jcr:content/sling:resourceType, value=bc-web/components/page/bc-school-major}

     {2_group=group: or=true[

         {1_property=property: property=jcr:content/cq:tags, value=bc:schools/MCAS/schools/math}

     ]}

     {3_group=group: or=true[

         {1_tagid=tagid: property=jcr:content/cq:tags, tagid=/etc/tags/bc/schools/degrees/BS}

         {2_tagid=tagid: property=jcr:content/cq:tags, tagid=/etc/tags/bc/schools/degrees/BA}

     ]}

]

This returns no results (difference in green):

ROOT=group: hits=full, limit=-1[

     {orderby=orderby: orderby=@jcr:content/jcr:title, sort=asc}

     {path=path: path=/content/bc-web/test/discernment}

     {type=type: type=cq:Page}

     {1_property=property: property=jcr:content/sling:resourceType, value=bc-web/components/page/bc-school-major}

     {2_group=group: or=true[

         {1_property=property: property=jcr:content/cq:tags, value=bc:schools/MCAS/schools/math}

         {2_property=property: property=jcr:content/cq:tags, value=bc:schools/MCAS/schools/physics}

     ]}

     {3_group=group: or=true[

         {1_tagid=tagid: property=jcr:content/cq:tags, tagid=/etc/tags/bc/schools/degrees/BS}

         {2_tagid=tagid: property=jcr:content/cq:tags, tagid=/etc/tags/bc/schools/degrees/BA}

     ]}

]

The Java that creates this is:

Map<String, String> map = new HashMap<String, String>();

map.put("path", this.getPathToMajors());

map.put("type", "cq:Page");

map.put("1_property", "jcr:content/sling:resourceType");

map.put("1_property.value", "bc-web/components/page/bc-school-major");

if (null != getTagFilter() && (filterCount > 0)) {

  map.put("2_group.p.or", "true");
   for (int i = 0; i < filterCount; i++) {

   int group = i + 1;

  String key1 = "2_group." + group + "_property.value";

  String key2 = "2_group." + group + "_property";

  map.put(key1, getTagFilter()[i]);

  map.put(key2, "jcr:content/cq:tags");

  }

}

if (null != getTagLimit() && (limitCount > 0)) {

  map.put("3_group.p.or", "true");

   for (int j = 0; j < limitCount; j++) {

   int group = j + 1;

  String key1 = "3_group." + group + "_tagid";

  String key2 = "3_group." + group + "_tagid.property";

  map.put(key1, getTagLimit()[j]);

  map.put(key2, "jcr:content/cq:tags");

  }

}

map.put("p.hits", "full");

map.put("orderby", "@jcr:content/jcr:title");

map.put("orderby.sort", "asc");

map.put("p.limit", "-1");