diff options
author | Olivier Lamy <olamy@apache.org> | 2011-09-15 15:45:49 +0000 |
---|---|---|
committer | Olivier Lamy <olamy@apache.org> | 2011-09-15 15:45:49 +0000 |
commit | 4579f684aa761897191c06736b7fd4f12b2e1369 (patch) | |
tree | f9ec58d4aa5b4177a78ec6904e302decaeb7a4cb /archiva-modules/archiva-base/archiva-indexer | |
parent | 4298c23f6d50cde1b1737454c218c597f2415042 (diff) | |
download | archiva-4579f684aa761897191c06736b7fd4f12b2e1369.tar.gz archiva-4579f684aa761897191c06736b7fd4f12b2e1369.zip |
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
Diffstat (limited to 'archiva-modules/archiva-base/archiva-indexer')
4 files changed, 156 insertions, 5 deletions
diff --git a/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/ArtifactInfoFiler.java b/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/ArtifactInfoFiler.java new file mode 100644 index 000000000..432580055 --- /dev/null +++ b/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/ArtifactInfoFiler.java @@ -0,0 +1,32 @@ +package org.apache.archiva.indexer.search; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.index.ArtifactInfo; + +import java.util.Map; + +/** + * @author Olivier Lamy + * @since 1.4 + */ +public interface ArtifactInfoFiler +{ + boolean addArtifactInResult( ArtifactInfo artifact, Map<String, SearchResultHit> currentResult ); +} diff --git a/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java b/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java index 5ffba7f88..cdc906c22 100644 --- a/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java +++ b/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java @@ -47,6 +47,7 @@ import javax.inject.Inject; 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 class NexusRepositorySearch 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 class NexusRepositorySearch 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 @@ public class NexusRepositorySearch return results; } - return convertToSearchResults( response, limits ); + return convertToSearchResults( response, limits, filters ); } catch ( IOException e ) { @@ -275,6 +280,10 @@ public class NexusRepositorySearch 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 @@ public class NexusRepositorySearch } - 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 @@ public class NexusRepositorySearch 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 @@ public class NexusRepositorySearch } } + 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(); diff --git a/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NoClassifierArtifactInfoFiler.java b/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NoClassifierArtifactInfoFiler.java new file mode 100644 index 000000000..078970299 --- /dev/null +++ b/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NoClassifierArtifactInfoFiler.java @@ -0,0 +1,42 @@ +package org.apache.archiva.indexer.search; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +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 NoClassifierArtifactInfoFiler + implements ArtifactInfoFiler +{ + public static final NoClassifierArtifactInfoFiler INSTANCE = new NoClassifierArtifactInfoFiler(); + + public static final List<? extends ArtifactInfoFiler> LIST = Arrays.asList( INSTANCE ); + + public boolean addArtifactInResult( ArtifactInfo artifact, Map<String, SearchResultHit> currentResult ) + { + return StringUtils.isBlank( artifact.classifier ); + } +} diff --git a/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java b/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java index fb6f4ae0d..2f7da7585 100644 --- a/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java +++ b/archiva-modules/archiva-base/archiva-indexer/src/test/java/org/apache/archiva/indexer/search/NexusRepositorySearchTest.java @@ -132,6 +132,49 @@ public class NexusRepositorySearchTest } @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 { |