You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2012/09/25 07:52:45 UTC

svn commit: r1389718 - in /lucene/dev/trunk/lucene: CHANGES.txt facet/src/java/org/apache/lucene/facet/search/sampling/Sampler.java facet/src/test/org/apache/lucene/facet/search/sampling/OversampleWithDepthTest.java

Author: shaie
Date: Tue Sep 25 05:52:44 2012
New Revision: 1389718

URL: http://svn.apache.org/viewvc?rev=1389718&view=rev
Log:
LUCENE-4411: Depth requested in a FacetRequest is reset when Sampling is in effect

Added:
    lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/search/sampling/OversampleWithDepthTest.java   (with props)
Modified:
    lucene/dev/trunk/lucene/CHANGES.txt
    lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/facet/search/sampling/Sampler.java

Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1389718&r1=1389717&r2=1389718&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Tue Sep 25 05:52:44 2012
@@ -28,6 +28,12 @@ New Features
   output for a single input.  UpToTwoPositiveIntsOutputs was moved
   from lucene/core to lucene/misc.  (Mike McCandless)
 
+Bug Fixes
+
+* LUCENE-4411: when sampling is enabled for a FacetRequest, its depth
+  parameter is reset to the default (1), even if set otherwise.
+  (Gilad Barkai via Shai Erera)
+  
 ======================= Lucene 4.0.0 =======================
 
 Changes in backwards compatibility policy

Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/facet/search/sampling/Sampler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/facet/search/sampling/Sampler.java?rev=1389718&r1=1389717&r2=1389718&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/facet/search/sampling/Sampler.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/facet/search/sampling/Sampler.java Tue Sep 25 05:52:44 2012
@@ -4,6 +4,7 @@ import java.io.IOException;
 
 import org.apache.lucene.index.IndexReader;
 
+import org.apache.lucene.facet.search.CategoryListIterator;
 import org.apache.lucene.facet.search.FacetArrays;
 import org.apache.lucene.facet.search.ScoredDocIDs;
 import org.apache.lucene.facet.search.aggregator.Aggregator;
@@ -203,8 +204,21 @@ public abstract class Sampler {
     public OverSampledFacetRequest(FacetRequest orig, int num) {
       super(orig.getCategoryPath(), num);
       this.orig = orig;
+      setDepth(orig.getDepth());
+      setNumLabel(orig.getNumLabel());
+      setResultMode(orig.getResultMode());
+      setSortBy(orig.getSortBy());
+      setSortOrder(orig.getSortOrder());
+    }
+    
+    @Override
+    public CategoryListIterator createCategoryListIterator(IndexReader reader,
+        TaxonomyReader taxo, FacetSearchParams sParams, int partition)
+        throws IOException {
+      return orig.createCategoryListIterator(reader, taxo, sParams, partition);
     }
 
+    
     @Override
     public Aggregator createAggregator(boolean useComplements,
         FacetArrays arrays, IndexReader indexReader,
@@ -222,5 +236,10 @@ public abstract class Sampler {
     public boolean requireDocumentScore() {
       return orig.requireDocumentScore();
     }
+    
+    @Override
+    public boolean supportsComplements() {
+      return orig.supportsComplements();
+    }
   }
 }

Added: lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/search/sampling/OversampleWithDepthTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/search/sampling/OversampleWithDepthTest.java?rev=1389718&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/search/sampling/OversampleWithDepthTest.java (added)
+++ lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/search/sampling/OversampleWithDepthTest.java Tue Sep 25 05:52:44 2012
@@ -0,0 +1,137 @@
+package org.apache.lucene.facet.search.sampling;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.apache.lucene.analysis.core.KeywordAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.facet.index.CategoryDocumentBuilder;
+import org.apache.lucene.facet.search.FacetsAccumulator;
+import org.apache.lucene.facet.search.FacetsCollector;
+import org.apache.lucene.facet.search.params.CountFacetRequest;
+import org.apache.lucene.facet.search.params.FacetRequest;
+import org.apache.lucene.facet.search.params.FacetRequest.ResultMode;
+import org.apache.lucene.facet.search.params.FacetSearchParams;
+import org.apache.lucene.facet.search.results.FacetResult;
+import org.apache.lucene.facet.search.results.FacetResultNode;
+import org.apache.lucene.facet.taxonomy.CategoryPath;
+import org.apache.lucene.facet.taxonomy.TaxonomyReader;
+import org.apache.lucene.facet.taxonomy.TaxonomyWriter;
+import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyReader;
+import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyWriter;
+import org.apache.lucene.index.CorruptIndexException;
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.LockObtainFailedException;
+import org.apache.lucene.util.IOUtils;
+import org.apache.lucene.util.LuceneTestCase;
+import org.junit.Test;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class OversampleWithDepthTest extends LuceneTestCase {
+  
+  @Test
+  public void testCountWithdepthUsingSamping() throws Exception, IOException {
+    Directory indexDir = newDirectory();
+    Directory taxoDir = newDirectory();
+    
+    // index 100 docs, each with one category: ["root", docnum/10, docnum]
+    // e.g. root/8/87
+    index100Docs(indexDir, taxoDir);
+    
+    DirectoryReader r = DirectoryReader.open(indexDir);
+    TaxonomyReader tr = new DirectoryTaxonomyReader(taxoDir);
+    
+    FacetSearchParams fsp = new FacetSearchParams();
+    
+    CountFacetRequest facetRequest = new CountFacetRequest(new CategoryPath("root"), 10);
+    
+    // Setting the depth to '2', should potentially get all categories
+    facetRequest.setDepth(2);
+    facetRequest.setResultMode(ResultMode.PER_NODE_IN_TREE);
+    fsp.addFacetRequest(facetRequest);
+    
+    // Craft sampling params to enforce sampling
+    final SamplingParams params = new SamplingParams();
+    params.setMinSampleSize(2);
+    params.setMaxSampleSize(50);
+    params.setOversampleFactor(5);
+    params.setSampingThreshold(60);
+    params.setSampleRatio(0.1);
+    
+    FacetResult res = searchWithFacets(r, tr, fsp, params);
+    FacetRequest req = res.getFacetRequest();
+    assertEquals(facetRequest, req);
+    
+    FacetResultNode rootNode = res.getFacetResultNode();
+    
+    // Each node below root should also have sub-results as the requested depth was '2'
+    for (FacetResultNode node : rootNode.getSubResults()) {
+      assertTrue("node " + node.getLabel()
+          + " should have had children as the requested depth was '2'",
+          node.getNumSubResults() > 0);
+    }
+    
+    IOUtils.close(r, tr, indexDir, taxoDir);
+  }
+
+  private void index100Docs(Directory indexDir, Directory taxoDir)
+      throws CorruptIndexException, LockObtainFailedException, IOException {
+    IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new KeywordAnalyzer());
+    IndexWriter w = new IndexWriter(indexDir, iwc);
+    TaxonomyWriter tw = new DirectoryTaxonomyWriter(taxoDir);
+    
+    CategoryDocumentBuilder cdb = new CategoryDocumentBuilder(tw);
+    ArrayList<CategoryPath> categoryPaths = new ArrayList<CategoryPath>(1);
+    
+    for (int i = 0; i < 100; i++) {
+      categoryPaths.clear();
+      categoryPaths.add(new CategoryPath("root",Integer.toString(i / 10), Integer.toString(i)));
+      cdb.setCategoryPaths(categoryPaths);
+      w.addDocument(cdb.build(new Document()));
+    }
+    IOUtils.close(tw, w);
+  }
+
+  /** search reader <code>r</code>*/
+  private FacetResult searchWithFacets(IndexReader r,
+      TaxonomyReader tr, FacetSearchParams fsp, final SamplingParams params)
+          throws IOException {
+    // a FacetsCollector with a sampling accumulator
+    FacetsCollector fcWithSampling = new FacetsCollector(fsp, r, tr) {
+      @Override
+      protected FacetsAccumulator initFacetsAccumulator(FacetSearchParams facetSearchParams, IndexReader indexReader,
+          TaxonomyReader taxonomyReader) {
+        Sampler sampler = new RandomSampler(params, random());
+        return new SamplingAccumulator(sampler, facetSearchParams, indexReader, taxonomyReader);
+      }
+    };
+    
+    IndexSearcher s = new IndexSearcher(r);
+    s.search(new MatchAllDocsQuery(), fcWithSampling);
+    
+    // there's only one expected result, return just it.
+    return fcWithSampling.getFacetResults().get(0);
+  }
+}