diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexSearchLayer.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexSearchLayer.java index 44c5196a0..068015e08 100644 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexSearchLayer.java +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexSearchLayer.java @@ -24,7 +24,8 @@ import org.apache.maven.model.Model; import org.apache.maven.model.Plugin; import org.apache.maven.model.ReportPlugin; import org.apache.maven.repository.indexing.query.Query; -import org.apache.maven.repository.indexing.query.SinglePhraseQuery; +import org.apache.maven.repository.indexing.query.QueryTerm; +import org.apache.maven.repository.indexing.query.SingleTermQuery; import java.util.ArrayList; import java.util.HashMap; @@ -61,8 +62,9 @@ public class DefaultRepositoryIndexSearchLayer List generalSearchResults = new ArrayList(); for ( int i = 0; i < RepositoryIndex.FIELDS.length; i++ ) { - Query qry = new SinglePhraseQuery( RepositoryIndex.FIELDS[i], keyword ); - List results = searchAdvanced( qry, index ); + // TODO! does simply iterating the fields and searching each perform well enough and yield correct rankings? + QueryTerm term = new QueryTerm( RepositoryIndex.FIELDS[i], keyword ); + List results = searchAdvanced( new SingleTermQuery( term ), index ); for ( Iterator iter = results.iterator(); iter.hasNext(); ) { SearchResult result = (SearchResult) iter.next(); @@ -104,6 +106,7 @@ public class DefaultRepositoryIndexSearchLayer fields.put( RepositoryIndex.FLD_SHA1, map.get( RepositoryIndex.FLD_SHA1 ) ); fields.put( RepositoryIndex.FLD_MD5, map.get( RepositoryIndex.FLD_MD5 ) ); + // TODO! this doesn't seem like the correct way to determine what matched result.setFieldMatches( fields ); searchResults.add( result ); } diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexSearcher.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexSearcher.java index 953145747..5525ed57d 100644 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexSearcher.java +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexSearcher.java @@ -118,15 +118,8 @@ public class DefaultRepositoryIndexSearcher return docs; } - /** - * Method for creating the object to be returned for the search - * - * @param doc the index document where the object field values will be retrieved from - * @param repository - * @return Object - */ - protected RepositoryIndexSearchHit createSearchedObjectFromIndexDocument( Document doc, - ArtifactRepository repository ) + private RepositoryIndexSearchHit createSearchedObjectFromIndexDocument( Document doc, + ArtifactRepository repository ) throws RepositoryIndexSearchException { RepositoryIndexSearchHit searchHit = null; @@ -142,6 +135,7 @@ public class DefaultRepositoryIndexSearcher artifact.setFile( new File( repository.getBasedir(), repository.pathOf( artifact ) ) ); + // TODO: introduce strongly types search result! Map map = new HashMap(); map.put( RepositoryIndex.ARTIFACT, artifact ); map.put( RepositoryIndex.FLD_CLASSES, doc.get( RepositoryIndex.FLD_CLASSES ) ); @@ -159,6 +153,7 @@ public class DefaultRepositoryIndexSearcher { Artifact pomArtifact = factory.createProjectArtifact( groupId, artifactId, version ); + // TODO: introduce strongly types search result! Don't read the POM here, though - populate with the data from the index searchHit = new RepositoryIndexSearchHit( false, false, true ); searchHit.setObject( readPom( pomArtifact, repository ) ); } @@ -180,18 +175,19 @@ public class DefaultRepositoryIndexSearcher if ( tmpDir.equals( version ) ) { repoMetadata = new SnapshotArtifactRepositoryMetadata( - factory.createBuildArtifact( groupId, artifactId, version, "jar" ) ); + factory.createProjectArtifact( groupId, artifactId, version ) ); } else if ( tmpDir.equals( artifactId ) ) { - repoMetadata = new ArtifactRepositoryMetadata( - factory.createBuildArtifact( groupId, artifactId, version, "jar" ) ); + repoMetadata = + new ArtifactRepositoryMetadata( factory.createProjectArtifact( groupId, artifactId, version ) ); } else { repoMetadata = new GroupRepositoryMetadata( groupId ); } + // TODO: introduce strongly types search result! Don't read the metadata here, though - populate with the data from the index repoMetadata.setMetadata( readMetadata( repoMetadata, repository ) ); searchHit = new RepositoryIndexSearchHit( false, true, false ); @@ -201,11 +197,6 @@ public class DefaultRepositoryIndexSearcher return searchHit; } - /** - * Create RepositoryMetadata object. - * - * @return RepositoryMetadata - */ private Metadata readMetadata( RepositoryMetadata repoMetadata, ArtifactRepository repository ) throws RepositoryIndexSearchException { @@ -237,11 +228,6 @@ public class DefaultRepositoryIndexSearcher } } - /** - * Create RepositoryMetadata object. - * - * @return RepositoryMetadata - */ private Model readPom( Artifact pomArtifact, ArtifactRepository repository ) throws RepositoryIndexSearchException { diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndex.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndex.java index f93ef54df..733128392 100644 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndex.java +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndex.java @@ -87,6 +87,8 @@ public interface RepositoryIndex /** * Method to encapsulate the optimize() method for lucene + * + * @throws RepositoryIndexException if there is a problem optimizing the index. */ void optimize() throws RepositoryIndexException; diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/AbstractCompoundQueryTerm.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/AbstractCompoundQueryTerm.java deleted file mode 100644 index 2d99a73ff..000000000 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/AbstractCompoundQueryTerm.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.apache.maven.repository.indexing.query; - -/* - * Copyright 2005-2006 The Apache Software Foundation. - * - * Licensed 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. - */ - -/** - * Base of all query terms. - * - * @author Brett Porter - */ -public abstract class AbstractCompoundQueryTerm - implements CompoundQueryTerm -{ - /** - * The query being added. - */ - private Query query; - - /** - * Class constructor - * - * @param query the query represented by this object - */ - protected AbstractCompoundQueryTerm( Query query ) - { - this.query = query; - } - - /** - * @see CompoundQueryTerm#isRequired() - */ - public boolean isRequired() - { - return false; - } - - /** - * @see CompoundQueryTerm#isProhibited() - */ - public boolean isProhibited() - { - return false; - } - - /** - * @see CompoundQueryTerm#getQuery() - */ - public Query getQuery() - { - return query; - } -} diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/AndQueryTerm.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/AndQueryTerm.java deleted file mode 100644 index 35e48a955..000000000 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/AndQueryTerm.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.apache.maven.repository.indexing.query; - -/* - * Copyright 2005-2006 The Apache Software Foundation. - * - * Licensed 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. - */ - -/** - * A Boolean AND join for queries. - * - * @author Brett Porter - */ -public class AndQueryTerm - extends AbstractCompoundQueryTerm -{ - /** - * Class constructor - * - * @param query the Query object represented by this object - */ - public AndQueryTerm( Query query ) - { - super( query ); - } - - /** - * @see AbstractCompoundQueryTerm#isRequired() - */ - public boolean isRequired() - { - return true; - } -} diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/CompoundQuery.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/CompoundQuery.java index 72d2476c2..79fb2fa0a 100644 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/CompoundQuery.java +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/CompoundQuery.java @@ -32,47 +32,69 @@ import java.util.List; public class CompoundQuery implements Query { - protected List queries; + /** + * The query terms. + */ + private final List compoundQueryTerms = new ArrayList(); /** - * Class constructor + * Appends a required term to this query. + * + * @param term the term to be appended to this query */ - public CompoundQuery() + public void and( QueryTerm term ) { - queries = new ArrayList(); + compoundQueryTerms.add( CompoundQueryTerm.and( new SingleTermQuery( term ) ) ); } /** - * Appends a required Query object to this Query object. The Query object will be encapsulated inside an - * AndQueryTerm object. + * Appends an optional term to this query. * - * @param query the Query object to be appended to this Query object + * @param term the term to be appended to this query + */ + public void or( QueryTerm term ) + { + compoundQueryTerms.add( CompoundQueryTerm.or( new SingleTermQuery( term ) ) ); + } + + /** + * Appends a prohibited term to this query. + * + * @param term the term to be appended to this query + */ + public void not( QueryTerm term ) + { + compoundQueryTerms.add( CompoundQueryTerm.not( new SingleTermQuery( term ) ) ); + } + + /** + * Appends a required subquery to this query. + * + * @param query the subquery to be appended to this query */ public void and( Query query ) { - queries.add( new AndQueryTerm( query ) ); + compoundQueryTerms.add( CompoundQueryTerm.and( query ) ); } /** - * Appends an optional Query object to this Query object. The Query object will be encapsulated inside an - * OrQueryTerm object. + * Appends an optional subquery to this query. * - * @param query the Query object to be appended to this Query object + * @param query the subquery to be appended to this query */ public void or( Query query ) { - queries.add( new OrQueryTerm( query ) ); + compoundQueryTerms.add( CompoundQueryTerm.or( query ) ); } /** - * Appends a prohibited Query object to this Query object. The Query object will be encapsulated inside an - * NotQueryTerm object. + * Appends a prohibited subquery to this query. * - * @param query the Query object to be appended to this Query object + * @param query the subquery to be appended to this query */ public void not( Query query ) { - queries.add( new NotQueryTerm( query ) ); + compoundQueryTerms.add( CompoundQueryTerm.not( query ) ); } /** @@ -80,23 +102,23 @@ public class CompoundQuery * * @return List of all Queries added to this Query */ - public List getQueries() + public List getCompoundQueryTerms() { - return queries; + return compoundQueryTerms; } + // TODO! relocate public org.apache.lucene.search.Query createLuceneQuery( RepositoryIndex index ) throws ParseException { BooleanQuery booleanQuery = new BooleanQuery(); - List queries = this.queries; + List queries = this.compoundQueryTerms; for ( Iterator i = queries.iterator(); i.hasNext(); ) { - CompoundQueryTerm subquery = (CompoundQueryTerm) i.next(); + CompoundQueryTerm queryTerm = (CompoundQueryTerm) i.next(); - org.apache.lucene.search.Query luceneQuery = subquery.getQuery().createLuceneQuery( index ); - - booleanQuery.add( luceneQuery, subquery.isRequired(), subquery.isProhibited() ); + booleanQuery.add( queryTerm.getQuery().createLuceneQuery( index ), queryTerm.isRequired(), + queryTerm.isProhibited() ); } return booleanQuery; } diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/CompoundQueryTerm.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/CompoundQueryTerm.java index 66d8ba771..46507375f 100644 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/CompoundQueryTerm.java +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/CompoundQueryTerm.java @@ -17,30 +17,84 @@ package org.apache.maven.repository.indexing.query; */ /** - * Term in a compound query. + * Base of all query terms. * * @author Brett Porter */ -public interface CompoundQueryTerm +class CompoundQueryTerm { + /** + * The query to add to the compound query. + */ + private final Query query; + + /** + * Whether the term is required (an AND). + */ + private final boolean required; + + /** + * Whether the term is prohibited (a NOT). + */ + private final boolean prohibited; + + /** + * Class constructor + * + * @param query the subquery to add + * @param required whether the term is required (an AND) + * @param prohibited whether the term is prohibited (a NOT) + */ + private CompoundQueryTerm( Query query, boolean required, boolean prohibited ) + { + this.query = query; + this.prohibited = prohibited; + this.required = required; + } + /** * Method to test if the Query is a search requirement * * @return true if this Query is a search requirement, otherwise returns false */ - boolean isRequired(); + boolean isRequired() + { + return required; + } /** * Method to test if the Query is prohibited in the search result * * @return true if this Query is prohibited in the search result */ - boolean isProhibited(); + boolean isProhibited() + { + return prohibited; + } + /** - * Method to get the Query object represented by this object + * The subquery to execute. * - * @return the Query object represented by this object + * @return the query */ - Query getQuery(); + Query getQuery() + { + return query; + } + + static CompoundQueryTerm and( Query query ) + { + return new CompoundQueryTerm( query, true, false ); + } + + static CompoundQueryTerm or( Query query ) + { + return new CompoundQueryTerm( query, false, false ); + } + + static CompoundQueryTerm not( Query query ) + { + return new CompoundQueryTerm( query, false, true ); + } } diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/NotQueryTerm.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/NotQueryTerm.java deleted file mode 100644 index 292c9ead0..000000000 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/NotQueryTerm.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.apache.maven.repository.indexing.query; - -/* - * Copyright 2005-2006 The Apache Software Foundation. - * - * Licensed 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. - */ - -/** - * A boolean NOT query term. - * - * @author Brett Porter - */ -public class NotQueryTerm - extends AbstractCompoundQueryTerm -{ - /** - * Class constructor - * - * @param query the Query object represented by this Query object - */ - public NotQueryTerm( Query query ) - { - super( query ); - } - - /** - * @see CompoundQueryTerm#isProhibited() - */ - public boolean isProhibited() - { - return true; - } -} diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/OrQueryTerm.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/OrQueryTerm.java deleted file mode 100644 index a3ae2d3d2..000000000 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/OrQueryTerm.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.apache.maven.repository.indexing.query; - -/* - * Copyright 2005-2006 The Apache Software Foundation. - * - * Licensed 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. - */ - -/** - * A boolean OR join term. - * - * @author Brett Porter - */ -public class OrQueryTerm - extends AbstractCompoundQueryTerm -{ - /** - * Class constructor - * - * @param query the Query object represented by this Query object - */ - public OrQueryTerm( Query query ) - { - super( query ); - } -} diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/SinglePhraseQuery.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/QueryTerm.java similarity index 61% rename from maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/SinglePhraseQuery.java rename to maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/QueryTerm.java index 34bd7fc70..6db240b3a 100644 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/SinglePhraseQuery.java +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/QueryTerm.java @@ -16,19 +16,12 @@ package org.apache.maven.repository.indexing.query; * limitations under the License. */ -import org.apache.lucene.index.Term; -import org.apache.lucene.queryParser.ParseException; -import org.apache.lucene.queryParser.QueryParser; -import org.apache.lucene.search.TermQuery; -import org.apache.maven.repository.indexing.RepositoryIndex; - /** * Class to hold a single field search condition * * @author Edwin Punzalan */ -public class SinglePhraseQuery - implements Query +public class QueryTerm { private String field; @@ -40,7 +33,7 @@ public class SinglePhraseQuery * @param field the index field to search * @param value the index value requirement */ - public SinglePhraseQuery( String field, String value ) + public QueryTerm( String field, String value ) { this.field = field; this.value = value; @@ -65,21 +58,4 @@ public class SinglePhraseQuery { return value; } - - public org.apache.lucene.search.Query createLuceneQuery( RepositoryIndex index ) - throws ParseException - { - org.apache.lucene.search.Query qry; - if ( index.isKeywordField( this.field ) ) - { - Term term = new Term( this.field, this.value ); - qry = new TermQuery( term ); - } - else - { - QueryParser parser = new QueryParser( this.field, index.getAnalyzer() ); - qry = parser.parse( this.value ); - } - return qry; - } } diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/RangeQuery.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/RangeQuery.java index 2037a9ade..c6d577a9b 100644 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/RangeQuery.java +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/RangeQuery.java @@ -19,35 +19,122 @@ package org.apache.maven.repository.indexing.query; import org.apache.lucene.index.Term; import org.apache.maven.repository.indexing.RepositoryIndex; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - /** - * Query object that handles range queries for dates. + * Query object that handles range queries (presently used for dates). * * @author Maria Odea Ching + * @author Brett Porter */ public class RangeQuery implements Query { - private List queries = new ArrayList(); + /** + * Whether values equal to the boundaries are included in the query results. + */ + private final boolean inclusive; - private boolean inclusive; + /** + * The lower bound. + */ + private final QueryTerm begin; - public RangeQuery( boolean inclusive ) + /** + * The upper bound. + */ + private final QueryTerm end; + + /** + * Constructor. + * + * @param begin the lower bound + * @param end the upper bound + * @param inclusive whether to include the boundaries in the query + */ + private RangeQuery( QueryTerm begin, QueryTerm end, boolean inclusive ) { + this.begin = begin; + this.end = end; this.inclusive = inclusive; } - public void addQuery( Query qry ) + /** + * Create an open range, including all results. + * + * @return the query object + */ + public static RangeQuery createOpenRange() { - queries.add( qry ); + return new RangeQuery( null, null, false ); } - public List getQueries() + /** + * Create a bounded range, excluding the endpoints. + * + * @return the query object + */ + public static RangeQuery createExclusiveRange( QueryTerm begin, QueryTerm end ) { - return queries; + return new RangeQuery( begin, end, false ); + } + + /** + * Create a bounded range, including the endpoints. + * + * @return the query object + */ + public static RangeQuery createInclusiveRange( QueryTerm begin, QueryTerm end ) + { + return new RangeQuery( begin, end, true ); + } + + /** + * Create a range that is greater than or equal to a given term. + * + * @return the query object + */ + public static RangeQuery createGreaterThanOrEqualToRange( QueryTerm begin ) + { + return new RangeQuery( begin, null, true ); + } + + /** + * Create a range that is greater than a given term. + * + * @return the query object + */ + public static RangeQuery createGreaterThanRange( QueryTerm begin ) + { + return new RangeQuery( begin, null, false ); + } + + /** + * Create a range that is less than or equal to a given term. + * + * @return the query object + */ + public static RangeQuery createLessThanOrEqualToRange( QueryTerm end ) + { + return new RangeQuery( null, end, true ); + } + + /** + * Create a range that is less than a given term. + * + * @return the query object + */ + public static RangeQuery createLessThanRange( QueryTerm end ) + { + return new RangeQuery( null, end, false ); + } + + public QueryTerm getBegin() + { + return begin; + } + + public QueryTerm getEnd() + { + return end; } public boolean isInclusive() @@ -55,19 +142,21 @@ public class RangeQuery return inclusive; } + /** + * @todo! this seems like the wrong place for this (it's back to front - create the query from the index + */ public org.apache.lucene.search.Query createLuceneQuery( RepositoryIndex index ) { - List queries = this.queries; - Iterator iter = queries.iterator(); - Term begin = null; - Term end = null; - if ( queries.size() == 2 ) + Term beginTerm = null; + if ( begin != null ) { - SinglePhraseQuery qry = (SinglePhraseQuery) iter.next(); - begin = new Term( qry.getField(), qry.getValue() ); - qry = (SinglePhraseQuery) iter.next(); - end = new Term( qry.getField(), qry.getValue() ); + beginTerm = new Term( begin.getField(), begin.getValue() ); } - return new org.apache.lucene.search.RangeQuery( begin, end, this.inclusive ); + Term endTerm = null; + if ( end != null ) + { + endTerm = new Term( end.getField(), end.getValue() ); + } + return new org.apache.lucene.search.RangeQuery( beginTerm, endTerm, inclusive ); } } diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/SingleTermQuery.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/SingleTermQuery.java new file mode 100644 index 000000000..607b6a84e --- /dev/null +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/SingleTermQuery.java @@ -0,0 +1,88 @@ +package org.apache.maven.repository.indexing.query; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed 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.lucene.index.Term; +import org.apache.lucene.queryParser.ParseException; +import org.apache.lucene.queryParser.QueryParser; +import org.apache.lucene.search.TermQuery; +import org.apache.maven.repository.indexing.RepositoryIndex; + +/** + * Query for a single term. + * + * @author Brett Porter + */ +public class SingleTermQuery + implements Query +{ + /** + * The term to query for. + */ + private final QueryTerm term; + + /** + * Constructor. + * + * @param term the term to query + */ + public SingleTermQuery( QueryTerm term ) + { + this.term = term; + } + + /** + * Shorthand constructor - create a single term query from a field and value + * + * @param field the field name + * @param value the value to check for + */ + public SingleTermQuery( String field, String value ) + { + this.term = new QueryTerm( field, value ); + } + + /** + * @todo! this seems like the wrong place for this (it's back to front - create the query from the index + */ + public org.apache.lucene.search.Query createLuceneQuery( RepositoryIndex index ) + throws ParseException + { + org.apache.lucene.search.Query qry; + if ( index.isKeywordField( term.getField() ) ) + { + qry = new TermQuery( new Term( term.getField(), term.getValue() ) ); + } + else + { + // TODO: doesn't seem like the right place for this here! + QueryParser parser = new QueryParser( term.getField(), index.getAnalyzer() ); + qry = parser.parse( term.getValue() ); + } + return qry; + } + + public String getField() + { + return term.getField(); + } + + public String getValue() + { + return term.getValue(); + } +} diff --git a/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/ArtifactRepositoryIndexingTest.java b/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/ArtifactRepositoryIndexingTest.java index c4bd64413..007c0f9e5 100644 --- a/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/ArtifactRepositoryIndexingTest.java +++ b/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/ArtifactRepositoryIndexingTest.java @@ -25,8 +25,8 @@ import org.apache.maven.repository.digest.DefaultDigester; import org.apache.maven.repository.digest.Digester; import org.apache.maven.repository.digest.DigesterException; import org.apache.maven.repository.indexing.query.CompoundQuery; -import org.apache.maven.repository.indexing.query.Query; -import org.apache.maven.repository.indexing.query.SinglePhraseQuery; +import org.apache.maven.repository.indexing.query.QueryTerm; +import org.apache.maven.repository.indexing.query.SingleTermQuery; import org.codehaus.plexus.PlexusTestCase; import org.codehaus.plexus.util.FileUtils; @@ -80,8 +80,8 @@ public class ArtifactRepositoryIndexingTest (RepositoryIndexSearchLayer) lookup( RepositoryIndexSearchLayer.ROLE ); // search version - Query qry = new SinglePhraseQuery( RepositoryIndex.FLD_VERSION, "1.0.15" ); - List artifactList = repoSearchLayer.searchAdvanced( qry, indexer ); + QueryTerm queryTerm = new QueryTerm( RepositoryIndex.FLD_VERSION, "1.0.15" ); + List artifactList = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 1, artifactList.size() ); for ( Iterator iter = artifactList.iterator(); iter.hasNext(); ) { @@ -91,8 +91,8 @@ public class ArtifactRepositoryIndexingTest } // search group id - qry = new SinglePhraseQuery( RepositoryIndex.FLD_GROUPID, "test.inherited" ); - artifactList = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_GROUPID, "test.inherited" ); + artifactList = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 1, artifactList.size() ); Iterator artifacts = artifactList.iterator(); if ( artifacts.hasNext() ) @@ -219,8 +219,8 @@ public class ArtifactRepositoryIndexingTest ArtifactRepositoryIndex indexer = factory.createArtifactRepositoryIndex( indexPath, repository ); // search version - Query qry = new SinglePhraseQuery( RepositoryIndex.FLD_VERSION, "1.0" ); - List artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + QueryTerm queryTerm = new QueryTerm( RepositoryIndex.FLD_VERSION, "1.0" ); + List artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 2, artifacts.size() ); for ( Iterator iter = artifacts.iterator(); iter.hasNext(); ) { @@ -230,8 +230,8 @@ public class ArtifactRepositoryIndexingTest } // search group id - qry = new SinglePhraseQuery( RepositoryIndex.FLD_GROUPID, "org.apache.maven" ); - artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_GROUPID, "org.apache.maven" ); + artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 4, artifacts.size() ); Iterator iter = artifacts.iterator(); if ( iter.hasNext() ) @@ -242,8 +242,8 @@ public class ArtifactRepositoryIndexingTest } // search artifact id - qry = new SinglePhraseQuery( RepositoryIndex.FLD_ARTIFACTID, "maven-artifact" ); - artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_ARTIFACTID, "maven-artifact" ); + artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 2, artifacts.size() ); for ( iter = artifacts.iterator(); iter.hasNext(); ) { @@ -253,8 +253,8 @@ public class ArtifactRepositoryIndexingTest } // search version - qry = new SinglePhraseQuery( RepositoryIndex.FLD_VERSION, "2" ); - artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_VERSION, "2" ); + artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 4, artifacts.size() ); for ( iter = artifacts.iterator(); iter.hasNext(); ) { @@ -264,8 +264,8 @@ public class ArtifactRepositoryIndexingTest } // search classes - qry = new SinglePhraseQuery( RepositoryIndex.FLD_CLASSES, "App" ); - artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_CLASSES, "App" ); + artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 1, artifacts.size() ); for ( iter = artifacts.iterator(); iter.hasNext(); ) { @@ -275,8 +275,8 @@ public class ArtifactRepositoryIndexingTest } // search packages - qry = new SinglePhraseQuery( RepositoryIndex.FLD_PACKAGES, "groupId" ); - artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_PACKAGES, "groupId" ); + artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 1, artifacts.size() ); for ( iter = artifacts.iterator(); iter.hasNext(); ) { @@ -286,8 +286,8 @@ public class ArtifactRepositoryIndexingTest } // search files - qry = new SinglePhraseQuery( RepositoryIndex.FLD_FILES, "pom.xml" ); - artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_FILES, "pom.xml" ); + artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 3, artifacts.size() ); iter = artifacts.iterator(); if ( iter.hasNext() ) @@ -298,8 +298,8 @@ public class ArtifactRepositoryIndexingTest } // search packaging - qry = new SinglePhraseQuery( RepositoryIndex.FLD_PACKAGING, "jar" ); - artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_PACKAGING, "jar" ); + artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 3, artifacts.size() ); for ( iter = artifacts.iterator(); iter.hasNext(); ) { @@ -309,9 +309,8 @@ public class ArtifactRepositoryIndexingTest } //search license url - qry = - new SinglePhraseQuery( RepositoryIndex.FLD_LICENSE_URLS, "http://www.apache.org/licenses/LICENSE-2.0.txt" ); - artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_LICENSE_URLS, "http://www.apache.org/licenses/LICENSE-2.0.txt" ); + artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 2, artifacts.size() ); for ( iter = artifacts.iterator(); iter.hasNext(); ) { @@ -325,8 +324,8 @@ public class ArtifactRepositoryIndexingTest } //search dependencies - qry = new SinglePhraseQuery( RepositoryIndex.FLD_DEPENDENCIES, "org.codehaus.plexus:plexus-utils:1.0.5" ); - artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_DEPENDENCIES, "org.codehaus.plexus:plexus-utils:1.0.5" ); + artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 2, artifacts.size() ); for ( iter = artifacts.iterator(); iter.hasNext(); ) { @@ -348,9 +347,8 @@ public class ArtifactRepositoryIndexingTest } //search build plugin - qry = - new SinglePhraseQuery( RepositoryIndex.FLD_PLUGINS_BUILD, "org.codehaus.modello:modello-maven-plugin:2.0" ); - artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_PLUGINS_BUILD, "org.codehaus.modello:modello-maven-plugin:2.0" ); + artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 1, artifacts.size() ); for ( iter = artifacts.iterator(); iter.hasNext(); ) { @@ -372,9 +370,9 @@ public class ArtifactRepositoryIndexingTest } //search reporting plugin - qry = new SinglePhraseQuery( RepositoryIndex.FLD_PLUGINS_REPORT, - "org.apache.maven.plugins:maven-checkstyle-plugin:2.0" ); - artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = + new QueryTerm( RepositoryIndex.FLD_PLUGINS_REPORT, "org.apache.maven.plugins:maven-checkstyle-plugin:2.0" ); + artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 1, artifacts.size() ); for ( iter = artifacts.iterator(); iter.hasNext(); ) { @@ -412,8 +410,8 @@ public class ArtifactRepositoryIndexingTest { String sha1 = digester.createChecksum( artifact.getFile(), algorithm ); - Query qry = new SinglePhraseQuery( field, sha1.trim() ); - List artifacts = repoSearchLayer.searchAdvanced( qry, indexer ); + QueryTerm queryTerm = new QueryTerm( field, sha1.trim() ); + List artifacts = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 1, artifacts.size() ); for ( Iterator iter = artifacts.iterator(); iter.hasNext(); ) { @@ -442,8 +440,8 @@ public class ArtifactRepositoryIndexingTest // Criteria 1: required query // ex. artifactId=maven-artifact AND groupId=org.apache.maven - Query qry1 = new SinglePhraseQuery( RepositoryIndex.FLD_ARTIFACTID, "maven-artifact" ); - Query qry2 = new SinglePhraseQuery( RepositoryIndex.FLD_GROUPID, "org.apache.maven" ); + QueryTerm qry1 = new QueryTerm( RepositoryIndex.FLD_ARTIFACTID, "maven-artifact" ); + QueryTerm qry2 = new QueryTerm( RepositoryIndex.FLD_GROUPID, "org.apache.maven" ); CompoundQuery rQry = new CompoundQuery(); rQry.and( qry1 ); rQry.and( qry2 ); @@ -460,7 +458,7 @@ public class ArtifactRepositoryIndexingTest // Criteria 2: nested required query // ex. (artifactId=maven-artifact AND groupId=org.apache.maven) OR // version=2.0.3 - Query qry3 = new SinglePhraseQuery( RepositoryIndex.FLD_VERSION, "2.0.3" ); + QueryTerm qry3 = new QueryTerm( RepositoryIndex.FLD_VERSION, "2.0.3" ); CompoundQuery oQry = new CompoundQuery(); oQry.or( rQry ); oQry.or( qry3 ); @@ -478,14 +476,14 @@ public class ArtifactRepositoryIndexingTest // ex. (artifactId=maven-artifact AND groupId=org.apache.maven) AND // (version=2.0.3 OR version=2.0.1) // AND (name=maven-artifact-2.0.1.jar OR name=maven-artifact) - Query qry4 = new SinglePhraseQuery( RepositoryIndex.FLD_VERSION, "2.0.1" ); + QueryTerm qry4 = new QueryTerm( RepositoryIndex.FLD_VERSION, "2.0.1" ); oQry = new CompoundQuery(); oQry.or( qry3 ); oQry.or( qry4 ); CompoundQuery oQry5 = new CompoundQuery(); - Query qry9 = new SinglePhraseQuery( RepositoryIndex.FLD_NAME, "maven-artifact-2.0.1.jar" ); - Query qry10 = new SinglePhraseQuery( RepositoryIndex.FLD_NAME, "maven-artifact" ); + QueryTerm qry9 = new QueryTerm( RepositoryIndex.FLD_NAME, "maven-artifact-2.0.1.jar" ); + QueryTerm qry10 = new QueryTerm( RepositoryIndex.FLD_NAME, "maven-artifact" ); oQry5.or( qry9 ); oQry5.or( qry10 ); @@ -505,10 +503,9 @@ public class ArtifactRepositoryIndexingTest } CompoundQuery oQry6 = new CompoundQuery(); - Query qry11 = - new SinglePhraseQuery( RepositoryIndex.FLD_DEPENDENCIES, "org.codehaus.plexus:plexus-utils:1.0.5" ); - Query qry12 = new SinglePhraseQuery( RepositoryIndex.FLD_DEPENDENCIES, - "org.codehaus.plexus:plexus-container-defualt:1.0-alpha-9" ); + QueryTerm qry11 = new QueryTerm( RepositoryIndex.FLD_DEPENDENCIES, "org.codehaus.plexus:plexus-utils:1.0.5" ); + QueryTerm qry12 = new QueryTerm( RepositoryIndex.FLD_DEPENDENCIES, + "org.codehaus.plexus:plexus-container-defualt:1.0-alpha-9" ); oQry6.or( qry11 ); oQry6.or( qry12 ); @@ -533,8 +530,8 @@ public class ArtifactRepositoryIndexingTest // AND (name=maven-artifact-2.0.1.jar OR name=maven-artifact)] // OR [(artifactId=sample AND groupId=test)] CompoundQuery rQry4 = new CompoundQuery(); - Query qry5 = new SinglePhraseQuery( RepositoryIndex.FLD_ARTIFACTID, "sample" ); - Query qry6 = new SinglePhraseQuery( RepositoryIndex.FLD_GROUPID, "test" ); + QueryTerm qry5 = new QueryTerm( RepositoryIndex.FLD_ARTIFACTID, "sample" ); + QueryTerm qry6 = new QueryTerm( RepositoryIndex.FLD_GROUPID, "test" ); rQry4.and( qry5 ); rQry4.and( qry6 ); CompoundQuery oQry2 = new CompoundQuery(); @@ -558,8 +555,8 @@ public class ArtifactRepositoryIndexingTest // [(artifactId=sample AND groupId=test)] OR // [(artifactId=sample2 AND groupId=test)] CompoundQuery rQry5 = new CompoundQuery(); - Query qry7 = new SinglePhraseQuery( RepositoryIndex.FLD_ARTIFACTID, "sample2" ); - Query qry8 = new SinglePhraseQuery( RepositoryIndex.FLD_GROUPID, "test" ); + QueryTerm qry7 = new QueryTerm( RepositoryIndex.FLD_ARTIFACTID, "sample2" ); + QueryTerm qry8 = new QueryTerm( RepositoryIndex.FLD_GROUPID, "test" ); rQry5.and( qry7 ); rQry5.and( qry8 ); oQry2.and( rQry5 ); @@ -592,8 +589,8 @@ public class ArtifactRepositoryIndexingTest try { - Query qry = new SinglePhraseQuery( RepositoryIndex.FLD_VERSION, "~~~~~" ); - repoSearchLayer.searchAdvanced( qry, indexer ); + QueryTerm queryTerm = new QueryTerm( RepositoryIndex.FLD_VERSION, "~~~~~" ); + repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); fail( "Must throw an exception on unparseable query." ); } catch ( RepositoryIndexSearchException re ) @@ -605,8 +602,8 @@ public class ArtifactRepositoryIndexingTest try { - Query qry = new SinglePhraseQuery( RepositoryIndex.FLD_VERSION, "1.0" ); - repoSearchLayer.searchAdvanced( qry, indexer ); + QueryTerm queryTerm = new QueryTerm( RepositoryIndex.FLD_VERSION, "1.0" ); + repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); fail( "Must throw an exception on invalid index location." ); } catch ( RepositoryIndexSearchException re ) @@ -635,23 +632,24 @@ public class ArtifactRepositoryIndexingTest Artifact pomArtifact = createArtifact( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), "pom" ); - Query qry = new SinglePhraseQuery( RepositoryIndex.FLD_ID, RepositoryIndex.ARTIFACT + ":" + artifact.getId() ); - List results = repoSearcher.search( qry, indexer ); + QueryTerm queryTerm = + new QueryTerm( RepositoryIndex.FLD_ID, RepositoryIndex.ARTIFACT + ":" + artifact.getId() ); + List results = repoSearcher.search( new SingleTermQuery( queryTerm ), indexer ); assertFalse( results.isEmpty() ); - qry = new SinglePhraseQuery( RepositoryIndex.FLD_ID, RepositoryIndex.POM + ":" + pomArtifact.getId() ); - results = repoSearcher.search( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_ID, RepositoryIndex.POM + ":" + pomArtifact.getId() ); + results = repoSearcher.search( new SingleTermQuery( queryTerm ), indexer ); assertFalse( results.isEmpty() ); indexer.deleteArtifact( artifact ); indexer.deleteArtifact( pomArtifact ); - qry = new SinglePhraseQuery( RepositoryIndex.FLD_ID, RepositoryIndex.ARTIFACT + ":" + artifact.getId() ); - results = repoSearcher.search( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_ID, RepositoryIndex.ARTIFACT + ":" + artifact.getId() ); + results = repoSearcher.search( new SingleTermQuery( queryTerm ), indexer ); assertTrue( results.isEmpty() ); - qry = new SinglePhraseQuery( RepositoryIndex.FLD_ID, RepositoryIndex.POM + ":" + pomArtifact.getId() ); - results = repoSearcher.search( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_ID, RepositoryIndex.POM + ":" + pomArtifact.getId() ); + results = repoSearcher.search( new SingleTermQuery( queryTerm ), indexer ); assertTrue( results.isEmpty() ); } @@ -673,8 +671,8 @@ public class ArtifactRepositoryIndexingTest Artifact artifact = createArtifact( "org.apache.maven", "maven-corrupt-jar", "2.0" ); indexer.indexArtifact( artifact ); - Query qry = new SinglePhraseQuery( RepositoryIndex.FLD_ID, RepositoryIndex.ARTIFACT + artifact.getId() ); - List artifacts = repoSearcher.search( qry, indexer ); + QueryTerm queryTerm = new QueryTerm( RepositoryIndex.FLD_ID, RepositoryIndex.ARTIFACT + artifact.getId() ); + List artifacts = repoSearcher.search( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 0, artifacts.size() ); } diff --git a/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/MetadataRepositoryIndexingTest.java b/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/MetadataRepositoryIndexingTest.java index 851478955..de3b257c5 100644 --- a/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/MetadataRepositoryIndexingTest.java +++ b/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/MetadataRepositoryIndexingTest.java @@ -29,9 +29,9 @@ import org.apache.maven.artifact.repository.metadata.RepositoryMetadata; import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata; import org.apache.maven.artifact.repository.metadata.Versioning; import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader; -import org.apache.maven.repository.indexing.query.Query; +import org.apache.maven.repository.indexing.query.QueryTerm; import org.apache.maven.repository.indexing.query.RangeQuery; -import org.apache.maven.repository.indexing.query.SinglePhraseQuery; +import org.apache.maven.repository.indexing.query.SingleTermQuery; import org.codehaus.plexus.PlexusTestCase; import org.codehaus.plexus.util.FileUtils; import org.codehaus.plexus.util.IOUtil; @@ -41,9 +41,9 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.ArrayList; /** * This class tests the MetadataRepositoryIndex. @@ -141,8 +141,8 @@ public class MetadataRepositoryIndexingTest MetadataRepositoryIndex indexer = factory.createMetadataRepositoryIndex( indexPath, repository ); // search last update - Query qry = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212044643" ); - List metadataList = repoSearchLayer.searchAdvanced( qry, indexer ); + QueryTerm queryTerm = new QueryTerm( RepositoryIndex.FLD_LASTUPDATE, "20051212044643" ); + List metadataList = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); //assertEquals( 1, metadataList.size() ); for ( Iterator iter = metadataList.iterator(); iter.hasNext(); ) { @@ -157,8 +157,8 @@ public class MetadataRepositoryIndexingTest } // search plugin prefix - qry = new SinglePhraseQuery( RepositoryIndex.FLD_PLUGINPREFIX, "org.apache.maven" ); - metadataList = repoSearchLayer.searchAdvanced( qry, indexer ); + queryTerm = new QueryTerm( RepositoryIndex.FLD_PLUGINPREFIX, "org.apache.maven" ); + metadataList = repoSearchLayer.searchAdvanced( new SingleTermQuery( queryTerm ), indexer ); //assertEquals( 1, metadataList.size() ); for ( Iterator iter = metadataList.iterator(); iter.hasNext(); ) { @@ -177,11 +177,9 @@ public class MetadataRepositoryIndexingTest } // search last update using INCLUSIVE Range Query - Query qry1 = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212000000" ); - Query qry2 = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212235959" ); - RangeQuery rQry = new RangeQuery( true ); - rQry.addQuery( qry1 ); - rQry.addQuery( qry2 ); + QueryTerm qry1 = new QueryTerm( RepositoryIndex.FLD_LASTUPDATE, "20051212000000" ); + QueryTerm qry2 = new QueryTerm( RepositoryIndex.FLD_LASTUPDATE, "20051212235959" ); + RangeQuery rQry = RangeQuery.createInclusiveRange( qry1, qry2 ); metadataList = repoSearchLayer.searchAdvanced( rQry, indexer ); for ( Iterator iter = metadataList.iterator(); iter.hasNext(); ) @@ -197,11 +195,10 @@ public class MetadataRepositoryIndexingTest } // search last update using EXCLUSIVE Range Query - qry1 = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212000000" ); - qry2 = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212044643" ); - rQry = new RangeQuery( false ); - rQry.addQuery( qry1 ); - rQry.addQuery( qry2 ); + qry1 = new QueryTerm( RepositoryIndex.FLD_LASTUPDATE, "20051212000000" ); + qry2 = new QueryTerm( RepositoryIndex.FLD_LASTUPDATE, "20051212044643" ); + + rQry = RangeQuery.createExclusiveRange( qry1, qry2 ); metadataList = repoSearchLayer.searchAdvanced( rQry, indexer ); assertEquals( 0, metadataList.size() ); @@ -226,8 +223,8 @@ public class MetadataRepositoryIndexingTest repoMetadata.setMetadata( readMetadata( repoMetadata ) ); indexer.deleteDocument( RepositoryIndex.FLD_ID, (String) repoMetadata.getKey() ); - Query qry = new SinglePhraseQuery( RepositoryIndex.FLD_ID, (String) repoMetadata.getKey() ); - List metadataList = repoSearcher.search( qry, indexer ); + QueryTerm queryTerm = new QueryTerm( RepositoryIndex.FLD_ID, (String) repoMetadata.getKey() ); + List metadataList = repoSearcher.search( new SingleTermQuery( queryTerm ), indexer ); assertEquals( 0, metadataList.size() ); } diff --git a/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/query/QueryTest.java b/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/query/QueryTest.java index ef81f4799..17364046f 100644 --- a/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/query/QueryTest.java +++ b/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/query/QueryTest.java @@ -18,58 +18,139 @@ package org.apache.maven.repository.indexing.query; import junit.framework.TestCase; +import java.util.Iterator; + /** - * @author Edwin Punzalan + * @author Brett Porter */ public class QueryTest extends TestCase { - public void testSinglePhraseQueryObject() + private QueryTerm term1 = new QueryTerm( "field1", "value1" ); + + private QueryTerm term2 = new QueryTerm( "field2", "value2" ); + + private QueryTerm term3 = new QueryTerm( "field3", "value3" ); + + public void testQueryTerm() { - SinglePhraseQuery query = new SinglePhraseQuery( "Field", "Value" ); - assertEquals( "Field", query.getField() ); - assertEquals( "Value", query.getValue() ); + QueryTerm query = new QueryTerm( "Field", "Value" ); + assertEquals( "check field setting", "Field", query.getField() ); + assertEquals( "check value setting", "Value", query.getValue() ); } - public void testCompoundQueries() + public void testSingleTermQuery() { - CompoundQuery rQuery = new CompoundQuery(); - rQuery.and( new SinglePhraseQuery( "r1Field", "r1Value" ) ); - rQuery.and( new SinglePhraseQuery( "r2Field", "r2Value" ) ); + SingleTermQuery query = new SingleTermQuery( "Field", "Value" ); + assertEquals( "check field setting", "Field", query.getField() ); + assertEquals( "check value setting", "Value", query.getValue() ); - CompoundQuery oQuery = new CompoundQuery(); - oQuery.or( new SinglePhraseQuery( "oField", "oValue" ) ); + query = new SingleTermQuery( term1 ); + assertEquals( "check field setting", "field1", query.getField() ); + assertEquals( "check value setting", "value1", query.getValue() ); + } - CompoundQuery all = new CompoundQuery(); - all.and( rQuery ); - all.or( oQuery ); - assertEquals( 2, all.getQueries().size() ); + public void testRangeQueryOpen() + { + RangeQuery rangeQuery = RangeQuery.createOpenRange(); + assertNull( "Check range has no start", rangeQuery.getBegin() ); + assertNull( "Check range has no end", rangeQuery.getEnd() ); + } - CompoundQueryTerm queryTerm = (CompoundQueryTerm) all.getQueries().get( 0 ); - assertTrue( queryTerm.getQuery() instanceof CompoundQuery ); - rQuery = (CompoundQuery) queryTerm.getQuery(); - assertEquals( 2, rQuery.getQueries().size() ); - queryTerm = (CompoundQueryTerm) rQuery.getQueries().get( 0 ); - assertTrue( queryTerm.getQuery() instanceof SinglePhraseQuery ); - SinglePhraseQuery sQuery = (SinglePhraseQuery) queryTerm.getQuery(); - assertEquals( "r1Field", sQuery.getField() ); - assertEquals( "r1Value", sQuery.getValue() ); - queryTerm = (CompoundQueryTerm) rQuery.getQueries().get( 1 ); - assertTrue( queryTerm.getQuery() instanceof SinglePhraseQuery ); - sQuery = (SinglePhraseQuery) queryTerm.getQuery(); - assertEquals( "r2Field", sQuery.getField() ); - assertEquals( "r2Value", sQuery.getValue() ); + public void testRangeQueryExclusive() + { + RangeQuery rangeQuery = RangeQuery.createExclusiveRange( term1, term2 ); + assertEquals( "Check range start", term1, rangeQuery.getBegin() ); + assertEquals( "Check range end", term2, rangeQuery.getEnd() ); + assertFalse( "Check exclusive", rangeQuery.isInclusive() ); + } - queryTerm = (CompoundQueryTerm) all.getQueries().get( 1 ); - assertTrue( queryTerm.getQuery() instanceof CompoundQuery ); - rQuery = (CompoundQuery) queryTerm.getQuery(); - assertEquals( 1, rQuery.getQueries().size() ); - queryTerm = (CompoundQueryTerm) rQuery.getQueries().get( 0 ); - assertTrue( queryTerm.getQuery() instanceof SinglePhraseQuery ); - sQuery = (SinglePhraseQuery) queryTerm.getQuery(); - assertEquals( "oField", sQuery.getField() ); - assertEquals( "oValue", sQuery.getValue() ); + public void testRangeQueryInclusive() + { + RangeQuery rangeQuery = RangeQuery.createInclusiveRange( term1, term2 ); + assertEquals( "Check range start", term1, rangeQuery.getBegin() ); + assertEquals( "Check range end", term2, rangeQuery.getEnd() ); + assertTrue( "Check inclusive", rangeQuery.isInclusive() ); + } + public void testRangeQueryOpenEnded() + { + RangeQuery rangeQuery = RangeQuery.createGreaterThanOrEqualToRange( term1 ); + assertEquals( "Check range start", term1, rangeQuery.getBegin() ); + assertNull( "Check range end", rangeQuery.getEnd() ); + assertTrue( "Check inclusive", rangeQuery.isInclusive() ); + + rangeQuery = RangeQuery.createGreaterThanRange( term1 ); + assertEquals( "Check range start", term1, rangeQuery.getBegin() ); + assertNull( "Check range end", rangeQuery.getEnd() ); + assertFalse( "Check exclusive", rangeQuery.isInclusive() ); + + rangeQuery = RangeQuery.createLessThanOrEqualToRange( term1 ); + assertNull( "Check range start", rangeQuery.getBegin() ); + assertEquals( "Check range end", term1, rangeQuery.getEnd() ); + assertTrue( "Check inclusive", rangeQuery.isInclusive() ); + + rangeQuery = RangeQuery.createLessThanRange( term1 ); + assertNull( "Check range start", rangeQuery.getBegin() ); + assertEquals( "Check range end", term1, rangeQuery.getEnd() ); + assertFalse( "Check exclusive", rangeQuery.isInclusive() ); + } + + public void testCompundQuery() + { + CompoundQuery query = new CompoundQuery(); + assertTrue( "check query is empty", query.getCompoundQueryTerms().isEmpty() ); + + query.and( term1 ); + query.or( term2 ); + query.not( term3 ); + + Iterator i = query.getCompoundQueryTerms().iterator(); + CompoundQueryTerm term = (CompoundQueryTerm) i.next(); + assertEquals( "Check first term", "field1", getQuery( term ).getField() ); + assertEquals( "Check first term", "value1", getQuery( term ).getValue() ); + assertTrue( "Check first term", term.isRequired() ); + assertFalse( "Check first term", term.isProhibited() ); + + term = (CompoundQueryTerm) i.next(); + assertEquals( "Check second term", "field2", getQuery( term ).getField() ); + assertEquals( "Check second term", "value2", getQuery( term ).getValue() ); + assertFalse( "Check second term", term.isRequired() ); + assertFalse( "Check second term", term.isProhibited() ); + + term = (CompoundQueryTerm) i.next(); + assertEquals( "Check third term", "field3", getQuery( term ).getField() ); + assertEquals( "Check third term", "value3", getQuery( term ).getValue() ); + assertFalse( "Check third term", term.isRequired() ); + assertTrue( "Check third term", term.isProhibited() ); + + CompoundQuery query2 = new CompoundQuery(); + query2.and( query ); + query2.or( new SingleTermQuery( term2 ) ); + query2.not( new SingleTermQuery( term3 ) ); + + i = query2.getCompoundQueryTerms().iterator(); + term = (CompoundQueryTerm) i.next(); + assertEquals( "Check first term", query, term.getQuery() ); + assertTrue( "Check first term", term.isRequired() ); + assertFalse( "Check first term", term.isProhibited() ); + + term = (CompoundQueryTerm) i.next(); + assertEquals( "Check second term", "field2", getQuery( term ).getField() ); + assertEquals( "Check second term", "value2", getQuery( term ).getValue() ); + assertFalse( "Check second term", term.isRequired() ); + assertFalse( "Check second term", term.isProhibited() ); + + term = (CompoundQueryTerm) i.next(); + assertEquals( "Check third term", "field3", getQuery( term ).getField() ); + assertEquals( "Check third term", "value3", getQuery( term ).getValue() ); + assertFalse( "Check third term", term.isRequired() ); + assertTrue( "Check third term", term.isProhibited() ); + } + + private static SingleTermQuery getQuery( CompoundQueryTerm term ) + { + return (SingleTermQuery) term.getQuery(); } } diff --git a/maven-repository-reports-standard/src/main/java/org/apache/maven/repository/reporting/DuplicateArtifactFileReportProcessor.java b/maven-repository-reports-standard/src/main/java/org/apache/maven/repository/reporting/DuplicateArtifactFileReportProcessor.java index b5f5d7c3d..21a24515c 100644 --- a/maven-repository-reports-standard/src/main/java/org/apache/maven/repository/reporting/DuplicateArtifactFileReportProcessor.java +++ b/maven-repository-reports-standard/src/main/java/org/apache/maven/repository/reporting/DuplicateArtifactFileReportProcessor.java @@ -27,8 +27,7 @@ import org.apache.maven.repository.indexing.RepositoryIndexSearchException; import org.apache.maven.repository.indexing.RepositoryIndexSearchLayer; import org.apache.maven.repository.indexing.RepositoryIndexingFactory; import org.apache.maven.repository.indexing.SearchResult; -import org.apache.maven.repository.indexing.query.Query; -import org.apache.maven.repository.indexing.query.SinglePhraseQuery; +import org.apache.maven.repository.indexing.query.SingleTermQuery; import java.io.File; import java.util.Iterator; @@ -92,11 +91,9 @@ public class DuplicateArtifactFileReportProcessor throw new ReportProcessorException( "Failed to generate checksum", e ); } - Query query = new SinglePhraseQuery( algorithm, checksum.trim() ); - try { - List results = searchLayer.searchAdvanced( query, index ); + List results = searchLayer.searchAdvanced( new SingleTermQuery( algorithm, checksum.trim() ), index ); if ( results.isEmpty() ) { diff --git a/maven-repository-webapp/src/main/java/org/apache/maven/repository/manager/web/action/SearchAction.java b/maven-repository-webapp/src/main/java/org/apache/maven/repository/manager/web/action/SearchAction.java index 395ecb51f..2d9aa855c 100644 --- a/maven-repository-webapp/src/main/java/org/apache/maven/repository/manager/web/action/SearchAction.java +++ b/maven-repository-webapp/src/main/java/org/apache/maven/repository/manager/web/action/SearchAction.java @@ -27,7 +27,7 @@ import org.apache.maven.repository.indexing.RepositoryIndexException; import org.apache.maven.repository.indexing.RepositoryIndexSearchException; import org.apache.maven.repository.indexing.RepositoryIndexSearchLayer; import org.apache.maven.repository.indexing.RepositoryIndexingFactory; -import org.apache.maven.repository.indexing.query.SinglePhraseQuery; +import org.apache.maven.repository.indexing.query.SingleTermQuery; import java.io.File; import java.net.MalformedURLException; @@ -112,7 +112,7 @@ public class SearchAction return ERROR; } - searchResults = searchLayer.searchAdvanced( new SinglePhraseQuery( "md5", md5 ), index ); + searchResults = searchLayer.searchAdvanced( new SingleTermQuery( "md5", md5 ), index ); return SUCCESS; }