Selaa lähdekoodia

[MRM-749]

o apply pagination in nexus search
o add test for pagination


git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/archiva-nexus-indexer@738779 13f79535-47bb-0310-9956-ffa450edef68
archiva-nexus-indexer
Maria Odea B. Ching 15 vuotta sitten
vanhempi
commit
78a944daf3

+ 51
- 9
archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java Näytä tiedosto

@@ -25,6 +25,8 @@ import java.util.List;
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 @@ public class NexusRepositorySearch
// 1. construct query for:
// - regular search
// - searching within search results
// 2. consider pagination
// 3. multiple repositories
BooleanQuery q = new BooleanQuery();
@@ -91,7 +92,7 @@ public class NexusRepositorySearch
return new SearchResults();
}

return convertToSearchResults( response );
return convertToSearchResults( response, limits );
}
catch ( IndexContextInInconsistentStateException e )
{
@@ -157,16 +158,14 @@ public class NexusRepositorySearch
}
}

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 @@ public class NexusRepositorySearch
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;
}

}

+ 5
- 0
archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/util/SearchUtil.java Näytä tiedosto

@@ -59,4 +59,9 @@ public class SearchUtil

return qString;
}
public static String getHitId( String groupId, String artifactId )
{
return groupId + ":" + artifactId;
}
}

+ 40
- 0
archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java Näytä tiedosto

@@ -29,6 +29,7 @@ import org.apache.maven.archiva.configuration.ArchivaConfiguration;
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 @@ public class NexusRepositorySearchTest
//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
{

Loading…
Peruuta
Tallenna