GroupQueryNodeProcessor doesn't recursively process children of custom query nodes ----------------------------------------------------------------------------------
Key: LUCENE-3367 URL: https://issues.apache.org/jira/browse/LUCENE-3367 Project: Lucene - Java Issue Type: Bug Components: modules/queryparser Affects Versions: 3.3 Reporter: Trejkaz In some situations I found that boolean queries weren't using the default operator. I have tracked this issue down to GroupQueryNodeProcessor, which does not appear to be recursing into the tree. I have two unit tests. The first one has just the boolean query, the second one has a custom query node wrapped around it. In the second case, the default operator logic is not applied to the boolean query. {code} @Test public void testDefaultOperator() throws Exception { QueryNode node = new GroupQueryNode(new BooleanQueryNode(Arrays.<QueryNode>asList( new FieldQueryNode("text", "a", 1, 1), new FieldQueryNode("text", "b", 3, 3) ))); GroupQueryNodeProcessor processor = new GroupQueryNodeProcessor(); QueryConfigHandler config = new StandardQueryConfigHandler(); config.addAttribute(DefaultOperatorAttribute.class).setOperator(DefaultOperatorAttribute.Operator.AND); processor.setQueryConfigHandler(config); QueryNode actualNode = processor.process(node); QueryNode expectedNode = new BooleanQueryNode(Arrays.<QueryNode>asList( new BooleanModifierNode(new FieldQueryNode("text", "a", 1, 1), ModifierQueryNode.Modifier.MOD_REQ), new BooleanModifierNode(new FieldQueryNode("text", "b", 3, 3), ModifierQueryNode.Modifier.MOD_REQ) )); assertEquals("Wrong node after processing", expectedNode.toString(), actualNode.toString()); } @Test public void testDefaultOperatorInsideCustomNode() throws Exception { QueryNode node = new CustomQueryNode(Arrays.<QueryNode>asList(new GroupQueryNode(new BooleanQueryNode(Arrays.<QueryNode>asList( new FieldQueryNode("text", "a", 1, 1), new FieldQueryNode("text", "b", 3, 3) ))))); GroupQueryNodeProcessor processor = new GroupQueryNodeProcessor(); QueryConfigHandler config = new StandardQueryConfigHandler(); config.addAttribute(DefaultOperatorAttribute.class).setOperator(DefaultOperatorAttribute.Operator.AND); processor.setQueryConfigHandler(config); QueryNode actualNode = processor.process(node); QueryNode expectedNode = new CustomQueryNode(Arrays.<QueryNode>asList(new GroupQueryNode(new BooleanQueryNode(Arrays.<QueryNode>asList( new BooleanModifierNode(new FieldQueryNode("text", "a", 1, 1), ModifierQueryNode.Modifier.MOD_REQ), new BooleanModifierNode(new FieldQueryNode("text", "b", 3, 3), ModifierQueryNode.Modifier.MOD_REQ) ))))); assertEquals("Wrong node after processing", expectedNode.toString(), actualNode.toString()); } public static class CustomQueryNode extends QueryNodeImpl { private CustomQueryNode(List<QueryNode> children) { setLeaf(false); allocate(); set(children); } @Override public CharSequence toQueryString(EscapeQuerySyntax escaper) { StringBuilder builder = new StringBuilder(100); builder.append("custom("); String separator = ""; for (QueryNode child : getChildren()) { builder.append(separator); builder.append(child.toQueryString(escaper)); separator = ","; } builder.append(')'); return builder.toString(); } @Override public String toString() { StringBuilder builder = new StringBuilder(100); builder.append("<custom>\n"); for (QueryNode child : getChildren()) { builder.append(child).append('\n'); } builder.append("\n</custom>"); return builder.toString(); } } {code} -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org For additional commands, e-mail: dev-h...@lucene.apache.org