You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ad...@apache.org on 2014/01/22 04:49:58 UTC

svn commit: r1560246 - in /lucene/dev/branches/branch_4x/lucene: ./ queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/ queryparser/src/test/org/apache/lucene/queryparser/flexible/core/nodes/ queryparser/src/test/org/apache/lucene/q...

Author: adrianocrestani
Date: Wed Jan 22 03:49:58 2014
New Revision: 1560246

URL: http://svn.apache.org/r1560246
Log:
LUCENE-5099 - QueryNode should have the ability to detach from its node parent

Modified:
    lucene/dev/branches/branch_4x/lucene/CHANGES.txt
    lucene/dev/branches/branch_4x/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/QueryNode.java
    lucene/dev/branches/branch_4x/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/QueryNodeImpl.java
    lucene/dev/branches/branch_4x/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/core/nodes/TestQueryNode.java
    lucene/dev/branches/branch_4x/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java

Modified: lucene/dev/branches/branch_4x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/CHANGES.txt?rev=1560246&r1=1560245&r2=1560246&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Wed Jan 22 03:49:58 2014
@@ -40,6 +40,10 @@ New Features
   using SortField.setMissingValue(SortField.STRING_LAST). (Rob Muir,
   Mike McCandless)
 
+* LUCENE-5099: QueryNode should have the ability to detach from its node
+  parent. Added QueryNode.removeFromParent() that allows nodes to be 
+  detached from its parent node. (Adriano Crestani)
+
 
 Build
 

Modified: lucene/dev/branches/branch_4x/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/QueryNode.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/QueryNode.java?rev=1560246&r1=1560245&r2=1560246&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/QueryNode.java (original)
+++ lucene/dev/branches/branch_4x/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/QueryNode.java Wed Jan 22 03:49:58 2014
@@ -91,4 +91,8 @@ public interface QueryNode {
    */
   public Map<String, Object> getTagMap();
 
+  /**
+   * Removes this query node from its parent.
+   */
+  public void removeFromParent();
 }

Modified: lucene/dev/branches/branch_4x/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/QueryNodeImpl.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/QueryNodeImpl.java?rev=1560246&r1=1560245&r2=1560246&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/QueryNodeImpl.java (original)
+++ lucene/dev/branches/branch_4x/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/QueryNodeImpl.java Wed Jan 22 03:49:58 2014
@@ -19,6 +19,7 @@ package org.apache.lucene.queryparser.fl
 
 import java.util.ArrayList;
 import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -102,18 +103,19 @@ public abstract class QueryNodeImpl impl
 
     // reset parent value
     for (QueryNode child : children) {
-
-      ((QueryNodeImpl) child).setParent(null);
-
+      child.removeFromParent();
     }
-
+    
+    ArrayList<QueryNode> existingChildren = new ArrayList<QueryNode>(getChildren());
+    for (QueryNode existingChild : existingChildren) {
+      existingChild.removeFromParent();
+    }
+    
     // allocate new children list
     allocate();
-
+    
     // add new children and set parent
-    for (QueryNode child : children) {
-      add(child);
-    }
+    add(children);
   }
 
   @Override
@@ -154,7 +156,7 @@ public abstract class QueryNodeImpl impl
     if (isLeaf() || this.clauses == null) {
       return null;
     }
-    return this.clauses;
+    return new ArrayList<QueryNode>(this.clauses);
   }
 
   @Override
@@ -181,7 +183,10 @@ public abstract class QueryNodeImpl impl
   private QueryNode parent = null;
 
   private void setParent(QueryNode parent) {
-    this.parent = parent;
+    if (this.parent != parent) {
+      this.removeFromParent();
+      this.parent = parent;
+    }
   }
 
   @Override
@@ -241,5 +246,21 @@ public abstract class QueryNodeImpl impl
   public Map<String, Object> getTagMap() {
     return (Map<String, Object>) this.tags.clone();
   }
+  
+  @Override
+  public void removeFromParent() {
+    if (this.parent != null) {
+      List<QueryNode> parentChildren = this.parent.getChildren();
+      Iterator<QueryNode> it = parentChildren.iterator();
+      
+      while (it.hasNext()) {
+        if (it.next() == this) {
+          it.remove();
+        }
+      }
+      
+      this.parent = null;
+    }
+  }
 
 } // end class QueryNodeImpl

Modified: lucene/dev/branches/branch_4x/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/core/nodes/TestQueryNode.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/core/nodes/TestQueryNode.java?rev=1560246&r1=1560245&r2=1560246&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/core/nodes/TestQueryNode.java (original)
+++ lucene/dev/branches/branch_4x/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/core/nodes/TestQueryNode.java Wed Jan 22 03:49:58 2014
@@ -18,6 +18,7 @@ package org.apache.lucene.queryparser.fl
  */
 
 import java.util.Arrays;
+import java.util.Collections;
 
 import org.apache.lucene.util.LuceneTestCase;
 
@@ -44,4 +45,23 @@ public class TestQueryNode extends Lucen
     
   }
   
+  /* LUCENE-5099 - QueryNodeProcessorImpl should set parent to null before returning on processing */
+  public void testRemoveFromParent() throws Exception {
+    BooleanQueryNode booleanNode = new BooleanQueryNode(Collections.<QueryNode>emptyList());
+    FieldQueryNode fieldNode = new FieldQueryNode("foo", "A", 0, 1);
+    assertNull(fieldNode.getParent());
+    
+    booleanNode.add(fieldNode);
+    assertNotNull(fieldNode.getParent());
+
+    fieldNode.removeFromParent();
+    assertNull(fieldNode.getParent());
+
+    booleanNode.add(fieldNode);
+    assertNotNull(fieldNode.getParent());
+    
+    booleanNode.set(Collections.<QueryNode>emptyList());
+    assertNull(fieldNode.getParent());
+  }
+  
 }

Modified: lucene/dev/branches/branch_4x/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java?rev=1560246&r1=1560245&r2=1560246&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java (original)
+++ lucene/dev/branches/branch_4x/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java Wed Jan 22 03:49:58 2014
@@ -1066,6 +1066,7 @@ public abstract class QueryParserTestBas
     assertTrue(bq.getClauses()[1].getQuery() instanceof MatchAllDocsQuery);
   }
   
+  @SuppressWarnings("unused")
   private void assertHits(int expected, String query, IndexSearcher is) throws Exception {
     String oldDefaultField = getDefaultField();
     setDefaultField("date");