Author: oching
Date: Thu Jan 29 07:13:15 2009
New Revision: 738779

URL: http://svn.apache.org/viewvc?rev=738779&view=rev
Log:
[MRM-749]
o apply pagination in nexus search
o add test for pagination

Modified:
    
archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java
    
archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/util/SearchUtil.java
    
archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java

Modified: 
archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java?rev=738779&r1=738778&r2=738779&view=diff
==============================================================================
--- 
archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java
 (original)
+++ 
archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java
 Thu Jan 29 07:13:15 2009
@@ -25,6 +25,8 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.archiva.indexer.util.SearchUtil;
+import org.apache.lucene.document.Document;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
@@ -70,7 +72,6 @@
         // 1. construct query for:
         //    - regular search
         //    - searching within search results
-        // 2. consider pagination
         // 3. multiple repositories
                         
         BooleanQuery q = new BooleanQuery();
@@ -91,7 +92,7 @@
                 return new SearchResults();
             }
 
-            return convertToSearchResults( response );
+            return convertToSearchResults( response, limits );
         }
         catch ( IndexContextInInconsistentStateException e )
         {
@@ -157,16 +158,14 @@
         }
     }
 
-    private SearchResults convertToSearchResults( FlatSearchResponse response )
-    {
-        // TODO: paginate!
-        
+    private SearchResults convertToSearchResults( FlatSearchResponse response, 
SearchResultLimits limits )
+    {   
         SearchResults results = new SearchResults();
         Set<ArtifactInfo> artifactInfos = response.getResults();
-
+        
         for ( ArtifactInfo artifactInfo : artifactInfos )
         {
-            String id = artifactInfo.groupId + ":" + artifactInfo.artifactId;  
          
+            String id = SearchUtil.getHitId( artifactInfo.groupId, 
artifactInfo.artifactId );            
             Map<String, SearchResultHit> hitsMap = results.getHitsMap();
 
             SearchResultHit hit = hitsMap.get( id );
@@ -192,7 +191,50 @@
         
         results.setTotalHits( results.getHitsMap().size() );
         
-        return results;
+        if( limits == null || limits.getSelectedPage() == 
SearchResultLimits.ALL_PAGES )
+        {   
+            return results;
+        }
+        else
+        {
+            return paginate( limits, results );            
+        }        
+    }
+
+    private SearchResults paginate( SearchResultLimits limits, SearchResults 
results )
+    {
+        SearchResults paginated = new SearchResults();
+        
+        int fetchCount = limits.getPageSize();
+        int offset = ( limits.getSelectedPage() * limits.getPageSize() );
+
+        // Goto offset.
+        if ( offset <= results.getTotalHits() )
+        {
+            // only process if the offset is within the hit count.
+            for ( int i = 0; i < fetchCount; i++ )
+            {
+                // Stop fetching if we are past the total # of available hits.
+                if ( offset + i > results.getTotalHits() )
+                {
+                    break;
+                }
+                
+                SearchResultHit hit = results.getHits().get( ( offset + i ) - 
1 );
+                if( hit != null )
+                {
+                    String id = SearchUtil.getHitId( hit.getGroupId(), 
hit.getArtifactId() );
+                    paginated.addHit( id, hit );
+                }
+                else
+                {
+                    break;
+                }
+            }
+        }            
+        paginated.setTotalHits( paginated.getHitsMap().size() );
+        
+        return paginated;
     }
 
 }

Modified: 
archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/util/SearchUtil.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/util/SearchUtil.java?rev=738779&r1=738778&r2=738779&view=diff
==============================================================================
--- 
archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/util/SearchUtil.java
 (original)
+++ 
archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/util/SearchUtil.java
 Thu Jan 29 07:13:15 2009
@@ -59,4 +59,9 @@
 
         return qString;
     }
+    
+    public static String getHitId( String groupId, String artifactId )
+    {
+        return groupId + ":" + artifactId;
+    }
 }

Modified: 
archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java?rev=738779&r1=738778&r2=738779&view=diff
==============================================================================
--- 
archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java
 (original)
+++ 
archiva/branches/archiva-nexus-indexer/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java
 Thu Jan 29 07:13:15 2009
@@ -29,6 +29,7 @@
 import org.apache.maven.archiva.configuration.Configuration;
 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
 import org.apache.maven.archiva.indexer.search.SearchResultHit;
+import org.apache.maven.archiva.indexer.search.SearchResultLimits;
 import org.apache.maven.archiva.indexer.search.SearchResults;
 import org.codehaus.plexus.spring.PlexusInSpringTestCase;
 import org.easymock.MockControl;
@@ -176,6 +177,45 @@
         //TODO: search for class & package names
     }
     
+    public void testQuickSearchWithPagination()
+        throws Exception
+    {
+        List<String> selectedRepos = new ArrayList<String>();
+        selectedRepos.add( TEST_REPO );
+        
+        // page 1
+        SearchResultLimits limits = new SearchResultLimits( 1 );
+        limits.setPageSize( 1 );        
+        
+        archivaConfigControl.expectAndReturn( 
archivaConfig.getConfiguration(), config );
+        
+        archivaConfigControl.replay();
+        
+        SearchResults results = search.search( "user", selectedRepos, "org", 
limits );
+        
+        archivaConfigControl.verify();
+        
+        assertNotNull( results );
+        assertEquals( 1, results.getTotalHits() );
+        
+        archivaConfigControl.reset();
+        
+        // page 2
+        limits = new SearchResultLimits( 2 );
+        limits.setPageSize( 1 );   
+        
+        archivaConfigControl.expectAndReturn( 
archivaConfig.getConfiguration(), config );
+        
+        archivaConfigControl.replay();
+        
+        results = search.search( "user", selectedRepos, "org", limits );
+        
+        archivaConfigControl.verify();
+        
+        assertNotNull( results );
+        assertEquals( 1, results.getTotalHits() );
+    }
+    
     public void testArtifactFoundInMultipleRepositories()
         throws Exception
     {


Reply via email to