You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2015/10/12 14:15:10 UTC
svn commit: r1708097 [2/2] - in /lucene/dev/trunk: lucene/
lucene/core/src/java/org/apache/lucene/search/
lucene/core/src/test/org/apache/lucene/search/
lucene/expressions/src/test/org/apache/lucene/expressions/
lucene/facet/src/test/org/apache/lucene/...
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/DocSetUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/DocSetUtil.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/DocSetUtil.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/DocSetUtil.java Mon Oct 12 12:15:07 2015
@@ -20,10 +20,8 @@ package org.apache.solr.search;
import java.io.IOException;
import java.util.List;
-import java.util.Map;
import org.apache.lucene.index.DirectoryReader;
-import org.apache.lucene.index.ExitableDirectoryReader;
import org.apache.lucene.index.Fields;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.LeafReaderContext;
@@ -31,12 +29,9 @@ import org.apache.lucene.index.PostingsE
import org.apache.lucene.index.Term;
import org.apache.lucene.index.Terms;
import org.apache.lucene.index.TermsEnum;
-import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.util.Bits;
Added: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Filter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Filter.java?rev=1708097&view=auto
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Filter.java (added)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Filter.java Mon Oct 12 12:15:07 2015
@@ -0,0 +1,144 @@
+package org.apache.solr.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 java.io.IOException;
+import java.util.Set;
+
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.ConstantScoreScorer;
+import org.apache.lucene.search.DocIdSet;
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.Explanation;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Scorer;
+import org.apache.lucene.search.TwoPhaseIterator;
+import org.apache.lucene.search.Weight;
+import org.apache.lucene.util.Bits;
+
+/**
+ * Convenient base class for building queries that only perform matching, but
+ * no scoring. The scorer produced by such queries always returns 0 as score.
+ */
+public abstract class Filter extends Query {
+
+ private final boolean applyLazily;
+
+ /** Filter constructor. When {@code applyLazily} is true and the produced
+ * {@link DocIdSet}s support {@link DocIdSet#bits() random-access}, Lucene
+ * will only apply this filter after other clauses. */
+ protected Filter(boolean applyLazily) {
+ this.applyLazily = applyLazily;
+ }
+
+ /** Default Filter constructor that will use the
+ * {@link DocIdSet#iterator() doc id set iterator} when consumed through
+ * the {@link Query} API. */
+ protected Filter() {
+ this(false);
+ }
+
+ /**
+ * Creates a {@link DocIdSet} enumerating the documents that should be
+ * permitted in search results. <b>NOTE:</b> null can be
+ * returned if no documents are accepted by this Filter.
+ * <p>
+ * Note: This method will be called once per segment in
+ * the index during searching. The returned {@link DocIdSet}
+ * must refer to document IDs for that segment, not for
+ * the top-level reader.
+ *
+ * @param context a {@link org.apache.lucene.index.LeafReaderContext} instance opened on the index currently
+ * searched on. Note, it is likely that the provided reader info does not
+ * represent the whole underlying index i.e. if the index has more than
+ * one segment the given reader only represents a single segment.
+ * The provided context is always an atomic context, so you can call
+ * {@link org.apache.lucene.index.LeafReader#fields()}
+ * on the context's reader, for example.
+ *
+ * @param acceptDocs
+ * Bits that represent the allowable docs to match (typically deleted docs
+ * but possibly filtering other documents)
+ *
+ * @return a DocIdSet that provides the documents which should be permitted or
+ * prohibited in search results. <b>NOTE:</b> <code>null</code> should be returned if
+ * the filter doesn't accept any documents otherwise internal optimization might not apply
+ * in the case an <i>empty</i> {@link DocIdSet} is returned.
+ */
+ public abstract DocIdSet getDocIdSet(LeafReaderContext context, Bits acceptDocs) throws IOException;
+
+ //
+ // Query compatibility
+ //
+
+ @Override
+ public Weight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
+ return new Weight(this) {
+
+ @Override
+ public void extractTerms(Set<Term> terms) {}
+
+ @Override
+ public float getValueForNormalization() throws IOException {
+ return 0f;
+ }
+
+ @Override
+ public void normalize(float norm, float boost) {}
+
+ @Override
+ public Explanation explain(LeafReaderContext context, int doc) throws IOException {
+ final Scorer scorer = scorer(context);
+ final boolean match = (scorer != null && scorer.advance(doc) == doc);
+ if (match) {
+ assert scorer.score() == 0f;
+ return Explanation.match(0f, "Match on id " + doc);
+ } else {
+ return Explanation.match(0f, "No match on id " + doc);
+ }
+ }
+
+ @Override
+ public Scorer scorer(LeafReaderContext context) throws IOException {
+ final DocIdSet set = getDocIdSet(context, null);
+ if (set == null) {
+ return null;
+ }
+ if (applyLazily && set.bits() != null) {
+ final Bits bits = set.bits();
+ final DocIdSetIterator approximation = DocIdSetIterator.all(context.reader().maxDoc());
+ final TwoPhaseIterator twoPhase = new TwoPhaseIterator(approximation) {
+ @Override
+ public boolean matches() throws IOException {
+ return bits.get(approximation.docID());
+ }
+ };
+ return new ConstantScoreScorer(this, 0f, twoPhase);
+ }
+ final DocIdSetIterator iterator = set.iterator();
+ if (iterator == null) {
+ return null;
+ }
+ return new ConstantScoreScorer(this, 0f, iterator);
+ }
+
+ };
+ }
+}
Added: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/FilteredDocIdSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/FilteredDocIdSet.java?rev=1708097&view=auto
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/FilteredDocIdSet.java (added)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/FilteredDocIdSet.java Mon Oct 12 12:15:07 2015
@@ -0,0 +1,115 @@
+package org.apache.solr.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 java.io.IOException;
+import java.util.Collection;
+
+import org.apache.lucene.search.DocIdSet;
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.FilteredDocIdSetIterator;
+import org.apache.lucene.util.Accountable;
+import org.apache.lucene.util.Bits;
+import org.apache.lucene.util.RamUsageEstimator;
+
+/**
+ * Abstract decorator class for a DocIdSet implementation
+ * that provides on-demand filtering/validation
+ * mechanism on a given DocIdSet.
+ *
+ * <p>
+ * Technically, this same functionality could be achieved
+ * with ChainedFilter (under queries/), however the
+ * benefit of this class is it never materializes the full
+ * bitset for the filter. Instead, the {@link #match}
+ * method is invoked on-demand, per docID visited during
+ * searching. If you know few docIDs will be visited, and
+ * the logic behind {@link #match} is relatively costly,
+ * this may be a better way to filter than ChainedFilter.
+ *
+ * @see DocIdSet
+ */
+
+public abstract class FilteredDocIdSet extends DocIdSet {
+ private final DocIdSet _innerSet;
+
+ /**
+ * Constructor.
+ * @param innerSet Underlying DocIdSet
+ */
+ public FilteredDocIdSet(DocIdSet innerSet) {
+ _innerSet = innerSet;
+ }
+
+ /** Return the wrapped {@link DocIdSet}. */
+ public DocIdSet getDelegate() {
+ return _innerSet;
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return RamUsageEstimator.NUM_BYTES_OBJECT_REF + _innerSet.ramBytesUsed();
+ }
+
+ @Override
+ public Collection<Accountable> getChildResources() {
+ return _innerSet.getChildResources();
+ }
+
+ @Override
+ public Bits bits() throws IOException {
+ final Bits bits = _innerSet.bits();
+ return (bits == null) ? null : new Bits() {
+ @Override
+ public boolean get(int docid) {
+ return bits.get(docid) && FilteredDocIdSet.this.match(docid);
+ }
+
+ @Override
+ public int length() {
+ return bits.length();
+ }
+ };
+ }
+
+ /**
+ * Validation method to determine whether a docid should be in the result set.
+ * @param docid docid to be tested
+ * @return true if input docid should be in the result set, false otherwise.
+ */
+ protected abstract boolean match(int docid);
+
+ /**
+ * Implementation of the contract to build a DocIdSetIterator.
+ * @see DocIdSetIterator
+ * @see FilteredDocIdSetIterator
+ */
+ @Override
+ public DocIdSetIterator iterator() throws IOException {
+ final DocIdSetIterator iterator = _innerSet.iterator();
+ if (iterator == null) {
+ return null;
+ }
+ return new FilteredDocIdSetIterator(iterator) {
+ @Override
+ protected boolean match(int docid) {
+ return FilteredDocIdSet.this.match(docid);
+ }
+ };
+ }
+}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Grouping.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Grouping.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Grouping.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/Grouping.java Mon Oct 12 12:15:07 2015
@@ -36,7 +36,6 @@ import org.apache.lucene.search.BooleanC
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.CachingCollector;
import org.apache.lucene.search.Collector;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.MultiCollector;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/HashQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/HashQParserPlugin.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/HashQParserPlugin.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/HashQParserPlugin.java Mon Oct 12 12:15:07 2015
@@ -18,49 +18,34 @@
package org.apache.solr.search;
import java.io.IOException;
-import java.io.Serializable;
import java.util.List;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.Future;
-import com.google.common.primitives.Longs;
+import org.apache.lucene.index.IndexReaderContext;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.LeafReaderContext;
-import org.apache.lucene.index.IndexReaderContext;
+import org.apache.lucene.index.NumericDocValues;
+import org.apache.lucene.index.SortedDocValues;
+import org.apache.lucene.search.ConstantScoreQuery;
+import org.apache.lucene.search.DocIdSet;
+import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.LeafCollector;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Scorer;
+import org.apache.lucene.search.Weight;
import org.apache.lucene.util.BitDocIdSet;
+import org.apache.lucene.util.Bits;
+import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.CharsRef;
import org.apache.lucene.util.CharsRefBuilder;
import org.apache.lucene.util.FixedBitSet;
-
-import org.apache.lucene.util.Bits;
-import org.apache.lucene.search.BitsFilteredDocIdSet;
import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.common.util.SolrjNamedThreadFactory;
-import org.apache.solr.core.CloseHook;
+import org.apache.solr.common.util.NamedList;
import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.schema.IndexSchema;
import org.apache.solr.schema.FieldType;
+import org.apache.solr.schema.IndexSchema;
import org.apache.solr.schema.StrField;
-import org.apache.solr.schema.TrieField;
-import org.apache.solr.core.SolrCore;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.ConstantScoreQuery;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.Scorer;
-import org.apache.lucene.search.Weight;
-import org.apache.lucene.search.DocIdSet;
-import org.apache.lucene.search.Filter;
-import org.apache.lucene.index.SortedDocValues;
-import org.apache.lucene.index.NumericDocValues;
-import org.apache.lucene.util.BytesRef;
-
-import org.apache.solr.common.util.NamedList;
+import com.google.common.primitives.Longs;
/**
* syntax fq={!hash workers=11 worker=4 keys=field1,field2}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java Mon Oct 12 12:15:07 2015
@@ -33,7 +33,6 @@ import org.apache.lucene.search.Constant
import org.apache.lucene.search.ConstantScoreWeight;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Scorer;
Added: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryWrapperFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryWrapperFilter.java?rev=1708097&view=auto
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryWrapperFilter.java (added)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QueryWrapperFilter.java Mon Oct 12 12:15:07 2015
@@ -0,0 +1,102 @@
+package org.apache.solr.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 java.io.IOException;
+
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.search.BoostQuery;
+import org.apache.lucene.search.ConstantScoreQuery;
+import org.apache.lucene.search.DocIdSet;
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.NumericRangeQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Weight;
+import org.apache.lucene.util.Bits;
+
+/**
+ * Constrains search results to only match those which also match a provided
+ * query.
+ *
+ * <p> This could be used, for example, with a {@link NumericRangeQuery} on a suitably
+ * formatted date field to implement date filtering. One could re-use a single
+ * CachingWrapperFilter(QueryWrapperFilter) that matches, e.g., only documents modified
+ * within the last week. This would only need to be reconstructed once per day.
+ */
+public class QueryWrapperFilter extends Filter {
+ private final Query query;
+
+ /** Constructs a filter which only matches documents matching
+ * <code>query</code>.
+ */
+ public QueryWrapperFilter(Query query) {
+ if (query == null)
+ throw new NullPointerException("Query may not be null");
+ this.query = query;
+ }
+
+ @Override
+ public Query rewrite(IndexReader reader) throws IOException {
+ return new BoostQuery(new ConstantScoreQuery(query), 0f);
+ }
+
+ /** returns the inner Query */
+ public final Query getQuery() {
+ return query;
+ }
+
+ @Override
+ public DocIdSet getDocIdSet(final LeafReaderContext context, final Bits acceptDocs) throws IOException {
+ // get a private context that is used to rewrite, createWeight and score eventually
+ final LeafReaderContext privateContext = context.reader().getContext();
+ final Weight weight = new IndexSearcher(privateContext).createNormalizedWeight(query, false);
+
+ DocIdSet set = new DocIdSet() {
+ @Override
+ public DocIdSetIterator iterator() throws IOException {
+ return weight.scorer(privateContext);
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return 0L;
+ }
+ };
+ return BitsFilteredDocIdSet.wrap(set, acceptDocs);
+ }
+
+ @Override
+ public String toString(String field) {
+ return "QueryWrapperFilter(" + query.toString(field) + ")";
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (super.equals(o) == false) {
+ return false;
+ }
+ return this.query.equals(((QueryWrapperFilter)o).query);
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * super.hashCode() + query.hashCode();
+ }
+}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrConstantScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrConstantScoreQuery.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrConstantScoreQuery.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrConstantScoreQuery.java Mon Oct 12 12:15:07 2015
@@ -3,14 +3,12 @@ package org.apache.solr.search;
import java.io.IOException;
import java.util.Map;
-import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.search.ConstantScoreScorer;
import org.apache.lucene.search.ConstantScoreWeight;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Scorer;
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrFilter.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrFilter.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrFilter.java Mon Oct 12 12:15:07 2015
@@ -18,7 +18,6 @@
package org.apache.solr.search;
import org.apache.lucene.index.LeafReaderContext;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.util.Bits;
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SortedIntDocSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SortedIntDocSet.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SortedIntDocSet.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SortedIntDocSet.java Mon Oct 12 12:15:07 2015
@@ -22,10 +22,8 @@ import java.util.Collections;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.LeafReaderContext;
-import org.apache.lucene.search.BitsFilteredDocIdSet;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.util.Accountable;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.FixedBitSet;
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/TermsQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/TermsQParserPlugin.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/TermsQParserPlugin.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/TermsQParserPlugin.java Mon Oct 12 12:15:07 2015
@@ -26,10 +26,8 @@ import org.apache.lucene.search.Automato
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.DocValuesTermsQuery;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.MatchNoDocsQuery;
import org.apache.lucene.search.Query;
-import org.apache.lucene.search.QueryWrapperFilter;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.BytesRefBuilder;
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetField.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetField.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetField.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/facet/FacetField.java Mon Oct 12 12:15:07 2015
@@ -39,7 +39,6 @@ import org.apache.lucene.index.Terms;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.util.BytesRef;
@@ -54,6 +53,7 @@ import org.apache.solr.schema.FieldType;
import org.apache.solr.schema.SchemaField;
import org.apache.solr.schema.TrieField;
import org.apache.solr.search.DocSet;
+import org.apache.solr.search.Filter;
import org.apache.solr.search.HashDocSet;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.search.SortedIntDocSet;
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/ValueSourceRangeFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/ValueSourceRangeFilter.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/ValueSourceRangeFilter.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/ValueSourceRangeFilter.java Mon Oct 12 12:15:07 2015
@@ -22,8 +22,8 @@ import org.apache.lucene.queries.functio
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.BitsFilteredDocIdSet;
import org.apache.lucene.util.Bits;
+import org.apache.solr.search.BitsFilteredDocIdSet;
import org.apache.solr.search.SolrFilter;
import java.io.IOException;
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java Mon Oct 12 12:15:07 2015
@@ -27,14 +27,12 @@ import org.apache.lucene.queries.functio
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Collector;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.MultiCollector;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TimeLimitingCollector;
import org.apache.lucene.search.TotalHitCountCollector;
import org.apache.lucene.search.grouping.AbstractAllGroupHeadsCollector;
import org.apache.lucene.search.grouping.function.FunctionAllGroupHeadsCollector;
-import org.apache.lucene.search.grouping.function.FunctionAllGroupsCollector;
import org.apache.lucene.search.grouping.term.TermAllGroupHeadsCollector;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.schema.FieldType;
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParser.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParser.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParser.java Mon Oct 12 12:15:07 2015
@@ -20,13 +20,10 @@ package org.apache.solr.search.join;
import java.io.IOException;
import org.apache.lucene.index.LeafReaderContext;
-import org.apache.lucene.search.BitsFilteredDocIdSet;
import org.apache.lucene.search.DocIdSet;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.Query;
-import org.apache.lucene.search.QueryWrapperFilter;
-import org.apache.lucene.search.join.QueryBitSetProducer;
import org.apache.lucene.search.join.BitSetProducer;
+import org.apache.lucene.search.join.QueryBitSetProducer;
import org.apache.lucene.search.join.ScoreMode;
import org.apache.lucene.search.join.ToParentBlockJoinQuery;
import org.apache.lucene.util.BitDocIdSet;
@@ -34,6 +31,8 @@ import org.apache.lucene.util.BitSet;
import org.apache.lucene.util.Bits;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.search.BitsFilteredDocIdSet;
+import org.apache.solr.search.Filter;
import org.apache.solr.search.QParser;
import org.apache.solr.search.QueryParsing;
import org.apache.solr.search.SolrCache;
@@ -96,7 +95,7 @@ class BlockJoinParentQParser extends QPa
}
private BitSetProducer createParentFilter(Query parentQ) {
- return new QueryBitSetProducer(new QueryWrapperFilter(parentQ));
+ return new QueryBitSetProducer(parentQ);
}
// We need this wrapper since BitDocIdSetFilter does not extend Filter
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/join/GraphQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/join/GraphQuery.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/join/GraphQuery.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/join/GraphQuery.java Mon Oct 12 12:15:07 2015
@@ -33,7 +33,6 @@ import org.apache.lucene.search.BooleanQ
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.Explanation;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Scorer;
@@ -48,6 +47,7 @@ import org.apache.lucene.util.automaton.
import org.apache.solr.handler.component.ResponseBuilder;
import org.apache.solr.search.BitDocSet;
import org.apache.solr.search.DocSet;
+import org.apache.solr.search.Filter;
import org.apache.solr.search.SolrIndexSearcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestDocSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestDocSet.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestDocSet.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestDocSet.java Mon Oct 12 12:15:07 2015
@@ -38,7 +38,6 @@ import org.apache.lucene.index.SortedSet
import org.apache.lucene.index.StoredFieldVisitor;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.util.BitSetIterator;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.FixedBitSet;
Added: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestFilteredDocIdSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestFilteredDocIdSet.java?rev=1708097&view=auto
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestFilteredDocIdSet.java (added)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestFilteredDocIdSet.java Mon Oct 12 12:15:07 2015
@@ -0,0 +1,202 @@
+package org.apache.solr.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 java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+
+import junit.framework.Assert;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.index.RandomIndexWriter;
+import org.apache.lucene.search.BooleanClause.Occur;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.DocIdSet;
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.Bits;
+import org.apache.lucene.util.LuceneTestCase;
+
+public class TestFilteredDocIdSet extends LuceneTestCase {
+ public void testFilteredDocIdSet() throws Exception {
+ final int maxdoc=10;
+ final DocIdSet innerSet = new DocIdSet() {
+
+ @Override
+ public long ramBytesUsed() {
+ return 0L;
+ }
+
+ @Override
+ public DocIdSetIterator iterator() {
+ return new DocIdSetIterator() {
+
+ int docid = -1;
+
+ @Override
+ public int docID() {
+ return docid;
+ }
+
+ @Override
+ public int nextDoc() {
+ docid++;
+ return docid < maxdoc ? docid : (docid = NO_MORE_DOCS);
+ }
+
+ @Override
+ public int advance(int target) throws IOException {
+ return slowAdvance(target);
+ }
+
+ @Override
+ public long cost() {
+ return 1;
+ }
+ };
+ }
+ };
+
+
+ DocIdSet filteredSet = new FilteredDocIdSet(innerSet){
+ @Override
+ protected boolean match(int docid) {
+ return docid%2 == 0; //validate only even docids
+ }
+ };
+
+ DocIdSetIterator iter = filteredSet.iterator();
+ ArrayList<Integer> list = new ArrayList<>();
+ int doc = iter.advance(3);
+ if (doc != DocIdSetIterator.NO_MORE_DOCS) {
+ list.add(Integer.valueOf(doc));
+ while((doc = iter.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
+ list.add(Integer.valueOf(doc));
+ }
+ }
+
+ int[] docs = new int[list.size()];
+ int c=0;
+ Iterator<Integer> intIter = list.iterator();
+ while(intIter.hasNext()) {
+ docs[c++] = intIter.next().intValue();
+ }
+ int[] answer = new int[]{4,6,8};
+ boolean same = Arrays.equals(answer, docs);
+ if (!same) {
+ System.out.println("answer: " + Arrays.toString(answer));
+ System.out.println("gotten: " + Arrays.toString(docs));
+ fail();
+ }
+ }
+
+ public void testNullDocIdSet() throws Exception {
+ // Tests that if a Filter produces a null DocIdSet, which is given to
+ // IndexSearcher, everything works fine. This came up in LUCENE-1754.
+ Directory dir = newDirectory();
+ RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+ Document doc = new Document();
+ doc.add(newStringField("c", "val", Field.Store.NO));
+ writer.addDocument(doc);
+ IndexReader reader = writer.getReader();
+ writer.close();
+
+ // First verify the document is searchable.
+ IndexSearcher searcher = newSearcher(reader);
+ Assert.assertEquals(1, searcher.search(new MatchAllDocsQuery(), 10).totalHits);
+
+ // Now search w/ a Filter which returns a null DocIdSet
+ Filter f = new Filter() {
+ @Override
+ public DocIdSet getDocIdSet(LeafReaderContext context, Bits acceptDocs) {
+ return null;
+ }
+ @Override
+ public String toString(String field) {
+ return "nullDocIdSetFilter";
+ }
+ };
+
+ Query filtered = new BooleanQuery.Builder()
+ .add(new MatchAllDocsQuery(), Occur.MUST)
+ .add(f, Occur.FILTER)
+ .build();
+ Assert.assertEquals(0, searcher.search(filtered, 10).totalHits);
+ reader.close();
+ dir.close();
+ }
+
+ public void testNullIteratorFilteredDocIdSet() throws Exception {
+ Directory dir = newDirectory();
+ RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+ Document doc = new Document();
+ doc.add(newStringField("c", "val", Field.Store.NO));
+ writer.addDocument(doc);
+ IndexReader reader = writer.getReader();
+ writer.close();
+
+ // First verify the document is searchable.
+ IndexSearcher searcher = newSearcher(reader);
+ Assert.assertEquals(1, searcher.search(new MatchAllDocsQuery(), 10).totalHits);
+
+ // Now search w/ a Filter which returns a null DocIdSet
+ Filter f = new Filter() {
+ @Override
+ public DocIdSet getDocIdSet(LeafReaderContext context, Bits acceptDocs) {
+ final DocIdSet innerNullIteratorSet = new DocIdSet() {
+ @Override
+ public DocIdSetIterator iterator() {
+ return null;
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return 0L;
+ }
+ };
+ return new FilteredDocIdSet(innerNullIteratorSet) {
+ @Override
+ protected boolean match(int docid) {
+ return true;
+ }
+ };
+ }
+ @Override
+ public String toString(String field) {
+ return "nullDocIdSetFilter";
+ }
+ };
+
+ Query filtered = new BooleanQuery.Builder()
+ .add(new MatchAllDocsQuery(), Occur.MUST)
+ .add(f, Occur.FILTER)
+ .build();
+ Assert.assertEquals(0, searcher.search(filtered, 10).totalHits);
+ reader.close();
+ dir.close();
+ }
+
+}
Added: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestQueryWrapperFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestQueryWrapperFilter.java?rev=1708097&view=auto
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestQueryWrapperFilter.java (added)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestQueryWrapperFilter.java Mon Oct 12 12:15:07 2015
@@ -0,0 +1,240 @@
+package org.apache.solr.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 java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.document.Field.Store;
+import org.apache.lucene.document.StringField;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.index.RandomIndexWriter;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause.Occur;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.DocIdSet;
+import org.apache.lucene.search.FuzzyQuery;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.RandomApproximationQuery;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.Scorer;
+import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.search.Weight;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.Bits;
+import org.apache.lucene.util.English;
+import org.apache.lucene.util.LuceneTestCase;
+
+public class TestQueryWrapperFilter extends LuceneTestCase {
+
+ // a filter for which other queries don't have special rewrite rules
+ private static class FilterWrapper extends Filter {
+
+ private final Filter in;
+
+ FilterWrapper(Filter in) {
+ this.in = in;
+ }
+
+ @Override
+ public DocIdSet getDocIdSet(LeafReaderContext context, Bits acceptDocs) throws IOException {
+ return in.getDocIdSet(context, acceptDocs);
+ }
+
+ @Override
+ public String toString(String field) {
+ return in.toString(field);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (super.equals(obj) == false) {
+ return false;
+ }
+ return in.equals(((FilterWrapper) obj).in);
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * super.hashCode() + in.hashCode();
+ }
+ }
+
+ public void testBasic() throws Exception {
+ Directory dir = newDirectory();
+ RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+ Document doc = new Document();
+ doc.add(newTextField("field", "value", Field.Store.NO));
+ writer.addDocument(doc);
+ IndexReader reader = writer.getReader();
+ writer.close();
+
+ TermQuery termQuery = new TermQuery(new Term("field", "value"));
+
+ // should not throw exception with primitive query
+ QueryWrapperFilter qwf = new QueryWrapperFilter(termQuery);
+
+ IndexSearcher searcher = newSearcher(reader);
+ TopDocs hits = searcher.search(qwf, 10);
+ assertEquals(1, hits.totalHits);
+ hits = searcher.search(new FilterWrapper(qwf), 10);
+ assertEquals(1, hits.totalHits);
+
+ // should not throw exception with complex primitive query
+ BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
+ booleanQuery.add(termQuery, Occur.MUST);
+ booleanQuery.add(new TermQuery(new Term("field", "missing")),
+ Occur.MUST_NOT);
+ qwf = new QueryWrapperFilter(termQuery);
+
+ hits = searcher.search(qwf, 10);
+ assertEquals(1, hits.totalHits);
+ hits = searcher.search(new FilterWrapper(qwf), 10);
+ assertEquals(1, hits.totalHits);
+
+ // should not throw exception with non primitive Query (doesn't implement
+ // Query#createWeight)
+ qwf = new QueryWrapperFilter(new FuzzyQuery(new Term("field", "valu")));
+
+ hits = searcher.search(qwf, 10);
+ assertEquals(1, hits.totalHits);
+ hits = searcher.search(new FilterWrapper(qwf), 10);
+ assertEquals(1, hits.totalHits);
+
+ // test a query with no hits
+ termQuery = new TermQuery(new Term("field", "not_exist"));
+ qwf = new QueryWrapperFilter(termQuery);
+ hits = searcher.search(qwf, 10);
+ assertEquals(0, hits.totalHits);
+ hits = searcher.search(new FilterWrapper(qwf), 10);
+ assertEquals(0, hits.totalHits);
+ reader.close();
+ dir.close();
+ }
+
+ public void testRandom() throws Exception {
+ final Directory d = newDirectory();
+ final RandomIndexWriter w = new RandomIndexWriter(random(), d);
+ w.w.getConfig().setMaxBufferedDocs(17);
+ final int numDocs = atLeast(100);
+ final Set<String> aDocs = new HashSet<>();
+ for(int i=0;i<numDocs;i++) {
+ final Document doc = new Document();
+ final String v;
+ if (random().nextInt(5) == 4) {
+ v = "a";
+ aDocs.add(""+i);
+ } else {
+ v = "b";
+ }
+ final Field f = newStringField("field", v, Field.Store.NO);
+ doc.add(f);
+ doc.add(newStringField("id", ""+i, Field.Store.YES));
+ w.addDocument(doc);
+ }
+
+ final int numDelDocs = atLeast(10);
+ for(int i=0;i<numDelDocs;i++) {
+ final String delID = ""+random().nextInt(numDocs);
+ w.deleteDocuments(new Term("id", delID));
+ aDocs.remove(delID);
+ }
+
+ final IndexReader r = w.getReader();
+ w.close();
+ final TopDocs hits = newSearcher(r).search(new QueryWrapperFilter(new TermQuery(new Term("field", "a"))),
+ numDocs);
+ assertEquals(aDocs.size(), hits.totalHits);
+ for(ScoreDoc sd: hits.scoreDocs) {
+ assertTrue(aDocs.contains(r.document(sd.doc).get("id")));
+ }
+ r.close();
+ d.close();
+ }
+
+ public void testThousandDocuments() throws Exception {
+ Directory dir = newDirectory();
+ RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+ for (int i = 0; i < 1000; i++) {
+ Document doc = new Document();
+ doc.add(newStringField("field", English.intToEnglish(i), Field.Store.NO));
+ writer.addDocument(doc);
+ }
+
+ IndexReader reader = writer.getReader();
+ writer.close();
+
+ IndexSearcher searcher = newSearcher(reader);
+
+ for (int i = 0; i < 1000; i++) {
+ TermQuery termQuery = new TermQuery(new Term("field", English.intToEnglish(i)));
+ QueryWrapperFilter qwf = new QueryWrapperFilter(termQuery);
+ TopDocs td = searcher.search(qwf, 10);
+ assertEquals(1, td.totalHits);
+ }
+
+ reader.close();
+ dir.close();
+ }
+
+ public void testScore() throws IOException {
+ Directory dir = newDirectory();
+ RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+ Document doc = new Document();
+ doc.add(new StringField("foo", "bar", Store.NO));
+ writer.addDocument(doc);
+ writer.commit();
+ final IndexReader reader = writer.getReader();
+ writer.close();
+ final IndexSearcher searcher = new IndexSearcher(reader);
+ final Query query = new QueryWrapperFilter(new TermQuery(new Term("foo", "bar")));
+ final TopDocs topDocs = searcher.search(query, 1);
+ assertEquals(1, topDocs.totalHits);
+ assertEquals(0f, topDocs.scoreDocs[0].score, 0f);
+ reader.close();
+ dir.close();
+ }
+
+ public void testQueryWrapperFilterPropagatesApproximations() throws IOException {
+ Directory dir = newDirectory();
+ RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+ Document doc = new Document();
+ doc.add(new StringField("foo", "bar", Store.NO));
+ writer.addDocument(doc);
+ writer.commit();
+ final IndexReader reader = writer.getReader();
+ writer.close();
+ final IndexSearcher searcher = new IndexSearcher(reader);
+ searcher.setQueryCache(null); // to still have approximations
+ final Query query = new QueryWrapperFilter(new RandomApproximationQuery(new TermQuery(new Term("foo", "bar")), random()));
+ final Weight weight = searcher.createNormalizedWeight(query, random().nextBoolean());
+ final Scorer scorer = weight.scorer(reader.leaves().get(0));
+ assertNotNull(scorer.asTwoPhaseIterator());
+ reader.close();
+ dir.close();
+ }
+
+ public void testBasics() {
+ org.apache.lucene.search.QueryUtils.check(new QueryWrapperFilter(new TermQuery(new Term("foo", "bar"))));
+ }
+}
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSort.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSort.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSort.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSort.java Mon Oct 12 12:15:07 2015
@@ -34,15 +34,12 @@ import org.apache.lucene.index.Directory
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.LeafReaderContext;
-import org.apache.lucene.search.BitsFilteredDocIdSet;
import org.apache.lucene.search.Collector;
import org.apache.lucene.search.DocIdSet;
-import org.apache.lucene.search.Filter;
import org.apache.lucene.search.FilterCollector;
import org.apache.lucene.search.FilterLeafCollector;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.LeafCollector;
-import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java?rev=1708097&r1=1708096&r2=1708097&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java Mon Oct 12 12:15:07 2015
@@ -39,7 +39,6 @@ import javax.xml.stream.XMLStreamReader;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.lucene.index.Term;
-import org.apache.lucene.search.QueryWrapperFilter;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.search.TopDocs;
@@ -53,6 +52,7 @@ import org.apache.solr.common.SolrInputD
import org.apache.solr.common.util.ExecutorUtil;
import org.apache.solr.common.util.JavaBinCodec;
import org.apache.solr.handler.loader.XMLLoader;
+import org.apache.solr.search.QueryWrapperFilter;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.util.DefaultSolrThreadFactory;
import org.apache.solr.util.RefCounted;
@@ -562,8 +562,8 @@ public class AddBlockUpdateTest extends
protected ToParentBlockJoinQuery join(final String childTerm) {
return new ToParentBlockJoinQuery(
- new TermQuery(new Term(child, childTerm)), new QueryBitSetProducer(new QueryWrapperFilter(
- new TermRangeQuery(parent, null, null, false, false))), ScoreMode.None);
+ new TermQuery(new Term(child, childTerm)), new QueryBitSetProducer(
+ new TermRangeQuery(parent, null, null, false, false)), ScoreMode.None);
}
private Collection<? extends Callable<Void>> callables(List<Document> blocks) {