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
{