You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2015/08/20 20:38:56 UTC

svn commit: r1696837 - in /lucene/dev/branches/branch_5x: ./ lucene/ lucene/CHANGES.txt lucene/join/ lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java

Author: hossman
Date: Thu Aug 20 18:38:55 2015
New Revision: 1696837

URL: http://svn.apache.org/r1696837
Log:
LUCENE-6755: more tests of ToChildBlockJoinScorer.advance (merge r1696834)

Modified:
    lucene/dev/branches/branch_5x/   (props changed)
    lucene/dev/branches/branch_5x/lucene/   (props changed)
    lucene/dev/branches/branch_5x/lucene/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_5x/lucene/join/   (props changed)
    lucene/dev/branches/branch_5x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java

Modified: lucene/dev/branches/branch_5x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/CHANGES.txt?rev=1696837&r1=1696836&r2=1696837&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/lucene/CHANGES.txt Thu Aug 20 18:38:55 2015
@@ -52,6 +52,8 @@ Other
 * LUCENE-6738: remove IndexWriterConfig.[gs]etIndexingChain
   (Christine Poerschke)
 
+* LUCENE-6755: more tests of ToChildBlockJoinScorer.advance (hossman)
+
 Build
 
 * LUCENE-6732: Improve checker for invalid source patterns to also

Modified: lucene/dev/branches/branch_5x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java?rev=1696837&r1=1696836&r2=1696837&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java (original)
+++ lucene/dev/branches/branch_5x/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java Thu Aug 20 18:38:55 2015
@@ -1608,5 +1608,103 @@ public class TestBlockJoin extends Lucen
     r.close();
     dir.close();
   }
+  
+  public void testToChildInitialAdvanceParentButNoKids() throws Exception {
+    
+    final Directory dir = newDirectory();
+    final RandomIndexWriter w = new RandomIndexWriter(random(), dir);
 
+    // degenerate case: first doc has no children
+    w.addDocument(makeResume("first", "nokids"));
+    w.addDocuments(Arrays.asList(makeJob("job", 42), makeResume("second", "haskid")));
+
+    // single segment
+    w.forceMerge(1);
+
+    final IndexReader r = w.getReader();
+    final IndexSearcher s = newSearcher(r);
+    w.close();
+
+    BitSetProducer parentFilter = new QueryBitSetProducer(new TermQuery(new Term("docType", "resume")));
+    Query parentQuery = new TermQuery(new Term("docType", "resume"));
+
+    ToChildBlockJoinQuery parentJoinQuery = new ToChildBlockJoinQuery(parentQuery, parentFilter);
+
+    Weight weight = s.createNormalizedWeight(parentJoinQuery, random().nextBoolean());
+    DocIdSetIterator advancingScorer = weight.scorer(s.getIndexReader().leaves().get(0));
+    DocIdSetIterator nextDocScorer = weight.scorer(s.getIndexReader().leaves().get(0));
+
+    final int firstKid = nextDocScorer.nextDoc();
+    assertTrue("firstKid not found", DocIdSetIterator.NO_MORE_DOCS != firstKid);
+    assertEquals(firstKid, advancingScorer.advance(0));
+    
+    r.close();
+    dir.close();
+  }
+
+  public void testMultiChildQueriesOfDiffParentLevels() throws Exception {
+    
+    final Directory dir = newDirectory();
+    final RandomIndexWriter w = new RandomIndexWriter(random(), dir);
+
+    // randomly generate resume->jobs[]->qualifications[]
+    final int numResumes = atLeast(50);
+    for (int r = 0; r < numResumes; r++) {
+      final List<Document> docs = new ArrayList<>();
+      
+      final int rv = TestUtil.nextInt(random(), 1, 10);
+      final int numJobs = atLeast(1);
+      for (int j = 0; j < numJobs; j++) {
+        final int jv = TestUtil.nextInt(random(), 1, 10);
+
+        final int numQualifications = atLeast(1);
+        for (int q = 0; q < numQualifications; q++) {
+          docs.add(makeQualification("q" + q + "_rv" + rv + "_jv" + jv, q));
+        }
+        docs.add(makeJob("j" + j, jv));
+      }
+      docs.add(makeResume("r" + r, "rv"+rv));
+      w.addDocuments(docs);
+    }
+
+    final IndexReader r = w.getReader();
+    final IndexSearcher s = newSearcher(r);
+    w.close();
+
+    BitSetProducer resumeFilter = new QueryBitSetProducer(new TermQuery(new Term("docType", "resume")));
+    // anything with a skill is a job
+    BitSetProducer jobFilter = new QueryBitSetProducer(new PrefixQuery(new Term("skill", "")));
+
+
+    final int numQueryIters = atLeast(1);
+    for (int i = 0; i < numQueryIters; i++) {
+      final int qjv = TestUtil.nextInt(random(), 1, 10);
+      final int qrv = TestUtil.nextInt(random(), 1, 10);
+      
+      Query resumeQuery = new ToChildBlockJoinQuery(new TermQuery(new Term("country","rv" + qrv)),
+                                                    resumeFilter);
+      
+      Query jobQuery = new ToChildBlockJoinQuery(NumericRangeQuery.newIntRange("year", qjv, qjv, true, true),
+                                                 jobFilter);
+      
+      BooleanQuery.Builder fullQuery = new BooleanQuery.Builder();
+      fullQuery.add(new BooleanClause(jobQuery, Occur.MUST));
+      fullQuery.add(new BooleanClause(resumeQuery, Occur.MUST));
+      
+      TopDocs hits = s.search(fullQuery.build(), 100); // NOTE: totally possible that we'll get no matches
+      
+      for (ScoreDoc sd : hits.scoreDocs) {
+        // since we're looking for children of jobs, all results must be qualifications
+        String q = r.document(sd.doc).get("qualification");
+        assertNotNull(sd.doc + " has no qualification", q);
+        assertTrue(q + " MUST contain jv" + qjv, q.contains("jv"+qjv));
+        assertTrue(q + " MUST contain rv" + qrv, q.contains("rv"+qrv));
+      }
+    }
+    
+    r.close();
+    dir.close();
+  }
+
+  
 }