You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2011/03/31 15:51:13 UTC

svn commit: r1087297 - in /maven/indexer/trunk/indexer-core/src: main/java/org/apache/maven/index/ main/java/org/apache/maven/index/archetype/ main/java/org/apache/maven/index/treeview/ test/java/org/apache/maven/index/

Author: cstamas
Date: Thu Mar 31 13:51:12 2011
New Revision: 1087297

URL: http://svn.apache.org/viewvc?rev=1087297&view=rev
Log:
MINDEXER-14: fix.

* HitLimit as "feature" dropped. API calls in place but deprecated and return always "not-hit-limited" values.
* To limit result set size, use Count. Works on IteratorSearch and FlatSearch, but not on GroupedSearch (TODO)
* smaller fixes regarding API deprecation and better method namings

Added:
    maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchPageableRequest.java   (with props)
    maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Mindexer14HitLimitTest.java   (with props)
Modified:
    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/DefaultNexusIndexer.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/FlatSearchResponse.java
    maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/GroupedSearchRequest.java
    maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/GroupedSearchResponse.java
    maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/IteratorSearchRequest.java
    maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/IteratorSearchResponse.java
    maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/archetype/NexusArchetypeDataSource.java
    maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/treeview/DefaultIndexTreeView.java
    maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Nexus3177HitLimitChecks.java

Added: 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=1087297&view=auto
==============================================================================
--- maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchPageableRequest.java (added)
+++ maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchPageableRequest.java Thu Mar 31 13:51:12 2011
@@ -0,0 +1,94 @@
+package org.apache.maven.index;
+
+import java.util.List;
+
+import org.apache.lucene.search.Query;
+import org.apache.maven.index.context.IndexingContext;
+
+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 )
+    {
+        super( query, contexts );
+
+        this.start = 0;
+
+        this.count = UNDEFINED;
+    }
+
+    /**
+     * Returns the "start" of wanted results calculated from result set window. Simply, the count of documents to skip.
+     * 
+     * @return
+     */
+    public int getStart()
+    {
+        return start;
+    }
+
+    /**
+     * Sets the "start" of wanted results calculated from result set window. Simply, the count of documents to skip.
+     * 
+     * @param start
+     */
+    public void setStart( int start )
+    {
+        if ( start < 0 )
+        {
+            throw new IllegalArgumentException( "Start cannot be less than 0!" );
+        }
+
+        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;
+    }
+}

Propchange: maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchPageableRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/AbstractSearchPageableRequest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

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=1087297&r1=1087296&r2=1087297&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:51:12 2011
@@ -26,29 +26,10 @@ import org.apache.maven.index.context.In
 
 public class AbstractSearchRequest
 {
-    public static final int UNDEFINED = -1;
-
-    public static final int UNDEFINED_HIT_LIMIT = 1000;
-
     private Query query;
 
     private List<IndexingContext> contexts;
 
-    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;
-
-    /**
-     * The limit size, the maximum possible count of items in response. Different than count above, since if this is
-     * set, and the search funds more then this number, the response will be _empty_ and a flag will be set on response
-     * about this.
-     */
-    private int resultHitLimit;
-
     /**
      * The filter to be used while executing the search request.
      */
@@ -84,13 +65,6 @@ public class AbstractSearchRequest
         {
             getContexts().addAll( contexts );
         }
-
-        this.start = UNDEFINED;
-
-        this.count = UNDEFINED;
-
-        // TODO: rethink use cases and find better way to provide this value!
-        this.resultHitLimit = UNDEFINED_HIT_LIMIT;
     }
 
     public Query getQuery()
@@ -118,51 +92,40 @@ public class AbstractSearchRequest
         this.contexts = contexts;
     }
 
-    public boolean isHitLimited()
-    {
-        return getResultHitLimit() != UNDEFINED_HIT_LIMIT;
-    }
-
-    public int getStart()
-    {
-        return start;
-    }
-
-    public void setStart( int start )
-    {
-        this.start = start;
-    }
-
-    public int getCount()
-    {
-        return count;
-    }
-
-    @Deprecated
-    public int getAiCount()
-    {
-        return getCount();
-    }
-
-    public void setCount( int count )
-    {
-        this.count = count;
-    }
-
-    @Deprecated
-    public void setAiCount( int count )
+    /**
+     * Returns true if hits are limited.
+     * 
+     * @return
+     * @deprecated always returns false, since 4.1.0 there is no notion of hit limit
+     * @see http://jira.codehaus.org/browse/MINDEXER-14
+     */
+    public boolean _isHitLimited()
     {
-        setCount( count );
+        return false;
     }
 
-    public int getResultHitLimit()
+    /**
+     * Gets the hit limit. Since 4.1.0 does nothing, always returns 0.
+     * 
+     * @return
+     * @deprecated always returns false, since 4.1.0 there is no notion of hit limit
+     * @see http://jira.codehaus.org/browse/MINDEXER-14
+     */
+    public int _getResultHitLimit()
     {
-        return resultHitLimit;
+        return -1;
     }
 
-    public void setResultHitLimit( int resultHitLimit )
+    /**
+     * Sets the hit limit. Since 4.1.0 does nothing.
+     * 
+     * @param resultHitLimit
+     * @deprecated always returns false, since 4.1.0 there is no notion of hit limit
+     * @see http://jira.codehaus.org/browse/MINDEXER-14
+     */
+    public void _setResultHitLimit( int resultHitLimit )
     {
-        this.resultHitLimit = resultHitLimit;
+        // noop
     }
 
     public ArtifactInfoFilter getArtifactInfoFilter()

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=1087297&r1=1087296&r2=1087297&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:51:12 2011
@@ -18,21 +18,27 @@
  */
 package org.apache.maven.index;
 
+import java.io.Closeable;
+import java.io.IOException;
+
 import org.apache.lucene.search.Query;
 
 public class AbstractSearchResponse
+    implements Closeable
 {
-    public static int LIMIT_EXCEEDED = -1;
-
     private final Query query;
 
-    private final int totalHits;
+    private final int totalHitsCount;
 
-    public AbstractSearchResponse( Query query, int totalHits )
+    private final int returnedHitsCount;
+
+    public AbstractSearchResponse( final Query query, final int totalHitsCount, final int returnedHitsCount )
     {
         this.query = query;
 
-        this.totalHits = totalHits;
+        this.totalHitsCount = totalHitsCount;
+
+        this.returnedHitsCount = returnedHitsCount;
     }
 
     public Query getQuery()
@@ -40,13 +46,63 @@ public class AbstractSearchResponse
         return query;
     }
 
+    /**
+     * Returns the number of total hits found. This may be different that actual hits returned (is usually more).
+     * 
+     * @return
+     * @deprecated use {@link #getTotalHitsCount()} instead.
+     */
     public int getTotalHits()
     {
-        return totalHits;
+        return getTotalHitsCount();
+    }
+
+    /**
+     * 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()}.
+     * 
+     * @return
+     */
+    public int getTotalHitsCount()
+    {
+        return totalHitsCount;
     }
 
+    /**
+     * Returns the number of hits returned by this search response. This number is affected by various input parameters
+     * (like count set on request) and filtering, paging, etc. Warning: this number's meaning depends on actual search
+     * response (for flat response number of actual AIs, for grouped response number of actual groups), and also, might
+     * be not precise at all (see {@link IteratorSearchResponse}).
+     * 
+     * @return
+     */
+    public int getReturnedHitsCount()
+    {
+        return returnedHitsCount;
+    }
+
+    /**
+     * Returns true if hit limit exceeded.
+     * 
+     * @return
+     * @deprecated always returns false, since 4.1.0 there is no notion of hit limit
+     * @see http://jira.codehaus.org/browse/MINDEXER-14
+     */
     public boolean isHitLimitExceeded()
     {
-        return getTotalHits() == LIMIT_EXCEEDED;
+        return false;
+    }
+
+    /**
+     * Frees any resource associated with this response. Should be called as last method on this response, when it's not
+     * used anymore.
+     * 
+     * @throws IOException
+     */
+    public void close()
+        throws IOException
+    {
+        // noop
     }
 }

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=1087297&r1=1087296&r2=1087297&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:51:12 2011
@@ -49,15 +49,6 @@ import org.apache.maven.index.creator.Ja
 public class DefaultIteratorResultSet
     implements IteratorResultSet
 {
-    /**
-     * This is "hard limit", a possible maximum count of hits that Nexus Indexer will _serve_ even if asked for more.
-     * Thus, it prevents some malicious attacks like forcing Nexus (or underlying IO to it's knees) but asking for huuge
-     * count of hits. If anyone needs more than 1000 of hits, it should download the index and use Indexer API instead
-     * to perform searches locally.
-     */
-    // TODO: inspect is this limit actually needed or not.
-    private static final int HARD_HIT_COUNT_LIMIT = Integer.MAX_VALUE;
-
     private final IteratorSearchRequest searchRequest;
 
     private final IndexSearcher indexSearcher;
@@ -115,11 +106,11 @@ public class DefaultIteratorResultSet
 
         this.hits = hits;
 
-        this.from = ( request.getStart() == AbstractSearchRequest.UNDEFINED ? 0 : request.getStart() );
+        this.from = request.getStart();
 
         this.count =
-            ( request.getCount() == AbstractSearchRequest.UNDEFINED ? HARD_HIT_COUNT_LIMIT : Math.min(
-                request.getCount(), HARD_HIT_COUNT_LIMIT ) );
+            ( request.getCount() == AbstractSearchPageableRequest.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/DefaultNexusIndexer.java
URL: http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultNexusIndexer.java?rev=1087297&r1=1087296&r2=1087297&view=diff
==============================================================================
--- maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultNexusIndexer.java (original)
+++ maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/DefaultNexusIndexer.java Thu Mar 31 13:51:12 2011
@@ -60,7 +60,6 @@ public class DefaultNexusIndexer
     extends AbstractLogEnabled
     implements NexusIndexer
 {
-
     @Requirement
     private Scanner scanner;
 
@@ -437,6 +436,7 @@ public class DefaultNexusIndexer
     // Query construction
     // ----------------------------------------------------------------------------
 
+    @Deprecated
     public Query constructQuery( Field field, String query, SearchType type )
         throws IllegalArgumentException
     {
@@ -528,7 +528,7 @@ public class DefaultNexusIndexer
 
         try
         {
-            ArrayList<ArtifactInfo> ais = new ArrayList<ArtifactInfo>( result.getTotalHits() );
+            ArrayList<ArtifactInfo> ais = new ArrayList<ArtifactInfo>( result.getTotalHitsCount() );
 
             for ( ArtifactInfo ai : result )
             {

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=1087297&r1=1087296&r2=1087297&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:51:12 2011
@@ -20,8 +20,10 @@ package org.apache.maven.index;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
@@ -56,7 +58,8 @@ public class DefaultSearchEngine
                                          IndexingContext indexingContext, Query query )
         throws IOException
     {
-        return searchFlatPaged( new FlatSearchRequest( query, artifactInfoComparator, indexingContext ) ).getResults();
+        return searchFlatPaged( new FlatSearchRequest( query, artifactInfoComparator, indexingContext ),
+            Arrays.asList( indexingContext ), true ).getResults();
     }
 
     @Deprecated
@@ -67,22 +70,6 @@ public class DefaultSearchEngine
         return searchFlatPaged( new FlatSearchRequest( query, artifactInfoComparator ), indexingContexts ).getResults();
     }
 
-    public FlatSearchResponse searchFlatPaged( FlatSearchRequest request )
-        throws IOException
-    {
-        TreeSet<ArtifactInfo> result = new TreeSet<ArtifactInfo>( request.getArtifactInfoComparator() );
-
-        int totalHits = 0;
-
-        for ( IndexingContext context : request.getContexts() )
-        {
-            totalHits +=
-                searchFlat( request, result, context, request.getQuery(), request.getStart(), request.getCount() );
-        }
-
-        return new FlatSearchResponse( request.getQuery(), totalHits, result );
-    }
-
     public FlatSearchResponse searchFlatPaged( FlatSearchRequest request, Collection<IndexingContext> indexingContexts )
         throws IOException
     {
@@ -102,35 +89,25 @@ public class DefaultSearchEngine
     {
         TreeSet<ArtifactInfo> result = new TreeSet<ArtifactInfo>( request.getArtifactInfoComparator() );
 
-        int totalHits = 0;
+        List<IndexingContext> contexts = getParticipatingContexts( indexingContexts, ignoreContext );
 
-        for ( IndexingContext ctx : indexingContexts )
+        try
         {
-            if ( ignoreContext || ctx.isSearchable() )
+            for ( IndexingContext ctx : contexts )
             {
-                int hitCount =
-                    searchFlat( request, result, ctx, request.getQuery(), request.getStart(), request.getCount() );
-
-                if ( hitCount == AbstractSearchResponse.LIMIT_EXCEEDED )
-                {
-                    totalHits = hitCount;
-                }
-                else
-                {
-                    totalHits += hitCount;
-                }
+                ctx.lock();
             }
 
-            if ( request.isHitLimited() && ( totalHits > request.getResultHitLimit() )
-                || totalHits == AbstractSearchResponse.LIMIT_EXCEEDED )
+            return new FlatSearchResponse( request.getQuery(), searchFlat( request, result, contexts,
+                request.getQuery() ), result );
+        }
+        finally
+        {
+            for ( IndexingContext ctx : contexts )
             {
-                totalHits = AbstractSearchResponse.LIMIT_EXCEEDED;
-                result = new TreeSet<ArtifactInfo>( request.getArtifactInfoComparator() );
-                break;
+                ctx.unlock();
             }
         }
-
-        return new FlatSearchResponse( request.getQuery(), totalHits, result );
     }
 
     public GroupedSearchResponse searchGrouped( GroupedSearchRequest request,
@@ -154,45 +131,37 @@ public class DefaultSearchEngine
         TreeMap<String, ArtifactInfoGroup> result =
             new TreeMap<String, ArtifactInfoGroup>( request.getGroupKeyComparator() );
 
-        int totalHits = 0;
+        List<IndexingContext> contexts = getParticipatingContexts( indexingContexts, ignoreContext );
 
-        for ( IndexingContext ctx : indexingContexts )
+        try
         {
-            if ( ignoreContext || ctx.isSearchable() )
+            for ( IndexingContext ctx : contexts )
             {
-                int hitCount = searchGrouped( request, result, request.getGrouping(), ctx, request.getQuery() );
-
-                if ( hitCount == AbstractSearchResponse.LIMIT_EXCEEDED )
-                {
-                    totalHits = hitCount;
-                }
-                else
-                {
-                    totalHits += hitCount;
-                }
+                ctx.lock();
             }
 
-            if ( request.isHitLimited() && ( totalHits > request.getResultHitLimit() )
-                || totalHits == AbstractSearchResponse.LIMIT_EXCEEDED )
+            return new GroupedSearchResponse( request.getQuery(), searchGrouped( request, result,
+                request.getGrouping(), contexts, request.getQuery() ), result );
+
+        }
+        finally
+        {
+            for ( IndexingContext ctx : contexts )
             {
-                totalHits = AbstractSearchResponse.LIMIT_EXCEEDED;
-                result = new TreeMap<String, ArtifactInfoGroup>( request.getGroupKeyComparator() );
-                break;
+                ctx.unlock();
             }
         }
-
-        return new GroupedSearchResponse( request.getQuery(), totalHits, result );
     }
 
-    protected int searchFlat( AbstractSearchRequest req, Collection<ArtifactInfo> result, IndexingContext context,
-                              Query query, int from, int aiCount )
+    protected int searchFlat( FlatSearchRequest req, Collection<ArtifactInfo> result,
+                              List<IndexingContext> participatingContexts, Query query )
         throws IOException
     {
-        context.lock();
+        int hitCount = 0;
 
-        try
+        for ( IndexingContext context : participatingContexts )
         {
-            TopScoreDocCollector collector = TopScoreDocCollector.create( req.getResultHitLimit(), true );
+            TopScoreDocCollector collector = TopScoreDocCollector.create( getTopDocsCollectorHitNum( req ), true );
 
             context.getIndexSearcher().search( query, collector );
 
@@ -201,14 +170,9 @@ public class DefaultSearchEngine
                 return 0;
             }
 
-            if ( req.isHitLimited() && collector.getTotalHits() > req.getResultHitLimit() )
-            {
-                return AbstractSearchResponse.LIMIT_EXCEEDED;
-            }
-
             ScoreDoc[] scoreDocs = collector.topDocs().scoreDocs;
 
-            int hitCount = scoreDocs.length;
+            hitCount += collector.getTotalHits();
 
             int start = 0; // from == FlatSearchRequest.UNDEFINED ? 0 : from;
 
@@ -226,45 +190,30 @@ public class DefaultSearchEngine
                     artifactInfo.context = context.getId();
 
                     result.add( artifactInfo );
-
-                    if ( req.isHitLimited() && result.size() > req.getResultHitLimit() )
-                    {
-                        // we hit limit, back out now !!
-                        return AbstractSearchResponse.LIMIT_EXCEEDED;
-                    }
                 }
             }
-
-            return hitCount;
-        }
-        finally
-        {
-            context.unlock();
         }
+
+        return hitCount;
     }
 
-    protected int searchGrouped( AbstractSearchRequest req, Map<String, ArtifactInfoGroup> result, Grouping grouping,
-                                 IndexingContext context, Query query )
+    protected int searchGrouped( GroupedSearchRequest req, Map<String, ArtifactInfoGroup> result, Grouping grouping,
+                                 List<IndexingContext> participatingContexts, Query query )
         throws IOException
     {
-        context.lock();
+        int hitCount = 0;
 
-        try
+        for ( IndexingContext context : participatingContexts )
         {
-            TopScoreDocCollector collector = TopScoreDocCollector.create( req.getResultHitLimit(), true );
+            TopScoreDocCollector collector = TopScoreDocCollector.create( getTopDocsCollectorHitNum( req ), true );
 
             context.getIndexSearcher().search( query, collector );
 
             if ( collector.getTotalHits() > 0 )
             {
-                if ( req.isHitLimited() && collector.getTotalHits() > req.getResultHitLimit() )
-                {
-                    return AbstractSearchResponse.LIMIT_EXCEEDED;
-                }
-
                 ScoreDoc[] scoreDocs = collector.topDocs().scoreDocs;
 
-                int hitCount = scoreDocs.length;
+                hitCount += collector.getTotalHits();
 
                 for ( int i = 0; i < scoreDocs.length; i++ )
                 {
@@ -285,18 +234,10 @@ public class DefaultSearchEngine
                         }
                     }
                 }
-
-                return hitCount;
-            }
-            else
-            {
-                return 0;
             }
         }
-        finally
-        {
-            context.unlock();
-        }
+
+        return hitCount;
     }
 
     // == NG Search
@@ -320,63 +261,108 @@ public class DefaultSearchEngine
                                                         boolean ignoreContext )
         throws IOException
     {
-        // manage defaults!
-        if ( request.getStart() < 0 )
-        {
-            request.setStart( IteratorSearchRequest.UNDEFINED );
-        }
-        if ( request.getCount() < 0 )
-        {
-            request.setCount( IteratorSearchRequest.UNDEFINED );
-        }
-
         try
         {
-            // to not change the API all away, but we need stable ordering here
-            // filter for those 1st, that take part in here
-            ArrayList<IndexingContext> contexts = new ArrayList<IndexingContext>( indexingContexts.size() );
+            List<IndexingContext> contexts = getParticipatingContexts( indexingContexts, ignoreContext );
 
+            final IndexReader multiReader = getMergedIndexReader( indexingContexts, ignoreContext );
+
+            IndexSearcher indexSearcher = new NexusIndexSearcher( multiReader );
+
+            // NEXUS-3482 made us to NOT use reverse ordering (it is a fix I wanted to implement, but user contributed
+            // patch did come in faster! -- Thanks)
+            TopScoreDocCollector hits = TopScoreDocCollector.create( getTopDocsCollectorHitNum( request ), true );
+
+            indexSearcher.search( request.getQuery(), hits );
+
+            return new IteratorSearchResponse( request.getQuery(), hits.getTotalHits(), new DefaultIteratorResultSet(
+                request, indexSearcher, contexts, hits.topDocs() ) );
+        }
+        catch ( Throwable e )
+        {
+            // perform cleaup, otherwise DefaultIteratorResultSet will do it
             for ( IndexingContext ctx : indexingContexts )
             {
                 if ( ignoreContext || ctx.isSearchable() )
                 {
-                    contexts.add( ctx );
-
-                    ctx.lock();
+                    ctx.unlock();
                 }
             }
 
-            ArrayList<IndexReader> contextsToSearch = new ArrayList<IndexReader>( contexts.size() );
+            if ( e instanceof IOException )
+            {
+                throw (IOException) e;
+            }
+            else
+            {
+                // wrap it
+                IOException ex = new IOException( e.getMessage() );
+                ex.initCause( e );
+                throw ex;
+            }
+        }
+    }
+
+    // ==
+
+    /**
+     * Returns the list of participating contexts. Does not locks them, just builds a list of them.
+     */
+    protected List<IndexingContext> getParticipatingContexts( final Collection<IndexingContext> indexingContexts,
+                                                              final boolean ignoreContext )
+    {
+        // to not change the API all away, but we need stable ordering here
+        // filter for those 1st, that take part in here
+        final ArrayList<IndexingContext> contexts = new ArrayList<IndexingContext>( indexingContexts.size() );
+
+        for ( IndexingContext ctx : indexingContexts )
+        {
+            if ( ignoreContext || ctx.isSearchable() )
+            {
+                contexts.add( ctx );
+            }
+        }
+
+        return contexts;
+    }
+
+    /**
+     * Locks down participating contexts, and returns a "merged" reader of them. In case of error, unlocks as part of
+     * cleanup and re-throws exception. Without error, it is the duty of caller to unlock contexts!
+     * 
+     * @param indexingContexts
+     * @param ignoreContext
+     * @return
+     * @throws IOException
+     */
+    protected IndexReader getMergedIndexReader( final Collection<IndexingContext> indexingContexts,
+                                                final boolean ignoreContext )
+        throws IOException
+    {
+        final List<IndexingContext> contexts = getParticipatingContexts( indexingContexts, ignoreContext );
+
+        try
+        {
+            final ArrayList<IndexReader> contextsToSearch = new ArrayList<IndexReader>( contexts.size() );
 
             for ( IndexingContext ctx : contexts )
             {
+                ctx.lock();
+
                 contextsToSearch.add( ctx.getIndexReader() );
             }
 
             MultiReader multiReader =
                 new MultiReader( contextsToSearch.toArray( new IndexReader[contextsToSearch.size()] ) );
 
-            IndexSearcher indexSearcher = new NexusIndexSearcher( multiReader );
-
-            // NEXUS-3482 made us to NOT use reverse ordering (it is a fix I wanted to implement, but user contributed
-            // patch
-            // did come in faster! -- Thanks)
-            TopScoreDocCollector hits = TopScoreDocCollector.create( request.getResultHitLimit(), true );
-
-            indexSearcher.search( request.getQuery(), hits );
-
-            return new IteratorSearchResponse( request.getQuery(), hits.getTotalHits(), new DefaultIteratorResultSet(
-                request, indexSearcher, contexts, hits.topDocs() ) );
+            return multiReader;
         }
         catch ( Throwable e )
         {
             // perform cleaup, otherwise DefaultIteratorResultSet will do it
-            for ( IndexingContext ctx : indexingContexts )
+            for ( IndexingContext ctx : contexts )
             {
-                if ( ignoreContext || ctx.isSearchable() )
-                {
-                    ctx.unlock();
-                }
+                ctx.unlock();
             }
 
             if ( e instanceof IOException )
@@ -392,4 +378,21 @@ public class DefaultSearchEngine
             }
         }
     }
+
+    protected int getTopDocsCollectorHitNum( AbstractSearchRequest request )
+    {
+        if ( request instanceof AbstractSearchPageableRequest )
+        {
+            final AbstractSearchPageableRequest prequest = (AbstractSearchPageableRequest) request;
+
+            if ( AbstractSearchPageableRequest.UNDEFINED != prequest.getCount() )
+            {
+                // easy, user knows how many results he want
+                return prequest.getCount() + prequest.getStart();
+            }
+        }
+
+        // TODO: ???
+        return 10000;
+    }
 }

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=1087297&r1=1087296&r2=1087297&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:51:12 2011
@@ -30,7 +30,7 @@ import org.apache.maven.index.context.In
  * @see NexusIndexer#searchFlat(FlatSearchRequest)
  */
 public class FlatSearchRequest
-    extends AbstractSearchRequest
+    extends AbstractSearchPageableRequest
 {
     private Comparator<ArtifactInfo> artifactInfoComparator;
 

Modified: maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/FlatSearchResponse.java
URL: http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/FlatSearchResponse.java?rev=1087297&r1=1087296&r2=1087297&view=diff
==============================================================================
--- maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/FlatSearchResponse.java (original)
+++ maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/FlatSearchResponse.java Thu Mar 31 13:51:12 2011
@@ -34,7 +34,7 @@ public class FlatSearchResponse
 
     public FlatSearchResponse( Query query, int totalHits, Set<ArtifactInfo> results )
     {
-        super( query, totalHits );
+        super( query, totalHits, results.size() );
 
         this.results = results;
     }

Modified: maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/GroupedSearchRequest.java
URL: http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/GroupedSearchRequest.java?rev=1087297&r1=1087296&r2=1087297&view=diff
==============================================================================
--- maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/GroupedSearchRequest.java (original)
+++ maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/GroupedSearchRequest.java Thu Mar 31 13:51:12 2011
@@ -25,7 +25,8 @@ import org.apache.lucene.search.Query;
 import org.apache.maven.index.context.IndexingContext;
 
 /**
- * A grouped search request.
+ * A grouped search request. This kinds of request is not pageable, since order of incoming hits are not defined, hence
+ * paging between Document hits makes no sense, would produce unpredictable (and probably not meaningful) results.
  * 
  * @see NexusIndexer#searchGrouped(GroupedSearchRequest)
  */

Modified: maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/GroupedSearchResponse.java
URL: http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/GroupedSearchResponse.java?rev=1087297&r1=1087296&r2=1087297&view=diff
==============================================================================
--- maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/GroupedSearchResponse.java (original)
+++ maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/GroupedSearchResponse.java Thu Mar 31 13:51:12 2011
@@ -23,7 +23,7 @@ import java.util.Map;
 import org.apache.lucene.search.Query;
 
 /**
- * A grouped search response.
+ * A grouped search response. For hitsCount, it reports the number of groups found.
  * 
  * @see NexusIndexer#searchGrouped(GroupedSearchRequest)
  */
@@ -34,7 +34,7 @@ public class GroupedSearchResponse
 
     public GroupedSearchResponse( Query query, int totalHits, Map<String, ArtifactInfoGroup> results )
     {
-        super( query, totalHits );
+        super( query, totalHits, results.size() );
 
         this.results = results;
     }

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=1087297&r1=1087296&r2=1087297&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:51:12 2011
@@ -30,7 +30,7 @@ import org.apache.maven.index.context.In
  * @author cstamas
  */
 public class IteratorSearchRequest
-    extends AbstractSearchRequest
+    extends AbstractSearchPageableRequest
 {
     public IteratorSearchRequest( Query query )
     {

Modified: maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/IteratorSearchResponse.java
URL: http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/IteratorSearchResponse.java?rev=1087297&r1=1087296&r2=1087297&view=diff
==============================================================================
--- maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/IteratorSearchResponse.java (original)
+++ maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/IteratorSearchResponse.java Thu Mar 31 13:51:12 2011
@@ -25,8 +25,9 @@ import java.util.Iterator;
 import org.apache.lucene.search.Query;
 
 /**
- * A Search Response for the "iterator-like" search request. The totalHits reports _total_ hits found on index, even if
- * the set of ArtifactInfos are usually limited!
+ * A Search Response for the "iterator-like" search request. The totalHitsCount reports <em>total</em> hits found on
+ * index, even if the set of ArtifactInfos are usually limited! On the flipside, the hitsCount is actually unknown,
+ * since this instance performs filtering on the fly, hence it does not know how many hits it will return ahead of time.
  * 
  * @author cstamas
  */
@@ -38,7 +39,7 @@ public class IteratorSearchResponse
 
     public IteratorSearchResponse( Query query, int totalHits, IteratorResultSet results )
     {
-        super( query, totalHits );
+        super( query, totalHits, -1 );
 
         this.results = results;
     }
@@ -53,6 +54,7 @@ public class IteratorSearchResponse
         return getResults();
     }
 
+    @Override
     public void close()
         throws IOException
     {
@@ -104,10 +106,8 @@ public class IteratorSearchResponse
         }
     };
 
-    public static final IteratorSearchResponse EMPTY_ITERATOR_SEARCH_RESPONSE = new IteratorSearchResponse( null, 0,
-        EMPTY_ITERATOR_RESULT_SET );
-
-    public static final IteratorSearchResponse TOO_MANY_HITS_ITERATOR_SEARCH_RESPONSE = new IteratorSearchResponse(
-        null, LIMIT_EXCEEDED, EMPTY_ITERATOR_RESULT_SET );
-
+    public static final IteratorSearchResponse empty( final Query q )
+    {
+        return new IteratorSearchResponse( q, 0, EMPTY_ITERATOR_RESULT_SET );
+    }
 }

Modified: maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/archetype/NexusArchetypeDataSource.java
URL: http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/archetype/NexusArchetypeDataSource.java?rev=1087297&r1=1087296&r2=1087297&view=diff
==============================================================================
--- maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/archetype/NexusArchetypeDataSource.java (original)
+++ maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/archetype/NexusArchetypeDataSource.java Thu Mar 31 13:51:12 2011
@@ -32,8 +32,8 @@ import org.apache.maven.index.FlatSearch
 import org.apache.maven.index.FlatSearchResponse;
 import org.apache.maven.index.MAVEN;
 import org.apache.maven.index.NexusIndexer;
-import org.apache.maven.index.SearchType;
 import org.apache.maven.index.context.IndexingContext;
+import org.apache.maven.index.expr.SourcedSearchExpression;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
@@ -58,7 +58,7 @@ public class NexusArchetypeDataSource
         {
             Map<String, String> repositories = getRepositoryMap();
 
-            Query pq = indexer.constructQuery( MAVEN.PACKAGING, "maven-archetype", SearchType.EXACT );
+            Query pq = indexer.constructQuery( MAVEN.PACKAGING, new SourcedSearchExpression( "maven-archetype" ) );
 
             FlatSearchRequest searchRequest = new FlatSearchRequest( pq );
 

Modified: maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/treeview/DefaultIndexTreeView.java
URL: http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/treeview/DefaultIndexTreeView.java?rev=1087297&r1=1087296&r2=1087297&view=diff
==============================================================================
--- maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/treeview/DefaultIndexTreeView.java (original)
+++ maven/indexer/trunk/indexer-core/src/main/java/org/apache/maven/index/treeview/DefaultIndexTreeView.java Thu Mar 31 13:51:12 2011
@@ -33,7 +33,7 @@ import org.apache.maven.index.IteratorSe
 import org.apache.maven.index.IteratorSearchResponse;
 import org.apache.maven.index.MAVEN;
 import org.apache.maven.index.NexusIndexer;
-import org.apache.maven.index.SearchType;
+import org.apache.maven.index.expr.SourcedSearchExpression;
 import org.apache.maven.index.treeview.TreeNode.Type;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
@@ -377,7 +377,7 @@ public class DefaultIndexTreeView
 
         result = getArtifactsByG( g, request );
 
-        if ( result.getTotalHits() > 0 )
+        if ( result.getTotalHitsCount() > 0 )
         {
             return result;
         }
@@ -399,7 +399,7 @@ public class DefaultIndexTreeView
 
             result = getArtifactsByGA( g, a, request );
 
-            if ( result.getTotalHits() > 0 )
+            if ( result.getTotalHitsCount() > 0 )
             {
                 return result;
             }
@@ -425,7 +425,7 @@ public class DefaultIndexTreeView
 
                 result = getArtifactsByGAV( g, a, v, request );
 
-                if ( result.getTotalHits() > 0 )
+                if ( result.getTotalHitsCount() > 0 )
                 {
                     return result;
                 }
@@ -441,7 +441,7 @@ public class DefaultIndexTreeView
         }
 
         // if we are here, no hits found
-        return IteratorSearchResponse.EMPTY_ITERATOR_SEARCH_RESPONSE;
+        return IteratorSearchResponse.empty( result.getQuery() );
     }
 
     protected IteratorSearchResponse getHintedArtifacts( TreeNode root, TreeViewRequest request )
@@ -465,7 +465,7 @@ public class DefaultIndexTreeView
         else
         {
             // if we are here, no hits found or something horribly went wrong?
-            return IteratorSearchResponse.EMPTY_ITERATOR_SEARCH_RESPONSE;
+            return IteratorSearchResponse.empty( null );
         }
     }
 
@@ -497,16 +497,16 @@ public class DefaultIndexTreeView
         Query versionQ = null;
 
         // minimum must have
-        groupIdQ = getNexusIndexer().constructQuery( MAVEN.GROUP_ID, g, SearchType.EXACT );
+        groupIdQ = getNexusIndexer().constructQuery( MAVEN.GROUP_ID, new SourcedSearchExpression( g ) );
 
         if ( StringUtils.isNotBlank( a ) )
         {
-            artifactIdQ = getNexusIndexer().constructQuery( MAVEN.ARTIFACT_ID, a, SearchType.EXACT );
+            artifactIdQ = getNexusIndexer().constructQuery( MAVEN.ARTIFACT_ID, new SourcedSearchExpression( a ) );
         }
 
         if ( StringUtils.isNotBlank( v ) )
         {
-            versionQ = getNexusIndexer().constructQuery( MAVEN.VERSION, v, SearchType.EXACT );
+            versionQ = getNexusIndexer().constructQuery( MAVEN.VERSION, new SourcedSearchExpression( v ) );
         }
 
         BooleanQuery q = new BooleanQuery();

Added: maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Mindexer14HitLimitTest.java
URL: http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Mindexer14HitLimitTest.java?rev=1087297&view=auto
==============================================================================
--- maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Mindexer14HitLimitTest.java (added)
+++ maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Mindexer14HitLimitTest.java Thu Mar 31 13:51:12 2011
@@ -0,0 +1,131 @@
+package org.apache.maven.index;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.lucene.search.Query;
+import org.apache.maven.index.expr.SourcedSearchExpression;
+import org.apache.maven.index.search.grouping.GAGrouping;
+
+public class Mindexer14HitLimitTest
+    extends AbstractNexusIndexerTest
+{
+    protected File repo = new File( getBasedir(), "target/repo/mindexer14" );
+
+    @Override
+    protected void prepareNexusIndexer( NexusIndexer nexusIndexer )
+        throws Exception
+    {
+        repo.mkdirs();
+
+        context =
+            nexusIndexer.addIndexingContext( "mindexer14", "mindexer14", repo, indexDir, null, null, MIN_CREATORS );
+
+        nexusIndexer.scan( context, false );
+    }
+
+    protected void createDummyAis( final String gid, final String aid, final int count )
+        throws IOException
+    {
+        int version = 0;
+
+        for ( int i = 0; i < count; i++ )
+        {
+            final ArtifactInfo ai = new ArtifactInfo( "mindexer14", gid, aid, String.valueOf( version++ ), null );
+
+            final ArtifactContext ac = new ArtifactContext( null, null, null, ai, ai.calculateGav() );
+
+            nexusIndexer.addArtifactToIndex( ac, context );
+        }
+
+    }
+
+    public void testFlatSearchTotalHitsLie1k()
+        throws Exception
+    {
+        createDummyAis( "org.test", "mindexer14", 1010 );
+
+        Query query = nexusIndexer.constructQuery( MAVEN.GROUP_ID, new SourcedSearchExpression( "org.test" ) );
+
+        FlatSearchRequest request = new FlatSearchRequest( query );
+
+        FlatSearchResponse response = nexusIndexer.searchFlat( request );
+
+        assertEquals( 1010, response.getTotalHitsCount() );
+
+        response.close();
+    }
+
+    public void testFlatSearchUnlimited()
+        throws Exception
+    {
+        createDummyAis( "org.test", "mindexer14", 1010 );
+
+        Query query = nexusIndexer.constructQuery( MAVEN.GROUP_ID, new SourcedSearchExpression( "org.test" ) );
+
+        FlatSearchRequest request = new FlatSearchRequest( query );
+
+        FlatSearchResponse response = nexusIndexer.searchFlat( request );
+
+        assertEquals( 1010, response.getTotalHitsCount() );
+        assertEquals( 1010, response.getReturnedHitsCount() );
+        assertEquals( 1010, response.getResults().size() );
+
+        response.close();
+    }
+
+    public void testFlatSearchLimited()
+        throws Exception
+    {
+        createDummyAis( "org.test", "mindexer14", 1010 );
+
+        Query query = nexusIndexer.constructQuery( MAVEN.GROUP_ID, new SourcedSearchExpression( "org.test" ) );
+
+        FlatSearchRequest request = new FlatSearchRequest( query );
+        request.setCount( 234 );
+
+        FlatSearchResponse response = nexusIndexer.searchFlat( request );
+
+        assertEquals( 1010, response.getTotalHitsCount() );
+        assertEquals( 234, response.getReturnedHitsCount() );
+        assertEquals( 234, response.getResults().size() );
+
+        response.close();
+    }
+
+    public void testGroupedSearchTotalHitsLie1k()
+        throws Exception
+    {
+        createDummyAis( "org.test", "mindexer14", 1010 );
+
+        Query query = nexusIndexer.constructQuery( MAVEN.GROUP_ID, new SourcedSearchExpression( "org.test" ) );
+
+        GroupedSearchRequest request = new GroupedSearchRequest( query, new GAGrouping() );
+
+        GroupedSearchResponse response = nexusIndexer.searchGrouped( request );
+
+        assertEquals( 1010, response.getTotalHitsCount() );
+        // in case of GroupedSearch, grouping is the one that defines count
+        // we have 1010 dummies with same GA, and GA grouping, hence count is 1 just like the map has 1 entry
+        assertEquals( 1, response.getReturnedHitsCount() );
+        assertEquals( 1, response.getResults().size() );
+
+        response.close();
+    }
+
+    public void testIteratorSearchTotalHitsLie1k()
+        throws Exception
+    {
+        createDummyAis( "org.test", "mindexer14", 1010 );
+
+        Query query = nexusIndexer.constructQuery( MAVEN.GROUP_ID, new SourcedSearchExpression( "org.test" ) );
+
+        IteratorSearchRequest request = new IteratorSearchRequest( query );
+
+        IteratorSearchResponse response = nexusIndexer.searchIterator( request );
+
+        assertEquals( 1010, response.getTotalHitsCount() );
+
+        response.close();
+    }
+}

Propchange: maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Mindexer14HitLimitTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Mindexer14HitLimitTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Nexus3177HitLimitChecks.java
URL: http://svn.apache.org/viewvc/maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Nexus3177HitLimitChecks.java?rev=1087297&r1=1087296&r2=1087297&view=diff
==============================================================================
--- maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Nexus3177HitLimitChecks.java (original)
+++ maven/indexer/trunk/indexer-core/src/test/java/org/apache/maven/index/Nexus3177HitLimitChecks.java Thu Mar 31 13:51:12 2011
@@ -25,11 +25,6 @@ import org.apache.lucene.index.Term;
 import org.apache.lucene.search.WildcardQuery;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.RAMDirectory;
-import org.apache.maven.index.AbstractSearchResponse;
-import org.apache.maven.index.ArtifactInfo;
-import org.apache.maven.index.FlatSearchRequest;
-import org.apache.maven.index.FlatSearchResponse;
-import org.apache.maven.index.NexusIndexer;
 import org.apache.maven.index.context.IndexingContext;
 
 public class Nexus3177HitLimitChecks
@@ -65,19 +60,28 @@ public class Nexus3177HitLimitChecks
         nexusIndexer.removeIndexingContext( secondContext, false );
     }
 
+    // ===================================================================
+    // NOTE: This test, with testing search limits lost it's original meaning,
+    // since version 4.1.0 there is no notion of hit limit.
+    // See http://jira.codehaus.org/browse/MINDEXER-14
+
+    // Hence, some of the tests, that can keep still original semantics were updated and left in place
+    // but the two test explicitly testing LIMIT_EXCEEDED were just removed/commented out.
+
     public void testHitLimitNotReachedSingleContext()
         throws Exception
     {
         WildcardQuery q = new WildcardQuery( new Term( ArtifactInfo.UINFO, "*testng*" ) );
 
         FlatSearchRequest request = new FlatSearchRequest( q );
-        request.setResultHitLimit( 5 );
+        request.setCount( 5 );
+        // request.setResultHitLimit( 5 );
         request.getContexts().add( context );
 
         FlatSearchResponse response = nexusIndexer.searchFlat( request );
         Set<ArtifactInfo> r = response.getResults();
         assertEquals( r.toString(), 4, r.size() );
-        assertEquals( r.toString(), 4, response.getTotalHits() );
+        assertEquals( r.toString(), 4, response.getTotalHitsCount() );
     }
 
     public void testHitLimitEqualSingleContext()
@@ -86,29 +90,31 @@ public class Nexus3177HitLimitChecks
         WildcardQuery q = new WildcardQuery( new Term( ArtifactInfo.UINFO, "*testng*" ) );
 
         FlatSearchRequest request = new FlatSearchRequest( q );
-        request.setResultHitLimit( 4 );
+        request.setCount( 4 );
+        // request.setResultHitLimit( 4 );
         request.getContexts().add( context );
 
         FlatSearchResponse response = nexusIndexer.searchFlat( request );
         Set<ArtifactInfo> r = response.getResults();
         assertEquals( r.toString(), 4, r.size() );
-        assertEquals( r.toString(), 4, response.getTotalHits() );
+        assertEquals( r.toString(), 4, response.getTotalHitsCount() );
     }
 
-    public void testHitLimitExceededSingleContext()
-        throws Exception
-    {
-        WildcardQuery q = new WildcardQuery( new Term( ArtifactInfo.UINFO, "*testng*" ) );
-
-        FlatSearchRequest request = new FlatSearchRequest( q );
-        request.setResultHitLimit( 3 );
-        request.getContexts().add( context );
-
-        FlatSearchResponse response = nexusIndexer.searchFlat( request );
-        Set<ArtifactInfo> r = response.getResults();
-        assertEquals( r.toString(), 0, r.size() );
-        assertEquals( r.toString(), AbstractSearchResponse.LIMIT_EXCEEDED, response.getTotalHits() );
-    }
+    // See NOTE above
+    // public void testHitLimitExceededSingleContext()
+    // throws Exception
+    // {
+    // WildcardQuery q = new WildcardQuery( new Term( ArtifactInfo.UINFO, "*testng*" ) );
+    //
+    // FlatSearchRequest request = new FlatSearchRequest( q );
+    // request.setResultHitLimit( 3 );
+    // request.getContexts().add( context );
+    //
+    // FlatSearchResponse response = nexusIndexer.searchFlat( request );
+    // Set<ArtifactInfo> r = response.getResults();
+    // assertEquals( r.toString(), 0, r.size() );
+    // assertEquals( r.toString(), AbstractSearchResponse.LIMIT_EXCEEDED, response.getTotalHits() );
+    // }
 
     public void testHitLimitNotReachedMultipleContexts()
         throws Exception
@@ -116,7 +122,8 @@ public class Nexus3177HitLimitChecks
         WildcardQuery q = new WildcardQuery( new Term( ArtifactInfo.UINFO, "*testng*" ) );
 
         FlatSearchRequest request = new FlatSearchRequest( q );
-        request.setResultHitLimit( 9 );
+        request.setCount( 9 );
+        // request.setResultHitLimit( 9 );
         request.setArtifactInfoComparator( ArtifactInfo.REPOSITORY_VERSION_COMPARATOR );
         request.getContexts().add( context );
         request.getContexts().add( secondContext );
@@ -124,7 +131,7 @@ public class Nexus3177HitLimitChecks
         FlatSearchResponse response = nexusIndexer.searchFlat( request );
         Set<ArtifactInfo> r = response.getResults();
         assertEquals( r.toString(), 8, r.size() );
-        assertEquals( r.toString(), 8, response.getTotalHits() );
+        assertEquals( r.toString(), 8, response.getTotalHitsCount() );
     }
 
     public void testHitLimitEqualMultipleContexts()
@@ -133,7 +140,8 @@ public class Nexus3177HitLimitChecks
         WildcardQuery q = new WildcardQuery( new Term( ArtifactInfo.UINFO, "*testng*" ) );
 
         FlatSearchRequest request = new FlatSearchRequest( q );
-        request.setResultHitLimit( 8 );
+        request.setCount( 8 );
+        // request.setResultHitLimit( 8 );
         request.setArtifactInfoComparator( ArtifactInfo.REPOSITORY_VERSION_COMPARATOR );
         request.getContexts().add( context );
         request.getContexts().add( secondContext );
@@ -141,23 +149,24 @@ public class Nexus3177HitLimitChecks
         FlatSearchResponse response = nexusIndexer.searchFlat( request );
         Set<ArtifactInfo> r = response.getResults();
         assertEquals( r.toString(), 8, r.size() );
-        assertEquals( r.toString(), 8, response.getTotalHits() );
+        assertEquals( r.toString(), 8, response.getTotalHitsCount() );
     }
 
-    public void testHitLimitExceededMultipleContexts()
-        throws Exception
-    {
-        WildcardQuery q = new WildcardQuery( new Term( ArtifactInfo.UINFO, "*testng*" ) );
-
-        FlatSearchRequest request = new FlatSearchRequest( q );
-        request.setResultHitLimit( 7 );
-        request.setArtifactInfoComparator( ArtifactInfo.REPOSITORY_VERSION_COMPARATOR );
-        request.getContexts().add( context );
-        request.getContexts().add( secondContext );
-
-        FlatSearchResponse response = nexusIndexer.searchFlat( request );
-        Set<ArtifactInfo> r = response.getResults();
-        assertEquals( r.toString(), 0, r.size() );
-        assertEquals( r.toString(), AbstractSearchResponse.LIMIT_EXCEEDED, response.getTotalHits() );
-    }
+    // See NOTE above
+    // public void testHitLimitExceededMultipleContexts()
+    // throws Exception
+    // {
+    // WildcardQuery q = new WildcardQuery( new Term( ArtifactInfo.UINFO, "*testng*" ) );
+    //
+    // FlatSearchRequest request = new FlatSearchRequest( q );
+    // request.setResultHitLimit( 7 );
+    // request.setArtifactInfoComparator( ArtifactInfo.REPOSITORY_VERSION_COMPARATOR );
+    // request.getContexts().add( context );
+    // request.getContexts().add( secondContext );
+    //
+    // FlatSearchResponse response = nexusIndexer.searchFlat( request );
+    // Set<ArtifactInfo> r = response.getResults();
+    // assertEquals( r.toString(), 0, r.size() );
+    // assertEquals( r.toString(), AbstractSearchResponse.LIMIT_EXCEEDED, response.getTotalHits() );
+    // }
 }