You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2012/08/09 12:21:07 UTC
svn commit: r1371142 [27/32] - in /lucene/dev/branches/lucene3312: ./
dev-tools/ dev-tools/eclipse/ dev-tools/maven/ dev-tools/maven/lucene/
dev-tools/maven/lucene/analysis/common/
dev-tools/maven/lucene/analysis/icu/ dev-tools/maven/lucene/analysis/ku...
Modified: lucene/dev/branches/lucene3312/lucene/misc/src/java/org/apache/lucene/misc/HighFreqTerms.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/misc/src/java/org/apache/lucene/misc/HighFreqTerms.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/misc/src/java/org/apache/lucene/misc/HighFreqTerms.java (original)
+++ lucene/dev/branches/lucene3312/lucene/misc/src/java/org/apache/lucene/misc/HighFreqTerms.java Thu Aug 9 10:20:53 2012
@@ -200,7 +200,8 @@ public class HighFreqTerms {
continue;
} // otherwise we fall-through
}
- DocsEnum de = r.termDocsEnum(liveDocs, field, termText, true);
+ // note: what should we do if field omits freqs? currently it counts as 1...
+ DocsEnum de = r.termDocsEnum(liveDocs, field, termText);
if (de != null) {
while (de.nextDoc() != DocIdSetIterator.NO_MORE_DOCS)
totalTF += de.freq();
Modified: lucene/dev/branches/lucene3312/lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java Thu Aug 9 10:20:53 2012
@@ -82,7 +82,7 @@ public class TermsFilter extends Filter
br.copyBytes(term.bytes());
assert termsEnum != null;
if (termsEnum.seekCeil(br) == TermsEnum.SeekStatus.FOUND) {
- docs = termsEnum.docs(acceptDocs, docs, false);
+ docs = termsEnum.docs(acceptDocs, docs, 0);
while (docs.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
result.set(docs.docID());
}
Modified: lucene/dev/branches/lucene3312/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/TFValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/TFValueSource.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/TFValueSource.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/TFValueSource.java Thu Aug 9 10:20:53 2012
@@ -57,16 +57,11 @@ public class TFValueSource extends TermF
public void reset() throws IOException {
// no one should call us for deleted docs?
- boolean omitTF = false;
if (terms != null) {
final TermsEnum termsEnum = terms.iterator(null);
if (termsEnum.seekExact(indexedBytes, false)) {
- docs = termsEnum.docs(null, null, true);
- if (docs == null) { // omitTF
- omitTF = true;
- docs = termsEnum.docs(null, null, false);
- }
+ docs = termsEnum.docs(null, null);
} else {
docs = null;
}
@@ -96,30 +91,6 @@ public class TFValueSource extends TermF
return DocIdSetIterator.NO_MORE_DOCS;
}
};
- } else if (omitTF) {
- // the docsenum won't support freq(), so return 1
- final DocsEnum delegate = docs;
- docs = new DocsEnum() {
- @Override
- public int freq() {
- return 1;
- }
-
- @Override
- public int docID() {
- return delegate.docID();
- }
-
- @Override
- public int nextDoc() throws IOException {
- return delegate.nextDoc();
- }
-
- @Override
- public int advance(int target) throws IOException {
- return delegate.advance(target);
- }
- };
}
atDoc = -1;
}
Modified: lucene/dev/branches/lucene3312/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/TermFreqValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/TermFreqValueSource.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/TermFreqValueSource.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/TermFreqValueSource.java Thu Aug 9 10:20:53 2012
@@ -50,16 +50,11 @@ public class TermFreqValueSource extends
public void reset() throws IOException {
// no one should call us for deleted docs?
- boolean omitTF = false;
if (terms != null) {
final TermsEnum termsEnum = terms.iterator(null);
if (termsEnum.seekExact(indexedBytes, false)) {
- docs = termsEnum.docs(null, null, true);
- if (docs == null) { // omit tf
- omitTF = true;
- docs = termsEnum.docs(null, null, false);
- }
+ docs = termsEnum.docs(null, null);
} else {
docs = null;
}
@@ -89,30 +84,6 @@ public class TermFreqValueSource extends
return DocIdSetIterator.NO_MORE_DOCS;
}
};
- } else if (omitTF) {
- // the docsenum won't support freq(), so return 1
- final DocsEnum delegate = docs;
- docs = new DocsEnum() {
- @Override
- public int freq() {
- return 1;
- }
-
- @Override
- public int docID() {
- return delegate.docID();
- }
-
- @Override
- public int nextDoc() throws IOException {
- return delegate.nextDoc();
- }
-
- @Override
- public int advance(int target) throws IOException {
- return delegate.advance(target);
- }
- };
}
atDoc = -1;
}
Modified: lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java Thu Aug 9 10:20:53 2012
@@ -30,6 +30,7 @@ import org.apache.lucene.analysis.tokena
import org.apache.lucene.document.DateTools;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.QueryParser.Operator;
+import org.apache.lucene.queryparser.flexible.standard.CommonQueryParserConfiguration;
import org.apache.lucene.search.*;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.Version;
@@ -37,7 +38,7 @@ import org.apache.lucene.util.Version;
/** This class is overridden by QueryParser in QueryParser.jj
* and acts to separate the majority of the Java code from the .jj grammar file.
*/
-public abstract class QueryParserBase {
+public abstract class QueryParserBase implements CommonQueryParserConfiguration {
/** Do not catch this exception in your code, it means you are using methods that you should no longer use. */
public static class MethodRemovedUseAnother extends Throwable {}
Modified: lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/precedence/processors/PrecedenceQueryNodeProcessorPipeline.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/precedence/processors/PrecedenceQueryNodeProcessorPipeline.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/precedence/processors/PrecedenceQueryNodeProcessorPipeline.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/precedence/processors/PrecedenceQueryNodeProcessorPipeline.java Thu Aug 9 10:20:53 2012
@@ -18,6 +18,7 @@ package org.apache.lucene.queryparser.fl
*/
import org.apache.lucene.queryparser.flexible.precedence.PrecedenceQueryParser;
+import org.apache.lucene.queryparser.flexible.standard.processors.BooleanQuery2ModifierNodeProcessor;
import org.apache.lucene.queryparser.flexible.standard.processors.GroupQueryNodeProcessor;
import org.apache.lucene.queryparser.flexible.standard.processors.StandardQueryNodeProcessorPipeline;
import org.apache.lucene.queryparser.flexible.core.config.QueryConfigHandler;
@@ -46,7 +47,7 @@ public class PrecedenceQueryNodeProcesso
for (int i = 0 ; i < size() ; i++) {
- if (get(i).getClass().equals(GroupQueryNodeProcessor.class)) {
+ if (get(i).getClass().equals(BooleanQuery2ModifierNodeProcessor.class)) {
remove(i--);
}
Modified: lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/StandardQueryParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/StandardQueryParser.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/StandardQueryParser.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/StandardQueryParser.java Thu Aug 9 10:20:53 2012
@@ -110,7 +110,7 @@ import org.apache.lucene.search.Query;
* @see StandardQueryNodeProcessorPipeline
* @see StandardQueryTreeBuilder
*/
-public class StandardQueryParser extends QueryParserHelper {
+public class StandardQueryParser extends QueryParserHelper implements CommonQueryParserConfiguration {
/**
* Constructs a {@link StandardQueryParser} object.
@@ -119,6 +119,7 @@ public class StandardQueryParser extends
super(new StandardQueryConfigHandler(), new StandardSyntaxParser(),
new StandardQueryNodeProcessorPipeline(null),
new StandardQueryTreeBuilder());
+ setEnablePositionIncrements(true);
}
/**
Modified: lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/GroupQueryNodeProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/GroupQueryNodeProcessor.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/GroupQueryNodeProcessor.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/GroupQueryNodeProcessor.java Thu Aug 9 10:20:53 2012
@@ -49,6 +49,7 @@ import org.apache.lucene.queryparser.fle
* Example: TODO: describe a good example to show how this processor works
*
* @see org.apache.lucene.queryparser.flexible.standard.config.StandardQueryConfigHandler
+ * @deprecated use {@link BooleanQuery2ModifierNodeProcessor} instead
*/
public class GroupQueryNodeProcessor implements QueryNodeProcessor {
Modified: lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/MultiFieldQueryNodeProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/MultiFieldQueryNodeProcessor.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/MultiFieldQueryNodeProcessor.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/MultiFieldQueryNodeProcessor.java Thu Aug 9 10:20:53 2012
@@ -25,6 +25,7 @@ import org.apache.lucene.queryparser.fle
import org.apache.lucene.queryparser.flexible.core.nodes.BooleanQueryNode;
import org.apache.lucene.queryparser.flexible.core.nodes.FieldableNode;
import org.apache.lucene.queryparser.flexible.core.nodes.GroupQueryNode;
+import org.apache.lucene.queryparser.flexible.core.nodes.OrQueryNode;
import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode;
import org.apache.lucene.queryparser.flexible.core.processors.QueryNodeProcessorImpl;
import org.apache.lucene.queryparser.flexible.standard.config.StandardQueryConfigHandler.ConfigurationKeys;
@@ -108,7 +109,7 @@ public class MultiFieldQueryNodeProcesso
}
- return new GroupQueryNode(new BooleanQueryNode(children));
+ return new GroupQueryNode(new OrQueryNode(children));
}
Modified: lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/StandardQueryNodeProcessorPipeline.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/StandardQueryNodeProcessorPipeline.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/StandardQueryNodeProcessorPipeline.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/StandardQueryNodeProcessorPipeline.java Thu Aug 9 10:20:53 2012
@@ -63,7 +63,8 @@ public class StandardQueryNodeProcessorP
add(new AllowLeadingWildcardProcessor());
add(new AnalyzerQueryNodeProcessor());
add(new PhraseSlopQueryNodeProcessor());
- add(new GroupQueryNodeProcessor());
+ //add(new GroupQueryNodeProcessor());
+ add(new BooleanQuery2ModifierNodeProcessor());
add(new NoChildOptimizationQueryNodeProcessor());
add(new RemoveDeletedQueryNodesProcessor());
add(new RemoveEmptyNonLeafQueryNodeProcessor());
Modified: lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java Thu Aug 9 10:20:53 2012
@@ -20,19 +20,269 @@ package org.apache.lucene.queryparser.cl
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.analysis.MockTokenizer;
+import org.apache.lucene.document.DateTools.Resolution;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.queryparser.classic.QueryParser.Operator;
+import org.apache.lucene.queryparser.flexible.standard.CommonQueryParserConfiguration;
import org.apache.lucene.queryparser.util.QueryParserTestBase;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TermQuery;
/**
* Tests QueryParser.
*/
public class TestQueryParser extends QueryParserTestBase {
- @Override
+ public static class QPTestParser extends QueryParser {
+ public QPTestParser(String f, Analyzer a) {
+ super(TEST_VERSION_CURRENT, f, a);
+ }
+
+ @Override
+ protected Query getFuzzyQuery(String field, String termStr,
+ float minSimilarity) throws ParseException {
+ throw new ParseException("Fuzzy queries not allowed");
+ }
+
+ @Override
+ protected Query getWildcardQuery(String field, String termStr)
+ throws ParseException {
+ throw new ParseException("Wildcard queries not allowed");
+ }
+ }
+
public QueryParser getParser(Analyzer a) throws Exception {
- if (a == null)
- a = new MockAnalyzer(random(), MockTokenizer.SIMPLE, true);
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", a);
+ if (a == null) a = new MockAnalyzer(random(), MockTokenizer.SIMPLE, true);
+ QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, getDefaultField(), a);
qp.setDefaultOperator(QueryParserBase.OR_OPERATOR);
return qp;
}
+
+ @Override
+ public CommonQueryParserConfiguration getParserConfig(Analyzer a)
+ throws Exception {
+ return getParser(a);
+ }
+
+ @Override
+ public Query getQuery(String query, CommonQueryParserConfiguration cqpC)
+ throws Exception {
+ assert cqpC != null : "Parameter must not be null";
+ assert (cqpC instanceof QueryParser) : "Parameter must be instance of QueryParser";
+ QueryParser qp = (QueryParser) cqpC;
+ return qp.parse(query);
+ }
+
+ @Override
+ public Query getQuery(String query, Analyzer a) throws Exception {
+ return getParser(a).parse(query);
+ }
+
+ @Override
+ public boolean isQueryParserException(Exception exception) {
+ return exception instanceof ParseException;
+ }
+
+ @Override
+ public void setDefaultOperatorOR(CommonQueryParserConfiguration cqpC) {
+ assert (cqpC instanceof QueryParser);
+ QueryParser qp = (QueryParser) cqpC;
+ qp.setDefaultOperator(Operator.OR);
+ }
+
+ @Override
+ public void setDefaultOperatorAND(CommonQueryParserConfiguration cqpC) {
+ assert (cqpC instanceof QueryParser);
+ QueryParser qp = (QueryParser) cqpC;
+ qp.setDefaultOperator(Operator.AND);
+ }
+
+ @Override
+ public void setAnalyzeRangeTerms(CommonQueryParserConfiguration cqpC,
+ boolean value) {
+ assert (cqpC instanceof QueryParser);
+ QueryParser qp = (QueryParser) cqpC;
+ qp.setAnalyzeRangeTerms(value);
+ }
+
+ @Override
+ public void setAutoGeneratePhraseQueries(CommonQueryParserConfiguration cqpC,
+ boolean value) {
+ assert (cqpC instanceof QueryParser);
+ QueryParser qp = (QueryParser) cqpC;
+ qp.setAutoGeneratePhraseQueries(value);
+ }
+
+ @Override
+ public void setDateResolution(CommonQueryParserConfiguration cqpC,
+ CharSequence field, Resolution value) {
+ assert (cqpC instanceof QueryParser);
+ QueryParser qp = (QueryParser) cqpC;
+ qp.setDateResolution(field.toString(), value);
+ }
+
+ @Override
+ public void testDefaultOperator() throws Exception {
+ QueryParser qp = getParser(new MockAnalyzer(random()));
+ // make sure OR is the default:
+ assertEquals(QueryParserBase.OR_OPERATOR, qp.getDefaultOperator());
+ setDefaultOperatorAND(qp);
+ assertEquals(QueryParserBase.AND_OPERATOR, qp.getDefaultOperator());
+ setDefaultOperatorOR(qp);
+ assertEquals(QueryParserBase.OR_OPERATOR, qp.getDefaultOperator());
+ }
+
+ // LUCENE-2002: when we run javacc to regen QueryParser,
+ // we also run a replaceregexp step to fix 2 of the public
+ // ctors (change them to protected):
+ //
+ // protected QueryParser(CharStream stream)
+ //
+ // protected QueryParser(QueryParserTokenManager tm)
+ //
+ // This test is here as a safety, in case that ant step
+ // doesn't work for some reason.
+ public void testProtectedCtors() throws Exception {
+ try {
+ QueryParser.class.getConstructor(new Class[] {CharStream.class});
+ fail("please switch public QueryParser(CharStream) to be protected");
+ } catch (NoSuchMethodException nsme) {
+ // expected
+ }
+ try {
+ QueryParser.class
+ .getConstructor(new Class[] {QueryParserTokenManager.class});
+ fail("please switch public QueryParser(QueryParserTokenManager) to be protected");
+ } catch (NoSuchMethodException nsme) {
+ // expected
+ }
+ }
+
+ @Override
+ public void testStarParsing() throws Exception {
+ final int[] type = new int[1];
+ QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field",
+ new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false)) {
+ @Override
+ protected Query getWildcardQuery(String field, String termStr) {
+ // override error checking of superclass
+ type[0] = 1;
+ return new TermQuery(new Term(field, termStr));
+ }
+
+ @Override
+ protected Query getPrefixQuery(String field, String termStr) {
+ // override error checking of superclass
+ type[0] = 2;
+ return new TermQuery(new Term(field, termStr));
+ }
+
+ @Override
+ protected Query getFieldQuery(String field, String queryText,
+ boolean quoted) throws ParseException {
+ type[0] = 3;
+ return super.getFieldQuery(field, queryText, quoted);
+ }
+ };
+
+ TermQuery tq;
+
+ tq = (TermQuery) qp.parse("foo:zoo*");
+ assertEquals("zoo", tq.getTerm().text());
+ assertEquals(2, type[0]);
+
+ tq = (TermQuery) qp.parse("foo:zoo*^2");
+ assertEquals("zoo", tq.getTerm().text());
+ assertEquals(2, type[0]);
+ assertEquals(tq.getBoost(), 2, 0);
+
+ tq = (TermQuery) qp.parse("foo:*");
+ assertEquals("*", tq.getTerm().text());
+ assertEquals(1, type[0]); // could be a valid prefix query in the future too
+
+ tq = (TermQuery) qp.parse("foo:*^2");
+ assertEquals("*", tq.getTerm().text());
+ assertEquals(1, type[0]);
+ assertEquals(tq.getBoost(), 2, 0);
+
+ tq = (TermQuery) qp.parse("*:foo");
+ assertEquals("*", tq.getTerm().field());
+ assertEquals("foo", tq.getTerm().text());
+ assertEquals(3, type[0]);
+
+ tq = (TermQuery) qp.parse("*:*");
+ assertEquals("*", tq.getTerm().field());
+ assertEquals("*", tq.getTerm().text());
+ assertEquals(1, type[0]); // could be handled as a prefix query in the
+ // future
+
+ tq = (TermQuery) qp.parse("(*:*)");
+ assertEquals("*", tq.getTerm().field());
+ assertEquals("*", tq.getTerm().text());
+ assertEquals(1, type[0]);
+
+ }
+
+ public void testCustomQueryParserWildcard() {
+ try {
+ new QPTestParser("contents", new MockAnalyzer(random(),
+ MockTokenizer.WHITESPACE, false)).parse("a?t");
+ fail("Wildcard queries should not be allowed");
+ } catch (ParseException expected) {
+ // expected exception
+ }
+ }
+
+ public void testCustomQueryParserFuzzy() throws Exception {
+ try {
+ new QPTestParser("contents", new MockAnalyzer(random(),
+ MockTokenizer.WHITESPACE, false)).parse("xunit~");
+ fail("Fuzzy queries should not be allowed");
+ } catch (ParseException expected) {
+ // expected exception
+ }
+ }
+
+ /** query parser that doesn't expand synonyms when users use double quotes */
+ private class SmartQueryParser extends QueryParser {
+ Analyzer morePrecise = new Analyzer2();
+
+ public SmartQueryParser() {
+ super(TEST_VERSION_CURRENT, "field", new Analyzer1());
+ }
+
+ @Override
+ protected Query getFieldQuery(String field, String queryText, boolean quoted)
+ throws ParseException {
+ if (quoted) return newFieldQuery(morePrecise, field, queryText, quoted);
+ else return super.getFieldQuery(field, queryText, quoted);
+ }
+ }
+
+ @Override
+ public void testNewFieldQuery() throws Exception {
+ /** ordinary behavior, synonyms form uncoordinated boolean query */
+ QueryParser dumb = new QueryParser(TEST_VERSION_CURRENT, "field",
+ new Analyzer1());
+ BooleanQuery expanded = new BooleanQuery(true);
+ expanded.add(new TermQuery(new Term("field", "dogs")),
+ BooleanClause.Occur.SHOULD);
+ expanded.add(new TermQuery(new Term("field", "dog")),
+ BooleanClause.Occur.SHOULD);
+ assertEquals(expanded, dumb.parse("\"dogs\""));
+ /** even with the phrase operator the behavior is the same */
+ assertEquals(expanded, dumb.parse("dogs"));
+
+ /**
+ * custom behavior, the synonyms are expanded, unless you use quote operator
+ */
+ QueryParser smart = new SmartQueryParser();
+ assertEquals(expanded, smart.parse("dogs"));
+
+ Query unexpanded = new TermQuery(new Term("field", "dogs"));
+ assertEquals(unexpanded, smart.parse("\"dogs\""));
+ }
+
}
Modified: lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/ext/TestExtendableQueryParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/ext/TestExtendableQueryParser.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/ext/TestExtendableQueryParser.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/ext/TestExtendableQueryParser.java Thu Aug 9 10:20:53 2012
@@ -25,7 +25,7 @@ import org.apache.lucene.analysis.MockTo
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.queryparser.classic.QueryParserBase;
-import org.apache.lucene.queryparser.util.QueryParserTestBase;
+import org.apache.lucene.queryparser.classic.TestQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
@@ -34,7 +34,7 @@ import org.apache.lucene.search.TermQuer
/**
* Testcase for the class {@link ExtendableQueryParser}
*/
-public class TestExtendableQueryParser extends QueryParserTestBase {
+public class TestExtendableQueryParser extends TestQueryParser {
private static char[] DELIMITERS = new char[] {
Extensions.DEFAULT_EXTENSION_FIELD_DELIMITER, '-', '|' };
@@ -48,8 +48,8 @@ public class TestExtendableQueryParser e
if (a == null)
a = new MockAnalyzer(random(), MockTokenizer.SIMPLE, true);
QueryParser qp = extensions == null ? new ExtendableQueryParser(
- TEST_VERSION_CURRENT, "field", a) : new ExtendableQueryParser(
- TEST_VERSION_CURRENT, "field", a, extensions);
+ TEST_VERSION_CURRENT, getDefaultField(), a) : new ExtendableQueryParser(
+ TEST_VERSION_CURRENT, getDefaultField(), a, extensions);
qp.setDefaultOperator(QueryParserBase.OR_OPERATOR);
return qp;
}
@@ -92,7 +92,7 @@ public class TestExtendableQueryParser e
assertTrue("expected instance of TermQuery but was " + query.getClass(),
query instanceof TermQuery);
tquery = (TermQuery) query;
- assertEquals("field", tquery.getTerm().field());
+ assertEquals(getDefaultField(), tquery.getTerm().field());
assertEquals("bar", tquery.getTerm().text());
}
}
@@ -108,7 +108,7 @@ public class TestExtendableQueryParser e
assertTrue("expected instance of TermQuery but was " + parse.getClass(),
parse instanceof TermQuery);
TermQuery tquery = (TermQuery) parse;
- assertEquals("field", tquery.getTerm().field());
+ assertEquals(getDefaultField(), tquery.getTerm().field());
assertEquals("foo & bar", tquery.getTerm().text());
}
}
Modified: lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestMultiAnalyzerQPHelper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestMultiAnalyzerQPHelper.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestMultiAnalyzerQPHelper.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestMultiAnalyzerQPHelper.java Thu Aug 9 10:20:53 2012
@@ -131,11 +131,11 @@ public class TestMultiAnalyzerQPHelper e
qp.setAnalyzer(new PosIncrementAnalyzer());
assertEquals("quick brown", qp.parse("the quick brown", "").toString());
- assertEquals("\"quick brown\"", qp.parse("\"the quick brown\"", "")
+ assertEquals("\"? quick brown\"", qp.parse("\"the quick brown\"", "")
.toString());
assertEquals("quick brown fox", qp.parse("the quick brown fox", "")
.toString());
- assertEquals("\"quick brown fox\"", qp.parse("\"the quick brown fox\"", "")
+ assertEquals("\"? quick brown fox\"", qp.parse("\"the quick brown fox\"", "")
.toString());
}
Modified: lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestMultiFieldQPHelper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestMultiFieldQPHelper.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestMultiFieldQPHelper.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestMultiFieldQPHelper.java Thu Aug 9 10:20:53 2012
@@ -183,15 +183,15 @@ public class TestMultiFieldQPHelper exte
String[] queries2 = { "+one", "+two" };
q = QueryParserUtil.parse(queries2, fields, new MockAnalyzer(random()));
- assertEquals("(+b:one) (+t:two)", q.toString());
+ assertEquals("b:one t:two", q.toString());
String[] queries3 = { "one", "+two" };
q = QueryParserUtil.parse(queries3, fields, new MockAnalyzer(random()));
- assertEquals("b:one (+t:two)", q.toString());
+ assertEquals("b:one t:two", q.toString());
String[] queries4 = { "one +more", "+two" };
q = QueryParserUtil.parse(queries4, fields, new MockAnalyzer(random()));
- assertEquals("(b:one +b:more) (+t:two)", q.toString());
+ assertEquals("(b:one +b:more) t:two", q.toString());
String[] queries5 = { "blah" };
try {
Modified: lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestQPHelper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestQPHelper.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestQPHelper.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestQPHelper.java Thu Aug 9 10:20:53 2012
@@ -491,6 +491,15 @@ public class TestQPHelper extends Lucene
assertQueryEquals(".NET", a, ".NET");
}
+ public void testGroup() throws Exception {
+ assertQueryEquals("!(a AND b) OR c", null, "-(+a +b) c");
+ assertQueryEquals("!(a AND b) AND c", null, "-(+a +b) +c");
+ assertQueryEquals("((a AND b) AND c)", null, "+(+a +b) +c");
+ assertQueryEquals("(a AND b) AND c", null, "+(+a +b) +c");
+ assertQueryEquals("b !(a AND b)", null, "b -(+a +b)");
+ assertQueryEquals("(a AND b)^4 OR c", null, "((+a +b)^4.0) c");
+ }
+
public void testSlop() throws Exception {
assertQueryEquals("\"term germ\"~2", null, "\"term germ\"~2");
@@ -1313,8 +1322,8 @@ public class TestQPHelper extends Lucene
parser.setAnalyzer(new MockAnalyzer(random()));
BooleanQuery exp = new BooleanQuery();
- exp.add(new BooleanClause(new RegexpQuery(new Term("b", "ab.+")), BooleanClause.Occur.MUST));
- exp.add(new BooleanClause(new RegexpQuery(new Term("t", "ab.+")), BooleanClause.Occur.MUST));
+ exp.add(new BooleanClause(new RegexpQuery(new Term("b", "ab.+")), BooleanClause.Occur.SHOULD));//TODO spezification? was "MUST"
+ exp.add(new BooleanClause(new RegexpQuery(new Term("t", "ab.+")), BooleanClause.Occur.SHOULD));//TODO spezification? was "MUST"
assertEquals(exp, parser.parse("/ab.+/", null));
Modified: lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java (original)
+++ lucene/dev/branches/lucene3312/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java Thu Aug 9 10:20:53 2012
@@ -37,11 +37,13 @@ import org.apache.lucene.index.Directory
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
-import org.apache.lucene.queryparser.classic.CharStream;
-import org.apache.lucene.queryparser.classic.ParseException;
-import org.apache.lucene.queryparser.classic.QueryParser;
+//import org.apache.lucene.queryparser.classic.CharStream;
+//import org.apache.lucene.queryparser.classic.ParseException;
+//import org.apache.lucene.queryparser.classic.QueryParser;
+//import org.apache.lucene.queryparser.classic.QueryParserBase;
+//import org.apache.lucene.queryparser.classic.QueryParserTokenManager;
import org.apache.lucene.queryparser.classic.QueryParserBase;
-import org.apache.lucene.queryparser.classic.QueryParserTokenManager;
+import org.apache.lucene.queryparser.flexible.standard.CommonQueryParserConfiguration;
import org.apache.lucene.search.*;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.store.Directory;
@@ -111,23 +113,17 @@ public abstract class QueryParserTestBas
}
}
- public static class QPTestParser extends QueryParser {
- public QPTestParser(String f, Analyzer a) {
- super(TEST_VERSION_CURRENT, f, a);
- }
-
- @Override
- protected Query getFuzzyQuery(String field, String termStr, float minSimilarity) throws ParseException {
- throw new ParseException("Fuzzy queries not allowed");
- }
-
- @Override
- protected Query getWildcardQuery(String field, String termStr) throws ParseException {
- throw new ParseException("Wildcard queries not allowed");
- }
+ private int originalMaxClauses;
+
+ private String defaultField = "field";
+
+ protected String getDefaultField(){
+ return defaultField;
}
- private int originalMaxClauses;
+ protected void setDefaultField(String defaultField){
+ this.defaultField = defaultField;
+ }
@Override
public void setUp() throws Exception {
@@ -135,10 +131,26 @@ public abstract class QueryParserTestBas
originalMaxClauses = BooleanQuery.getMaxClauseCount();
}
- public abstract QueryParser getParser(Analyzer a) throws Exception;
+ public abstract CommonQueryParserConfiguration getParserConfig(Analyzer a) throws Exception;
+
+ public abstract void setDefaultOperatorOR(CommonQueryParserConfiguration cqpC);
+
+ public abstract void setDefaultOperatorAND(CommonQueryParserConfiguration cqpC);
+
+ public abstract void setAnalyzeRangeTerms(CommonQueryParserConfiguration cqpC, boolean value);
+
+ public abstract void setAutoGeneratePhraseQueries(CommonQueryParserConfiguration cqpC, boolean value);
- public Query getQuery(String query, Analyzer a) throws Exception {
- return getParser(a).parse(query);
+ public abstract void setDateResolution(CommonQueryParserConfiguration cqpC, CharSequence field, DateTools.Resolution value);
+
+ public abstract Query getQuery(String query, CommonQueryParserConfiguration cqpC) throws Exception;
+
+ public abstract Query getQuery(String query, Analyzer a) throws Exception;
+
+ public abstract boolean isQueryParserException(Exception exception);
+
+ public Query getQuery(String query) throws Exception {
+ return getQuery(query, (Analyzer)null);
}
public void assertQueryEquals(String query, Analyzer a, String result)
@@ -151,9 +163,9 @@ public abstract class QueryParserTestBas
}
}
- public void assertQueryEquals(QueryParser qp, String field, String query, String result)
+ public void assertQueryEquals(CommonQueryParserConfiguration cqpC, String field, String query, String result)
throws Exception {
- Query q = qp.parse(query);
+ Query q = getQuery(query, cqpC);
String s = q.toString(field);
if (!s.equals(result)) {
fail("Query /" + query + "/ yielded /" + s
@@ -172,10 +184,10 @@ public abstract class QueryParserTestBas
public void assertWildcardQueryEquals(String query, boolean lowercase, String result, boolean allowLeadingWildcard)
throws Exception {
- QueryParser qp = getParser(null);
- qp.setLowercaseExpandedTerms(lowercase);
- qp.setAllowLeadingWildcard(allowLeadingWildcard);
- Query q = qp.parse(query);
+ CommonQueryParserConfiguration cqpC = getParserConfig(null);
+ cqpC.setLowercaseExpandedTerms(lowercase);
+ cqpC.setAllowLeadingWildcard(allowLeadingWildcard);
+ Query q = getQuery(query, cqpC);
String s = q.toString("field");
if (!s.equals(result)) {
fail("WildcardQuery /" + query + "/ yielded /" + s
@@ -189,8 +201,7 @@ public abstract class QueryParserTestBas
}
public void assertWildcardQueryEquals(String query, String result) throws Exception {
- QueryParser qp = getParser(null);
- Query q = qp.parse(query);
+ Query q = getQuery(query);
String s = q.toString("field");
if (!s.equals(result)) {
fail("WildcardQuery /" + query + "/ yielded /" + s + "/, expecting /"
@@ -202,9 +213,9 @@ public abstract class QueryParserTestBas
throws Exception {
if (a == null)
a = new MockAnalyzer(random(), MockTokenizer.SIMPLE, true);
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", a);
- qp.setDefaultOperator(QueryParserBase.AND_OPERATOR);
- return qp.parse(query);
+ CommonQueryParserConfiguration qp = getParserConfig(a);
+ setDefaultOperatorAND(qp);
+ return getQuery(query, qp);
}
public void assertQueryEqualsDOA(String query, Analyzer a, String result)
@@ -315,9 +326,9 @@ public abstract class QueryParserTestBas
PhraseQuery expected = new PhraseQuery();
expected.add(new Term("field", "ä¸"));
expected.add(new Term("field", "å½"));
- QueryParser parser = new QueryParser(TEST_VERSION_CURRENT, "field", analyzer);
- parser.setAutoGeneratePhraseQueries(true);
- assertEquals(expected, parser.parse("ä¸å½"));
+ CommonQueryParserConfiguration qp = getParserConfig(analyzer);
+ setAutoGeneratePhraseQueries(qp, true);
+ assertEquals(expected, getQuery("ä¸å½",qp));
}
public void testSimple() throws Exception {
@@ -345,26 +356,15 @@ public abstract class QueryParserTestBas
// assertQueryEquals("a OR ! b", null, "a -b");
assertQueryEquals("a OR -b", null, "a -b");
- // +,-,! should be directly adjacent to operand (i.e. not separated by whitespace) to be treated as an operator
- Analyzer a = new Analyzer() {
- @Override
- public TokenStreamComponents createComponents(String fieldName, Reader reader) {
- return new TokenStreamComponents(new MockTokenizer(reader, MockTokenizer.WHITESPACE, false));
- }
- };
- assertQueryEquals("a - b", a, "a - b");
- assertQueryEquals("a + b", a, "a + b");
- assertQueryEquals("a ! b", a, "a ! b");
-
assertQueryEquals("+term -term term", null, "+term -term term");
assertQueryEquals("foo:term AND field:anotherTerm", null,
"+foo:term +anotherterm");
assertQueryEquals("term AND \"phrase phrase\"", null,
"+term +\"phrase phrase\"");
assertQueryEquals("\"hello there\"", null, "\"hello there\"");
- assertTrue(getQuery("a AND b", null) instanceof BooleanQuery);
- assertTrue(getQuery("hello", null) instanceof TermQuery);
- assertTrue(getQuery("\"hello there\"", null) instanceof PhraseQuery);
+ assertTrue(getQuery("a AND b") instanceof BooleanQuery);
+ assertTrue(getQuery("hello") instanceof TermQuery);
+ assertTrue(getQuery("\"hello there\"") instanceof PhraseQuery);
assertQueryEquals("germ term^2.0", null, "germ term^2.0");
assertQueryEquals("(term)^2.0", null, "term^2.0");
@@ -383,15 +383,24 @@ public abstract class QueryParserTestBas
assertQueryEquals("+title:(dog OR cat) -author:\"bob dole\"", null,
"+(title:dog title:cat) -author:\"bob dole\"");
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", new MockAnalyzer(random()));
- // make sure OR is the default:
- assertEquals(QueryParserBase.OR_OPERATOR, qp.getDefaultOperator());
- qp.setDefaultOperator(QueryParserBase.AND_OPERATOR);
- assertEquals(QueryParserBase.AND_OPERATOR, qp.getDefaultOperator());
- qp.setDefaultOperator(QueryParserBase.OR_OPERATOR);
- assertEquals(QueryParserBase.OR_OPERATOR, qp.getDefaultOperator());
}
+ public abstract void testDefaultOperator() throws Exception;
+
+
+ public void testOperatorVsWhitespace() throws Exception { //LUCENE-2566
+ // +,-,! should be directly adjacent to operand (i.e. not separated by whitespace) to be treated as an operator
+ Analyzer a = new Analyzer() {
+ @Override
+ public TokenStreamComponents createComponents(String fieldName, Reader reader) {
+ return new TokenStreamComponents(new MockTokenizer(reader, MockTokenizer.WHITESPACE, false));
+ }
+ };
+ assertQueryEquals("a - b", a, "a - b");
+ assertQueryEquals("a + b", a, "a + b");
+ assertQueryEquals("a ! b", a, "a ! b");
+ }
+
public void testPunct() throws Exception {
Analyzer a = new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false);
assertQueryEquals("a&b", a, "a&b");
@@ -430,20 +439,20 @@ public abstract class QueryParserTestBas
assertQueryEquals("term*germ", null, "term*germ");
assertQueryEquals("term*germ^3", null, "term*germ^3.0");
- assertTrue(getQuery("term*", null) instanceof PrefixQuery);
- assertTrue(getQuery("term*^2", null) instanceof PrefixQuery);
- assertTrue(getQuery("term~", null) instanceof FuzzyQuery);
- assertTrue(getQuery("term~0.7", null) instanceof FuzzyQuery);
- FuzzyQuery fq = (FuzzyQuery)getQuery("term~0.7", null);
+ assertTrue(getQuery("term*") instanceof PrefixQuery);
+ assertTrue(getQuery("term*^2") instanceof PrefixQuery);
+ assertTrue(getQuery("term~") instanceof FuzzyQuery);
+ assertTrue(getQuery("term~0.7") instanceof FuzzyQuery);
+ FuzzyQuery fq = (FuzzyQuery)getQuery("term~0.7");
assertEquals(1, fq.getMaxEdits());
assertEquals(FuzzyQuery.defaultPrefixLength, fq.getPrefixLength());
- fq = (FuzzyQuery)getQuery("term~", null);
+ fq = (FuzzyQuery)getQuery("term~");
assertEquals(2, fq.getMaxEdits());
assertEquals(FuzzyQuery.defaultPrefixLength, fq.getPrefixLength());
assertParseException("term~1.1"); // value > 1, throws exception
- assertTrue(getQuery("term*germ", null) instanceof WildcardQuery);
+ assertTrue(getQuery("term*germ") instanceof WildcardQuery);
/* Tests to see that wild card terms are (or are not) properly
* lower-cased with propery parser configuration
@@ -483,15 +492,20 @@ public abstract class QueryParserTestBas
// Test suffix queries: first disallow
try {
assertWildcardQueryEquals("*Term", true, "*term");
- fail();
- } catch(ParseException pe) {
+ } catch(Exception pe) {
// expected exception
+ if(!isQueryParserException(pe)){
+ fail();
+ }
}
try {
assertWildcardQueryEquals("?Term", true, "?term");
fail();
- } catch(ParseException pe) {
+ } catch(Exception pe) {
// expected exception
+ if(!isQueryParserException(pe)){
+ fail();
+ }
}
// Test suffix queries: then allow
assertWildcardQueryEquals("*Term", true, "*term", true);
@@ -499,11 +513,11 @@ public abstract class QueryParserTestBas
}
public void testLeadingWildcardType() throws Exception {
- QueryParser qp = getParser(null);
- qp.setAllowLeadingWildcard(true);
- assertEquals(WildcardQuery.class, qp.parse("t*erm*").getClass());
- assertEquals(WildcardQuery.class, qp.parse("?term*").getClass());
- assertEquals(WildcardQuery.class, qp.parse("*term*").getClass());
+ CommonQueryParserConfiguration cqpC = getParserConfig(null);
+ cqpC.setAllowLeadingWildcard(true);
+ assertEquals(WildcardQuery.class, getQuery("t*erm*",cqpC).getClass());
+ assertEquals(WildcardQuery.class, getQuery("?term*",cqpC).getClass());
+ assertEquals(WildcardQuery.class, getQuery("*term*",cqpC).getClass());
}
public void testQPA() throws Exception {
@@ -540,11 +554,12 @@ public abstract class QueryParserTestBas
assertQueryEquals("[ a TO z}", null, "[a TO z}");
assertQueryEquals("{ a TO z]", null, "{a TO z]");
- assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((TermRangeQuery)getQuery("[ a TO z]", null)).getRewriteMethod());
+ assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((TermRangeQuery)getQuery("[ a TO z]")).getRewriteMethod());
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", new MockAnalyzer(random(), MockTokenizer.SIMPLE, true));
+ CommonQueryParserConfiguration qp = getParserConfig( new MockAnalyzer(random(), MockTokenizer.SIMPLE, true));
+
qp.setMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE);
- assertEquals(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE,((TermRangeQuery)qp.parse("[ a TO z]")).getRewriteMethod());
+ assertEquals(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE,((TermRangeQuery)getQuery("[ a TO z]", qp)).getRewriteMethod());
// test open ranges
assertQueryEquals("[ a TO * ]", null, "[a TO *]");
@@ -569,9 +584,13 @@ public abstract class QueryParserTestBas
assertQueryEquals("[* TO Z]",null,"[* TO z]");
assertQueryEquals("[A TO *]",null,"[a TO *]");
assertQueryEquals("[* TO *]",null,"[* TO *]");
- assertQueryEquals("[\\* TO \"*\"]",null,"[\\* TO \\*]");
}
-
+
+ public void testRangeWithPhrase() throws Exception {
+ assertQueryEquals("[\\* TO \"*\"]",null,"[\\* TO \\*]");
+ assertQueryEquals("[\"*\" TO *]",null,"[\\* TO *]");
+ }
+
private String escapeDateString(String s) {
if (s.indexOf(" ") > -1) {
return "\"" + s + "\"";
@@ -616,16 +635,17 @@ public abstract class QueryParserTestBas
final String defaultField = "default";
final String monthField = "month";
final String hourField = "hour";
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", new MockAnalyzer(random(), MockTokenizer.SIMPLE, true));
+ Analyzer a = new MockAnalyzer(random(), MockTokenizer.SIMPLE, true);
+ CommonQueryParserConfiguration qp = getParserConfig(a);
// set a field specific date resolution
- qp.setDateResolution(monthField, DateTools.Resolution.MONTH);
+ setDateResolution(qp, monthField, DateTools.Resolution.MONTH);
// set default date resolution to MILLISECOND
qp.setDateResolution(DateTools.Resolution.MILLISECOND);
// set second field specific date resolution
- qp.setDateResolution(hourField, DateTools.Resolution.HOUR);
+ setDateResolution(qp, hourField, DateTools.Resolution.HOUR);
// for this field no field specific date resolution has been set,
// so verify if the default resolution is used
@@ -640,11 +660,11 @@ public abstract class QueryParserTestBas
endDateExpected.getTime(), DateTools.Resolution.HOUR);
}
- public void assertDateRangeQueryEquals(QueryParser qp, String field, String startDate, String endDate,
+ public void assertDateRangeQueryEquals(CommonQueryParserConfiguration cqpC, String field, String startDate, String endDate,
Date endDateInclusive, DateTools.Resolution resolution) throws Exception {
- assertQueryEquals(qp, field, field + ":[" + escapeDateString(startDate) + " TO " + escapeDateString(endDate) + "]",
+ assertQueryEquals(cqpC, field, field + ":[" + escapeDateString(startDate) + " TO " + escapeDateString(endDate) + "]",
"[" + getDate(startDate, resolution) + " TO " + getDate(endDateInclusive, resolution) + "]");
- assertQueryEquals(qp, field, field + ":{" + escapeDateString(startDate) + " TO " + escapeDateString(endDate) + "}",
+ assertQueryEquals(cqpC, field, field + ":{" + escapeDateString(startDate) + " TO " + escapeDateString(endDate) + "}",
"{" + getDate(startDate, resolution) + " TO " + getDate(endDate, resolution) + "}");
}
@@ -693,12 +713,6 @@ public abstract class QueryParserTestBas
assertQueryEquals("a:b\\\\c*", a, "a:b\\c*");
- assertQueryEquals("a:b\\-?c", a, "a:b\\-?c");
- assertQueryEquals("a:b\\+?c", a, "a:b\\+?c");
- assertQueryEquals("a:b\\:?c", a, "a:b\\:?c");
-
- assertQueryEquals("a:b\\\\?c", a, "a:b\\\\?c");
-
assertQueryEquals("a:b\\-c~", a, "a:b-c~2");
assertQueryEquals("a:b\\+c~", a, "a:b+c~2");
assertQueryEquals("a:b\\:c~", a, "a:b:c~2");
@@ -741,7 +755,16 @@ public abstract class QueryParserTestBas
// LUCENE-1189
assertQueryEquals("(\"a\\\\\") or (\"b\")", a ,"a\\ or b");
}
+
+ public void testEscapedVsQuestionMarkAsWildcard() throws Exception {
+ Analyzer a = new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false);
+ assertQueryEquals("a:b\\-?c", a, "a:b\\-?c");
+ assertQueryEquals("a:b\\+?c", a, "a:b\\+?c");
+ assertQueryEquals("a:b\\:?c", a, "a:b\\:?c");
+ assertQueryEquals("a:b\\\\?c", a, "a:b\\\\?c");
+ }
+
public void testQueryStringEscaping() throws Exception {
Analyzer a = new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false);
@@ -830,20 +853,21 @@ public abstract class QueryParserTestBas
throws Exception {
CharacterRunAutomaton stopWords = new CharacterRunAutomaton(BasicAutomata.makeString("on"));
Analyzer oneStopAnalyzer = new MockAnalyzer(random(), MockTokenizer.SIMPLE, true, stopWords, true);
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", oneStopAnalyzer);
- Query q = qp.parse("on^1.0");
+ CommonQueryParserConfiguration qp = getParserConfig(oneStopAnalyzer);
+ Query q = getQuery("on^1.0",qp);
assertNotNull(q);
- q = qp.parse("\"hello\"^2.0");
+ q = getQuery("\"hello\"^2.0",qp);
assertNotNull(q);
assertEquals(q.getBoost(), (float) 2.0, (float) 0.5);
- q = qp.parse("hello^2.0");
+ q = getQuery("hello^2.0",qp);
assertNotNull(q);
assertEquals(q.getBoost(), (float) 2.0, (float) 0.5);
- q = qp.parse("\"on\"^1.0");
+ q = getQuery("\"on\"^1.0",qp);
assertNotNull(q);
- QueryParser qp2 = new QueryParser(TEST_VERSION_CURRENT, "field", new MockAnalyzer(random(), MockTokenizer.SIMPLE, true, MockTokenFilter.ENGLISH_STOPSET, true));
- q = qp2.parse("the^3");
+ Analyzer a2 = new MockAnalyzer(random(), MockTokenizer.SIMPLE, true, MockTokenFilter.ENGLISH_STOPSET, true);
+ CommonQueryParserConfiguration qp2 = getParserConfig(a2);
+ q = getQuery("the^3", qp2);
// "the" is a stop word so the result is an empty query:
assertNotNull(q);
assertEquals("", q.toString());
@@ -852,13 +876,26 @@ public abstract class QueryParserTestBas
public void assertParseException(String queryString) throws Exception {
try {
- getQuery(queryString, null);
- } catch (ParseException expected) {
- return;
+ getQuery(queryString);
+ } catch (Exception expected) {
+ if(isQueryParserException(expected)){
+ return;
+ }
+ }
+ fail("ParseException expected, not thrown");
+ }
+
+ public void assertParseException(String queryString, Analyzer a) throws Exception {
+ try {
+ getQuery(queryString, a);
+ } catch (Exception expected) {
+ if(isQueryParserException(expected)){
+ return;
+ }
}
fail("ParseException expected, not thrown");
}
-
+
public void testException() throws Exception {
assertParseException("\"some phrase");
assertParseException("(foo bar");
@@ -867,44 +904,20 @@ public abstract class QueryParserTestBas
assertParseException("(sub query)^5.0^2.0 plus more");
assertParseException("secret AND illegal) AND access:confidential");
}
-
-
- public void testCustomQueryParserWildcard() {
- try {
- new QPTestParser("contents", new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false)).parse("a?t");
- fail("Wildcard queries should not be allowed");
- } catch (ParseException expected) {
- // expected exception
- }
- }
-
- public void testCustomQueryParserFuzzy() throws Exception {
- try {
- new QPTestParser("contents", new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false)).parse("xunit~");
- fail("Fuzzy queries should not be allowed");
- } catch (ParseException expected) {
- // expected exception
- }
- }
public void testBooleanQuery() throws Exception {
BooleanQuery.setMaxClauseCount(2);
- try {
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false));
- qp.parse("one two three");
- fail("ParseException expected due to too many boolean clauses");
- } catch (ParseException expected) {
- // too many boolean clauses, so ParseException is expected
- }
+ Analyzer purWhitespaceAnalyzer = new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false);
+ assertParseException("one two three", purWhitespaceAnalyzer);
}
/**
* This test differs from TestPrecedenceQueryParser
*/
public void testPrecedence() throws Exception {
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false));
- Query query1 = qp.parse("A AND B OR C AND D");
- Query query2 = qp.parse("+A +B +C +D");
+ CommonQueryParserConfiguration qp = getParserConfig(new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false));
+ Query query1 = getQuery("A AND B OR C AND D", qp);
+ Query query2 = getQuery("+A +B +C +D", qp);
assertEquals(query1, query2);
}
@@ -936,131 +949,73 @@ public abstract class QueryParserTestBas
// iw.addDocument(d);
// }
- public void testStarParsing() throws Exception {
- final int[] type = new int[1];
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false)) {
- @Override
- protected Query getWildcardQuery(String field, String termStr) {
- // override error checking of superclass
- type[0]=1;
- return new TermQuery(new Term(field,termStr));
- }
- @Override
- protected Query getPrefixQuery(String field, String termStr) {
- // override error checking of superclass
- type[0]=2;
- return new TermQuery(new Term(field,termStr));
- }
-
- @Override
- protected Query getFieldQuery(String field, String queryText, boolean quoted) throws ParseException {
- type[0]=3;
- return super.getFieldQuery(field, queryText, quoted);
- }
- };
-
- TermQuery tq;
-
- tq = (TermQuery)qp.parse("foo:zoo*");
- assertEquals("zoo",tq.getTerm().text());
- assertEquals(2,type[0]);
-
- tq = (TermQuery)qp.parse("foo:zoo*^2");
- assertEquals("zoo",tq.getTerm().text());
- assertEquals(2,type[0]);
- assertEquals(tq.getBoost(),2,0);
-
- tq = (TermQuery)qp.parse("foo:*");
- assertEquals("*",tq.getTerm().text());
- assertEquals(1,type[0]); // could be a valid prefix query in the future too
-
- tq = (TermQuery)qp.parse("foo:*^2");
- assertEquals("*",tq.getTerm().text());
- assertEquals(1,type[0]);
- assertEquals(tq.getBoost(),2,0);
-
- tq = (TermQuery)qp.parse("*:foo");
- assertEquals("*",tq.getTerm().field());
- assertEquals("foo",tq.getTerm().text());
- assertEquals(3,type[0]);
-
- tq = (TermQuery)qp.parse("*:*");
- assertEquals("*",tq.getTerm().field());
- assertEquals("*",tq.getTerm().text());
- assertEquals(1,type[0]); // could be handled as a prefix query in the future
-
- tq = (TermQuery)qp.parse("(*:*)");
- assertEquals("*",tq.getTerm().field());
- assertEquals("*",tq.getTerm().text());
- assertEquals(1,type[0]);
-
- }
+ public abstract void testStarParsing() throws Exception;
public void testEscapedWildcard() throws Exception {
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false));
+ CommonQueryParserConfiguration qp = getParserConfig( new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false));
WildcardQuery q = new WildcardQuery(new Term("field", "foo\\?ba?r"));
- assertEquals(q, qp.parse("foo\\?ba?r"));
+ assertEquals(q, getQuery("foo\\?ba?r", qp));
}
public void testRegexps() throws Exception {
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false));
+ CommonQueryParserConfiguration qp = getParserConfig( new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false));
RegexpQuery q = new RegexpQuery(new Term("field", "[a-z][123]"));
- assertEquals(q, qp.parse("/[a-z][123]/"));
+ assertEquals(q, getQuery("/[a-z][123]/",qp));
qp.setLowercaseExpandedTerms(true);
- assertEquals(q, qp.parse("/[A-Z][123]/"));
+ assertEquals(q, getQuery("/[A-Z][123]/",qp));
q.setBoost(0.5f);
- assertEquals(q, qp.parse("/[A-Z][123]/^0.5"));
+ assertEquals(q, getQuery("/[A-Z][123]/^0.5",qp));
qp.setMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE);
q.setRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE);
- assertTrue(qp.parse("/[A-Z][123]/^0.5") instanceof RegexpQuery);
- assertEquals(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE, ((RegexpQuery)qp.parse("/[A-Z][123]/^0.5")).getRewriteMethod());
- assertEquals(q, qp.parse("/[A-Z][123]/^0.5"));
+ assertTrue(getQuery("/[A-Z][123]/^0.5",qp) instanceof RegexpQuery);
+ assertEquals(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE, ((RegexpQuery)getQuery("/[A-Z][123]/^0.5",qp)).getRewriteMethod());
+ assertEquals(q, getQuery("/[A-Z][123]/^0.5",qp));
qp.setMultiTermRewriteMethod(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT);
Query escaped = new RegexpQuery(new Term("field", "[a-z]\\/[123]"));
- assertEquals(escaped, qp.parse("/[a-z]\\/[123]/"));
+ assertEquals(escaped, getQuery("/[a-z]\\/[123]/",qp));
Query escaped2 = new RegexpQuery(new Term("field", "[a-z]\\*[123]"));
- assertEquals(escaped2, qp.parse("/[a-z]\\*[123]/"));
+ assertEquals(escaped2, getQuery("/[a-z]\\*[123]/",qp));
BooleanQuery complex = new BooleanQuery();
complex.add(new RegexpQuery(new Term("field", "[a-z]\\/[123]")), Occur.MUST);
complex.add(new TermQuery(new Term("path", "/etc/init.d/")), Occur.MUST);
complex.add(new TermQuery(new Term("field", "/etc/init[.]d/lucene/")), Occur.SHOULD);
- assertEquals(complex, qp.parse("/[a-z]\\/[123]/ AND path:\"/etc/init.d/\" OR \"/etc\\/init\\[.\\]d/lucene/\" "));
+ assertEquals(complex, getQuery("/[a-z]\\/[123]/ AND path:\"/etc/init.d/\" OR \"/etc\\/init\\[.\\]d/lucene/\" ",qp));
Query re = new RegexpQuery(new Term("field", "http.*"));
- assertEquals(re, qp.parse("field:/http.*/"));
- assertEquals(re, qp.parse("/http.*/"));
+ assertEquals(re, getQuery("field:/http.*/",qp));
+ assertEquals(re, getQuery("/http.*/",qp));
re = new RegexpQuery(new Term("field", "http~0.5"));
- assertEquals(re, qp.parse("field:/http~0.5/"));
- assertEquals(re, qp.parse("/http~0.5/"));
+ assertEquals(re, getQuery("field:/http~0.5/",qp));
+ assertEquals(re, getQuery("/http~0.5/",qp));
re = new RegexpQuery(new Term("field", "boo"));
- assertEquals(re, qp.parse("field:/boo/"));
- assertEquals(re, qp.parse("/boo/"));
+ assertEquals(re, getQuery("field:/boo/",qp));
+ assertEquals(re, getQuery("/boo/",qp));
- assertEquals(new TermQuery(new Term("field", "/boo/")), qp.parse("\"/boo/\""));
- assertEquals(new TermQuery(new Term("field", "/boo/")), qp.parse("\\/boo\\/"));
+ assertEquals(new TermQuery(new Term("field", "/boo/")), getQuery("\"/boo/\"",qp));
+ assertEquals(new TermQuery(new Term("field", "/boo/")), getQuery("\\/boo\\/",qp));
BooleanQuery two = new BooleanQuery();
two.add(new RegexpQuery(new Term("field", "foo")), Occur.SHOULD);
two.add(new RegexpQuery(new Term("field", "bar")), Occur.SHOULD);
- assertEquals(two, qp.parse("field:/foo/ field:/bar/"));
- assertEquals(two, qp.parse("/foo/ /bar/"));
+ assertEquals(two, getQuery("field:/foo/ field:/bar/",qp));
+ assertEquals(two, getQuery("/foo/ /bar/",qp));
}
public void testStopwords() throws Exception {
CharacterRunAutomaton stopSet = new CharacterRunAutomaton(new RegExp("the|foo").toAutomaton());
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "a", new MockAnalyzer(random(), MockTokenizer.SIMPLE, true, stopSet, true));
- Query result = qp.parse("a:the OR a:foo");
+ CommonQueryParserConfiguration qp = getParserConfig(new MockAnalyzer(random(), MockTokenizer.SIMPLE, true, stopSet, true));
+ Query result = getQuery("field:the OR field:foo",qp);
assertNotNull("result is null and it shouldn't be", result);
assertTrue("result is not a BooleanQuery", result instanceof BooleanQuery);
assertTrue(((BooleanQuery) result).clauses().size() + " does not equal: " + 0, ((BooleanQuery) result).clauses().size() == 0);
- result = qp.parse("a:woo OR a:the");
+ result = getQuery("field:woo OR field:the",qp);
assertNotNull("result is null and it shouldn't be", result);
assertTrue("result is not a TermQuery", result instanceof TermQuery);
- result = qp.parse("(fieldX:xxxxx OR fieldy:xxxxxxxx)^2 AND (fieldx:the OR fieldy:foo)");
+ result = getQuery("(fieldX:xxxxx OR fieldy:xxxxxxxx)^2 AND (fieldx:the OR fieldy:foo)",qp);
assertNotNull("result is null and it shouldn't be", result);
assertTrue("result is not a BooleanQuery", result instanceof BooleanQuery);
if (VERBOSE) System.out.println("Result: " + result);
@@ -1068,12 +1023,12 @@ public abstract class QueryParserTestBas
}
public void testPositionIncrement() throws Exception {
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "a", new MockAnalyzer(random(), MockTokenizer.SIMPLE, true, MockTokenFilter.ENGLISH_STOPSET, true));
+ CommonQueryParserConfiguration qp = getParserConfig( new MockAnalyzer(random(), MockTokenizer.SIMPLE, true, MockTokenFilter.ENGLISH_STOPSET, true));
qp.setEnablePositionIncrements(true);
String qtxt = "\"the words in poisitions pos02578 are stopped in this phrasequery\"";
// 0 2 5 7 8
int expectedPositions[] = {1,3,4,6,9};
- PhraseQuery pq = (PhraseQuery) qp.parse(qtxt);
+ PhraseQuery pq = (PhraseQuery) getQuery(qtxt,qp);
//System.out.println("Query text: "+qtxt);
//System.out.println("Result: "+pq);
Term t[] = pq.getTerms();
@@ -1085,20 +1040,23 @@ public abstract class QueryParserTestBas
}
public void testMatchAllDocs() throws Exception {
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false));
- assertEquals(new MatchAllDocsQuery(), qp.parse("*:*"));
- assertEquals(new MatchAllDocsQuery(), qp.parse("(*:*)"));
- BooleanQuery bq = (BooleanQuery)qp.parse("+*:* -*:*");
+ CommonQueryParserConfiguration qp = getParserConfig( new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false));
+ assertEquals(new MatchAllDocsQuery(), getQuery("*:*",qp));
+ assertEquals(new MatchAllDocsQuery(), getQuery("(*:*)",qp));
+ BooleanQuery bq = (BooleanQuery)getQuery("+*:* -*:*",qp);
assertTrue(bq.getClauses()[0].getQuery() instanceof MatchAllDocsQuery);
assertTrue(bq.getClauses()[1].getQuery() instanceof MatchAllDocsQuery);
}
- private void assertHits(int expected, String query, IndexSearcher is) throws ParseException, IOException {
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "date", new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false));
+ private void assertHits(int expected, String query, IndexSearcher is) throws Exception {
+ String oldDefaultField = getDefaultField();
+ setDefaultField("date");
+ CommonQueryParserConfiguration qp = getParserConfig( new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false));
qp.setLocale(Locale.ENGLISH);
- Query q = qp.parse(query);
+ Query q = getQuery(query,qp);
ScoreDoc[] hits = is.search(q, null, 1000).scoreDocs;
assertEquals(expected, hits.length);
+ setDefaultField( oldDefaultField );
}
@Override
@@ -1115,43 +1073,18 @@ public abstract class QueryParserTestBas
Analyzer a = new MockAnalyzer(random(), MockTokenizer.SIMPLE, true, MockTokenFilter.ENGLISH_STOPSET, true);
IndexWriter w = new IndexWriter(dir, newIndexWriterConfig( TEST_VERSION_CURRENT, a));
Document doc = new Document();
- doc.add(newTextField("f", "the wizard of ozzy", Field.Store.NO));
+ doc.add(newTextField("field", "the wizard of ozzy", Field.Store.NO));
w.addDocument(doc);
IndexReader r = DirectoryReader.open(w, true);
w.close();
IndexSearcher s = newSearcher(r);
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "f", a);
- Query q = qp.parse("\"wizard of ozzy\"");
+
+ Query q = getQuery("\"wizard of ozzy\"",a);
assertEquals(1, s.search(q, 1).totalHits);
r.close();
dir.close();
}
- // LUCENE-2002: when we run javacc to regen QueryParser,
- // we also run a replaceregexp step to fix 2 of the public
- // ctors (change them to protected):
- //
- // protected QueryParser(CharStream stream)
- //
- // protected QueryParser(QueryParserTokenManager tm)
- //
- // This test is here as a safety, in case that ant step
- // doesn't work for some reason.
- public void testProtectedCtors() throws Exception {
- try {
- QueryParser.class.getConstructor(new Class[] {CharStream.class});
- fail("please switch public QueryParser(CharStream) to be protected");
- } catch (NoSuchMethodException nsme) {
- // expected
- }
- try {
- QueryParser.class.getConstructor(new Class[] {QueryParserTokenManager.class});
- fail("please switch public QueryParser(QueryParserTokenManager) to be protected");
- } catch (NoSuchMethodException nsme) {
- // expected
- }
- }
-
/**
* adds synonym of "dog" for "dogs".
*/
@@ -1184,7 +1117,10 @@ public abstract class QueryParserTestBas
}
/** whitespace+lowercase analyzer with synonyms */
- private class Analyzer1 extends Analyzer {
+ protected class Analyzer1 extends Analyzer {
+ public Analyzer1(){
+ super();
+ }
@Override
public TokenStreamComponents createComponents(String fieldName, Reader reader) {
Tokenizer tokenizer = new MockTokenizer(reader, MockTokenizer.WHITESPACE, true);
@@ -1193,48 +1129,17 @@ public abstract class QueryParserTestBas
}
/** whitespace+lowercase analyzer without synonyms */
- private class Analyzer2 extends Analyzer {
+ protected class Analyzer2 extends Analyzer {
+ public Analyzer2(){
+ super();
+ }
@Override
public TokenStreamComponents createComponents(String fieldName, Reader reader) {
return new TokenStreamComponents(new MockTokenizer(reader, MockTokenizer.WHITESPACE, true));
}
}
- /** query parser that doesn't expand synonyms when users use double quotes */
- private class SmartQueryParser extends QueryParser {
- Analyzer morePrecise = new Analyzer2();
-
- public SmartQueryParser() {
- super(TEST_VERSION_CURRENT, "field", new Analyzer1());
- }
-
- @Override
- protected Query getFieldQuery(String field, String queryText, boolean quoted)
- throws ParseException {
- if (quoted)
- return newFieldQuery(morePrecise, field, queryText, quoted);
- else
- return super.getFieldQuery(field, queryText, quoted);
- }
- }
-
- public void testNewFieldQuery() throws Exception {
- /** ordinary behavior, synonyms form uncoordinated boolean query */
- QueryParser dumb = new QueryParser(TEST_VERSION_CURRENT, "field", new Analyzer1());
- BooleanQuery expanded = new BooleanQuery(true);
- expanded.add(new TermQuery(new Term("field", "dogs")), BooleanClause.Occur.SHOULD);
- expanded.add(new TermQuery(new Term("field", "dog")), BooleanClause.Occur.SHOULD);
- assertEquals(expanded, dumb.parse("\"dogs\""));
- /** even with the phrase operator the behavior is the same */
- assertEquals(expanded, dumb.parse("dogs"));
-
- /** custom behavior, the synonyms are expanded, unless you use quote operator */
- QueryParser smart = new SmartQueryParser();
- assertEquals(expanded, smart.parse("dogs"));
-
- Query unexpanded = new TermQuery(new Term("field", "dogs"));
- assertEquals(unexpanded, smart.parse("\"dogs\""));
- }
+ public abstract void testNewFieldQuery() throws Exception;
/**
* Mock collation analyzer: indexes terms as "collated" + term
@@ -1267,30 +1172,31 @@ public abstract class QueryParserTestBas
}
public void testCollatedRange() throws Exception {
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", new MockCollationAnalyzer());
- qp.setAnalyzeRangeTerms(true);
- Query expected = TermRangeQuery.newStringRange("field", "collatedabc", "collateddef", true, true);
- Query actual = qp.parse("[abc TO def]");
+ CommonQueryParserConfiguration qp = getParserConfig(new MockCollationAnalyzer());
+ setAnalyzeRangeTerms(qp, true);
+ Query expected = TermRangeQuery.newStringRange(getDefaultField(), "collatedabc", "collateddef", true, true);
+ Query actual = getQuery("[abc TO def]", qp);
assertEquals(expected, actual);
}
public void testDistanceAsEditsParsing() throws Exception {
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", new MockAnalyzer(random()));
- FuzzyQuery q = (FuzzyQuery) qp.parse("foobar~2");
+ FuzzyQuery q = (FuzzyQuery) getQuery("foobar~2",new MockAnalyzer(random()));
assertEquals(2, q.getMaxEdits());
}
- public void testPhraseQueryToString() throws ParseException {
+ public void testPhraseQueryToString() throws Exception {
Analyzer analyzer = new MockAnalyzer(random(), MockTokenizer.SIMPLE, true, MockTokenFilter.ENGLISH_STOPSET, true);
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field", analyzer);
+ CommonQueryParserConfiguration qp = getParserConfig(analyzer);
qp.setEnablePositionIncrements(true);
- PhraseQuery q = (PhraseQuery)qp.parse("\"this hi this is a test is\"");
+ PhraseQuery q = (PhraseQuery)getQuery("\"this hi this is a test is\"", qp);
assertEquals("field:\"? hi ? ? ? test\"", q.toString());
}
- public void testParseWildcardAndPhraseQueries() throws ParseException {
+ public void testParseWildcardAndPhraseQueries() throws Exception {
String field = "content";
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, field, new MockAnalyzer(random()));
+ String oldDefaultField = getDefaultField();
+ setDefaultField(field);
+ CommonQueryParserConfiguration qp = getParserConfig(new MockAnalyzer(random()));
qp.setAllowLeadingWildcard(true);
String prefixQueries[][] = {
@@ -1309,7 +1215,7 @@ public abstract class QueryParserTestBas
for (int i = 0; i < prefixQueries.length; i++) {
for (int j = 0; j < prefixQueries[i].length; j++) {
String queryString = prefixQueries[i][j];
- Query q = qp.parse(queryString);
+ Query q = getQuery(queryString,qp);
assertEquals(PrefixQuery.class, q.getClass());
}
}
@@ -1318,51 +1224,64 @@ public abstract class QueryParserTestBas
for (int i = 0; i < wildcardQueries.length; i++) {
for (int j = 0; j < wildcardQueries[i].length; j++) {
String qtxt = wildcardQueries[i][j];
- Query q = qp.parse(qtxt);
+ Query q = getQuery(qtxt,qp);
assertEquals(WildcardQuery.class, q.getClass());
}
}
+ setDefaultField(oldDefaultField);
}
public void testPhraseQueryPositionIncrements() throws Exception {
CharacterRunAutomaton stopStopList =
new CharacterRunAutomaton(new RegExp("[sS][tT][oO][pP]").toAutomaton());
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "field",
- new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false, stopStopList, false));
+ CommonQueryParserConfiguration qp = getParserConfig(new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false, stopStopList, false));
PhraseQuery phraseQuery = new PhraseQuery();
phraseQuery.add(new Term("field", "1"));
phraseQuery.add(new Term("field", "2"));
- assertEquals(phraseQuery, qp.parse("\"1 2\""));
- assertEquals(phraseQuery, qp.parse("\"1 stop 2\""));
+ assertEquals(phraseQuery, getQuery("\"1 2\"",qp));
+ assertEquals(phraseQuery, getQuery("\"1 stop 2\"",qp));
qp.setEnablePositionIncrements(true);
- assertEquals(phraseQuery, qp.parse("\"1 stop 2\""));
+ assertEquals(phraseQuery, getQuery("\"1 stop 2\"",qp));
qp.setEnablePositionIncrements(false);
- assertEquals(phraseQuery, qp.parse("\"1 stop 2\""));
+ assertEquals(phraseQuery, getQuery("\"1 stop 2\"",qp));
- qp = new QueryParser(TEST_VERSION_CURRENT, "field",
+ qp = getParserConfig(
new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false, stopStopList, true));
qp.setEnablePositionIncrements(true);
phraseQuery = new PhraseQuery();
phraseQuery.add(new Term("field", "1"));
phraseQuery.add(new Term("field", "2"), 2);
- assertEquals(phraseQuery, qp.parse("\"1 stop 2\""));
+ assertEquals(phraseQuery, getQuery("\"1 stop 2\"",qp));
}
public void testMatchAllQueryParsing() throws Exception {
// test simple parsing of MatchAllDocsQuery
- QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "key", new MockAnalyzer(random()));
- assertEquals(new MatchAllDocsQuery(), qp.parse(new MatchAllDocsQuery().toString()));
+ String oldDefaultField = getDefaultField();
+ setDefaultField("key");
+ CommonQueryParserConfiguration qp = getParserConfig( new MockAnalyzer(random()));
+ assertEquals(new MatchAllDocsQuery(), getQuery(new MatchAllDocsQuery().toString(),qp));
// test parsing with non-default boost
MatchAllDocsQuery query = new MatchAllDocsQuery();
query.setBoost(2.3f);
- assertEquals(query, qp.parse(query.toString()));
+ assertEquals(query, getQuery(query.toString(),qp));
+ setDefaultField(oldDefaultField);
+ }
+
+ public void testNestedAndClausesFoo() throws Exception {
+ String query = "(field1:[1 TO *] AND field1:[* TO 2]) AND field2:(z)";
+ BooleanQuery q = new BooleanQuery();
+ BooleanQuery bq = new BooleanQuery();
+ bq.add(TermRangeQuery.newStringRange("field1", "1", null, true, true), BooleanClause.Occur.MUST);
+ bq.add(TermRangeQuery.newStringRange("field1", null, "2", true, true), BooleanClause.Occur.MUST);
+ q.add(bq, BooleanClause.Occur.MUST);
+ q.add(new TermQuery(new Term("field2", "z")), BooleanClause.Occur.MUST);
+ assertEquals(q, getQuery(query, new MockAnalyzer(random())));
}
-
}
Modified: lucene/dev/branches/lucene3312/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/DuplicateFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/DuplicateFilter.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/DuplicateFilter.java (original)
+++ lucene/dev/branches/lucene3312/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/DuplicateFilter.java Thu Aug 9 10:20:53 2012
@@ -102,7 +102,7 @@ public class DuplicateFilter extends Fil
if (currTerm == null) {
break;
} else {
- docs = termsEnum.docs(acceptDocs, docs, false);
+ docs = termsEnum.docs(acceptDocs, docs, 0);
int doc = docs.nextDoc();
if (doc != DocIdSetIterator.NO_MORE_DOCS) {
if (keepMode == KeepMode.KM_USE_FIRST_OCCURRENCE) {
@@ -142,7 +142,7 @@ public class DuplicateFilter extends Fil
} else {
if (termsEnum.docFreq() > 1) {
// unset potential duplicates
- docs = termsEnum.docs(acceptDocs, docs, false);
+ docs = termsEnum.docs(acceptDocs, docs, 0);
int doc = docs.nextDoc();
if (doc != DocIdSetIterator.NO_MORE_DOCS) {
if (keepMode == KeepMode.KM_USE_FIRST_OCCURRENCE) {
Modified: lucene/dev/branches/lucene3312/lucene/sandbox/src/test/org/apache/lucene/sandbox/queries/DuplicateFilterTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/sandbox/src/test/org/apache/lucene/sandbox/queries/DuplicateFilterTest.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/sandbox/src/test/org/apache/lucene/sandbox/queries/DuplicateFilterTest.java (original)
+++ lucene/dev/branches/lucene3312/lucene/sandbox/src/test/org/apache/lucene/sandbox/queries/DuplicateFilterTest.java Thu Aug 9 10:20:53 2012
@@ -140,7 +140,7 @@ public class DuplicateFilterTest extends
new BytesRef(url),
MultiFields.getLiveDocs(reader),
null,
- false);
+ 0);
int lastDoc = 0;
while (td.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
@@ -164,7 +164,7 @@ public class DuplicateFilterTest extends
new BytesRef(url),
MultiFields.getLiveDocs(reader),
null,
- false);
+ 0);
int lastDoc = 0;
td.nextDoc();
Modified: lucene/dev/branches/lucene3312/lucene/sandbox/src/test/org/apache/lucene/sandbox/queries/TestSlowFuzzyQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/sandbox/src/test/org/apache/lucene/sandbox/queries/TestSlowFuzzyQuery.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/sandbox/src/test/org/apache/lucene/sandbox/queries/TestSlowFuzzyQuery.java (original)
+++ lucene/dev/branches/lucene3312/lucene/sandbox/src/test/org/apache/lucene/sandbox/queries/TestSlowFuzzyQuery.java Thu Aug 9 10:20:53 2012
@@ -440,21 +440,25 @@ public class TestSlowFuzzyQuery extends
assertEquals(1, hits.length);
assertEquals("foobar", searcher.doc(hits[0].doc).get("field"));
- q = new SlowFuzzyQuery(new Term("field", "t"), 3);
- hits = searcher.search(q, 10).scoreDocs;
- assertEquals(1, hits.length);
- assertEquals("test", searcher.doc(hits[0].doc).get("field"));
+ // TODO: cannot really be supported given the legacy scoring
+ // system which scores negative, if the distance > min term len,
+ // so such matches were always impossible with lucene 3.x, etc
+ //
+ //q = new SlowFuzzyQuery(new Term("field", "t"), 3);
+ //hits = searcher.search(q, 10).scoreDocs;
+ //assertEquals(1, hits.length);
+ //assertEquals("test", searcher.doc(hits[0].doc).get("field"));
- q = new SlowFuzzyQuery(new Term("field", "a"), 4f, 0, 50);
- hits = searcher.search(q, 10).scoreDocs;
- assertEquals(1, hits.length);
- assertEquals("test", searcher.doc(hits[0].doc).get("field"));
+ // q = new SlowFuzzyQuery(new Term("field", "a"), 4f, 0, 50);
+ // hits = searcher.search(q, 10).scoreDocs;
+ // assertEquals(1, hits.length);
+ // assertEquals("test", searcher.doc(hits[0].doc).get("field"));
- q = new SlowFuzzyQuery(new Term("field", "a"), 6f, 0, 50);
- hits = searcher.search(q, 10).scoreDocs;
- assertEquals(2, hits.length);
- assertEquals("test", searcher.doc(hits[0].doc).get("field"));
- assertEquals("foobar", searcher.doc(hits[1].doc).get("field"));
+ // q = new SlowFuzzyQuery(new Term("field", "a"), 6f, 0, 50);
+ // hits = searcher.search(q, 10).scoreDocs;
+ // assertEquals(2, hits.length);
+ // assertEquals("test", searcher.doc(hits[0].doc).get("field"));
+ // assertEquals("foobar", searcher.doc(hits[1].doc).get("field"));
reader.close();
index.close();
Modified: lucene/dev/branches/lucene3312/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeFilter.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeFilter.java (original)
+++ lucene/dev/branches/lucene3312/lucene/spatial/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeFilter.java Thu Aug 9 10:20:53 2012
@@ -112,7 +112,7 @@ RE "scan" threshold:
if (seekStat == TermsEnum.SeekStatus.NOT_FOUND)
continue;
if (cell.getLevel() == detailLevel || cell.isLeaf()) {
- docsEnum = termsEnum.docs(acceptDocs, docsEnum, false);
+ docsEnum = termsEnum.docs(acceptDocs, docsEnum, 0);
addDocs(docsEnum,bits);
} else {//any other intersection
//If the next indexed term is the leaf marker, then add all of them
@@ -120,7 +120,7 @@ RE "scan" threshold:
assert StringHelper.startsWith(nextCellTerm, cellTerm);
scanCell = grid.getNode(nextCellTerm.bytes, nextCellTerm.offset, nextCellTerm.length, scanCell);
if (scanCell.isLeaf()) {
- docsEnum = termsEnum.docs(acceptDocs, docsEnum, false);
+ docsEnum = termsEnum.docs(acceptDocs, docsEnum, 0);
addDocs(docsEnum,bits);
termsEnum.next();//move pointer to avoid potential redundant addDocs() below
}
@@ -145,7 +145,7 @@ RE "scan" threshold:
if(queryShape.relate(cShape, grid.getSpatialContext()) == SpatialRelation.DISJOINT)
continue;
- docsEnum = termsEnum.docs(acceptDocs, docsEnum, false);
+ docsEnum = termsEnum.docs(acceptDocs, docsEnum, 0);
addDocs(docsEnum,bits);
}
}//term loop
Modified: lucene/dev/branches/lucene3312/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapeFieldCacheProvider.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapeFieldCacheProvider.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapeFieldCacheProvider.java (original)
+++ lucene/dev/branches/lucene3312/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapeFieldCacheProvider.java Thu Aug 9 10:20:53 2012
@@ -64,7 +64,7 @@ public abstract class ShapeFieldCachePro
while (term != null) {
T shape = readShape(term);
if( shape != null ) {
- docs = te.docs(null, docs, false);
+ docs = te.docs(null, docs, 0);
Integer docid = docs.nextDoc();
while (docid != DocIdSetIterator.NO_MORE_DOCS) {
idx.add( docid, shape );
Modified: lucene/dev/branches/lucene3312/lucene/test-framework/src/java/org/apache/lucene/codecs/ramonly/RAMOnlyPostingsFormat.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene3312/lucene/test-framework/src/java/org/apache/lucene/codecs/ramonly/RAMOnlyPostingsFormat.java?rev=1371142&r1=1371141&r2=1371142&view=diff
==============================================================================
--- lucene/dev/branches/lucene3312/lucene/test-framework/src/java/org/apache/lucene/codecs/ramonly/RAMOnlyPostingsFormat.java (original)
+++ lucene/dev/branches/lucene3312/lucene/test-framework/src/java/org/apache/lucene/codecs/ramonly/RAMOnlyPostingsFormat.java Thu Aug 9 10:20:53 2012
@@ -386,15 +386,12 @@ public class RAMOnlyPostingsFormat exten
}
@Override
- public DocsEnum docs(Bits liveDocs, DocsEnum reuse, boolean needsFreqs) {
+ public DocsEnum docs(Bits liveDocs, DocsEnum reuse, int flags) {
return new RAMDocsEnum(ramField.termToDocs.get(current), liveDocs);
}
@Override
- public DocsAndPositionsEnum docsAndPositions(Bits liveDocs, DocsAndPositionsEnum reuse, boolean needsOffsets) {
- if (needsOffsets) {
- return null;
- }
+ public DocsAndPositionsEnum docsAndPositions(Bits liveDocs, DocsAndPositionsEnum reuse, int flags) {
return new RAMDocsAndPositionsEnum(ramField.termToDocs.get(current), liveDocs);
}
}