fix quick search which returns artifacts with classifier too : hackhish solution currently as I can't find a way to say in a Lucene query this field must empty or null

git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1171151 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Olivier Lamy 2011-09-15 15:45:49 +00:00
parent 4298c23f6d
commit 4579f684aa
5 changed files with 102 additions and 48 deletions

View File

@ -1,4 +1,4 @@
package org.apache.archiva.rest.services.searchfilter;
package org.apache.archiva.indexer.search;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@ -18,15 +18,15 @@
* under the License.
*/
import org.apache.archiva.rest.api.model.Artifact;
import org.apache.maven.index.ArtifactInfo;
import java.util.List;
import java.util.Map;
/**
* @author Olivier Lamy
* @since 1.4
*/
public interface ArtifactFiler
public interface ArtifactInfoFiler
{
boolean addArtifactInResult( Artifact artifact, List<Artifact> currentResult );
boolean addArtifactInResult( ArtifactInfo artifact, Map<String, SearchResultHit> currentResult );
}

View File

@ -47,6 +47,7 @@
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -110,7 +111,10 @@ public SearchResults search( String principal, List<String> selectedRepos, Strin
q.add( iQuery, Occur.MUST );
}
return search( limits, q, indexingContextIds );
// we retun only artifacts without classifier in quick search, olamy cannot find a way to say with this field empty
// FIXME cannot find a way currently to setup this in constructQuery !!!
return search( limits, q, indexingContextIds, NoClassifierArtifactInfoFiler.LIST );
}
/**
@ -199,10 +203,11 @@ public SearchResults search( String principal, SearchFields searchFields, Search
throw new RepositorySearchException( "No search fields set." );
}
return search( limits, q, indexingContextIds );
return search( limits, q, indexingContextIds, Collections.<ArtifactInfoFiler>emptyList() );
}
private SearchResults search( SearchResultLimits limits, BooleanQuery q, List<String> indexingContextIds )
private SearchResults search( SearchResultLimits limits, BooleanQuery q, List<String> indexingContextIds,
List<? extends ArtifactInfoFiler> filters )
throws RepositorySearchException
{
@ -219,7 +224,7 @@ private SearchResults search( SearchResultLimits limits, BooleanQuery q, List<St
return results;
}
return convertToSearchResults( response, limits );
return convertToSearchResults( response, limits, filters );
}
catch ( IOException e )
{
@ -275,6 +280,10 @@ private void constructQuery( String term, BooleanQuery q )
q.add( indexer.constructQuery( MAVEN.VERSION, new StringSearchExpression( term ) ), Occur.SHOULD );
q.add( indexer.constructQuery( MAVEN.PACKAGING, new StringSearchExpression( term ) ), Occur.SHOULD );
q.add( indexer.constructQuery( MAVEN.CLASSNAMES, new StringSearchExpression( term ) ), Occur.SHOULD );
//Query query =
// new WildcardQuery( new Term( MAVEN.CLASSNAMES.getFieldName(), "*" ) );
//q.add( query, Occur.MUST_NOT );
// olamy IMHO we could set this option as at least one must match
//q.setMinimumNumberShouldMatch( 1 );
}
@ -363,7 +372,8 @@ protected List<? extends IndexCreator> getAllIndexCreators()
}
private SearchResults convertToSearchResults( FlatSearchResponse response, SearchResultLimits limits )
private SearchResults convertToSearchResults( FlatSearchResponse response, SearchResultLimits limits,
List<? extends ArtifactInfoFiler> artifactInfoFilers )
{
SearchResults results = new SearchResults();
Set<ArtifactInfo> artifactInfos = response.getResults();
@ -374,6 +384,11 @@ private SearchResults convertToSearchResults( FlatSearchResponse response, Searc
artifactInfo.packaging );
Map<String, SearchResultHit> hitsMap = results.getHitsMap();
if ( !applyArtifactInfoFilters( artifactInfo, artifactInfoFilers, hitsMap ) )
{
continue;
}
SearchResultHit hit = hitsMap.get( id );
if ( hit != null )
{
@ -428,6 +443,25 @@ private SearchResults convertToSearchResults( FlatSearchResponse response, Searc
}
}
private boolean applyArtifactInfoFilters( ArtifactInfo artifactInfo,
List<? extends ArtifactInfoFiler> artifactInfoFilers,
Map<String, SearchResultHit> currentResult )
{
if ( artifactInfoFilers == null || artifactInfoFilers.isEmpty() )
{
return true;
}
for ( ArtifactInfoFiler filter : artifactInfoFilers )
{
if ( !filter.addArtifactInResult( artifactInfo, currentResult ) )
{
return false;
}
}
return true;
}
private SearchResults paginate( SearchResults results )
{
SearchResultLimits limits = results.getLimits();

View File

@ -1,4 +1,4 @@
package org.apache.archiva.rest.services.searchfilter;
package org.apache.archiva.indexer.search;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@ -18,25 +18,25 @@
* under the License.
*/
import com.sun.org.apache.bcel.internal.generic.INSTANCEOF;
import org.apache.archiva.rest.api.model.Artifact;
import org.apache.commons.lang.StringUtils;
import org.apache.maven.index.ArtifactInfo;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @author Olivier Lamy
*/
public class NoClassifierArtifactFiler
implements ArtifactFiler
public class NoClassifierArtifactInfoFiler
implements ArtifactInfoFiler
{
public static final NoClassifierArtifactFiler INSTANCE = new NoClassifierArtifactFiler();
public static final NoClassifierArtifactInfoFiler INSTANCE = new NoClassifierArtifactInfoFiler();
public static final List<? extends ArtifactFiler> LIST = Arrays.asList( INSTANCE );
public static final List<? extends ArtifactInfoFiler> LIST = Arrays.asList( INSTANCE );
public boolean addArtifactInResult( Artifact artifact, List<Artifact> currentResult )
public boolean addArtifactInResult( ArtifactInfo artifact, Map<String, SearchResultHit> currentResult )
{
return StringUtils.isBlank( artifact.getClassifier() );
return StringUtils.isBlank( artifact.classifier );
}
}

View File

@ -131,6 +131,49 @@ public void testQuickSearch()
//TODO: search for class & package names
}
@Test
public void testQuickSearchNotWithClassifier()
throws Exception
{
createSimpleIndex( true );
List<String> selectedRepos = Arrays.asList( TEST_REPO_1 );
// search artifactId
archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
archivaConfigControl.replay();
SearchResults results = search.search( "user", selectedRepos, "archiva-search", null, null );
archivaConfigControl.verify();
assertNotNull( results );
SearchResultHit hit =
results.getSearchResultHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-search", null, "jar" ) );
assertNotNull( "hit null in result " + results.getHits(), hit );
assertEquals( "org.apache.archiva", hit.getGroupId() );
assertEquals( "archiva-search", hit.getArtifactId() );
assertEquals( "1.0", hit.getVersions().get( 0 ) );
archivaConfigControl.reset();
// search groupId
archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
archivaConfigControl.replay();
results = search.search( "user", selectedRepos, "archiva-search", null, null );
archivaConfigControl.verify();
assertNotNull( results );
assertEquals( "total hints not 3 hits " + results.getHits(), 3, results.getTotalHits() );
//TODO: search for class & package names
}
@Test
public void testQuickSearchMultipleArtifactsSameVersion()
throws Exception

View File

@ -30,8 +30,6 @@
import org.apache.archiva.rest.api.model.SearchRequest;
import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
import org.apache.archiva.rest.api.services.SearchService;
import org.apache.archiva.rest.services.searchfilter.ArtifactFiler;
import org.apache.archiva.rest.services.searchfilter.NoClassifierArtifactFiler;
import org.apache.archiva.security.AccessDeniedException;
import org.apache.archiva.security.ArchivaSecurityException;
import org.apache.archiva.security.PrincipalNotFoundException;
@ -80,7 +78,7 @@ public List<Artifact> quickSearch( String queryString )
SearchResults searchResults =
repositorySearch.search( getPrincipal(), getObservableRepos(), queryString, limits,
Collections.<String>emptyList() );
return getArtifacts( searchResults, new ArrayList<ArtifactFiler>( NoClassifierArtifactFiler.LIST ) );
return getArtifacts( searchResults);
}
catch ( RepositorySearchException e )
@ -105,7 +103,7 @@ public List<Artifact> getArtifactVersions( String groupId, String artifactId, St
try
{
SearchResults searchResults = repositorySearch.search( getPrincipal(), searchField, null );
return getArtifacts( searchResults, Collections.<ArtifactFiler>emptyList() );
return getArtifacts( searchResults );
}
catch ( RepositorySearchException e )
{
@ -127,7 +125,7 @@ public List<Artifact> searchArtifacts( SearchRequest searchRequest )
try
{
SearchResults searchResults = repositorySearch.search( getPrincipal(), searchField, limits );
return getArtifacts( searchResults, Collections.<ArtifactFiler>emptyList() );
return getArtifacts( searchResults );
}
catch ( RepositorySearchException e )
{
@ -182,7 +180,7 @@ protected String getPrincipal()
: redbackRequestInformation.getUser().getUsername() );
}
protected List<Artifact> getArtifacts( SearchResults searchResults, List<ArtifactFiler> artifactFilers )
protected List<Artifact> getArtifacts( SearchResults searchResults )
{
if ( searchResults == null || searchResults.isEmpty() )
{
@ -226,34 +224,13 @@ protected List<Artifact> getArtifacts( SearchResults searchResults, List<Artifac
if ( StringUtils.isNotBlank( version ) )
{
versionned.setVersion( version );
if ( applyFiltering( versionned, artifactFilers, artifacts ) )
{
artifacts.add( versionned );
}
}
}
}
}
return artifacts;
}
protected boolean applyFiltering( Artifact artifact, List<ArtifactFiler> artifactFilers, List<Artifact> artifacts )
{
if ( artifact == null )
{
return false;
}
if ( artifactFilers == null || artifactFilers.isEmpty() )
{
return true;
}
for ( ArtifactFiler filter : artifactFilers )
{
if ( !filter.addArtifactInResult( artifact, artifacts ) )
{
return false;
}
}
return true;
}
}