Author: cstamas
Date: Thu Mar 31 13:52:09 2011
New Revision: 1087301

URL: http://svn.apache.org/viewvc?rev=1087301&view=rev
Log:
MINDEXER-14 and others.

* re-introduced "count" on AbstractSearchRequest to overcome problem of Group 
searches being "wide open" for OOM and no way to limit them.
* cleanup the API wrt "search paging": there was paging support in indexer, but 
it never worked for grouped and flat searches. Only pageable search was much 
later implemented Iterator search. Now, the API properly reflects this fact, 
unlike before, when it suggested that flat and grouped supports paging but 
actually they did not.
* Javadoc improvements, clearing up the meaning of "count" and hits.
* Some UTs commented out -- those that were testing (and were disabled) paging 
on flat search, but actually did nothing, see MINDEXER-22 for more.

Modified:
    
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchPageableRequest.java
    
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchRequest.java
    
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchResponse.java
    
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultIteratorResultSet.java
    
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultSearchEngine.java
    
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/FlatSearchRequest.java
    
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/IteratorSearchRequest.java
    
maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/AbstractRepoNexusIndexerTest.java
    
maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Index20081108RegressionTest.java

Modified: 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchPageableRequest.java
URL: 
http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchPageableRequest.java?rev=1087301&r1=1087300&r2=1087301&view=diff
==============================================================================
--- 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchPageableRequest.java
 (original)
+++ 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchPageableRequest.java
 Thu Mar 31 13:52:09 2011
@@ -5,32 +5,25 @@ import java.util.List;
 import org.apache.lucene.search.Query;
 import org.apache.maven.index.context.IndexingContext;
 
+/**
+ * Pageable search request. Adds "start" point, to skip wanted number of 
records, to implement paging. Use "count" of
+ * AbstractSearchRequest to set page size.
+ * 
+ * @author cstamas
+ */
 public class AbstractSearchPageableRequest
     extends AbstractSearchRequest
 {
     /**
-     * Constant for denoting undefined value for result count.
-     */
-    protected static final int UNDEFINED = -1;
-
-    /**
      * The number of hit we want to skip from result set. Defaults to 0.
      */
     private int start;
 
-    /**
-     * The page size, actually count of items in one page. Different than 
limit, because this will _cut_ the response to
-     * the requested count.
-     */
-    private int count;
-
     public AbstractSearchPageableRequest( Query query )
     {
         super( query, null );
 
         this.start = 0;
-
-        this.count = UNDEFINED;
     }
 
     public AbstractSearchPageableRequest( Query query, List<IndexingContext> 
contexts )
@@ -38,8 +31,6 @@ public class AbstractSearchPageableReque
         super( query, contexts );
 
         this.start = 0;
-
-        this.count = UNDEFINED;
     }
 
     /**
@@ -66,29 +57,4 @@ public class AbstractSearchPageableReque
 
         this.start = start;
     }
-
-    /**
-     * Returns the "count" of wanted results. See {@link #UNDEFINED}.
-     * 
-     * @return
-     */
-    public int getCount()
-    {
-        return count;
-    }
-
-    /**
-     * Sets the "count" of wanted results. See {@link #UNDEFINED}.
-     * 
-     * @param count
-     */
-    public void setCount( int count )
-    {
-        if ( UNDEFINED != count && count < 1 )
-        {
-            throw new IllegalArgumentException( "Count cannot be less than 1!" 
);
-        }
-
-        this.count = count;
-    }
 }

Modified: 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchRequest.java
URL: 
http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchRequest.java?rev=1087301&r1=1087300&r2=1087301&view=diff
==============================================================================
--- 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchRequest.java
 (original)
+++ 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchRequest.java
 Thu Mar 31 13:52:09 2011
@@ -26,11 +26,23 @@ import org.apache.maven.index.context.In
 
 public class AbstractSearchRequest
 {
+    /**
+     * Constant for denoting undefined value for result count.
+     */
+    public static final int UNDEFINED = -1;
+
     private Query query;
 
     private List<IndexingContext> contexts;
 
     /**
+     * The maximum count of results expected to have delivered, actually count 
of items (AIs). More precisely, with this
+     * setting we LIMIT the number of Lucene Documents for total set of hits 
to be processed. If set to anything other
+     * than {@link #UNDEFINED}, search will stop upon processing this count of 
AIs (that correspond to Lucene Document).
+     */
+    private int count;
+
+    /**
      * The filter to be used while executing the search request.
      */
     private ArtifactInfoFilter artifactInfoFilter;
@@ -65,6 +77,8 @@ public class AbstractSearchRequest
         {
             getContexts().addAll( contexts );
         }
+
+        this.count = UNDEFINED;
     }
 
     public Query getQuery()
@@ -93,6 +107,31 @@ public class AbstractSearchRequest
     }
 
     /**
+     * Returns the "count" of wanted results. See {@link #UNDEFINED} and 
{@link #count}.
+     * 
+     * @return
+     */
+    public int getCount()
+    {
+        return count;
+    }
+
+    /**
+     * Sets the "count" of wanted results. See {@link #UNDEFINED} and {@link 
#count}.
+     * 
+     * @param count
+     */
+    public void setCount( int count )
+    {
+        if ( UNDEFINED != count && count < 1 )
+        {
+            throw new IllegalArgumentException( "Count cannot be less than 1!" 
);
+        }
+
+        this.count = count;
+    }
+
+    /**
      * Returns true if hits are limited.
      * 
      * @return

Modified: 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchResponse.java
URL: 
http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchResponse.java?rev=1087301&r1=1087300&r2=1087301&view=diff
==============================================================================
--- 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchResponse.java
 (original)
+++ 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchResponse.java
 Thu Mar 31 13:52:09 2011
@@ -60,7 +60,7 @@ public class AbstractSearchResponse
     /**
      * Returns the number of total hits found by this query (total number of 
potential hits as reported by Lucene
      * index). This is the number of existing AIs matching your query, and 
does not represent the count of hits
-     * delivered, which is returned by {@link #getHitsCount()}.
+     * delivered, which is returned by {@link #getReturnedHitsCount()}.
      * 
      * @return
      */

Modified: 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultIteratorResultSet.java
URL: 
http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultIteratorResultSet.java?rev=1087301&r1=1087300&r2=1087301&view=diff
==============================================================================
--- 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultIteratorResultSet.java
 (original)
+++ 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultIteratorResultSet.java
 Thu Mar 31 13:52:09 2011
@@ -109,7 +109,7 @@ public class DefaultIteratorResultSet
         this.from = request.getStart();
 
         this.count =
-            ( request.getCount() == AbstractSearchPageableRequest.UNDEFINED ? 
hits.scoreDocs.length : Math.min(
+            ( request.getCount() == AbstractSearchRequest.UNDEFINED ? 
hits.scoreDocs.length : Math.min(
                 request.getCount(), hits.scoreDocs.length ) );
 
         this.pointer = from;

Modified: 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultSearchEngine.java
URL: 
http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultSearchEngine.java?rev=1087301&r1=1087300&r2=1087301&view=diff
==============================================================================
--- 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultSearchEngine.java
 (original)
+++ 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultSearchEngine.java
 Thu Mar 31 13:52:09 2011
@@ -305,9 +305,9 @@ public class DefaultSearchEngine
                                                         final IndexSearcher 
indexSearcher, final Query query )
         throws IOException
     {
-        int topHitCount = getTopDocsCollectorHitNum( request, 
AbstractSearchPageableRequest.UNDEFINED );
+        int topHitCount = getTopDocsCollectorHitNum( request, 
AbstractSearchRequest.UNDEFINED );
 
-        if ( AbstractSearchPageableRequest.UNDEFINED != topHitCount )
+        if ( AbstractSearchRequest.UNDEFINED != topHitCount )
         {
             // count is set, simply just execute it as-is
             final TopScoreDocCollector hits = TopScoreDocCollector.create( 
topHitCount, true );
@@ -321,13 +321,11 @@ public class DefaultSearchEngine
             // set something reasonable as 1k
             topHitCount = 1000;
 
-            // count is not set, start with something reasonable as 1k
-            TopScoreDocCollector hits = TopScoreDocCollector.create( 
topHitCount, true );
-
             // perform search
+            TopScoreDocCollector hits = TopScoreDocCollector.create( 
topHitCount, true );
             indexSearcher.search( query, hits );
 
-            // check total hits against
+            // check total hits against, does it fit?
             if ( topHitCount < hits.getTotalHits() )
             {
                 topHitCount = hits.getTotalHits();
@@ -431,12 +429,20 @@ public class DefaultSearchEngine
         {
             final AbstractSearchPageableRequest prequest = 
(AbstractSearchPageableRequest) request;
 
-            if ( AbstractSearchPageableRequest.UNDEFINED != 
prequest.getCount() )
+            if ( AbstractSearchRequest.UNDEFINED != prequest.getCount() )
             {
                 // easy, user knows and tells us how many results he want
                 return prequest.getCount() + prequest.getStart();
             }
         }
+        else
+        {
+            if ( AbstractSearchRequest.UNDEFINED != request.getCount() )
+            {
+                // easy, user knows and tells us how many results he want
+                return request.getCount();
+            }
+        }
 
         return ceiling;
     }

Modified: 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/FlatSearchRequest.java
URL: 
http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/FlatSearchRequest.java?rev=1087301&r1=1087300&r2=1087301&view=diff
==============================================================================
--- 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/FlatSearchRequest.java
 (original)
+++ 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/FlatSearchRequest.java
 Thu Mar 31 13:52:09 2011
@@ -30,7 +30,7 @@ import org.apache.maven.index.context.In
  * @see NexusIndexer#searchFlat(FlatSearchRequest)
  */
 public class FlatSearchRequest
-    extends AbstractSearchPageableRequest
+    extends AbstractSearchRequest
 {
     private Comparator<ArtifactInfo> artifactInfoComparator;
 

Modified: 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/IteratorSearchRequest.java
URL: 
http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/IteratorSearchRequest.java?rev=1087301&r1=1087300&r2=1087301&view=diff
==============================================================================
--- 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/IteratorSearchRequest.java
 (original)
+++ 
maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/IteratorSearchRequest.java
 Thu Mar 31 13:52:09 2011
@@ -25,7 +25,8 @@ import org.apache.lucene.search.Query;
 import org.apache.maven.index.context.IndexingContext;
 
 /**
- * A Search Request that will perform the new "iterator-like" type of search.
+ * A Search Request that will perform the new "iterator-like" type of search. 
It is pageable as plus, but on downside,
+ * it's corresponding result does not result size in advance.
  * 
  * @author cstamas
  */

Modified: 
maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/AbstractRepoNexusIndexerTest.java
URL: 
http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/AbstractRepoNexusIndexerTest.java?rev=1087301&r1=1087300&r2=1087301&view=diff
==============================================================================
--- 
maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/AbstractRepoNexusIndexerTest.java
 (original)
+++ 
maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/AbstractRepoNexusIndexerTest.java
 Thu Mar 31 13:52:09 2011
@@ -80,7 +80,9 @@ public abstract class AbstractRepoNexusI
         FlatSearchRequest request =
             new FlatSearchRequest( nexusIndexer.constructQuery( 
MAVEN.GROUP_ID, "org", SearchType.SCORED ) );
 
-        request.setStart( 0 );
+        // See MINDEXER-22
+        // Flat search is not pageable
+        // request.setStart( 0 );
 
         request.setCount( 50 );
 
@@ -424,56 +426,58 @@ public abstract class AbstractRepoNexusI
     }
 
     // Paging is currently disabled
-    public void donttestPaging()
-        throws Exception
-    {
-        // we have 22 artifact for this search
-        int total = 22;
-
-        int pageSize = 4;
-
-        Query q = nexusIndexer.constructQuery( MAVEN.GROUP_ID, "org", 
SearchType.SCORED );
-
-        FlatSearchRequest req = new FlatSearchRequest( q );
-
-        // have page size of 4, that will make us 4 pages
-        req.setCount( pageSize );
-
-        List<ArtifactInfo> constructedPageList = new ArrayList<ArtifactInfo>();
-
-        int offset = 0;
-
-        while ( true )
-        {
-            req.setStart( offset );
-
-            FlatSearchResponse resp = nexusIndexer.searchFlat( req );
-
-            Collection<ArtifactInfo> p = resp.getResults();
-
-            assertEquals( p.toString(), total, resp.getTotalHits() );
-
-            assertEquals( Math.min( pageSize, total - offset ), p.size() );
-
-            constructedPageList.addAll( p );
-
-            offset += pageSize;
-
-            if ( offset > total )
-            {
-                break;
-            }
-        }
-
-        //
-        FlatSearchResponse response = nexusIndexer.searchFlat( new 
FlatSearchRequest( q ) );
-        Collection<ArtifactInfo> onePage = response.getResults();
-
-        List<ArtifactInfo> onePageList = new ArrayList<ArtifactInfo>( onePage 
);
-
-        // onePage and constructedPage should hold equal elems in the same 
order
-        assertTrue( resultsAreEqual( onePageList, constructedPageList ) );
-    }
+    // See MINDEXER-22
+    // Flat search is not pageable
+//    public void donttestPaging()
+//        throws Exception
+//    {
+//        // we have 22 artifact for this search
+//        int total = 22;
+//
+//        int pageSize = 4;
+//
+//        Query q = nexusIndexer.constructQuery( MAVEN.GROUP_ID, "org", 
SearchType.SCORED );
+//
+//        FlatSearchRequest req = new FlatSearchRequest( q );
+//
+//        // have page size of 4, that will make us 4 pages
+//        req.setCount( pageSize );
+//
+//        List<ArtifactInfo> constructedPageList = new 
ArrayList<ArtifactInfo>();
+//
+//        int offset = 0;
+//
+//        while ( true )
+//        {
+//            req.setStart( offset );
+//
+//            FlatSearchResponse resp = nexusIndexer.searchFlat( req );
+//
+//            Collection<ArtifactInfo> p = resp.getResults();
+//
+//            assertEquals( p.toString(), total, resp.getTotalHits() );
+//
+//            assertEquals( Math.min( pageSize, total - offset ), p.size() );
+//
+//            constructedPageList.addAll( p );
+//
+//            offset += pageSize;
+//
+//            if ( offset > total )
+//            {
+//                break;
+//            }
+//        }
+//
+//        //
+//        FlatSearchResponse response = nexusIndexer.searchFlat( new 
FlatSearchRequest( q ) );
+//        Collection<ArtifactInfo> onePage = response.getResults();
+//
+//        List<ArtifactInfo> onePageList = new ArrayList<ArtifactInfo>( 
onePage );
+//
+//        // onePage and constructedPage should hold equal elems in the same 
order
+//        assertTrue( resultsAreEqual( onePageList, constructedPageList ) );
+//    }
 
     public void testPurge()
         throws Exception

Modified: 
maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Index20081108RegressionTest.java
URL: 
http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Index20081108RegressionTest.java?rev=1087301&r1=1087300&r2=1087301&view=diff
==============================================================================
--- 
maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Index20081108RegressionTest.java
 (original)
+++ 
maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Index20081108RegressionTest.java
 Thu Mar 31 13:52:09 2011
@@ -151,7 +151,9 @@ public class Index20081108RegressionTest
     {
         FlatSearchRequest request = new FlatSearchRequest( 
nexusIndexer.constructQuery( MAVEN.GROUP_ID, "org", SearchType.SCORED ) );
 
-        request.setStart( 0 );
+        // See MINDEXER-22
+        // Flat search is not pageable
+        // request.setStart( 0 );
 
         request.setCount( 50 );
 
@@ -206,57 +208,59 @@ public class Index20081108RegressionTest
         }
     }
 
-    @Override
-    public void donttestPaging()
-        throws Exception
-    {
-        // we have 15 artifact for this search
-        int total = 15;
-
-        int pageSize = 4;
-
-        Query q = nexusIndexer.constructQuery( MAVEN.GROUP_ID, "org", 
SearchType.SCORED );
-
-        FlatSearchRequest req = new FlatSearchRequest( q );
-
-        // have page size of 4, that will make us 4 pages
-        req.setCount( pageSize );
-
-        List<ArtifactInfo> constructedPageList = new ArrayList<ArtifactInfo>();
-
-        int offset = 0;
-
-        while ( true )
-        {
-            req.setStart( offset );
-
-            FlatSearchResponse resp = nexusIndexer.searchFlat( req );
-
-            Collection<ArtifactInfo> p = resp.getResults();
-
-            assertEquals( p.toString(), total, resp.getTotalHits() );
-
-            assertEquals( Math.min( pageSize, total - offset ), p.size() );
-
-            constructedPageList.addAll( p );
-
-            offset += pageSize;
-
-            if ( offset > total )
-            {
-                break;
-            }
-        }
-
-        //
-        FlatSearchResponse response = nexusIndexer.searchFlat( new 
FlatSearchRequest( q ) );
-        Collection<ArtifactInfo> onePage = response.getResults();
-
-        List<ArtifactInfo> onePageList = new ArrayList<ArtifactInfo>( onePage 
);
-
-        // onePage and constructedPage should hold equal elems in the same 
order
-        assertTrue( resultsAreEqual( onePageList, constructedPageList ) );
-    }
+    // See MINDEXER-22
+    // Flat search is not pageable
+//    @Override
+//    public void donttestPaging()
+//        throws Exception
+//    {
+//        // we have 15 artifact for this search
+//        int total = 15;
+//
+//        int pageSize = 4;
+//
+//        Query q = nexusIndexer.constructQuery( MAVEN.GROUP_ID, "org", 
SearchType.SCORED );
+//
+//        FlatSearchRequest req = new FlatSearchRequest( q );
+//
+//        // have page size of 4, that will make us 4 pages
+//        req.setCount( pageSize );
+//
+//        List<ArtifactInfo> constructedPageList = new 
ArrayList<ArtifactInfo>();
+//
+//        int offset = 0;
+//
+//        while ( true )
+//        {
+//            req.setStart( offset );
+//
+//            FlatSearchResponse resp = nexusIndexer.searchFlat( req );
+//
+//            Collection<ArtifactInfo> p = resp.getResults();
+//
+//            assertEquals( p.toString(), total, resp.getTotalHits() );
+//
+//            assertEquals( Math.min( pageSize, total - offset ), p.size() );
+//
+//            constructedPageList.addAll( p );
+//
+//            offset += pageSize;
+//
+//            if ( offset > total )
+//            {
+//                break;
+//            }
+//        }
+//
+//        //
+//        FlatSearchResponse response = nexusIndexer.searchFlat( new 
FlatSearchRequest( q ) );
+//        Collection<ArtifactInfo> onePage = response.getResults();
+//
+//        List<ArtifactInfo> onePageList = new ArrayList<ArtifactInfo>( 
onePage );
+//
+//        // onePage and constructedPage should hold equal elems in the same 
order
+//        assertTrue( resultsAreEqual( onePageList, constructedPageList ) );
+//    }
 
     @Override
     public void testPurge()


Reply via email to