o implement advanced search for nexus search impl o added test cases git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/archiva-nexus-indexer@740206 13f79535-47bb-0310-9956-ffa450edef68archiva-nexus-indexer
@@ -70,13 +70,7 @@ public class NexusRepositorySearch | |||
throws RepositorySearchException | |||
{ | |||
addIndexingContexts( selectedRepos ); | |||
// TODO: | |||
// 1. construct query for: | |||
// - regular search | |||
// - searching within search results | |||
// 3. multiple repositories | |||
BooleanQuery q = new BooleanQuery(); | |||
if( previousSearchTerms == null || previousSearchTerms.isEmpty() ) | |||
{ | |||
@@ -97,6 +91,59 @@ public class NexusRepositorySearch | |||
q.add( iQuery, Occur.MUST ); | |||
} | |||
return search( limits, q ); | |||
} | |||
/** | |||
* @see RepositorySearch#search(String, SearchFields, SearchResultLimits) | |||
*/ | |||
public SearchResults search( String principal, SearchFields searchFields, SearchResultLimits limits ) | |||
throws RepositorySearchException | |||
{ | |||
if( searchFields.getRepositories() == null ) | |||
{ | |||
throw new RepositorySearchException( "Repositories cannot be null." ); | |||
} | |||
addIndexingContexts( searchFields.getRepositories() ); | |||
BooleanQuery q = new BooleanQuery(); | |||
if( searchFields.getGroupId() != null && !"".equals( searchFields.getGroupId() ) ) | |||
{ | |||
q.add( indexer.constructQuery( ArtifactInfo.GROUP_ID, searchFields.getGroupId() ), Occur.MUST ); | |||
} | |||
if( searchFields.getArtifactId() != null && !"".equals( searchFields.getArtifactId() ) ) | |||
{ | |||
q.add( indexer.constructQuery( ArtifactInfo.ARTIFACT_ID, searchFields.getArtifactId() ), Occur.MUST ); | |||
} | |||
if( searchFields.getVersion() != null && !"".equals( searchFields.getVersion() ) ) | |||
{ | |||
q.add( indexer.constructQuery( ArtifactInfo.VERSION, searchFields.getVersion() ), Occur.MUST ); | |||
} | |||
if( searchFields.getPackaging() != null && !"".equals( searchFields.getPackaging() ) ) | |||
{ | |||
q.add( indexer.constructQuery( ArtifactInfo.PACKAGING, searchFields.getPackaging() ), Occur.MUST ); | |||
} | |||
if( searchFields.getClassName() != null && !"".equals( searchFields.getClassName() ) ) | |||
{ | |||
q.add( indexer.constructQuery( ArtifactInfo.NAMES, searchFields.getClassName() ), Occur.MUST ); | |||
} | |||
if( q.getClauses() == null || q.getClauses().length <= 0 ) | |||
{ | |||
throw new RepositorySearchException( "No search fields set." ); | |||
} | |||
return search( limits, q ); | |||
} | |||
private SearchResults search( SearchResultLimits limits, BooleanQuery q ) | |||
throws RepositorySearchException | |||
{ | |||
try | |||
{ | |||
FlatSearchRequest request = new FlatSearchRequest( q ); | |||
@@ -146,16 +193,7 @@ public class NexusRepositorySearch | |||
q.add( indexer.constructQuery( ArtifactInfo.NAMES, term ), Occur.SHOULD ); | |||
} | |||
/** | |||
* @see RepositorySearch#search(String, SearchFields, SearchResultLimits) | |||
*/ | |||
public SearchResults search( String principal, SearchFields searchFields, SearchResultLimits limits ) | |||
throws RepositorySearchException | |||
{ | |||
// TODO Auto-generated method stub | |||
return null; | |||
} | |||
private void addIndexingContexts( List<String> selectedRepos ) | |||
{ | |||
for( String repo : selectedRepos ) |
@@ -1,5 +1,8 @@ | |||
package org.apache.archiva.indexer.search; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one | |||
* or more contributor license agreements. See the NOTICE file | |||
@@ -21,20 +24,36 @@ package org.apache.archiva.indexer.search; | |||
public class SearchFields | |||
{ | |||
/** | |||
* groupId | |||
*/ | |||
private String groupId; | |||
/** | |||
* artifactId | |||
*/ | |||
private String artifactId; | |||
/** | |||
* version | |||
*/ | |||
private String version; | |||
/** | |||
* packaging (jar, war, pom, etc.) | |||
*/ | |||
private String packaging; | |||
/** | |||
* class name or package name | |||
*/ | |||
private String className; | |||
private String packageName; | |||
private String repositoryId; | |||
/** | |||
* repositories | |||
*/ | |||
private List<String> repositories = new ArrayList<String>(); | |||
public String getGroupId() | |||
{ | |||
return groupId; | |||
@@ -85,23 +104,13 @@ public class SearchFields | |||
this.className = className; | |||
} | |||
public String getPackageName() | |||
{ | |||
return packageName; | |||
} | |||
public void setPackageName( String packageName ) | |||
{ | |||
this.packageName = packageName; | |||
} | |||
public String getRepositoryId() | |||
public List<String> getRepositories() | |||
{ | |||
return repositoryId; | |||
return repositories; | |||
} | |||
public void setRepositoryId( String repositoryId ) | |||
public void setRepositories( List<String> repositories ) | |||
{ | |||
this.repositoryId = repositoryId; | |||
this.repositories = repositories; | |||
} | |||
} |
@@ -330,7 +330,97 @@ public class NexusRepositorySearchTest | |||
public void testAdvancedSearch() | |||
throws Exception | |||
{ | |||
List<File> files = new ArrayList<File>(); | |||
files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + | |||
"/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) ); | |||
files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + | |||
"/org/apache/archiva/archiva-search/1.1/archiva-search-1.1.jar" ) ); | |||
createIndex( TEST_REPO_2, files ); | |||
List<String> selectedRepos = new ArrayList<String>(); | |||
selectedRepos.add( TEST_REPO_1 ); | |||
selectedRepos.add( TEST_REPO_2 ); | |||
config.addManagedRepository( createRepositoryConfig( TEST_REPO_2 ) ); | |||
SearchFields searchFields = new SearchFields(); | |||
searchFields.setGroupId( "org.apache.archiva" ); | |||
searchFields.setVersion( "1.0" ); | |||
searchFields.setRepositories( selectedRepos ); | |||
archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config, 2 ); | |||
archivaConfigControl.replay(); | |||
SearchResults results = search.search( "user", searchFields, null ); | |||
archivaConfigControl.verify(); | |||
assertNotNull( results ); | |||
assertEquals( 2, results.getTotalHits() ); | |||
FileUtils.deleteDirectory( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + "/.indexer" ) ); | |||
assertFalse( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + "/.indexer" ).exists() ); | |||
} | |||
public void testAdvancedSearchWithPagination() | |||
throws Exception | |||
{ | |||
List<File> files = new ArrayList<File>(); | |||
files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + | |||
"/org/apache/archiva/archiva-search/1.0/archiva-search-1.0.jar" ) ); | |||
files.add( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + | |||
"/org/apache/archiva/archiva-search/1.1/archiva-search-1.1.jar" ) ); | |||
createIndex( TEST_REPO_2, files ); | |||
List<String> selectedRepos = new ArrayList<String>(); | |||
selectedRepos.add( TEST_REPO_1 ); | |||
selectedRepos.add( TEST_REPO_2 ); | |||
config.addManagedRepository( createRepositoryConfig( TEST_REPO_2 ) ); | |||
SearchFields searchFields = new SearchFields(); | |||
searchFields.setGroupId( "org.apache.archiva" ); | |||
searchFields.setVersion( "1.0" ); | |||
searchFields.setRepositories( selectedRepos ); | |||
// page 1 | |||
SearchResultLimits limits = new SearchResultLimits( 0 ); | |||
limits.setPageSize( 1 ); | |||
archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config, 2 ); | |||
archivaConfigControl.replay(); | |||
SearchResults results = search.search( "user", searchFields, limits ); | |||
archivaConfigControl.verify(); | |||
assertNotNull( results ); | |||
assertEquals( 2, results.getTotalHits() ); | |||
assertEquals( 1, results.getHits().size() ); | |||
// page 2 | |||
archivaConfigControl.reset(); | |||
limits = new SearchResultLimits( 1 ); | |||
limits.setPageSize( 1 ); | |||
archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config, 2 ); | |||
archivaConfigControl.replay(); | |||
results = search.search( "user", searchFields, limits ); | |||
archivaConfigControl.verify(); | |||
assertNotNull( results ); | |||
assertEquals( 2, results.getTotalHits() ); | |||
assertEquals( 1, results.getHits().size() ); | |||
FileUtils.deleteDirectory( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + "/.indexer" ) ); | |||
assertFalse( new File( getBasedir(), "/target/test-classes/" + TEST_REPO_2 + "/.indexer" ).exists() ); | |||
} | |||
} |